搭建环境

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程序使用多线程,界面为主线程,获取摄像头信息放在另一个线程中。

usb opencv_#include

成功。

Qt完整源码放在github上,有需要可以自行下载。