参考链接:
Ubuntu 20.04搭建OpenCV 4.5.0 & C++环境_ubuntu opencv4.5.0-CSDN博客
How to compile OpenCV with Gstreamer [Ubuntu&Windows] | by Galaktyk 01 | Medium
香橙派官方镜像自带一个opencv4.5.4的头文件库,可以使用C/C++语言直接调用,奈何本渣渣太菜还不会C++,只能想想办法用python调用了。按照以前玩jetson nano的经验,决定使用opencv的Gstreamer读取。
想要使用gstreamer获取视频流,首先必须确定opencv开启了Gstreamer,一般来说使用pip install opencv-python安装的opencv是不开启Gstreamer的
可以尝试以下代码查看:
import cv2
print(cv2.getBuildInformation())
上图就代表未开启Gstreamer,这种情况下是无法通过cv2.CAP_GSTREAMER直接读取的
cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)
想要开启Gstreamer,就需要从源码进行编译。
预备工作:
下载依赖库
sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
1、下载opencv source
https://github.com/opencv/opencv/archive/4.5.4.zip
2、解压,创建build文件夹,使用Cmake配置
unzip opencv-4.5.4.zip
cd opencv-4.5.4
mkdir build
cd build
Cmake配置如下
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \ # 设置构建类型为RELEASE
-D INSTALL_PYTHON_EXAMPLES=OFF \ # 不安装Python示例
-D INSTALL_C_EXAMPLES=OFF \ # 不安装C示例
-D BUILD_opencv_python2=OFF \ # 不构建Python 2支持
-D CMAKE_INSTALL_PREFIX=$(python3 -c "import sys; print(sys.prefix)") \ # 设置安装路径为Python的安装路径
-D PYTHON3_EXECUTABLE=$(which python3) \ # 指定Python 3可执行文件路径
-D PYTHON3_INCLUDE_DIR=$(python3 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \ # 指定Python 3的包含目录
-D PYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \ # 指定Python 3的包路径
-D WITH_GSTREAMER=ON \ # 开启GStreamer支持
-D BUILD_EXAMPLES=OFF \ # 不构建示例
-D PNG_LIBRARY=/usr/lib/aarch64-linux-gnu/libpng.so \ # 指定PNG库路径
..
配置后检查一下自己的配置,路径什么的是否正确,重点是GStreamer一行为YES(下图是截的别人的How to compile OpenCV with Gstreamer [Ubuntu&Windows] | by Galaktyk 01 | Medium)
3、开始编译
下面命令是全核一起参与编译,但是在我的香橙派5plus上开全核编译时出现多次系统死机情况,所以我使用的是 make -j4 只开启四个线程编译
make -j$(nproc)
4、安装,更新动态链接库
sudo make install
sudo ldconfig
5、测试
首先卸载python中的opencv-python包
然后直接进入python测试下面代码
import cv2
print(cv2.getBuildInformation())
显示YES则成功。
6、获取HDMI输入测试
import cv2
# GStreamer 管道字符串
pipeline = "v4l2src device=/dev/video0 ! videoconvert ! appsink"
# 创建 VideoCapture 对象
cap = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)
if not cap.isOpened():
print("Error: Could not open video stream.")
exit()
# 读取和显示视频流
while True:
ret, frame = cap.read()
if not ret:
print("Error: Failed to read frame from video stream.")
break
cv2.imshow('Video Stream', frame)
key = cv2.waitKey(1)
if key == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
OK了