rk3588 利用opencv打开摄像头(MIPI或USB)

1 查看v4l2设备

firefly@firefly:~/opencv_cam$ v4l2-ctl --list-devices
rk_hdmirx (fdee0000.hdmirx-controller):
        /dev/video40

rkisp-statistics (platform: rkisp):
        /dev/video29
        /dev/video30
        /dev/video38
        /dev/video39

rkcif-mipi-lvds2 (platform:rkcif):
        /dev/media0
        /dev/media1

rkcif (platform:rkcif-mipi-lvds2):
        /dev/video0
        /dev/video1
        /dev/video2
        /dev/video3
        /dev/video4
        /dev/video5
        /dev/video6
        /dev/video7
        /dev/video8
        /dev/video9
        /dev/video10

rkcif (platform:rkcif-mipi-lvds3):
        /dev/video11
        /dev/video12
        /dev/video13
        /dev/video14
        /dev/video15
        /dev/video16
        /dev/video17
        /dev/video18
        /dev/video19
        /dev/video20
        /dev/video21

rkisp_mainpath (platform:rkisp0-vir2):
        /dev/video22
        /dev/video23
        /dev/video24
        /dev/video25
        /dev/video26
        /dev/video27
        /dev/video28
        /dev/media2

rkisp_mainpath (platform:rkisp1-vir0):
        /dev/video31
        /dev/video32
        /dev/video33
        /dev/video34
        /dev/video35
        /dev/video36
        /dev/video37
        /dev/media3

2 当前video*节点确认

我的是双目摄像头,media2与media3,共两个,对应video22,video31

firefly@firefly:~/opencv_cam$ media-ctl -p -d /dev/media2 -e rkisp_mainpath
Media controller API version 5.10.160

Media device information
------------------------
driver          rkisp0-vir2
model           rkisp0
serial
bus info
hw revision     0x0
driver version  5.10.160

- entity 6: rkisp_mainpath (1 pad, 1 link)
            type Node subtype V4L flags 0
            device node name /dev/video22
        pad0: Sink
                <- "rkisp-isp-subdev":2 [ENABLED]

firefly@firefly:~/zack_test_dir/opencv_cam$ media-ctl -p -d /dev/media3 -e rkisp_mainpath
Media controller API version 5.10.160

Media device information
------------------------
driver          rkisp1-vir0
model           rkisp0
serial
bus info
hw revision     0x0
driver version  5.10.160

- entity 6: rkisp_mainpath (1 pad, 1 link)
            type Node subtype V4L flags 0
            device node name /dev/video31
        pad0: Sink
                <- "rkisp-isp-subdev":2 [ENABLED]

3 opencv代码如下

本代码是打开video22,如果需要video31则修改即可

#define HAVE_OPENCV_VIDEO
#define HAVE_OPENCV_VIDEOIO

#include 
#include 
#include 

int main() {
    const int width = 1920;
    const int height = 1080;
    const int fps = 30;

    cv::VideoCapture capture(22);
    if (!capture.isOpened()) {
        std::cout << "无法打开摄像头" << std::endl;
        return -1;
    }
    capture.set(cv::CAP_PROP_FRAME_WIDTH, width);
    capture.set(cv::CAP_PROP_FRAME_HEIGHT, height);
    capture.set(cv::CAP_PROP_FPS, fps);
    //capture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('N', 'V', '1', '2'));
    cv::Mat frame;
    while (true) {
        capture >> frame;
        if (frame.empty()) {
            std::cout << "无法获取帧" << std::endl;
            break;
        }
        cv::imshow("摄像头预览", frame);
        if (cv::waitKey(1) == 27) {
            break;
        }
    }
    capture.release();
    cv::destroyAllWindows();
    return 0;
}

4 编译&&执行

sudo g++ opencv_cam.cpp -o opencv_cam -I /usr/include/aarch64-linux-gnu/ -I /usr/include/opencv4/  -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_videoio -pthread -lz -ldl
./opencv_cam

5 疑问与总结

本次是打开mipi摄像头成功,但是每次运行都有关于gstreamer的打印,猜测是否opencv底层打开摄像头框架就是使用gst框架,也就是说opencv打开video*节点都需要借助类似gst的插件去打开

firefly@firefly:~//opencv_cam$ [ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (935) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1

你可能感兴趣的:(opencv,人工智能,计算机视觉)