Opencv 编译和安装
不少客户遇到OpenCV的问题多集中在如何获取mipi摄像头的数据。因为OpenCV使用的V4l2协议和Rockchip编写的mipi摄像头驱动协议不同,所以不能直接使用OpenCV的摄像头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-essen
tial
python3-tk python3.7-dev
virtualenv
创建python3.7虚拟环境
virtualenv -p /usr/bin/python3.7m /home/firefly/venv
# 使用虚拟环境,如果想退出可以在终端输入 deactivate
source /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 opencv
cd opencv
# 下载 opencv-3.4.15.zip
wget
unzip opencv-3.4.15.zip
配置
mkdir build
cd 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-dev
cmake -D WITH_GSTREAMER=ON ../opencv-3.4.15
编译安装
# 如果板子内存不超过2G,建议不超过-j4
make -j6
# 安装的过程需要sudo权限
sudo make install
测试
测试
source /home/firefly/venv/bin/activate
git clone
cd mipi_video_demo/OpenCV_Python
python3 opencv_gst_test.py
opencv_gst_test.py 代码
import numpy as np
import cv2 as cv
import os
import time
cap = 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'):
break
cap.release()
cv.destroyAllWindows()
原作者:Firefly Wiki