相机的拍摄,可以通过相机自带的驱动程序和应用软件。也可以通过 gPhoto2,它的 官网 上这么介绍到:
gPhoto2 is a free, redistributable, ready to use set of digital camera software applications for Unix-like systems, written by a whole team of dedicated volunteers around the world. It supports more than 2100 cameras…
我们用 gPhoto2 来控制 Nikon 相机和一个工业鱼眼镜头,实现定时触发的拍摄,用于室内全景图的采集。本文先介绍 Linux 下 Bash 基础知识,再介绍 gPhoto2 的安装和使用,以及相机的配置方法。
Linux 下命令行环境为一种 shell,通常默认为 Bash(borne-again shell)。
命令不需要全部手敲,按 Tab
键命令可自动补全。如:ec<TAB>(这里的 <TAB> 指的是键盘上的 Tab
键), Bash 会自动补全为 echo
,接着敲空格,再 hello Bash
,即整个语句是 echo hello Bash
,输出为 hello Bash
。
echo
是命令,hello Bash
是参数。结果就是打印 hello Bash
到标准输出流(即命令行)。
几乎所有命令都有详细的使用文档,所以不必背太多指令。不知道 gphoto2
怎么用,就 man gphoto2
,或者试试 gphoto2 --help
,或者直接 gphoto2
,使用方法会打印在屏幕上(Linux 用起来其实很容易):
拍一张照片,用 gphoto2 --capture-image
即可,写到一个文件里比如 run.sh
:
#/bin/bash
# 这是单行注释,下面是命令
gphoto2 \
--capture-image
: '
这是多行注释,上面冒号前的两行是命令。反斜杠用来续行,上面的命令等价于
gphoto2 --capture-image
两种表达一模一样。
多行注释结束。
'
保存好 run.sh
,添加执行权限(不然文本就是文本,不能运行):chmod +x ./run.sh
,最后运行:./run.sh
,即可拍一张照片。
关于 Linux 和 Bash 脚本,可以参考我的另一篇 post: Linux Shell 脚本菜谱 | Linux Shell Scripting Cookbook,或者 鳥哥的 Linux 私房菜。
我主要参考了这篇文章:Compiling gphoto2 on the Raspberry Pi – One life and a few more things,大致的流程是:
# 安装依赖
sudo apt-get install \
subversion dh-autoreconf \
libglib2.0-dev \
libusb-dev libusb-1.0-0-dev \
libexif-dev libpopt-dev libfuse-dev \
mono-devel monodoc-base libmono-2.0.1 mono-gmcs \
python-pyrex
# 下载安装 libgphoto2
wget http://sourceforge.net/projects/gphoto/files/libgphoto/2.5.2/libgphoto2-2.5.2.tar.gz
tar xvf libgphoto2*.tar.gz
cd libgphoto2*
./configure
make -j4
sudo make install
# 下载安装 gphoto2
wget http://sourceforge.net/projects/gphoto/files/gphoto/2.5.2/gphoto2-2.5.2.tar.gz
tar xvf gphoto2*.tar.gz
cd gphoto2*
./configure
make -j4
sudo make install
拍照:(保留一些注释掉的命令)
#/bin/bash
gphoto2 \
--capture-image \
--capture-image \
--capture-image \
: '
更改一些设置,改一次就好,用了就注释掉
gphoto2 \
--set-config /main/capturesettings/nikonflashmode=3 \
--set-config /main/capturesettings/shootingspeed=3 \
--set-config /main/capturesettings/flashmode=1 \
--set-config /main/capturesettings/shutterspeed=15 \
--set-config /main/capturesettings/shutterspeed2=17 \
--set-config /main/capturesettings/exposuredelaymode=0 \
--set-config /main/capturesettings/burstnumber=1 \
--set-config /main/other/500c=1 \
--set-config /main/other/500d=15 \
--set-config /main/other/500f=0 \
--set-config /main/other/5018=0 \
--set-config /main/other/d068=3 \
--set-config /main/other/d06a=3 \
--set-config /main/other/d1b1=36 \
'
: '
# 这是原来的设置,恢复的时候用
--set-config /main/capturesettings/nikonflashmode=0 \
--set-config /main/capturesettings/shootingspeed=3 \
--set-config /main/capturesettings/flashmode=1 \
--set-config /main/capturesettings/shutterspeed=15 \
--set-config /main/capturesettings/shutterspeed2=17 \
--set-config /main/capturesettings/exposuredelaymode=0 \
--set-config /main/capturesettings/burstnumber=1 \
--set-config /main/other/500c=1 \
--set-config /main/other/500d=15 \
--set-config /main/other/500f=0 \
--set-config /main/other/5018=0 \
--set-config /main/other/d068=3 \
--set-config /main/other/d06a=3 \
--set-config /main/other/d1b1=36 \
'
注意 --capture-preview
和 --capture-image
的区别,可换着试试看。
获取 Thumbnail(把相机里的照片缩略图传回电脑):
gphoto2 --get-all-thumbnails
自动分类存到文件夹
#/bin/bash
# BASENAME=$(date +%s_%F_%H:%M:%S_%N)
BASEDIR="/tmp/"
EXTENTION="jpg"
repeat() { while true; do $@; done;};
capture() {
FOLDER="${BASEDIR}./$(date +%F/%H/%M)" && \
IMG="$(date +%s_%F_%H:%M:%S_%N).${EXTENTION}"
mkdir -p $FOLDER
echo @___folder: [$FOLDER]
echo @____image: [$IMG]
# 照相命名并分类保存
gphoto2 --capture-image --filename $IMG && mv $IMG $FOLDER
# echo 'hello(`date +%s`)' > $IMG && mv $IMG $FOLDER
# read -t 1 || return
# echo sleep 3 seconds && sleep 3 && echo sleep done
};
repeat capture # 持续拍照
可以通过 gphoto2 获取相机的当前设置:gphoto2 --summary
,这里是部分输出:
Camera summary:
Manufacturer: Nikon Corporation
Model: D7100
Version: V1.01
Serial Number: 61778820000000000000000000000000
Vendor Extension ID: 0xa (1.0)
Vendor Extension Description: microsoft.com: 1.0
Capture Formats: JPEG Undefined Type
Display Formats: Undefined Type, Association/Directory, Script, DPOF, Apple Quicktime, JPEG
Device Capabilities:
File Download, File Deletion, File Upload
Generic Image Capture, No Open Capture, Nikon Capture 1, Nikon Capture 2, Nikon Capture 3
全部输出:summary.txt。
还可以输出相机的所有的参数候选项,大概长这样(list-all-config
( <= 点我查看全部内容)):
/main/actions/autofocusdrive
Label: Drive Nikon DSLR Autofocus
Type: TOGGLE
Current: 0
/main/actions/manualfocusdrive
Label: Drive Nikon DSLR Manual focus
Type: RANGE
Current: 0
Bottom: -32767
Top: 32767
Step: 1
/main/actions/changeafarea
Label: Set Nikon Autofocus area
Type: TEXT
Current: 0x0
/main/actions/controlmode
Label: Set Nikon Control Mode
Type: TEXT
Current: 0
/main/settings/capturetarget
Label: Capture Target
Type: RADIO
Current: Internal RAM
Choice: 0 Internal RAM
Choice: 1 Memory card
利用这些可以设置相机,比如上面的 /main/settings/capturetarget
的类型是 RADIO (就是 Qt/MFC 里的 Radio button,HTML 里的 Radio input,一样一样的),二选一。
那么,设置照片保存在 RAM 上就可以:
gphoto2 --set-config /main/settings/capturetarget=0
。
其他参数也是这样设置。
或许说“软件”有点怪,因为 gphoto2 其实是一个 Linux 命令行工具,在很多人眼中软件都是有界面的。
但它,确实是一个软件……哈哈。↩