Controlling a camera in Linux – continued

Last post, I looked at what we could do on my old Nikon D60 DSLR connected to the Parallella using both Ubuntu and ArchLinux. This time, I will see what extended options there are on a newer DSLR, in this case the Nikon D7000.

As there are some issues with the 2.5.3 version shipping with Ubuntu, so I will use ArchLinux for this post also.

I found with the D7000 that unless I turned the camera on before connecting the USB, it failed to enumerate. This was true with both my desktop and the Parallella (both of which run ArchLinux).

Unlike the D60, as I hinted at last time, the D7000 supports driving the focus. Although this is restricted to LiveView mode.

[root@ParallellArch ~]# gphoto2 --get-config /main/actions/manualfocusdrive
Label: Drive Nikon DSLR Manual focus
Type: RANGE
Current: 0
Bottom: -32767
Top: 32767
Step: 1

The only way I have been able to make use of the focus is by entering the interactive shell – when you use gphoto2 in this manner, the mirror remains locked up after a call to capture-preview (if you call it non-interactively, it will drop immediately after capturing a preview image).

$ gphoto2 --shell
gphoto2: {/home/yani} /> capture-preview
Saving file as capture_preview.jpg
gphoto2: {/home/yani} /> set-config /main/actions/manualfocusdrive=-500
gphoto2: {/home/yani} /> set-config /main/actions/manualfocusdrive=500
gphoto2: {/home/yani} /> set-config /main/actions/manualfocusdrive=-500
gphoto2: {/home/yani} /> set-config /main/actions/manualfocusdrive=500
gphoto2: {/home/yani} /> exit

and so I see the focus ring driven back and forth. The call to capture-preview causes the mirror to be left up. As soon as you exit the shell, you will hear the mirror being dropped.

I can also record LiveView movies using

[root@ParallellArch ~]# gphoto2 --capture-movie
Capturing preview frames as movie to 'movie.mjpg'. Press Ctrl-C to abort.
^C
Cancelling...
Ctrl-C pressed ... Exiting.
Movie capture finished (162 frames)
[root@ParallellArch ~]# ls -l movie.mjpg; file movie.mjpg
-rw-r----- 1 root root 5285244 Oct 1 09:30 movie.mjpg
movie.mjpg: JPEG image data, baseline, precision 0, 4360x426

The resultant motion JPEG file can then be loaded directly into smplayer. You can of course convert this to something like mpeg or avi (for example using ffmpeg or mencoder).

But after each operation, the mirror is lowered. According to this post (dated 2012), locking up the mirror on a Canon is no small feat. However I am sure I must be missing something.

There are other cool things you can do, which may be useful in my project down the track, so I will give them a mention here. You can select the currently lit AF point. The D7000 has a 39-point AF. Mine was set to 2, so I reprogrammed it to 22. I did this while peering into the viewfinder and saw it immediately move. This represents a nifty ability to programmatically configure where the camera will focus, by determining which quadrant the subject will be in (by whatever means), and telling the camera to autofocus on that part of the AF matrix.

[root@ParallellArch ~]# gphoto2 --get-config d108
Label: Active AF Sensor
Type: MENU
Current: 2
Choice: 0 1
.....
Choice: 38 39
[root@ParallellArch ~]# gphoto2 --set-config d108=22
[root@ParallellArch ~]# gphoto2 --get-config d108
Label: Active AF Sensor
Type: MENU
Current: 22

Since my D7000 shoots in JPG+RAW, I get two images each time I take an exposure:

[root@ParallellArch ~]# gphoto2 --capture-image-and-download
New file is in location /capt0000.jpg on the camera
Saving file as capt0000.jpg
Deleting file /capt0000.jpg on the camera
Deleting 'capt0000.jpg' from folder '/'...
New file is in location /capt0001.nef on the camera
Saving file as capt0001.nef
Deleting file /capt0001.nef on the camera
Deleting 'capt0001.nef' from folder '/'...

