环境

硬件:友善之臂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摄像头相关推荐

  1. rk3399上安装docker+ubuntu18.04+opencv+ tensorflowa

    客户要求在rk3399上安装docker,搜了很久资料有限,东平四凑,花了几天时间才搞定,分享下吧,给需要的人 1 docker 安装 本文档适合 rk3399debian 平台,其他平台若要使用,请 ...

  2. Xcode使用OpenCV访问Mac摄像头权限问题

    这里记录下Xcode使用OpenCV访问Mac摄像头权限的解决方法: 1.首先配置对应的info.plist文件 右键项目文件->new file->选择默认的property file- ...

  3. imx8mini openCV mipi摄像头报错: VIDIOC_QUERYCTRL: Inappropriate ioctl for device

    imx8mini openCV摄像头报错: VIDIOC_QUERYCTRL: Inappropriate ioctl for device 简单介绍: 首先来看python 源码 然后是openCV ...

  4. 写字机器人开发之:python opencv linux下合作操作摄像头

    2019独角兽企业重金招聘Python工程师标准>>> 设想 之前使用C#控制摄像头的,现在厌烦了windows,决定转移到linux下玩耍.感觉能够python语言特有的好入手,正 ...

  5. python+opencv用电脑调用手机摄像头或其他网路摄像头

    python+opencv用电脑调用手机摄像头或其他网路摄像头 文章目录: 1 获取手机摄像头或网络摄像头的ip 1.1 获取手机摄像头的ip 1.2 获取网络摄像头的IP 1.3 关于RTSP协议 ...

  6. Python+OpenCV教程3:打开摄像头

    Python+OpenCV教程3:打开摄像头 学习打开摄像头捕获照片.播放本地视频.录制视频等. 目标: 打开摄像头并捕获照片 播放本地视频,录制视频 OpenCV函数:cv2.VideoCaptur ...

  7. Opencv最强案例——使用摄像头、OpenCV和Python扫描条形码和二维码。

    Dynamsoft是唯一一家为Windows.Linux.macOS和Raspberry Pi OS提供企业级Python条形码和二维码SDK的公司.SDK允许开发人员快速构建健壮的命令行.web和桌 ...

  8. QT与opencv(二)开启摄像头

    QT与opencv(二)开启摄像头 OpenCV中的VideoCapture不仅可以打开视频.usb摄像头,还可以做很多事,例如读取流媒体文件,网络摄像头,图像序列等. 下面我简单介绍一个在Qt中用V ...

  9. OpenCv图像处理之图像视频摄像头读取和保存

    OpenCv图像处理之图像视频摄像头读取与保存 使用cv::imread()读取图片 使用cv::imwrite()存储图片 使用cv::VideoCapture::open()读取视频 使用cv:: ...

最新文章

  1. kafka+zookeeper搭建步骤kafka问题
  2. docker宿主机访问docker容器服务失败
  3. 分层和分段用什么符号_如何划分段落层次,如何给段落分层
  4. mongodb全套配置
  5. 309. Best Time to Buy and Sell Stock with Cooldown
  6. java获取2017年第39周_java中怎么样取出39周的每周开始时间和每周结束时间?
  7. 模拟电梯1.0(类与对象实验)
  8. Android手机WIFI与电脑间共享文件
  9. 5gnr帧结构特点有哪些_真空离子束刻蚀设备的结构特点有哪些
  10. html块左右排列,html – 如何均匀地排列多个内嵌块元素?
  11. 第九大陆服务器未找到文件,第九大陆服务器优化规则说明 拍卖行和寄售功能关闭公告...
  12. opencv获得图片的像素宽度_使用OpenCV实现摄像头测距
  13. Vue 计算属性 computed
  14. android webserver mysql,Android手机变身Web服务器,BitWebServer简单评测
  15. hdu1599+floyd最小环
  16. Ubuntu 10.04中配置ip地址
  17. 【工业机器人】全球工业机器人详细产业链梳理!
  18. 办公小技巧:excel重复项怎么找出来?
  19. java网络编程--网络的要素--ip地址
  20. 关于win7快速启动栏以及显示桌面功能的还原

热门文章

  1. 家庭智能摄像头,智能家居的又一个爆发点?
  2. 【GCN-RS】Region or Global? A Principle for Negative Sampling in Graph-based Recommendation (TKDE‘22)
  3. Tableau制作人物关系图
  4. Eplan符号比例缩放(缩小设置)
  5. ubuntu查看显示器信息
  6. 【python 初学者】使用matplotlib画对比旋风图
  7. 云队友丨专科毕业创立喜茶,29岁身价40亿:哪有什么一夜暴富,不过都是百炼成钢
  8. 【高端定制】属于自己的背单词软件
  9. 惯用语(目~/足~/手~)
  10. TM4C USB-HID了解学习(二)