(一)搭建环境与打开USB摄像头
PC端:Ubuntu-16.04LTS 64bit
ARM板:NanoPI Fire3
淘宝链接:https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-18778446007.34.254571d6O7hkz4&id=572191106032
开发软件:Qt
搭建环境
-
PC端环境
-
编译opencv(选用opencv3.4版本)
-
编译opencv3.4需要用到Cmake,所以先安装Cmake
apt-get install cmake
官网下载opencv3.4源码
https://github.com/opencv/opencv/archive/3.4.0.zip
解压并进入目录
unzip opencv-3.4.0.zip cd opencv-3.4.0
新建一个build目录
mkdir build cd build
安装依赖包
必须的
apt-get install build-essential apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
可选的
apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
编译opencv3.4
cmake .. make make install
配置opencv3.4
sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf' ldconfig
安装目录为
/usr/local/include /usr/local/include/opencv /usr/local/include/opencv2
链接库为
/usr/local/lib/
opencv3.4安装完成
-
安装Qt(选用Qt 5.6.3版本)
-
可以参考官方教程
https://wiki.qt.io/Install_Qt_5_on_Ubuntu
官网下载Qt5.7源码
http://download.qt.io/official_releases/qt/5.6/5.6.3/qt-opensource-linux-x64-5.6.3.run
添加可执行权限
chmod +x qt-opensource-linux-x64-5.6.3.run ./ qt-opensource-linux-x64-5.6.3.run
然后弹出图形化安装界面,跟着向导来就行
-
-
安装完后,qtcreator放在/opt/Qt5.6.3/Tools/QtCreator/bin目录下
-
-
安装OpenGL依赖库
apt-get install mesa-common-dev apt-get install libglu1-mesa-dev -y
-
-
ARM板环境
-
ARM板只需要安装opencv3.4即可,由于NanoPI提供的了ubuntu core系统,所以不需要交叉编译,直接在开发板上编译即可(由于开发板性能与PC有差别,所以编译速度会比较慢),方法与PC端相同。
第一个例程(打开摄像头)
先在.pro工程文件中加入如下代码
INCLUDEPATH +=/usr/local/include \
/usr/local/include/opencv \
/usr/local/include/opencv2
LIBS += /usr/local/lib/libopencv_*
opencv头文件为
// include opencv header
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include "videoio.hpp"
定义变量
void opencam();
cv::Mat frame;
cv::VideoCapture capture;
QImage image; //emit image form thread to dialog
double rate; //FPS
-
打开摄像头并获取图像
if (capture.isOpened()) capture.release(); //decide if capture is already opened; if so,close it capture.open(0); if (capture.isOpened()) { rate = capture.get(CV_CAP_PROP_FPS); //qDebug() << rate; capture >> frame; if (!frame.empty()) { image = Mat2QImage(frame); ui->camer_label->setPixmap(QPixmap::fromImage(camer_image).scaled(ui->camer_label->size())); ui->camer_fps_label->setText(QString("FPS : %1").arg(camer_rate)); } }
-
opencv图像格式与Qt图像格式转换
QImage Camer_thread::Mat2QImage(cv::Mat cvImg) { QImage qImg; if(cvImg.channels()==3) //3 channels color image { cv::cvtColor(cvImg,cvImg,CV_BGR2RGB); qImg =QImage((const unsigned char*)(cvImg.data), cvImg.cols, cvImg.rows, cvImg.cols*cvImg.channels(), QImage::Format_RGB888); } else if(cvImg.channels()==1) //grayscale image { qImg =QImage((const unsigned char*)(cvImg.data), cvImg.cols,cvImg.rows, cvImg.cols*cvImg.channels(), QImage::Format_Indexed8); } else { qImg =QImage((const unsigned char*)(cvImg.data), cvImg.cols,cvImg.rows, cvImg.cols*cvImg.channels(), QImage::Format_RGB888); } return qImg; }
-
可能出现的问题
-
无法打开USB摄像头
-
第一,设备驱动还没有加载
ls /dev/
看看是否有设备节点,一般是video*
-
-
第二,源码中打开的设备不对
-
capture.open(0)
如果0不能打开可以试试-1,1,或者其他值
-
找不到v4l1compat.so库
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libv4l/v4l1compat.so
这里的路径要根据自己板子上链接库的路径进行修改
-
其他
-
一般一个USB控制器只能使用一个USB摄像头,并且使用时会占用80%的带宽,所以如果使用了集线器最好将集线器上的其他设备拔掉,或者不用集线器,USB摄像头直接接上USB口。否则USB摄像头和集线器上的其他设备都可能会无法正常使用。
-
为了方便,我写了一个脚本来运行程序
#!/bin/bash export QT_QPA_EGLFS_PHYSICAL_WIDTH=800 export QT_QPA_EGLFS_PHYSICAL_HEIGHT=480 . /usr/bin/setqt5env-eglfs . /usr/bin/setqt5env export ROTATION=90 . setqt5env export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libv4l/v4l1compat.so cd /home/yan/opencv/ ./app –qws
-
-
测试
界面说明
open按钮将打开摄像头
save将当前帧保存到当前路径并命名为save.png
close按钮将关闭摄像头。
该qt程序使用多线程,界面为主线程,获取摄像头信息放在另一个线程中。
成功。
Qt完整源码放在github上,有需要可以自行下载。 代码名称为190510.zip
https://github.com/ljy980330/opencv_face_sys
有任何问题可以在下面给我留言!大家一起学习!