RK3588使用OV5695摄像头

本文记录了在RK3588开发板上使用OV5695摄像头遇到的OpenCV警告和帧率下降问题。通过v4l2测试摄像头并查看设备参数,尝试用OpenCV和Python进行调用。尽管OpenCV能成功打开摄像头,但存在警告和帧率降低至1.7帧的问题。作者提供了测试代码和GStreamer管道设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2023-04-21记录。

重新安装OpenCV后,能够运行了,但是还有点瑕疵:

  • 1、提示警报【未解决】:
[ WARN:0] OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
[ WARN:0] OpenCV | GStreamer warning: GStreamer: unhandled property
  • 2、摄像头会掉帧严重,从30帧掉到1.7帧【未解决】

1、测试

参考:
1、(二十一)实践出真知——opecv调取摄像头、使用gstreamer访问mipi摄像头
2、Ubuntu系统下查看摄像头参数并基于OpenCV调用
3、Ubuntu 下使用opencv打开usb 摄像头

环境:RK3588、Ubuntu20.04、Python3.8、OpenCV3.4.16

1.1、查看摄像头列表

在终端中使用命令来查看设备:

v4l2-ctl --list-devices

得到的结果为:

topeet@iTOP-RK3588:~ $ v4l2-ctl --list-devices
rk_hdmirx (fdee0000.hdmirx-controller):
        /dev/video20

rkisp-statistics (platform: rkisp):
        /dev/video18
        /dev/video19

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

rkisp_mainpath (platform:rkisp0-vir0):
        /dev/video11
        /dev/video12
        /dev/video13
        /dev/video14
        /dev/video15
        /dev/video16
        /dev/video17

查看摄像头是哪个:

media-ctl -d /dev/media1 -e "rkisp_mainpath"

在这里插入图片描述
前几个video被其他媒体设备占用了,内核自动分配的

查看各相机支持的分辨率、帧率、像素格式等参数

v4l2-ctl -d /dev/video11 --list-formats-ext

得到下面的结果:

ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture Multiplanar

        [0]: 'UYVY' (UYVY 4:2:2)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [1]: '422P' (Planar YUV 4:2:2)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [2]: 'NV16' (Y/CbCr 4:2:2)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [3]: 'NV61' (Y/CrCb 4:2:2)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [4]: 'YM16' (Planar YUV 4:2:2 (N-C))
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [5]: 'NV21' (Y/CrCb 4:2:0)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [6]: 'NV12' (Y/CbCr 4:2:0)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [7]: 'NM21' (Y/CrCb 4:2:0 (N-C))
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [8]: 'NM12' (Y/CbCr 4:2:0 (N-C))
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [9]: 'YU12' (Planar YUV 4:2:0)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [10]: 'YM24' (Planar YUV 4:4:4 (N-C))
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [11]: 'RGGB' (8-bit Bayer RGRG/GBGB)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [12]: 'GRBG' (8-bit Bayer GRGR/BGBG)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [13]: 'GBRG' (8-bit Bayer GBGB/RGRG)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [14]: 'BA81' (8-bit Bayer BGBG/GRGR)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [15]: 'RG10' (10-bit Bayer RGRG/GBGB)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [16]: 'BA10' (10-bit Bayer GRGR/BGBG)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [17]: 'GB10' (10-bit Bayer GBGB/RGRG)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [18]: 'BG10' (10-bit Bayer BGBG/GRGR)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [19]: 'RG12' (12-bit Bayer RGRG/GBGB)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [20]: 'BA12' (12-bit Bayer GRGR/BGBG)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [21]: 'GB12' (12-bit Bayer GBGB/RGRG)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8
        [22]: 'BG12' (12-bit Bayer BGBG/GRGR)
                Size: Stepwise 32x16 - 4672x3504 with step 8/8

1.2、用v4l2测试摄像头

在itop开发板上,根据文档连接好摄像头,摄像头对准缺口方向连接好,默认是J1接口。

使用官方给的Ubuntu20.04镜像,在终端输入以下命令来测试摄像头是否正常:

gst-launch-1.0 v4l2src device=/dev/video11 ! \video/x-raw,format=NV12,width=800,height=1280,framerate=30/1 ! autovideosink

或者是:

gst-launch-1.0 v4l2src device=/dev/video%d ! video/x-raw,format=NV12,width=%d,height=%d,framerate=%d/1 ! appsink

在这里插入图片描述
在这里插入图片描述

2、OpenCV调用摄像头

测试代码UseOV5695.cpp文件:

#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{

    std::cout << "Built with OpenCV " << CV_VERSION << std::endl;

	  // 3种打开方式,3选一
	  // 只有方式1能够正确打开摄像头
     
    // 打开方式1:
     cv::VideoCapture capture;
     capture.open(11);
    
    // 打开方式2:
    //cv::VideoCapture capture;
    //capture.open("/dev/video11", cv::CAP_V4L2);
    
    // 打开方式3:
    // cv::VideoCapture capture("/dev/video11", cv::CAP_V4L2);
    // capture.open("/dev/video11", cv::CAP_V4L2);


    // capture.open("/home/topeet/Documents/TOB/video/down.avi"); // 打开视频文件

    

    bool isOpenCamera = capture.isOpened();
    if (!isOpenCamera)
    {
        std::cout << "the 'open' funtion fails to open the OV5695" << std::endl;
        return -1;
    }
    // capture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
    capture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('N', 'V', '1', '2'));
    // capture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
    capture.set(cv::CAP_PROP_FRAME_WIDTH, 800);
    capture.set(cv::CAP_PROP_FRAME_HEIGHT, 1280);
    capture.set(cv::CAP_PROP_FPS, 30);

    cv::Mat frame;
    while (1)
    {
        capture >> frame;
        // capture.read(frame); // 读取视频帧
        if (!frame.empty())
        {
            cv::imshow("frame", frame);
        }
        else
        {
            std::cout << "fail to open the OV5695! The frame is empty!!" << std::endl;
            break;
        }
        if (cv::waitKey(1) == 27)
            break;
    }

    return 0;
}

构建可执行文件:

g++ UseOV5695.cpp -o UseOV6595 `pkg-config --cflags --libs opencv`

构建可执行程序CMakeLists.txt文件:

cmake_minimum_required(VERSION 2.8)
project(OpenCVUseOV5695)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

add_executable(OpenCVUseOV5695 UseOV5695.cpp)

编译文件,得到可执行文件,在串口中运行文件,得到的结果如图:

topeet@iTOP-RK3588:~/Documents/testOV5695/OpenCVUseOV5695 $ g++ UseOV5695.cpp -o UseOV6595 `pkg-config --cflags --libs opencv`
topeet@iTOP-RK3588:~/Documents/testOV5695/OpenCVUseOV5695 $ sudo ./UseOV6595    Built with OpenCV 3.4.16
[ WARN:0] OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
[ WARN:0] OpenCV | GStreamer warning: GStreamer: unhandled property

在这里插入图片描述

3、Python调用摄像头

测试代码:

import cv2
import time

def main():
    # 使用GStreamer管道从MIPI摄像头捕获视频,添加视频帧率
    gst_pipeline = 'v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 ! appsink'
    # 从GStreamer管道创建OpenCV VideoCapture对象
    cap = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)

    if not cap.isOpened():
        # 如果无法打开摄像头,则输出提示信息
        print("无法打开摄像头")
        return
    time0 = time.time() # 获取开始时间
    while True:
        # 从摄像头捕获帧
        ret, frame = cap.read()
        frame = cv2.cvtColor(frame, cv2.COLOR_YUV2BGR_NV12)
        # 如果捕获到帧,则显示它
        if ret:
            time1 = time.time() # 获取结束时间
            fps = 1 / (time1 - time0) # 计算实时帧率
            time0 = time1 # 更新开始时间
            cv2.putText(frame, "FPS: {:.2f}".format(fps), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) # 在图像上显示帧率
            cv2.imshow("MIPI Camera", frame)
        # 按下'q'键退出循环
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break

    # 释放资源并关闭窗口
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

在终端上运行:
在这里插入图片描述
在这里插入图片描述

### RK3588OV5648摄像头模块的兼容性和配置 #### 配置环境准备 对于RK3588平台来说,在硬件/rockchip/camera/Config/user.mk文件中增加对传感器的支持是常见的做法。当涉及到OV5648这样的具体型号时,同样可以在对应的路径下添加支持[^1]。 #### 修改设备树(DTS) 大多数情况下,SOC平台会提供详细的开发文档指导如何集成新的传感器。针对OV5648摄像头模块而言,主要工作集中在修改DTS(Device Tree Source)文件上。这通常涉及定义I2C接口参数以及连接到CSI通道的具体设置。例如: ```dts &i2c0 { status = "okay"; ov5648@3c{ compatible = "ovti,ov5648"; reg = <0x3c>; pinctrl-names = "default"; pinctrl-0 = <&cam_io>; clock-frequency = <1000000>; reset-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>; powerdown-gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>; vddcore-supply = <&vcc_ana>; vdda-supply = <&vcc_cam_2v8>; vdddio-supply = <&vcc_cam_1v8>; mclk = <&csi_mclk>; csi-port = <0>; mipi-lanes = <4>; }; }; ``` 这段代码展示了如何通过DeviceTree描述符指定OV5648的相关属性并将其链接至系统的其余部分[^3]。 #### 编译内核和固件更新 完成上述更改后,重新编译Linux内核并将生成的新镜像刷入目标板卡。确保所有必要的驱动程序都已包含在最终映像之中。如果一切顺利的话,重启系统后应该能够识别并正常运行所连接的OV5648相机模组。 #### 测试验证 最后一步是对整个过程的结果进行测试验证。可以利用V4L2工具集来进行基本功能检测,比如捕获图像帧数据等操作。命令如下所示: ```bash ffmpeg -f video4linux2 -input_format yuyv422 -video_size 1920x1080 -framerate 30 -i /dev/video0 output.mp4 ``` 这条指令将会录制一段视频保存为output.mp4文件用于后续分析评估目的。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值