I mentioned in my previous post that I would explain the differences between –trigger-capture, –capture-image, and –capture-image-and-download. The first simply causes the camera to take an exposure, so is the command to use if trying to take a short burst with varying exposure settings (a bracketed shot). While you won’t then see any new photo if you use –list-files (and it won’t be saved to the SD card), a subsequent download will indeed fetch the photo. The second causes an image to be capture, sent over PTP, and ultimately discarded. I think this command is utterly pointless. All it tells you is what the captured file was named (but at the huge inefficiency of sending the whole file!). The final option captures an image, and then downloads ALL files. So if you previously used –trigger-capture, it will send you your file. However if you previously used –capture-image, it will not send you both – it will replace the existing file! Confused? Good – not the most intuitive interface.

Here is an example of me taking a bracketed exposure, and then retrieving the files

[root@ParallellArch ~]# gphoto2 --set-config /main/capturesettings/exposurecompensation=12 --trigger-capture
[root@ParallellArch ~]# gphoto2 --set-config /main/capturesettings/exposurecompensation=15 --trigger-capture
[root@ParallellArch ~]# gphoto2 --set-config /main/capturesettings/exposurecompensation=18 --trigger-capture
[root@ParallellArch ~]# gphoto2 --capture-image-and-download
New file is in location /capt0000.jpg on the camera
Saving file as capt0000.jpg
Deleting file /capt0000.jpg on the camera
Deleting 'capt0000.jpg' from folder '/'...
New file is in location /capt0001.nef on the camera
Saving file as capt0001.nef
Deleting file /capt0001.nef on the camera
Deleting 'capt0001.nef' from folder '/'...
New file is in location /capt0002.jpg on the camera
Saving file as capt0002.jpg
Deleting file /capt0002.jpg on the camera
Deleting 'capt0002.jpg' from folder '/'...
New file is in location /capt0003.nef on the camera
Saving file as capt0003.nef
Deleting file /capt0003.nef on the camera
Deleting 'capt0003.nef' from folder '/'...
New file is in location /capt0004.jpg on the camera
Saving file as capt0004.jpg
Deleting file /capt0004.jpg on the camera
Deleting 'capt0004.jpg' from folder '/'...
New file is in location /capt0005.nef on the camera
Saving file as capt0005.nef
Deleting file /capt0005.nef on the camera
Deleting 'capt0005.nef' from folder '/'...
New file is in location /capt0006.jpg on the camera
Saving file as capt0006.jpg
Deleting file /capt0006.jpg on the camera
Deleting 'capt0006.jpg' from folder '/'...
New file is in location /capt0007.nef on the camera
Saving file as capt0007.nef
Deleting file /capt0007.nef on the camera
Deleting 'capt0007.nef' from folder '/'...

What just happened? Why 8 images? Remember I am shooting RAW+JPG – so each exposure generates two files. Finally, because –capture-image-and-download causes a final image to be taken, the 3 shots results in 8 images. I could have substituted –trigger-capture with –capture-image-and-download for the last shot, and not generated any wasted captures/transfers.

Note that all of the above writed photos to SDRAM only – which can then be retrieved via USB. In order to save to the camera’s internal SD cards (the D7000 has dual slots), I found you need to use

gphoto2 --set-config=capturetarget=1

If you keep track of the number of the last recorded image, take a flurry of shots, it should be possible to query the list of available files and selectively retrieve just the newer ones you wish to store, process, upload to the cloud, or whatever.

Obviously this is the only mode you should use for the likes of my earlier 8-bit AVR driven approach, since I had a device triggering the captures which had nowhere near the capabilities required to retrieve and store the photos. This is no issue with the Parallella – but in the interests of preserving backups of photos, limiting the need to saturate the USB link fetching photos too often, and risking losing un-fetched images, I intend to save to the SD card always, and then only retrieve photos as needed.

Obviously there are a whole lot of other functions I would like to explore, in particular things like focus lock and exposure lock for taking panoramas, or preventing AF from hesitating at the wrong moment when you have a shot all setup, but it wants to seek. I will add further details as I explore these. I am not sure how much will require the camera to be correctly configured via the UI, and how much we can do via USB control. Since the D7000 provides two save slots for the entire camera configuration, which can then be saved to and restored from card, it is not too onerous to use a different card when I go out shooting versus when in the platform – but not all cameras afford this luxury, and I prefer the idea of programming it via PTP.

Advertisements

One thought on “Controlling a camera in Linux – continued

  1. Pingback: Controlling a camera in Linux | The Parallellogram

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s