OpenCV 编译和安装
不少客户遇到OpenCV的问题多集中在如何获取mipi摄像头的数据。因为OpenCV使用的V4l2协议和Rockchip编写的mipi摄像头驱动协议不同,所以不能直接使用OpenCV的摄像头API。本节讲述如何编译Opencv并添加GStreamer API支持。
要求
-
OS: Ubuntu18.04 / Debian 10
-
OpenCV version: 3.4.15
-
Board: RK3399
编译和安装
-
搭建python3.7虚拟环境
# 依次安装gcc和cmake等编译环境# 安装python3.7-tk 和 python3.7-dev# 安装virtualenv虚拟环境sudo apt install gcc cmake git build-essential \python3-tk python3.7-dev \virtualenv -
创建python3.7虚拟环境
virtualenv -p /usr/bin/python3.7m /home/firefly/venv# 使用虚拟环境,如果想退出可以在终端输入 deactivatesource /home/firefly/venv/bin/activate -
安装Opencv所需的环境包
# 安装编译环境、gtk包和相关编解码库sudo apt install cmake build-essential libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev libjasper-dev# 注意!如果安装了rknn_toolkit(or lite)则不需要再安装Python-numpy,否则会导致rknn_toolkit(or lite)无法使用sudo apt install python-numpy -
下载Opencv
# 创建文件夹mkdir opencvcd opencv# 下载 opencv-3.4.15.zipwget https://github.com/opencv/opencv/archive/refs/tags/3.4.15.zipunzip opencv-3.4.15.zip -
配置
mkdir buildcd build# 让 OpenCV 和 Python3 之间建立联系cmake -D CMAKE_BUILD_TYPE=RELEASE \-D PYTHON_DEFAULT_EXECUTABLE=$(python -c "import sys; print(sys.executable)")\-D PYTHON3_EXECUTABLE=$(python -c "import sys; print(sys.executable)") \-D PYTHON3_NUMPY_INCLUDE_DIRS=$(python -c "import numpy; print (numpy.get_include())") \-D PYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \../opencv-3.4.15 -
如需支持Gstreamer API,则进行以下配置操作否则跳过
sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-devcmake -D WITH_GSTREAMER=ON ../opencv-3.4.15 -
编译安装
# 如果板子内存不超过2G,建议不超过-j4make -j6# 安装的过程需要sudo权限sudo make install
测试
-
测试
source /home/firefly/venv/bin/activategit clone https://gitlab.com/firefly-linux/test_code/rkisp-v4l2.gitcd mipi_video_demo/OpenCV_Pythonpython3 opencv_gst_test.py -
opencv_gst_test.py 代码
import numpy as npimport cv2 as cvimport osimport timecap = cv.VideoCapture('v4l2src device=/dev/video1 ! video/x-raw, format=NV12, width=640, height=480, 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'):breakcap.release()cv.destroyAllWindows()