zoukankan      html  css  js  c++  java
  • (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;
    }
     
      





  • 相关阅读:
    Linux安装Oralce 11g问题
    Hadoop 2.X 集群安装
    Centos图形界面关闭与开启
    SecureCRT乱码
    Hadoop 1.X 集群安装
    ThinkPad E430c 开机启动
    Node.js运行端口修改
    Node.js代理设置
    Github安装过后删除右键菜单选项
    吴恩达深度学习笔记 第四章作业1
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/8000804.html
Copyright © 2011-2022 走看看