【KV260视觉入门套件试用体验】+05.USB-Camera测试(zmj)
本篇主要介绍在KV260视觉入门套件测试USB-Camera的流程。
---------------------------以下为正文---------------------------
1. 摄像头接口和设备
摄像头设备位于” /dev/video*“(此处仅连接了USB摄像头)。
a.通过设备列表查看
ls -la /dev/video*
b.通过v4l2-ctl工具查看
v4l2-ctl --list-devices
c.通过media0检查有效摄像头节点
media-ctl -d /dev/media0 -p
ubuntu@kria:~/zmj_ws/camera$ ls -la /dev/video*
crw-rw----+ 1 root video 81, 0 Oct 15 13:00 /dev/video0
crw-rw----+ 1 root video 81, 1 Oct 15 13:00 /dev/video1
ubuntu@kria:~/zmj_ws/camera$ v4l2-ctl --list-devices
USB 2.0 Camera: USB Camera (usb-xhci-hcd.0.auto-1.1.1):
/dev/video0
/dev/video1
/dev/media0
ubuntu@kria:~/zmj_ws/camera$ media-ctl -d /dev/media0 -p
Media controller API version 5.15.99
Media device information
------------------------
driver uvcvideo
model USB 2.0 Camera: USB Camera
serial
bus info usb-xhci-hcd.0.auto-1.1.1
hw revision 0x0
driver version 5.15.99
Device topology
- entity 1: USB 2.0 Camera: USB Camera (1 pad, 1 link)
type Node subtype V4L flags 1
device node name /dev/video0
pad0: Sink
<- "Extension 3":1 [ENABLED,IMMUTABLE]
- entity 4: USB 2.0 Camera: USB Camera (0 pad, 0 link)
type Node subtype V4L flags 0
device node name /dev/video1
- entity 8: Extension 3 (2 pads, 2 links)
type V4L2 subdev subtype Unknown flags 0
pad0: Sink
<- "Processing 2":1 [ENABLED,IMMUTABLE]
pad1: Source
-> "USB 2.0 Camera: USB Camera":0 [ENABLED,IMMUTABLE]
- entity 11: Processing 2 (2 pads, 2 links)
type V4L2 subdev subtype Unknown flags 0
pad0: Sink
<- "Camera 1":0 [ENABLED,IMMUTABLE]
pad1: Source
-> "Extension 3":0 [ENABLED,IMMUTABLE]
- entity 14: Camera 1 (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
pad0: Source
-> "Processing 2":0 [ENABLED,IMMUTABLE]
ubuntu@kria:~/zmj_ws/camera$
//------USB摄像头状态
2. USB摄像头测试
将USB摄像头插入开发板,将自动安装 uvc 添加设备节点。
a.确认USB摄像头的设备节点,此处为/dev/video0。
v4l2-ctl --list-devices
b.查看摄像头支持的格式与分辨率
v4l2-ctl --list-formats-ext -d /dev/video0
c.摄像头预览(视频640 x 480)
gst-launch-1.0 v4l2src device=/dev/video0 ! \\
"video/x-raw, width=640, Height=480, framerate=(fraction)30/1" ! \\
queue ! glimagesink
d.摄像头预览(视频1920 x 1080)
gst-launch-1.0 v4l2src device=/dev/video0 ! \\
video/x-raw,format=YUY2,width=1920,height=1080 ! \\
queue ! glimagesink
e.摄像头预览(拍照)
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=3 ! \\
jpegenc ! filesink location=~/pic_of_video0.jpg
//------USB摄像头测试正常
3. 边沿检测
USB摄像头的视频流主要通过python调用OpenCV库完成对每一帧图像的边沿检测,参数调节通过滑动条实时调节以获取更好结果,按下ESC键退出测试程序(不得不说python是真的强大):
python3 ./edge.py 0
或者
python ./edge.py 0
使用USB-Camera,它位于/dev/video0
sudo apt install opencv*
sudo apt install libopencv*
3.1 代码解析
代码功能说明:
a.导入必要的库:cv2、numpy、video 和 sys。
b.创建两个滑动条:cv.namedWindow('edge') 用来显示边缘检测的结果窗口,cv.createTrackbar('thrs1', 'edge', 2000, 5000, nothing) 和 cv.createTrackbar('thrs2', 'edge', 4000, 5000, nothing) 用来设置边缘检测的参数。
c.创建一个视频捕获对象:cap = video.create_capture(fn),其中 fn 是指定的视频文件名。
d.在一个无限循环中,从视频捕获对象中读取帧数据:while True:。
e.将读取的帧数据转换为灰度图像:gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)。
f.对灰度图像进行边缘检测:edge = cv.Canny(gray, thrs1, thrs2, apertureSize=5)。
g.将原始图像和边缘检测结果合并:vis = img.copy(),然后将结果图像中非零像素的部分设为绿色:vis = np.uint8(vis/2.),最后将结果图像显示出来:cv.imshow('edge', vis)。
h.监听窗口的关闭事件:ch = cv.waitKey(5),如果按下了ESC键,则退出循环:if ch == 27:。
i.最后打印程序的文档字符串:print(__doc__),并关闭所有窗口:cv.destroyAllWindows()。
//------完整代码:
from __future__ import print_function
import cv2 as cv
import numpy as np
import video
import sys
def main():
try:
fn = sys.argv[1]
except:
fn = 0
def nothing(*arg):
pass
cv.namedWindow('edge')
cv.createTrackbar('thrs1', 'edge', 2000, 5000, nothing)
cv.createTrackbar('thrs2', 'edge', 4000, 5000, nothing)
cap = video.create_capture(fn)
while True:
_flag, img = cap.read()
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
thrs1 = cv.getTrackbarPos('thrs1', 'edge')
thrs2 = cv.getTrackbarPos('thrs2', 'edge')
edge = cv.Canny(gray, thrs1, thrs2, apertureSize=5)
vis = img.copy()
vis = np.uint8(vis/2.)
vis[edge != 0] = (0, 255, 0)
cv.imshow('edge', vis)
ch = cv.waitKey(5)
if ch == 27:
break
print('Done')
if __name__ == '__main__':
print(__doc__)
main()
cv.destroyAllWindows()
3.2 测试效果
基于USB-Camera的边沿检测测试结果如图所示:
//------end