(一)搭建环境与打开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

 

有任何问题可以在下面给我留言!大家一起学习!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值