$ sudo apt update
$ sudo apt upgrade
$ sudo apt install gphoto2
xxxxxxxxxx
$ gphoto2 --list-cameras
xxxxxxxxxx
$ gphoto2 --auto-detect
xxxxxxxxxx
nohup gphoto2 --capture-image-and-download -I 30 -q
nohup令命令在后台运行,每30秒拍一张照片,-q指定静默模式。
使用python的opencv模块将照片组合成视频。
xxxxxxxxxx
$ sudo apt install python3-opencv
合成视频代码:
ximport cv2
import os
image_folder = 'D60_1' #假设所有照片都存放在当前目录的 D60_1 目录下
output_video = '1.mp4' #设置输出的视频文件保存在当前目录中,文件名为1.mp4
# 读取存放照片的目录中所有jpg和png文件名,并按排序
images = [img for img in os.listdir(image_folder) if img.endswith(".jpg") or img.endswith(".png")]
images.sort()
# print(images)
# 获取第一张图片的宽度和高度,以此作为输出视频的基准尺寸
first_image_path = os.path.join(image_folder,images[0])
frame = cv2.imread(first_image_path)
height,width,layers = frame.shape
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video = cv2.VideoWriter(output_video,fourcc,30,(width,height))
# 逐张读取图片添加到视频中
for image in images:
image_path = os.path.join(image_folder,image)
print("add ",image_path)
img = cv2.imread(image_path)
video.write(img)
# 关闭视频文件
video.release()
print("done, save as:",output_video)
cv2.VideoWriter_fourcc是OpenCV中用于定义视频编解码器的函数,它将四个字符的编码(FourCC)转换为一个用于视频编解码的整数,用于指定视频文件中使用的压缩方法。
xxxxxxxxxx
cv2.VideoWriter_fourcc(c1,c2,c3,c4)
一般用法,生成MPEG-4编码的视频文件:
xxxxxxxxxx
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
介绍文章:闲置树莓派:种朵花然后做延时摄影吧 | 树莓派实验室
代码:imageProcessor/balance.py at main · misra0514/imageProcessor · GitHub
xxxxxxxxxx
import cv2
import numpy as np
import os
from tqdm import tqdm
IMG_ADDR1 = 'flower_pics/'
IMG_ADDR2 = './'
TESTMODE = 1
VIDEOMODE = 2
'''
图像处理部分
'''
def afternoon(img, gamma = 0.65):
gamma_table=[np.power(x/255.0,gamma)*255.0 for x in range(256)]
gamma_table=np.round(np.array(gamma_table)).astype(np.uint8)
img = cv2.LUT(img,gamma_table)
img = cv2.normalize(img,dst=None,alpha=255,beta=25,norm_type=cv2.NORM_INF)
return img
def night(img):
img = cv2.normalize(img,dst=None,alpha=255,beta=30,norm_type=cv2.NORM_MINMAX)
return img
'''
每1秒钟有n张图片写入,帧率为n。
使用'I','4','2','0'编码得到的是.avi文件。如果需要其他编码格式的话可以尝试修改VideoWriter_fourcc参数,同时修改文件名后缀。
'''
def picToVideo(in_path, size, out_path, fps = 48):
filelist = os.listdir(in_path)
filelist.sort()
out_path = out_path + "test" + ".avi" # 导出路径
fourcc = cv2.VideoWriter_fourcc('I','4','2','0')
video = cv2.VideoWriter(out_path, fourcc, fps, size)
for item in tqdm(filelist):
img = cv2.imread(in_path + item)
date = str(item).split("_")[1].split(".")[0]
if(int(date) > 1900 or int(date) < 510 ):
img = night(img)
elif(int(date) > 1330):
img = afternoon(img)
video.write(img)
video.release()
def viewPics(in_path):
print("find ", len(os.listdir(in_path)) , "files")
cv2.namedWindow("demo",0)#将显示窗口的大小适应于显示器的分辨率
files = os.listdir(in_path)
files.sort()
for item in tqdm(files):
img = cv2.imread(in_path+item)
date = str(item).split("_")[1].split(".")[0]
print(date)
if(int(date) > 1900 or int(date) < 510 ):
img = night(img)
elif(int(date) > 1330):
img = afternoon(img)
else:
pass
cv2.imshow("demo", img)
k = cv2.waitKey(1)
if __name__ == '__main__':
IN_ADDR = IMG_ADDR1
OUT_ADDR = IMG_ADDR2
mode = VIDEOMODE
if(mode == TESTMODE):
viewPics(IN_ADDR)
elif(mode == VIDEOMODE):
picToVideo(IN_ADDR, (3280, 2464), OUT_ADDR) # 注意这个地方必须和图片的分辨率相同
gphoto2 [--debug] [--debug-logfile FILENAME] [--debug-loglevel LEVEL] [[-q] | [--quiet]] [[-v] | [--verbose]] [[-h] | [--help]] [--usage] [--hook-script FILENAME] [--list-cameras] [--list-ports] [--stdout] [--stdout-size] [--parsable] [--auto-detect] [--port PATH] [--speed SPEED] [--camera MODEL] [--filename FILENAME] [--filenumber FILENUMBER] [--usbid USBIDS] [[-a] | [--abilities]] [[--folder FOLDER] | [-f FOLDER]] [[[-R] | [--recurse]] | [--no-recurse]] [[-l] | [--list-folders]] [[-L] | [--list-files]] [[-m NAME] | [--mkdir NAME]] [[-r NAME] | [--rmdir NAME]] [[-n] | [--num-files]] [[-p RANGE or NAME] | [--get-file RANGE or NAME]] [[-P] | [--get-all-files]] [[-t RANGE or NAME] | [--get-thumbnail RANGE or NAME]] [[-T] | [--get-all-thumbnails]] [--get-raw-data RANGE or NAME] [--get-all-raw-data] [--get-audio-data RANGE or NAME] [--get-all-audio-data] [--get-metadata RANGE or NAME] [--get-all-metadata] [--upload-metadata FILENAME] [--force-overwrite] [--new] [[-d RANGE or NAME] | [--delete-file RANGE or NAME]] [[-D] | [--delete-all-files]] [[-u FILENAME] | [--upload-file FILENAME]] [--config] [--list-config] [--list-all-config] [--get-config CONFIGENTRY] [--set-config CONFIGENTRY=CONFIGVALUE] [--set-config-index CONFIGENTRY=CONFIGINDEX] [--set-config-value CONFIGENTRY=CONFIGVALUE] [--reset] [--capture-preview] [--show-preview] [[-F COUNT] | [--frames COUNT]] [[-I SECONDS] | [--interval SECONDS]] [--reset-interval] [--capture-image] [--trigger-capture] [--capture-movie SECONDS or COUNT] [--capture-sound] [--capture-tethered SECONDS, COUNT or STRING] [--wait-event SECONDS, COUNT or STRING] [--wait-event-and-download SECONDS, COUNT or STRING] [--keep] [--no-keep] [--show-info RANGE or NAME] [--show-exif RANGE or NAME] [--storage-info] [--summary] [--manual] [--about] [--shell]
libgphoto2(3)
是一个跨平台的数字相机库, gphoto2(1)
是它的命令行客户端。
如果选项采用一系列文件、缩略图或其他数据,则它们从1开始编号。范围是以逗号分隔的数字或跨度列表(“first-last”)。范围是XOR(异或),因此“1-5,3,7”等同于“1,2,4,5,7”。
--debug
打开调试输出。默认情况下,调试输出写入stderr,或写入--debug logfile选项的文件名。
--debug-logfile FILENAME (since 2.3.0)
如果给出 --debug
,则为将调试信息写入的日志文件。
--debug-loglevel LEVEL (since 2.5.5)
调试日志记录的详细程度。冗余度递增的可能值为:error
、debug
、data
、all
。默认为 all
。
--hook-script FILENAME (new after 2.3.0)
每当gphoto2中发生特定事件时,执行挂钩脚本 FILENAME 。钩子脚本读取环境变量 ACTION
。它必须忽略它未知的ACTION值。
ACTION=init
gphoto2刚刚初始化。如果钩子脚本现在返回非零退出代码,gphoto2将中止。
ACTION=start
gphoto2刚刚完成对命令行的解析,并将开始执行命令行上给定的命令。
ACTION=download
gphoto2刚刚将一个文件下载到计算机,并将其存储在环境变量ARGUMENT指示的文件中。
ACTION=stop
gphoto2即将完成。在这里做最后的清理。
所有其他环境变量都将原封不动地传递给钩子脚本。您可以利用它将数据传递给钩子脚本。
钩子脚本可以在 ~/.gphoto/settings 文件中指定为 gphoto2=hook-script=filename
。
-q, --quiet
安静输出(默认值=详细)。
-v, --version
显示版本并退出。
-h, --help
显示选项和简短描述。
--usage
显示简短的用法信息。
--list-cameras
列出支持的摄像头型号。
--list-ports
列出支持的端口设备。
--stdout
将文件发送到标准输出。
--stdout-size
在数据之前打印文件大小。
--parsable
以基于行的格式输出文件列表,该文件列表可以传递到shellscript或其他筛选器中。
--auto-detect
列出自动检测到的摄像头及其连接的端口。
--port PATH
指定端口设备。--list-ports
打印有效、可用端口的列表。如果是多个USB摄像头,--auto-detect
将显示每个摄像头连接到的特定端口。
--speed SPEED
指定串行传输速度。
--camera MODEL
指定相机型号。 --list-cameras
选项打印所有显式支持的相机的列表。
大多数型号名称都包含空格:请记住将名称括在引号中,以便shell知道它是一个参数。例如: --camera “Kodak DC240”
。
请注意,如果指定 --camera
,则还必须指定 --port
。否则, --camera
选项将被自动忽略。
--filename FILENAME
从相机下载文件时,指定将下载的文件存储在本地磁盘上时要使用的文件名或文件名模式。将文件上传到相机时,指定文件名以将上传的文件存储为相机上的文件。
--filename
选项接受 %a、%A、%b、%B、%d、%H、%k、%I、%l、%j、%m、%M、%S、%y、%%
,(请参阅 date(1)
),此外, %n
表示数字, %C
表示文件名后缀, %f
表示没有后缀的文件名, %F
表示文件夹名,%:
表示小写的完整文件名。
请注意,%:
仍然处于alpha阶段,实际的字符或语法可能仍然会更改。例如,可以将 %#f
和 %#C
用于小写版本,将 %^f
和 %^C
用于大写版本。
%n
是唯一接受填充字符和宽度的转换说明符:%03n
将用零填充到宽度3(例如,将数字7打印为“007”)。省略填充字符(例如 %3n
)将使用特定于实现的默认填充字符,该字符可能适合或不适合在文件名中使用。
此选项的默认值可以在 ~/.gphoto/settings 文件中指定为 gphoto2=filename=value
。
--filenumber FILENUMBER
如果使用 --filename
选项指定文件名并使用 %n
模式,则此模式通常从1开始。对于增量使用,可以使用 --filenumber
使其从另一个数字 FILENUMBER 开始。
--usbid USBIDS
(仅限专家)覆盖USB ID。
USBIDS的格式必须为DetectedVendorID:DetectedProductID=TreatAsVendorID:TreatAsProductID,才能将检测到的任何USB设备视为DetectdVendorId:DetectedProductID,将其视为TreatAsVendorID:TreatAsProductID。所有VendorID和ProductID都应该是以C表示法开头的十六进制数,即以“0x”开头。
例如: --usbid 0x4a9:0x306b=0x4a9:0x306c
。
-a, --abilities
显示libgphoto2驱动程序中指定的相机和驱动程序功能。这一切并不查询相机,它使用库提供的数据。使用 --summary
查询相机的概述。
-f, --folder FOLDER
指定相机文件夹(默认值=“/”)。
-R, --recurse
递归(默认为下载)。
--no-recurse
无递归(默认为删除)。
-l, --list-folders
列出文件夹中的文件夹。
-L, --list-files
列出文件夹中的文件。
-m, --mkdir NAME
创建目录。
-r, --rmdir NAME
删除目录。
-n, --num-files
显示文件数。
-p, --get-file RANGE
获取范围内给定的文件。
-P, --get-all-files
从文件夹中获取所有文件。
-t, --get-thumbnail RANGE
获取范围内给定的缩略图。
-T, --get-all-thumbnails
从文件夹中获取所有缩略图。
--get-raw-data RANGE
获取范围内给定的原始数据。
--get-all-raw-data
从文件夹中获取所有原始数据。
--get-audio-data RANGE
获取范围内给定的音频数据。
--get-all-audio-data
从文件夹中获取所有音频数据。
--upload-metadata FILENAME
上传特定文件的元数据,从具有 meta_ 的文件前缀中获取。
--get-metadata RANGE
获取范围中给定的元数据。
--get-all-metadata
从文件夹中获取所有元数据。
--force-overwrite
在不询问的情况下覆盖文件。
--skip-existing
如果本地目录中已经存在文件,则跳过这些文件。
--new
仅获取尚未下载的文件。此选项取决于摄像头对标记已下载图像的支持,并非所有驱动程序都可用。
-d, --delete-file RANGE
删除范围内给定的文件。
-D, --delete-all-files
删除文件夹中的所有文件(默认为--无递归)。
-u, --upload-file FILENAME
将文件上传到相机。
--capture-preview
捕获快速预览。
-B--bulb SECONDS
在指定的时间内进行灯泡(bulb)捕获。
--show-preview
捕获快速预览,并使用Ascii Art将其显示在终端中(如果在构建期间使用了aalib)。
-F COUNT, --frames COUNT
一次运行中要捕获的帧数。默认值为无限帧数。
-I SECONDS, --interval SECONDS
捕获多个帧之间的时间。
(自2.4起)如果接收到SIGUSR1信号,则在不等待当前间隔周期结束的情况下立即拍摄照片(参见称为“信号”的部分)。值-1将使gphoto2永远等待,即直到信号到达。另请参阅 --reset-interval
。
--reset-interval
当在延时模式下接收到SIGUSR1信号时,设置该选项将把时间间隔重置为 -I|--interval
选项给定的值。
--capture-image
拍摄图像并将其保存在相机上。
--capture-image-and-download
捕获图像并立即将其下载到计算机。
--trigger-capture
触发捕获图像并返回。如果要下载映像,请参阅 --wait-event-and-download
。
此功能仅适用于某些相机品牌和驱动程序。
--keep
执行 --capture-image-and-download
或间隔捕获时,此选项将图像保留在相机的存储卡上。
--no-keep
执行 --capture-image-and-download
或 interval capture
时,此选项不会在拍摄过程中下载图像后将其保留在相机的存储卡上。(默认)
--keep-raw
执行 --capture-image-and-download
或 interval capture
时,此选项将保留相机存储卡上的原始图像,但仍然下载JPEG图像。这在执行双模式捕获时非常有用,并且您希望在捕获过程中查看JPEG。
--capture-movie SECONDS
拍摄电影。如果相机支持预览,这将以相机可以的速度捕获预览流(运动jpeg)。
如果未指定参数,则在您按 Ctrl-C 之前,它将捕获预览帧。可以指定的参数是捕获秒数或预览帧数。
--capture-sound
捕获音频剪辑。目前没有驱动程序支持此功能。
--capture-tethered SECONDS, MILLISECONDS, COUNT or MATCHSTRING
允许gphoto2等待来自相机的添加对象的通知。这对于栓系(tethered)捕获非常有用,其中按下相机上的快门会立即将图像传输到机器进行处理。
与 --hook-script
一起立即后处理或显示图像,这可以帮助工作室工作流(studio workflow)。
该选项需要驱动程序和摄像头的支持,目前较新的佳能EOS和尼康DLSR能用。
--wait-event SECONDS, MILLISECONDS, COUNT or MATCHSTRING, --wait-event-and-download SECONDS, MILLISECONDS, COUNT or MATCHSTRING
让gphoto2等待来自摄像头的各种事件通知。这对于查看相机的操作和等待添加对象非常有用。在 --wait-event
版本中,对象保存在相机上,并下载 --waite-event-and-download
。
--wait-event-and-download
相当于 --capture-tethered
。
等待时间可以指定为带 s
后缀的完整秒数、带 ms
后缀的毫秒数、事件数(只是数字)或要匹配的子字符串。如果没有发生任何事情,则在1秒后生成超时,因此 wait-event=5
最多需要5秒。--wait event=5s
正好需要5秒钟。
也可以等待 MATCHSTRING ,等待 CAPTURECOMPLETE、FILEADDED、TIMEOUT 或其他打印出来的事件。
如果没有给出参数,则等待时间为100万个事件(基本上永远)。
在下载变体中,这可以与 --hook-script
一起使用,以立即后处理或显示图像,这有助于工作室工作流。
该选项需要驱动程序和摄像头的支持。
如果gphoto2在等待期间接收到SIGUSR1,它将立即拍照(类似于 --capture-image
),并根据模式将其留在相机上或下载。(自2.5.28起)
如果gphoto2在等待期间接收到SIGUSR2,它将安全地结束系留。(自2.5.25起)
--show-info RANGE
显示单个或多个图像的信息,如宽度、高度、大小和/或捕获时间
--config
启动基于ncurses的文本配置菜单。gphoto2需要针对CDK构建此功能。
--list-config
列出所有配置条目。
--list-all-config
列出所有配置条目及其值和选项。
该命令是 --list-config
和对所有条目调用 --get-config
的组合。
--get-config CONFIGENTRY
获取指定的配置条目。
该命令将列出该配置值的类型、当前值以及可用选项。
--set-config CONFIGENTRY=CONFIGVALUE
设置指定的配置条目。对于值的选择列表,此设置首先将CONFIGVALUE作为值查找,然后将其作为选项列表中的索引。由于这不是完全清楚的,所以可以使用 --set-config-index
或 --set-config-value
来更清楚地搜索什么。
查看 --get-config
的输出,看看可以在这里设置哪些值。
--set-config-index CONFIGENTRY=CONFIGINDEX
通过在配置值的选项列表中指定索引来设置指定的配置条目。当然,这仅适用于提供选项列表的配置设置。
查看 --get-config
的输出,看看可以在这里设置哪些索引。
--set-config-value CONFIGENTRY=CONFIGVALUE
通过指定指定的配置条目的新值来设置该条目。对于选项列表,将查找并设置值。
查看 --get-config
的输出,看看可以在这里设置哪些值。
--reset
重置指定(或自动检测)的USB端口。
该命令重置第一个自动检测相机的USB端口,或用 --port USB:XXX,YYY
指定的端口。如果以某种方式与相机对话的协议锁定,并模拟插拔和插入相机,则该选项非常有用。
--storage-info
显示有关相机存储介质的信息。
--summary
摄像头状态摘要。
--manual
摄像头驱动程序手册。
--about
关于相机驱动程序。
--shell
启动gphoto2 shell,这是一个交互式环境。有关详细说明,请参见 SHELL MODE
。
以下命令可用:
cd DIRECTORY
切换到相机上的指定目录。
ls
列出相机上当前目录的内容。
lcd DIRECTORY
更改到本地计算机上的指定目录。
get FILENAME
将指定的文件下载到当前目录。
put FILENAME
将指定的文件从当前系统目录上载到相机当前目录。
get-thumbnail FILENAME
将指定的缩略图下载到当前目录。
get-raw FILENAME
将指定的原始数据下载到当前目录。
show-info FILENAME
显示指定文件的信息。
delete FILENAME
删除指定的文件或目录。
mkdir DIRECTORY
创建名为 DIRECTORY 的目录。
rmdir DIRECTORY
删除名为 DIRECTORY 的目录。
show-exif FILENAME
显示EXIF信息(仅当使用EXIF支持编译时)。
capture-image
捕获单个图像并将其保留在相机上。
capture-image-and-download
捕获单个图像并从相机下载。
capture-preview
捕获预览图像并从相机下载。
list-config
列出所有配置值。
get-config NAME
获取由 NAME 指定的配置。
set-config NAME=VALUE
将 NAME 指定的配置设置为 VALUE 。
set-config-value NAME=VALUE
将 NAME 指定的配置设置为 VALUE 。
set-config-index NAME=VALUE
将 NAME 指定的配置设置为选项列表中的 INDEX 。仅适用于菜单或单选按钮条目。
wait-event COUNT or SECONDS
在指定的时间内等待来自相机的事件,单位为秒(如果后缀为s)或相机的事件计数,其中每秒钟发生一次超时事件。新添加的图像将保留在相机上。
默认值为1个事件。
wait-event-and-download COUNT or SECONDS, capture-tethered COUNT or SECONDS
在指定的时间内等待来自相机的事件,单位为秒(如果后缀为s)或相机的事件计数,其中每秒钟发生一次超时事件。新添加的图像将从相机下载。
默认值为1个事件。
help, ?
显示命令用法。
exit, quit, q
退出gphoto2 shell。
CAMLIBS
如果设置,则定义libgphoto2库查找其相机驱动程序(camlibs)的目录。您只需要在OS/2系统和中断/测试安装上设置此设置。
IOLIBS
如果设置,则定义libgphoto2_port库查找其I/O驱动程序(iolibs)的目录。您只需要在OS/2系统和中断/测试安装上设置此设置。
LD_DEBUG
将其设置为all,以接收有关在基于ld的系统上加载库的大量调试信息。
USB_DEBUG
如果设置,则定义libusb库用于打印消息的数字调试级别。为了获得一些调试输出,请将其设置为1。
SIGUSR1 (since 2.4)
在延时摄影(time-lapse capture)和系留(tethering)或等待事件模式中,接收SIGUSR1信号使gphoto2立即拍照。
如果给定了 --reset-interval
选项,则时间计数器将重置为 -I|--interval
选件给定的值。请注意,相机需要一些时间(从50毫秒到几秒钟)才能真正捕获图像。
SIGUSR2 (since 2.5.26)
在系留或等待事件模式中,接收SIGUSR2信号结束系留或等候事件模式。如果您在手之前不知道结束,但仍然希望安全地退出等待,则这是有用的。
libgphoto2(3), The gPhoto2 Manual[1],
The gphoto.org website[2], Digital Camera Support for UNIX, Linux and BSD[3]
xxxxxxxxxx
gphoto2 --list-ports
显示您具有的端口类型(USB和串行)。
xxxxxxxxxx
gphoto2 --auto-detect
显示已连接的摄像头。
xxxxxxxxxx
gphoto2 --list-files
列出相机上的文件。
xxxxxxxxxx
gphoto2 --get-file 7-13
从 gphoto2 --list-files
输出的列表中获取编号为7到13的文件。
xxxxxxxxxx
gphoto2 --capture-image --interval 60 --hook-script /usr/share/doc/gphoto2/test-hook.sh
从现在到永恒,每60秒拍摄一张图像。在计算机上存储每个捕获的图像后,将调用示例挂钩脚本。