[原创] 【VisionFive 2:集成3D GPU RISC-V单板计算机】+05.Camera功能测试与边沿检测(zmj)

卿小小   2023-7-23 19:23 楼主

【VisionFive 2:集成3D GPU RISC-V单板计算机】+05.Camera功能测试与边沿检测(zmj)

 

赛昉科技的“昉·星光 2”开发板提供了2-Lane的MIPI-CSI摄像头接口,可以接入编号9的连接器,兼容树莓派IMX219 MIPI 摄像头;同时还支持常见的USB摄像头(UVC),可以接入编号17和编号18的USB3.0接口。(详细参见接口描述)

手上只有USB摄像头,因此主要测试内容围绕USB-Camera展开。

//------赛昉科技的“昉·星光 2”开发板的/dev/Video*设备说明:
a.一般情况下, /dev/video1 为 MIPI CSI 连接的摄像头,兼容树莓派IMX219 MIPI 摄像头;
b.而 /dev/video4 则为USB摄像头。

//------UVC / USB-Camera
UVC通俗的讲就是USB摄像头,全称为USB Video Class,即:USB视频类,是一种为USB视频捕获设备定义的协议标准。

1. 摄像头接口和设备

1.1 摄像头接口

编号9连接器为MIPI-CSI摄像头接口,编号17和编号18为USB3.0接口(一共四个接口,任选一个即可)。

//------昉·星光 2的MIPI-CSI接口原理图

image-20230723155157390.png

//------昉·星光 2外观(顶部视图)

image-20230711084125774.png

//------昉·星光 2接口详细说明

image-20230711084340021.png

1.2 摄像头设备

摄像头设备位于” /dev/video*“。一般情况下, /dev/video1 为 MIPI CSI 连接的摄像头,而 /dev/video4 则为USB摄像头。

当前赛昉科技提供的“昉·星光 2”开发板系统镜像在设备树(system.dtsi)中已经写入了MIPI-CSI接口,因此可以在” /dev/video* “摄像头设备中可以看到MIPI-CSI摄像头video0。

(此处仅连接了USB摄像头)

//------查看摄像头设备节点
a.通过设备列表查看
ls -la /dev/video*
b.通过v4l2-ctl工具查看
v4l2-ctl --list-devices
c.通过media0检查有效摄像头节点
media-ctl -d /dev/media0 -p

//------示例Log信息
root@starfive:/home/user/zmj_ws/2_base_function/usb_camera# ls -la /dev/video*
crw-rw----+ 1 root video 81, 0 Dec 22  2022 /dev/video0
crw-rw----+ 1 root video 81, 1 Dec 22  2022 /dev/video1
crw-rw----+ 1 root video 81, 2 Dec 22  2022 /dev/video2
crw-rw----+ 1 root video 81, 3 Dec 22  2022 /dev/video3
crw-rw----+ 1 root video 81, 6 Jul 13 07:06 /dev/video4
crw-rw----+ 1 root video 81, 7 Jul 13 07:06 /dev/video5
crw-rw----+ 1 root video 81, 4 Dec 22  2022 /dev/video6
crw-rw----+ 1 root video 81, 5 Dec 22  2022 /dev/video7
root@starfive:/home/user/zmj_ws/2_base_function/usb_camera# v4l2-ctl --list-devices
Starfive Camera Subsystem (platform:19800000.vin_sysctl):
        /dev/video0
        /dev/video1
        /dev/video2
        /dev/video3
        /dev/video6
        /dev/video7

USB 2.0 Camera: USB Camera (usb-0000:01:00.0-1.1.1):
        /dev/video4
        /dev/video5
        /dev/media0

root@starfive:/home/user/zmj_ws/2_base_function/usb_camera# media-ctl -d /dev/media0 -p
Media controller API version 5.15.0

Media device information
------------------------
driver          uvcvideo
model           USB 2.0 Camera: USB Camera
serial
bus info        usb-0000:01:00.0-1.1.1
hw revision     0x0
driver version  5.15.0

Device topology
- entity 1: USB 2.0 Camera: USB Camera (1 pad, 1 link)
            type Node subtype V4L flags 1
            device node name /dev/video4
        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/video5

- 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]

root@starfive:/home/user/zmj_ws/2_base_function/usb_camera#
image-20230723161317488.png

2. USB摄像头测试

将USB摄像头插入开发板,将自动安装 uvc 添加设备节点。

