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

  1. 云栖社区>
  2. 博客>
  3. 正文

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

禾路 2017-12-07 19:53:00 浏览531
展开阅读全文

从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

1综述
http://www.cnblogs.com/jsxyhelu/p/7907241.html
2环境架设
http://www.cnblogs.com/jsxyhelu/p/7908226.html
3两个例子
http://www.cnblogs.com/jsxyhelu/p/8000804.html
4程序框架
http://www.cnblogs.com/jsxyhelu/p/7953805.html
5编译使用最新opencv
http://www.cnblogs.com/jsxyhelu/p/8000819.html
6综合实验
http://www.cnblogs.com/jsxyhelu/p/8000829.html
7拾遗
http://www.cnblogs.com/jsxyhelu/p/8007117.html

一、第一个例子
    其实在目前这种情况下,配置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;
}
 
  



来自为知笔记(Wiz)



目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

网友评论

登录后评论
0/500
评论
禾路
+ 关注