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-devapt-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'):breakcap.release()
cv.destroyAllWindows()
我发现在NanoPC T4开发板上,这样访问摄像头对于画面分辨率会有要求,分辨率高于740x360就会出现画面上下割裂的情况,很像是两个线程处理一个buffer没同步好,我自己是gstreamer初学者,暂时不清楚怎么解决这个问题。不知道是rock官方该背锅还是友善之臂该背锅(论硬件平台成熟的重要性,此处省去三千字…)。而用gst-launch-1.0访问无论多大分辨率都不会有此问题。
我暂时只使用740x360这个分辨率。
割裂的画面如下:
其实割裂位置的上下画面都是流畅的,但是时间差了半秒左右,实在是神奇的很。
参考资料
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/
rk3399上opencv使用gstreamer访问mipi摄像头相关推荐
- rk3399上安装docker+ubuntu18.04+opencv+ tensorflowa
客户要求在rk3399上安装docker,搜了很久资料有限,东平四凑,花了几天时间才搞定,分享下吧,给需要的人 1 docker 安装 本文档适合 rk3399debian 平台,其他平台若要使用,请 ...
- Xcode使用OpenCV访问Mac摄像头权限问题
这里记录下Xcode使用OpenCV访问Mac摄像头权限的解决方法: 1.首先配置对应的info.plist文件 右键项目文件->new file->选择默认的property file- ...
- imx8mini openCV mipi摄像头报错: VIDIOC_QUERYCTRL: Inappropriate ioctl for device
imx8mini openCV摄像头报错: VIDIOC_QUERYCTRL: Inappropriate ioctl for device 简单介绍: 首先来看python 源码 然后是openCV ...
- 写字机器人开发之:python opencv linux下合作操作摄像头
2019独角兽企业重金招聘Python工程师标准>>> 设想 之前使用C#控制摄像头的,现在厌烦了windows,决定转移到linux下玩耍.感觉能够python语言特有的好入手,正 ...
- python+opencv用电脑调用手机摄像头或其他网路摄像头
python+opencv用电脑调用手机摄像头或其他网路摄像头 文章目录: 1 获取手机摄像头或网络摄像头的ip 1.1 获取手机摄像头的ip 1.2 获取网络摄像头的IP 1.3 关于RTSP协议 ...
- Python+OpenCV教程3:打开摄像头
Python+OpenCV教程3:打开摄像头 学习打开摄像头捕获照片.播放本地视频.录制视频等. 目标: 打开摄像头并捕获照片 播放本地视频,录制视频 OpenCV函数:cv2.VideoCaptur ...
- Opencv最强案例——使用摄像头、OpenCV和Python扫描条形码和二维码。
Dynamsoft是唯一一家为Windows.Linux.macOS和Raspberry Pi OS提供企业级Python条形码和二维码SDK的公司.SDK允许开发人员快速构建健壮的命令行.web和桌 ...
- QT与opencv(二)开启摄像头
QT与opencv(二)开启摄像头 OpenCV中的VideoCapture不仅可以打开视频.usb摄像头,还可以做很多事,例如读取流媒体文件,网络摄像头,图像序列等. 下面我简单介绍一个在Qt中用V ...
- OpenCv图像处理之图像视频摄像头读取和保存
OpenCv图像处理之图像视频摄像头读取与保存 使用cv::imread()读取图片 使用cv::imwrite()存储图片 使用cv::VideoCapture::open()读取视频 使用cv:: ...
最新文章
- kafka+zookeeper搭建步骤kafka问题
- docker宿主机访问docker容器服务失败
- 分层和分段用什么符号_如何划分段落层次,如何给段落分层
- mongodb全套配置
- 309.	Best Time to Buy and Sell Stock with Cooldown
- java获取2017年第39周_java中怎么样取出39周的每周开始时间和每周结束时间?
- 模拟电梯1.0(类与对象实验)
- Android手机WIFI与电脑间共享文件
- 5gnr帧结构特点有哪些_真空离子束刻蚀设备的结构特点有哪些
- html块左右排列,html – 如何均匀地排列多个内嵌块元素?
- 第九大陆服务器未找到文件,第九大陆服务器优化规则说明 拍卖行和寄售功能关闭公告...
- opencv获得图片的像素宽度_使用OpenCV实现摄像头测距
- Vue 计算属性 computed
- android webserver mysql,Android手机变身Web服务器,BitWebServer简单评测
- hdu1599+floyd最小环
- Ubuntu 10.04中配置ip地址
- 【工业机器人】全球工业机器人详细产业链梳理!
- 办公小技巧:excel重复项怎么找出来?
- java网络编程--网络的要素--ip地址
- 关于win7快速启动栏以及显示桌面功能的还原
热门文章
- 家庭智能摄像头,智能家居的又一个爆发点?
- 【GCN-RS】Region or Global? A Principle for Negative Sampling in Graph-based Recommendation (TKDE‘22)
- Tableau制作人物关系图
- Eplan符号比例缩放(缩小设置)
- ubuntu查看显示器信息
- 【python 初学者】使用matplotlib画对比旋风图
- 云队友丨专科毕业创立喜茶,29岁身价40亿:哪有什么一夜暴富,不过都是百炼成钢
- 【高端定制】属于自己的背单词软件
- 惯用语(目~/足~/手~)
- TM4C USB-HID了解学习(二)