Attaching pi4 camera module and usb webcam for photo and video

Shalav Kakati
7 min readFeb 28, 2021

--

Backstory — even a webcam on the usb works fine!

With temp, humidity and LCD done I wanted to check out how video and still images worked, so use that in future, so purchased a camera module and ribbon cable that goes into the designated camera connector on the Pi4.

Well it turned out later even a regular webcam used for wfh attached to the usb port would world, but since we had the camera module, tried it out first. It comes with a short ribbon cable that makes it a bit incovenient vs a usb webcam with a long wire when we want the camera up on a pole or outside a window to keep an eye on things.

The vision I had was to learn how to take still images and video from SW and fold that into a program to periodically do that as a monitoring use case.

we need to insert the cable into the connector after pulling up the black clip to create a gap and then pushing it down to lock it tightly. a mishap happened when I applied too much force in wrong direction and one end of the black clip broke (see on left side of connector in 4th pic above), but fortunately there was enough left to get a good lock.

We next need to enable the camera interface in raspi-config tool, reboot and use the commands below.

raspi-config. -> turn on camera interface in settingsto take still images
raspistill --help
raspistill -o shalav.jpg
raspistill -tl 1000 -o img_%04d.jpg. -> time lapse photo graphy with images bearing time stamp for sorting
to take videos
raspivid --help
raspivid -o shalav.h264
raspivid --help
aspivid -ex night -o shalav.h264 -> checked to see if camera can operate in very low light but was a fail
root@raspberrypi:/home/pi# cat raspistill.py
import time
import datetime
import os

for i in range(0,5):
timestr = time.strftime("%H%M%S")
filename = "shalav_raspistill_" + timestr + ".jpg"
print(filename)
os.system("raspistill -dt -o {}".format(filename))
time.sleep(3)

Reference video used to learn how to use this

I connected a regular logitech webcam to one of the USB ports and got the same results. The quality of the camera output even in bright daylight was not so great but passable as a proof of concept. I hung the camera pointing outside a window after changing the Pi config to support wifi connection so that ssh and vnc servers were running. only power cable was then needed to move the Pi near the window.

The usb camera needs fswebcam installed firstsudo apt-get install fswebcamplug in camera to usbensure the camera option is enabled in raspi-config and if not enable and rebootroot@raspberrypi:/home/pi# cat fswebcam.pyimport time
import os

for i in range(0,30):
os.system('fswebcam -S 50 --save /home/pi/fswebcam/shalav_fsweb_%H%M%S.jpg')
time.sleep(60)
the first pic came out all overexposed. after reading a bit learned that camera sensor needs a bit of time to settle in when faced with bright light, so the -S 50 tells it to discard the first 50 frames. the second pic came out all right when i made the change

Next to record video on the webcame ffmpeg can be used. I let it record for a few seconds then pressed control-C to terminate. These commands have a lot of options visible under “ — help”

