• (3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练


    一、第一个例子
         其实在目前这种情况下,配置OpenCV+QT的环境还是非常直接,简单的。
         最为重要的是编写正确的.pro文件,再原有基础上添加以下内容:
    INCLUDEPATH += /usr / include /opencv \
                    /usr / include /opencv2
    LIBS += /usr /lib /gnueabihf /libopencv_highgui.so \
            /usr /lib /gnueabihf /libopencv_core.so    \
            /usr /lib /gnueabihf /libopencv_imgproc.so
            指向正确的include和lib文件。实现以下结果,读取显示lena.jpg
     
    # 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();
    }
      主要代码已经非常类似windows下的编写方式,唯一不同的就是添加了QImage和mat之间的转换。
    二、第二个例子
         图像处理必须和摄像头打交道,具体的配置请看下一节。但是现在,如果直接使用USB摄像头,也应该能够进行操作:
    头文件:
    # ifndef MAINWINDOW_H
    # define MAINWINDOW_H
    # include <QMainWindow >
    //新添加
    # include <opencv2 /core /core.hpp >
    # include <opencv2 /highgui /highgui.hpp >
    # include <opencv2 /imgproc /imgproc.hpp >
    # include <QFileDialog >
    # include <QImage >
    # include <QTimer >     // 设置采集数据的间隔时间
    using namespace cv;
    //helper函数
    QPixmap Mat2QImage(Mat src);
    namespace Ui {
    class MainWindow;
    }
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    public :
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    private slots :
        void on_pushButton_clicked();
        void on_pushButton_2_clicked();
        void on_pushButton_3_clicked();
        void readFarme();       // 读取当前帧信息
        void on_pushButton_4_clicked();
    private :
        Ui : :MainWindow *ui;
        QTimer    *timer;
        QImage    *imag;
        VideoCapture *videocapture;   // 视频获取结构, 用来作为视频获取函数的一个参数
        Mat          matFrame;        //申请IplImage类型指针,就是申请内存空间来存放每一帧图像
        bool      bMethod; //是否使用算法
    };
    # endif // MAINWINDOW_H
     
      程序文件,注意我做了进一步集成:
    # include "mainwindow.h"
    # include "ui_mainwindow.h"
    using namespace cv;
    //全局变量
    Mat src;
    Mat gray;
    Mat tmp;
    Mat dst;
    MainWindow : :MainWindow(QWidget *parent) :QMainWindow(parent),ui( new Ui : :MainWindow)
    {
        ui - >setupUi( this);
        timer   = new QTimer( this);
        imag    = new QImage();         // 初始化
        connect(timer, SIGNAL(timeout()), this, SLOT(readFarme()));  // 时间到,读取当前摄像头信息
        bMethod = false; //是否使用算法
    }
    MainWindow : : ~MainWindow()
    {
        delete ui;
    }
    //事件驱动
    //打开摄像头
    void MainWindow : :on_pushButton_clicked()
    {
        //打开摄像头,从摄像头中获取视频
        videocapture  = new VideoCapture( 0);
        // 开始计时,超时则发出timeout()信号
        timer - >start( 33);
    }
    //读取下一Frame图像
    void MainWindow : :readFarme()
    {
        // 从摄像头中抓取并返回每一帧
        videocapture - >read(matFrame);
        //图像处理
        if(bMethod)
        {
            cvtColor(matFrame,tmp,COLOR_BGR2GRAY);
            Canny(tmp,dst, 30, 255);
        }
        else
        {
            dst = matFrame.clone();
        }
        // 格式转换
        QPixmap qpixmap = Mat2QImage(dst);
        // 将图片显示到label上
        ui - >label - >setPixmap(qpixmap);
    }
    //拍照
    void MainWindow : :on_pushButton_2_clicked()
    {
        // 格式转换
        QPixmap qpixmap = Mat2QImage(dst);
        // 将图片显示到label上
        ui - >label_2 - >setPixmap(qpixmap);
    }
    //执行算法
    void MainWindow : :on_pushButton_4_clicked()
    {
        bMethod = !bMethod;
    }
    //关闭摄像头
    void MainWindow : :on_pushButton_3_clicked()
    {
        timer - >stop();         // 停止读取数据。
        videocapture - >release();
    }
    //helper函数//
    //格式转换
    QPixmap Mat2QImage(Mat src)
    {
        QImage img;
        //根据QT的显示方法进行转换
        if(src.channels() == 3)
        {
            cvtColor( src, tmp, CV_BGR2RGB );
            img = QImage( ( const unsigned char *)(tmp.data), tmp.cols, tmp.rows, QImage : :Format_RGB888 );
        }
        else
        {
            img = QImage( ( const unsigned char *)(src.data), src.cols, src.rows, QImage : :Format_Grayscale8 );
        }
        QPixmap qimg = QPixmap : :fromImage(img) ;
        return qimg;
    }
     
      





  • 相关阅读:
    系统吞吐量、TPS(QPS)、用户并发量、性能測试概念和公式
    限流实现与解决方案
    mysql事务,select for update,及数据的一致性处理
    **MySQL锁机制与用法分析**
    死锁的排查
    系统中异常的设计与处理
    Spring如何处理线程并发问题
    ThreadLocal作用、场景、原理
    Database Administration Statements
    mybatis 无法自动补全,没有获得dtd文件
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/16947965.html
Copyright © 2020-2023  润新知