• 基于opencv和QT的摄像头采集代码( GoQTtemplate3持续更新)


    在Linux操作系统上,编写带界面的图像处理程序,选择opencv+QT是一种很好的选择。 GoQTtemplate3是我为编写Linux下图像处理程序实现的框架,希望能够为大家解决Linux环境下桌面图像处理程序,提供一些帮助。

    文中相关代码请参考:https://github.com/jsxyhelu/GOQTtemplate3
    一、基本环境构建
    a、我们需要完整地安装QT。具体方法,是从网站上下载在线安装程序,并且直接安装

    b、下载并且安装OpenCV

    直接使用编译好的OpenCV类库

    sudo apt-get install libcv-dev
    sudo apt-get install libopencv-dev

    全部成功后在QT中进行相关配置:

    安装完成之后,opencv相关的头文件被安装到/usr/include目录中,该目录是linux默认头文件查找路径。

    修改配置文件:

    编写相关代码

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <QFileDialog>
    using namespace cv;
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this);}
    MainWindow::~MainWindow(){ delete ui;}
    void MainWindow::on_pushButton_clicked()
    {
        //第3个参数表示查找文件时从哪个目录开始,如果为"."的话,表示从该工程目录开始查找,最后那个参数的过滤器的名字之间
        //要用空格,否则识别不出来
        QString img_name = QFileDialog::getOpenFileName( this, tr("Open Image"), ".",tr("Image Files(*.png *.jpg *.jpeg *.bmp)"));
        //toAscii()返回8位描述的string,为QByteArray,data()表示返回QByteArray的指针,QByteArray为字节指针
        //现在已改为toLatinl函数
        Mat src = imread( img_name.toLatin1().data());
        cvtColor( src, src, CV_BGR2RGB );
        QImage img = QImage( (const unsigned char*)(src.data), src.cols, src.rows, QImage::Format_RGB888 );
        ui->label->setPixmap( QPixmap::fromImage(img) );
        img_name.clear();
    }

    实现以下效果:

    注意,所有操作的目录都不要放在中文目录下面。能够正常显示出Lena,那么证明QT和OpenCV的环境都是配置正确了。
    二、QT自己带的例子程序是重要参考

    这段代码主要是基于QCamera实现了摄像头的抽象,由于是官方代码,实现过程中采用了较多的“信号、槽”的机制,还是很值的参考的。但是就图像处理这块而言,价值一般。

    三、《qt5.9c++开发指南》例程序解析

    这个程序最为重要的地方,就是实现了摄像头设备的枚举(当然QT官方的例子可能也实现了,但是不是非常明显);在图像采集这块,同样采用的是QCamera。这段代码还有 一个特点,就是实现了一个较为完善的界面模型。


    //  创建  QCamera对象
        QCameraInfo curCameraInfo =QCameraInfo : :defaultCamera(); //获取缺省摄像头
        ui - >comboCamera - >addItem(curCameraInfo.description()); //摄像头描述
        ui - >comboCamera - >setCurrentIndex( 0);
    但是这段程序存在一个问题,就是只选择默认摄像头,实际上,我们需要获得的是所有摄像头,那么就必须对这段代码进行相关修改:
       const QList <QCameraInfo > availableCameras = QCameraInfo : :availableCameras();
        for ( const QCameraInfo &cameraInfo : availableCameras) {
              ui - >comboCamera - >addItem(cameraInfo.description()); //摄像头描述
        }
        ui - >comboCamera - >setCurrentIndex( 0);

    这样将非常方便后面的操作。
    四、结合OpenCV功能,编写 GoQTtemplate3

    我们最终还是需要将OpenCV引入其中,因为这样才能够更方便我们进行图像处理操作。之前介

    绍过的GoQTtemplate2 就是实现了相关的功能。

    需要说明的地方是,为了将摄像头选择功能加入目前平台,需要添加QCameraInfo.h,这个前提

    是在.pro文件中,添加

    multimedia类库。
    并且将初始化程序加入其中

    同时,我们在打开摄像头的时候,也要根据选择来进行打开。
    同时需要添加错误控制,每次打开摄像头之前关闭之前的摄像头。具体内容可以参考代码。
    五、备注

    a、在程序的配置过程中,非常容易出现错误的一个问题为::

    /usr/bin/ld: cannot find -lxxx  这种情况是系统找不到对应的库文件,其中,-lxxx表示链接库文件 libxxx.so。
    具体的解决方法是先用locat找到指定的lib文件,查看链接文件是否正确的指向了我们希望的lib,如果不是,用
     ln -sf */libxxx.so.x */libxxx.so 指令修改它。
    连接以后,输入ldconfig来让动态链接库供系统共享。
    比如

    b、 如果出现 视频窗口是黑屏的,怎么回事?
    在Vmware Workstation的“虚拟机”->“虚拟机设置”->“USB控制器”下,查看“USB兼容性”,如果当前是“USB2.0”就修改为“USB3.0”,反之就修改为“USB2.0”。然后再在“虚拟机”->“可移动设备”下重新连接Camera,最好重新启动下即可。
    这里写图片描述

    感谢阅读至此,希望有所帮助。





  • 相关阅读:
    JVM工作原理--垃圾收集
    并发编程之单例模式
    设计模式之动态代理
    UML类图基础
    CAP理论的理解
    Dubbo RPC调用参数校验---错误message自动返回
    ELK日志分析系统搭建
    Kafka原理及应用(一)
    HTTPS的原理
    Maven 生命周期的概念(指令默认顺序执行)
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/16947877.html
Copyright © 2020-2023  润新知