rk3399上opencv使用gstreamer访问mipi摄像头

环境

硬件:友善之臂NanoPi T4

rk3399:

  • Big.Little 架构:双核Cortex-A72 + 四核 Cortex-A53 架构,64位CPU
  • 主频超过1.8GHz

软件:rk3399-eflasher-friendlydesktop-bionic-4.4-arm64-20181219.img

这是友善之臂定制的一个基于ubuntu18.04的64位操作系统。

探索思路

自己买了一个配套的mipi接口的0v4689摄像头。官方的例子是通过一个shell脚本来访问的,通过打印信息,发现最终执行的命令如下:

gst-launch-1.0 rkisp io-mode=4 path-iqf=/etc/cam_iq/rk-ov4689.xml ! video/x-raw,format=NV12,width=1280,height=720,framerate=30/1 ! rkximagesink

也就是调用gst-launch-1.0,使用gstreamer框架访问摄像头。

而我需要在程序中访问摄像头画面,特别是想在opencv中访问。

通过搜索发现,opencv也可以访问gstream的,但是ubuntu源或者pip安装的预编译版本未开启gstreamer,需要自己手动编译。

编译安装支持gstreamer版本的opencv

我下载的是opencv3.4.2的源码。在rk3399上编译安装。

编译之前需要安装依赖的包:

apt-get update
apt-get install -y 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 \
            libgstreamer1.0-dev \
            libgstreamer-plugins-base1.0-dev

apt-get install libpng12-0
apt-get install -y \
        build-essential \
        cmake \
        git
apt-get install -y pkg-config \
        libjpeg8-dev
apt-get install -y libgtk2.0-dev \
        libavcodec-dev \
        libavformat-dev \
        libswscale-dev \
        libv4l-dev \
        libatlas-base-dev \
        gfortran \
        libhdf5-dev
apt-get install libjpeg-dev
apt-get install libtiff4-dev
apt-get install -y libtbb-dev libeigen3-dev

编译opencv的cmake命令:

# cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local  -D INSTALL_C_EXAMPLES=OFF  -D INSTALL_PYTHON_EXAMPLES=ON   -D BUILD_EXAMPLES=ON  -D PYTHON_EXECUTABLE=/usr/bin/python3  -D PYTHON_NUMPY_INCLUDE_DIRS=/usr/local/lib/python3.6/dist-packages/numpy/core/include/  -D WITH_GSTREAMER=ON -D WITH_GTK=ON  -D WITH_GTHREAD=ON -D WITH_TBB=ON   -DWITH_OPENGL=ON  ..

注意上面我指定了python3的环境目录,因为一会我要用python接口调用opencv,只使用c++接口的可以去掉python相关的选项。-D WITH_GSTREAMER=ON是为了开启gstreamer。

编译和安装

# make -j 6 
# make install

测试代码

这里使用python调用opencv。

上面说了,shell脚本调用gst-launch-1.0的参数如下:

gst-launch-1.0 rkisp io-mode=4 path-iqf=/etc/cam_iq/rk-ov4689.xml ! video/x-raw,format=NV12,width=1280,height=720,framerate=30/1 ! rkximagesink

在opencv中构建gstreamer的pipeline需要调整为:

rkisp io-mode=4 path-iqf=/etc/cam_iq/rk-ov4689.xml ! video/x-raw,format=NV12,width=740 ,height=360,framerate=30/1  ! videoconvert !appsink

下面是完整代码:

import numpy as np
import cv2 as cv

#cap = cv.VideoCapture('demo.mp4')
cap = cv.VideoCapture('rkisp io-mode=4 path-iqf=/etc/cam_iq/rk-ov4689.xml ! video/x-raw,format=NV12,width=740 ,height=360,framerate=30/1 ! videoconvert ! appsink', cv.CAP_GSTREAMER)

if not cap.isOpened():
    print("Cannot capture from camera. Exiting.")
    os._exit()
last_time = time.time()

while(True):

    ret, frame = cap.read()
    cv.imshow('frame', frame)

    if cv.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv.destroyAllWindows()

我发现在NanoPC T4开发板上,这样访问摄像头对于画面分辨率会有要求,分辨率高于740x360就会出现画面上下割裂的情况,很像是两个线程处理一个buffer没同步好,我自己是gstreamer初学者,暂时不清楚怎么解决这个问题。不知道是rock官方该背锅还是友善之臂该背锅(论硬件平台成熟的重要性,此处省去三千字…)。而用gst-launch-1.0访问无论多大分辨率都不会有此问题。

我暂时只使用740x360这个分辨率。

割裂的画面如下:

rk3399上opencv使用gstreamer访问mipi摄像头_第1张图片

其实割裂位置的上下画面都是流畅的,但是时间差了半秒左右,实在是神奇的很。

参考资料

TX2 上使用opencv 调用板载mipi摄像头:https://www.cnblogs.com/chay/p/10287902.html

这个人编译rock gstreamer很擅长:http://blog.sina.com.cn/s/blog_a6559d920102yy4o.html

编译opencv支持gstream的方法:https://github.com/junjuew/Docker-OpenCV-GStreamer/blob/master/opencv3-gstreamer1.0-Dockerfile

Ubuntu 18.04: How to install OpenCV https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/

你可能感兴趣的:(机器学习,芯片/硬件,机器视觉,环境配置,深度计算加速,嵌入式深度学习)