22. 摄像头¶
22.1. 使能设备树插件¶
想要使能OV5640摄像头需要使能74hc595和cam两个设备树插件, 同时摄像头设备树插件和LED的设备树插件用到重复的引脚,需关闭LED相关的设备树插件, 如果还想要在LCD液晶屏上显示摄像头的内容还需要使能lcd的设备树插件, 如下所示
1 2 3 4 | dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-74hc595.dtbo
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-cam.dtbo
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-lcd.dtbo
#dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-led.dtbo
|
22.2. v4l-utils工具使用¶
v4l-utils工具安装
1 | sudo apt install v4l-utils
|
查看可用的视频设备,其中/dev/video1对应OV5640的物理设备
1 2 3 4 5 6 7 8 9 | #执行命令
v4l2-ctl --list-devices
#显示信息如下
i.MX6S_CSI (platform:21c4000.csi):
/dev/video1
pxp (pxp_v4l2):
/dev/video0
|
查看摄像头所有参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #执行命令
sudo v4l2-ctl -d /dev/video1 --all
#显示信息如下
Driver Info:
Driver name : mx6s-csi
Card type : i.MX6S_CSI
Bus info : platform:21c4000.csi
Driver version : 4.19.35
Capabilities : 0x84200001
Video Capture
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x04200001
Video Capture
Streaming
Extended Pix Format
Priority: 0
Video input : 0 (Camera: ok)
Format Video Capture:
Width/Height : 0/0
Pixel Format : ''
Field : Any
Bytes per Line : 0
Size Image : 0
Colorspace : Default
Transfer Function : Default (maps to Rec. 709)
YCbCr/HSV Encoding: Default (maps to ITU-R 601)
Quantization : Default (maps to Full Range)
Flags :
Crop Capability Video Capture:
Bounds : Left 0, Top 0, Width 0, Height 0
Default : Left 0, Top 0, Width 0, Height 0
Pixel Aspect: 1/1
Crop: Left 0, Top 0, Width 0, Height 0
Streaming Parameters Video Capture:
Capabilities : timeperframe
Frames per second: 30.000 (30/1)
Read buffers : 0
|
查看摄像头所支持的分辨率
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #执行命令
sudo v4l2-ctl --list-formats-ext -d /dev/video1
#显示信息如下
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 640x480
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 320x240
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 720x480
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 720x576
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 1920x1080
Interval: Discrete 0.067s (15.000 fps)
Size: Discrete 2592x1944
Interval: Discrete 0.067s (15.000 fps)
Size: Discrete 176x144
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 1024x768
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.033s (30.000 fps)
|
22.3. 安装gstreamer¶
可以使用gstreamer对摄像头做个简单测试,安装命令如下 (当开发板已经烧录了带QT库镜像时不用执行)
1 | sudo apt install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools
|
22.3.1. 简单测试¶
使用以下命令可对摄像头进行录制视频、拍照或将摄像头的拍摄到的视频显示到显示屏上。
1 2 3 4 5 6 7 8 9 | #录制视频
sudo gst-launch-1.0 -v v4l2src device=/dev/video1 ! "video/x-raw, format=(string)YUY2, width=(int)640,height=(int)480, framerate=(fraction)15/1" ! videoconvert ! avimux ! filesink location=webcam.avi
#在LCD屏幕上显示摄像头的内容
sudo gst-launch-1.0 -v v4l2src device=/dev/video1 ! "video/x-raw, format=(string)YUY2, width=(int)640, height=(int)480, framerate=(fraction)15/1" ! videoconvert ! fbdevsink
#拍照 (拍照命令对使用OV5640摄像头有问题,建议使用 USB免驱摄像头 章节部分的用的摄像头)
sudo gst-launch-1.0 v4l2src num-buffers=1 device=/dev/video1 ! jpegenc ! filesink location=picture.jpg
|
22.4. 摄像头设备树插件¶
野火imx6ull提供了很多的设备树插件源码,若想要修改不同的引脚作为v5640摄像头的引脚, 可参考:
设备树插件 imx-fire-cam-overlay.dts ,源码如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | /dts-v1/;
/plugin/;
#include "imx6ul-pinfunc.h"
#include "dt-bindings/gpio/gpio.h"
#include "dt-bindings/clock/imx6ul-clock.h"
#include "imx6ull-pinfunc-snvs.h"
/ {
fragment@0 {
target=<&i2c2>;
__overlay__ {
#address-cells = <1>;
#size-cells = <0>;
ov5640: ov5640@3c {
compatible = "ovti,ov5640";
reg = <0x3c>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_csi1>;
clocks = <&clks IMX6UL_CLK_CSI>;
clock-names = "csi_mclk";
pwn-gpios = <&gpio_spi 6 1>;
rst-gpios = <&gpio_spi 5 0>;
csi_id = <0>;
mclk = <24000000>;
mclk_source = <0>;
status = "okay";
port {
ov5640_ep: endpoint {
remote-endpoint = <&csi1_ep>;
};
};
};
};
};
fragment@1 {
target=<&iomuxc>;
__overlay__ {
pinctrl_csi1: csi1grp {
fsl,pins = <
MX6UL_PAD_CSI_MCLK__CSI_MCLK 0x1b088
MX6UL_PAD_CSI_PIXCLK__CSI_PIXCLK 0x1b088
MX6UL_PAD_CSI_VSYNC__CSI_VSYNC 0x1b088
MX6UL_PAD_CSI_HSYNC__CSI_HSYNC 0x1b088
MX6UL_PAD_CSI_DATA00__CSI_DATA02 0x1b088
MX6UL_PAD_CSI_DATA01__CSI_DATA03 0x1b088
MX6UL_PAD_CSI_DATA02__CSI_DATA04 0x1b088
MX6UL_PAD_CSI_DATA03__CSI_DATA05 0x1b088
MX6UL_PAD_CSI_DATA04__CSI_DATA06 0x1b088
MX6UL_PAD_CSI_DATA05__CSI_DATA07 0x1b088
MX6UL_PAD_CSI_DATA06__CSI_DATA08 0x1b088
MX6UL_PAD_CSI_DATA07__CSI_DATA09 0x1b088
>;
};
};
};
fragment@2 {
target = <&csi>;
__overlay__ {
status = "okay"; /* 摄像头总线使能 */
port {
csi1_ep: endpoint {
remote-endpoint = <&ov5640_ep>;
};
};
};
};
};
|
若想更改使用具有csi功能的引脚只需修改上面的标记部分的内容即可。
22.5. USB免驱摄像头¶
当插入UVC(全称USB Video Class)免驱摄像头时, 内核将会打印信息,使用lsusb再次查看lsusb设备时可发现多了一个新的USB设备。 同时在 /dev/ 目录下将多出新的video设备,其中 /dev/video2 则为USB摄像头设备, 不同板子的摄像头设备文件可能不同。
本实验使用的设备为 罗技 B525摄像头 (或者找其他树莓派可以使用的USB免驱摄像头)
注意得支持USB2.0的,可以先在PC上的ubuntu测试可以用再在板子上试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | root@npi:~# lsusb
Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
root@npi:~# [ 1988.776119] usb 1-1.3: new high-speed USB device number 4 using ci_hdrc
[ 1991.298210] uvcvideo: Found UVC 1.00 device HD Pro Webcam C920 (046d:082d)
[ 1991.324787] input: HD Pro Webcam C920 as /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.3/1-1.3:1.0/input/input3
root@npi:~# lsusb
Bus 001 Device 004: ID 046d:082d Logitech, Inc. HD Pro Webcam C920
Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
root@npi:~# ls -l /dev/video*
crw-rw---- 1 root video 81, 0 Feb 2 10:36 /dev/video0
crw-rw---- 1 root video 81, 1 Feb 2 10:36 /dev/video1
crw-rw---- 1 root video 81, 2 Feb 2 10:36 /dev/video2
crw-rw---- 1 root video 81, 3 Feb 2 10:36 /dev/video3
|
若提示找不到lsusb命令,可使用 sudo apt install usbutils 安装usbutils。
关于USB摄像头的相关操作与章节前面介绍的OV5640摄像头控制方式完全相同,请参照章节前面说明。