root@raspberrypi:/home/pi/fswebcam# ffmpeg -f video4linux2 -framerate 25 -i /dev/video0 video0.aviffmpeg version 4.1.6-1~deb10u1+rpt1 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 8 (Raspbian 8.3.0-6+rpi1)
configuration: --prefix=/usr --extra-version='1~deb10u1+rpt1' --toolchain=hardened --incdir=/usr/include/arm-linux-gnueabihf --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-omx-rpi --enable-mmal --enable-neon --enable-rpi --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared --libdir=/usr/lib/arm-linux-gnueabihf --cpu=arm1176jzf-s --arch=arm
WARNING: library configuration mismatch
[snipped] libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
[video4linux2,v4l2 @ 0x1af61e0] The driver changed the time per frame from 1/25 to 1/10
Input #0, video4linux2,v4l2, from '/dev/video0':
Duration: N/A, start: 15663.365996, bitrate: 147456 kb/s
Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1280x720, 147456 kb/s, 10 fps, 10 tbr, 1000k tbn, 1000k tbc
File 'video0.avi' already exists. Overwrite ? [y/N] y
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> mpeg4 (native))
Press [q] to stop, [?] for help
Output #0, avi, to 'video0.avi':
Metadata:
ISFT : Lavf58.20.100
Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720, q=2-31, 200 kb/s, 10 fps, 10 tbn, 10 tbc
Metadata:
encoder : Lavc58.35.100 mpeg4
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
frame= 26 fps=0.0 q=24.8 size= 262kB time=00:00:02.90 bitrate= 738.8kbits/frame= 41 fps= 41 q=31.0 size= 262kB time=00:00:04.80 bitrate= 446.4kbits/frame= 46 fps= 30 q=30.9 size= 262kB time=00:00:05.30 bitrate= 404.3kbits/frame= 51 fps= 25 q=25.5 size= 262kB time=00:00:05.80 bitrate= 369.4kbits/frame= 56 fps= 22 q=24.2 size= 262kB time=00:00:06.30 bitrate= 340.1kbits/frame= 61 fps= 20 q=21.0 size= 262kB time=00:00:06.80 bitrate= 315.1kbits/frame= 66 fps= 19 q=23.8 size= 262kB time=00:00:07.30 bitrate= 293.5kbits/frame= 71 fps= 18 q=21.5 size= 262kB time=00:00:07.80 bitrate= 274.7kbits/frame= 76 fps= 17 q=23.6 size= 262kB time=00:00:08.30 bitrate= 258.1kbits/frame= 81 fps= 16 q=20.8 size= 262kB time=00:00:08.80 bitrate= 243.5kbits/frame= 86 fps= 15 q=15.6 size= 262kB time=00:00:09.30 bitrate= 230.4kbits/frame= 91 fps= 15 q=21.7 size= 262kB time=00:00:09.80 bitrate= 218.6kbits/frame= 96 fps= 15 q=18.9 size= 262kB time=00:00:10.30 bitrate= 208.0kbits/frame= 101 fps= 14 q=22.5 size= 262kB time=00:00:10.80 bitrate= 198.4kbits/frame= 106 fps= 14 q=19.1 size= 518kB time=00:00:11.30 bitrate= 375.2kbits/frame= 111 fps= 14 q=19.3 size= 518kB time=00:00:11.80 bitrate= 359.3kbits/frame= 116 fps= 13 q=20.2 size= 518kB time=00:00:12.30 bitrate= 344.7kbits/frame= 121 fps= 13 q=18.1 size= 518kB time=00:00:12.80 bitrate= 331.2kbits/frame= 126 fps= 13 q=22.1 size= 518kB time=00:00:13.40 bitrate= 316.4kbits/frame= 131 fps= 13 q=18.7 size= 518kB time=00:00:13.90 bitrate= 305.0kbits/frame= 136 fps= 13 q=20.9 size= 518kB time=00:00:14.40 bitrate= 294.4kbits/frame= 142 fps= 13 q=19.3 size= 518kB time=00:00:15.00 bitrate= 282.6kbits/frame= 147 fps= 13 q=19.4 size= 518kB time=00:00:15.50 bitrate= 273.5kbits/frame= 152 fps= 13 q=20.5 size= 518kB time=00:00:16.00 bitrate= 265.0kbits/frame= 157 fps= 12 q=18.5 size= 518kB time=00:00:16.50 bitrate= 257.0kbits/frame= 162 fps= 12 q=23.1 size= 518kB time=00:00:17.00 bitrate= 249.4kbits/frame= 167 fps= 12 q=19.6 size= 518kB time=00:00:17.50 bitrate= 242.3kbits/frame= 172 fps= 12 q=22.1 size= 518kB time=00:00:18.00 bitrate= 235.5kbits/frame= 177 fps= 12 q=21.2 size= 518kB time=00:00:18.50 bitrate= 229.2kbits/frame= 182 fps= 12 q=15.5 size= 518kB time=00:00:19.00 bitrate= 223.1kbits/frame= 187 fps= 12 q=23.7 size= 518kB time=00:00:19.50 bitrate= 217.4kbits/frame= 192 fps= 12 q=20.4 size= 518kB time=00:00:20.00 bitrate= 212.0kbits/frame= 197 fps= 12 q=25.3 size= 774kB time=00:00:20.50 bitrate= 309.1kbits/frame= 202 fps= 12 q=21.9 size= 774kB time=00:00:21.00 bitrate= 301.8kbits/frame= 207 fps= 12 q=22.2 size= 774kB time=00:00:21.50 bitrate= 294.7kbits/frame= 212 fps= 12 q=23.6 size= 774kB time=00:00:22.00 bitrate= 288.0kbits/frame= 217 fps= 12 q=21.6 size= 774kB time=00:00:22.50 bitrate= 281.6kbits/frame= 222 fps= 12 q=26.1 size= 774kB time=00:00:23.00 bitrate= 275.5kbits/frame= 227 fps= 11 q=23.1 size= 774kB time=00:00:23.50 bitrate= 269.7kbits/frame= 232 fps= 11 q=25.6 size= 774kB time=00:00:24.00 bitrate= 264.0kbits/frame= 237 fps= 11 q=23.8 size= 774kB time=00:00:24.50 bitrate= 258.6kbits/frame= 242 fps= 11 q=17.4 size= 774kB time=00:00:25.00 bitrate= 253.5kbits/frame= 247 fps= 11 q=24.8 size= 774kB time=00:00:25.50 bitrate= 248.5kbits/frame= 251 fps= 11 q=22.1 Lsize= 939kB time=00:00:25.90 bitrate= 296.9kbits/s speed=1.17x
video:927kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.266804%
Exiting normally, received signal 2.

Next activity I will try to mate this SW driven camera operation to ultrasonic distance measuring sensor!

--

--

Shalav Kakati
Shalav Kakati

Written by Shalav Kakati

Grade 11 IBDP student, interested in the intersections of mechanical, electrical and biomedical engineering.

No responses yet