//------USB-Camera(某宝几十块买的USB摄像头)
a.确认USB摄像头的设备节点,此处为/dev/video4。
v4l2-ctl --list-devices
b.查看摄像头支持的格式与分辨率
v4l2-ctl --list-formats-ext -d /dev/video4
c.摄像头预览(视频)
gst-launch-1.0 v4l2src device=/dev/video4 io-mode=2 ! \
'video/x-raw, format=YUY2, \
width=640, height=480, framerate=30/1' ! \
waylandsink window-x=0 window-y=0 window-width=1024 window-height=600
或者
ffplay -f video4linux2 -framerate 30 -video_size hd720 /dev/video4
d.摄像头预览(拍照)
gst-launch-1.0 v4l2src device=/dev/video4 num-buffers=3 ! jpegenc ! filesink location=/home/user/pic_of_video4.jpg
e.USB-Camera设备信息(查看硬件变动信息即可)
dmesg | tail -11

//------示例Log信息:
root@starfive:/home/user/zmj_ws/2_base_function/usb_camera# v4l2-ctl --list-devices
Starfive Camera Subsystem (platform:19800000.vin_sysctl):
        /dev/video0
        /dev/video1
        /dev/video2
        /dev/video3
        /dev/video6
        /dev/video7

USB 2.0 Camera: USB Camera (usb-0000:01:00.0-1.1.1):
        /dev/video4
        /dev/video5
        /dev/media0

root@starfive:/home/user/zmj_ws/2_base_function/usb_camera# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 1b3f:2008 Generalplus Technology Inc. Usb Audio Device
Bus 001 Device 004: ID 0c45:6362 Microdia USB 2.0 Camera
Bus 001 Device 003: ID 1a40:0801 Terminus Technology Inc. USB 2.0 Hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
root@starfive:/home/user/zmj_ws/2_base_function/usb_camera# dmesg | tail -11
[ 2436.999646] usb 1-1.1: new high-speed USB device number 3 using xhci_hcd
[ 2437.132956] hub 1-1.1:1.0: USB hub found
[ 2437.137059] hub 1-1.1:1.0: 4 ports detected
[ 2437.459596] usb 1-1.1.1: new high-speed USB device number 4 using xhci_hcd
[ 2437.673459] usb 1-1.1.1: Found UVC 1.00 device USB 2.0 Camera (0c45:6362)
[ 2437.710207] input: USB 2.0 Camera: USB Camera as /devices/platform/soc/2b000000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1/1-1.1.1/1-1.1.1:1.0/input/input0
[ 2437.819578] usb 1-1.1.3: new full-speed USB device number 5 using xhci_hcd
[ 2437.957029] usb 1-1.1.3: config 1 has an invalid interface number: 3 but max is 2
[ 2437.964715] usb 1-1.1.3: config 1 has no interface number 1
[ 2438.012348] input: Generalplus Usb Audio Device as /devices/platform/soc/2b000000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1/1-1.1.3/1-1.1.3:1.3/0003:1B3F:2008.0001/input/input1
[ 2438.099988] hid-generic 0003:1B3F:2008.0001: input: USB HID v2.01 Device [Generalplus Usb Audio Device] on usb-0000:01:00.0-1.1.3/input3
image-20230723164313174.png

 

//------视频功能测试

uvc_01

 

3. 边沿检测

USB摄像头的视频流主要通过python调用OpenCV库完成对每一帧图像的边沿检测,参数调节通过滑动条实时调节以获取更好结果,按下ESC键退出测试程序(不得不说python是真的强大):

//------基于OPENCV的摄像头视频边沿检测
//---指令(python2或者python3均可以):
python3 ./edge.py 4
或者
python ./edge.py 4
//---指令中的参数”4“说明:
使用USB-Camera,它位于/dev/video4
//------依赖(根据错误提示安装对应的依赖库及以来组件):
sudo apt install opencv*
sudo apt install libopencv*
sudo apt install gststream*

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()。

//------完整代码:

#!/usr/bin/env python

from __future__ import print_function

import cv2 as cv
import numpy as np

# relative module
import video

# built-in module
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 测试效果

//------原图:

image-20230723172026109.png

//------检测效果(参数合适):

image-20230723172706409.png
 

//------检测效果(低参):丢失了很多检测细节

image-20230723172623420.png

//------检测效果(高参):此时引入了很多图像噪点

image-20230723172800104.png

//------检测效果

uvc_02_edge

 

4. 视频缩放ZOOM

//------检测效果

uvc_03_zoom

 

//------END

 

 

回复评论 (1)

边缘检测这个好像500ms? 视频本身有点卡顿,是分辨率太大了还是响应问题?

默认摸鱼,再摸鱼。2022、9、28
点赞  2023-7-28 23:28
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复