开发板上支持一路MIPI-CSI接口,默认使用的配件是gc8034摄像头。图像数据的流向为
GC8034 -> MIPI CSI2 -> ISP0
目前在开发板上,应用层获取数据的来源为ISP0。目前RK平台上面全部支持V4L2接口获取数据,但是RK平台的V4L2并不是完整版本,因此不能直接使用opencv的v4l2来拉取数据。如果直接使用会提示有一个V4L2的ioctl命令不能支持。但如果在此平台上使用USB摄像头的话,是可以支持openCV直接调用V4L2的。
不过这里有一个折中的方式。RK已经在他们的debian等系统里面适配了Gstreamer,板上Debian系统里面的Gstreamer是被修改过的,增加了一个名为gstreamer-rockchip的插件,能够支持RK 的ISP组件。
默认的测试命令为
gst-launch-1.0 v4l2src device=/dev/video22 ! video/x-raw, format=NV12, width=1632, height=1224, framerate=30/1 ! autovideosink
其中 "device=" 后面跟的设备名需要根据实际填写,这些参数可以参考camera的教程
开发板接显示器,使用应用程序LX终端执行之后,可以看到显示出了摄像头画面,说明gstreamer功能可用
板上本身是有opencv的,但是不支持gstreamer,因此,需要重新编译安装一个支持 gstreamer 的版本。
首先执行相关软件包的安装
sudo su
apt-get update
apt-get install gcc g++
apt-get install aptitude
aptitude install build-essential
apt-get install cmake libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev python3-dev python3-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev libunwind-dev
接下来下载opencv,用哪个版本都差不多,笔者这里用的是4.5.1。opencv源码下载地址为https://github.com/opencv/opencv/releases。下载之后执行解压
tar -zxvf opencv-4.5.1.tar.gz
然后创建一个编译目录
cd opencv-4.5.1
mkdir build
cd build
接下来在这个build目录下面执行构建。opencv是支持cmake的。
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D WITH_GSTREAMER=ON \
-D PYTHON_DEFAULT_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") \
-D PYTHON3_DEFAULT_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") \
-D PYTHON3_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") \
-D PYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy; print (numpy.get_include())") \
-D PYTHON3_PACKAGES_PATH=$(python3 -c "import site; print(site.getsitepackages()[0])") \
-DBUILD_DOCS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_PERF_TESTS=OFF \
..
注意此步骤输出中GStreamer必须为YES,否则就是有某些软件包缺失了
这样可以在build目录下得到makefile,执行编译安装
make -j4
make install
这样就完成安装了
这里使用一个python 的脚本来实现opencv gstreamer预览摄像头画面的demo,命名为 opencv_g.py 脚本如下
import cv2 as cv
import os
import time
cap = cv.VideoCapture('v4l2src device=/dev/video22 ! video/x-raw, format=NV12, width=1632, height=1224, 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()
this_time = time.time()
print (str((this_time-last_time)*1000)+'ms')
last_time = this_time;
cv.imshow('frame', frame)
if cv.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv.destroyAllWindows()
在板上的LX终端使用python3 opencv_g.py,即可看到摄像头画面了