搭建环境
PC端环境
编译opencv(选用opencv3.4版本)
- 编译opencv3.4需要用到Cmake,所以先安装Cmake
apt-get install cmake
解压并进入目录
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版本)
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上,有需要可以自行下载。