zoukankan      html  css  js  c++  java
  • 基于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,最好重新启动下即可。
    这里写图片描述

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





  • 相关阅读:
    85. Maximal Rectangle
    120. Triangle
    72. Edit Distance
    39. Combination Sum
    44. Wildcard Matching
    138. Copy List with Random Pointer
    91. Decode Ways
    142. Linked List Cycle II
    异或的性质及应用
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/10264378.html
Copyright © 2011-2022 走看看