(3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
生活随笔
收集整理的這篇文章主要介紹了
(3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
從零開始的嵌入式圖像圖像處理(PI+QT+OpenCV)實戰(zhàn)演練
1綜述
http://www.cnblogs.com/jsxyhelu/p/7907241.html
2環(huán)境架設(shè)
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的環(huán)境還是非常直接,簡單的。 ? ??最為重要的是編寫正確的.pro文件,再原有基礎(chǔ)上添加以下內(nèi)容: 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文件。實現(xiàn)以下結(jié)果,讀取顯示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個參數(shù)表示查找文件時從哪個目錄開始,如果為"."的話,表示從該工程目錄開始查找,最后那個參數(shù)的過濾器的名字之間
? //要用空格,否則識別不出來
? QString img_name = QFileDialog::getOpenFileName( this, tr("Open Image"), ".",tr("Image Files(*.png *.jpg *.jpeg *.bmp)"));
? //toAscii()返回8位描述的string,為QByteArray,data()表示返回QByteArray的指針,QByteArray為字節(jié)指針
? //現(xiàn)在已改為toLatinl函數(shù)
? 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();
} ?主要代碼已經(jīng)非常類似windows下的編寫方式,唯一不同的就是添加了QImage和mat之間的轉(zhuǎn)換。 二、第二個例子 ? ??圖像處理必須和攝像頭打交道,具體的配置請看下一節(jié)。但是現(xiàn)在,如果直接使用USB攝像頭,也應(yīng)該能夠進行操作: 頭文件: #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>???? // 設(shè)置采集數(shù)據(jù)的間隔時間
using namespace cv;
//helper函數(shù)
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;?? // 視頻獲取結(jié)構(gòu), 用來作為視頻獲取函數(shù)的一個參數(shù)
??? Mat????????? matFrame;??????? //申請IplImage類型指針,就是申請內(nèi)存空間來存放每一幀圖像
??? 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;
}
//事件驅(qū)動
//打開攝像頭
void MainWindow::on_pushButton_clicked()
{
??? //打開攝像頭,從攝像頭中獲取視頻
??? videocapture? = new VideoCapture(0);
??? // 開始計時,超時則發(fā)出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();
??? }
??? // 格式轉(zhuǎn)換
??? QPixmap qpixmap = Mat2QImage(dst);
??? // 將圖片顯示到label上
??? ui->label->setPixmap(qpixmap);
}
//拍照
void MainWindow::on_pushButton_2_clicked()
{
??? // 格式轉(zhuǎn)換
??? QPixmap qpixmap = Mat2QImage(dst);
??? // 將圖片顯示到label上
??? ui->label_2->setPixmap(qpixmap);
}
//執(zhí)行算法
void MainWindow::on_pushButton_4_clicked()
{
??? bMethod = !bMethod;
}
//關(guān)閉攝像頭
void MainWindow::on_pushButton_3_clicked()
{
??? timer->stop();???????? // 停止讀取數(shù)據(jù)。
??? videocapture->release();
}
//helper函數(shù)//
//格式轉(zhuǎn)換
QPixmap Mat2QImage(Mat src)
{
??? QImage img;
??? //根據(jù)QT的顯示方法進行轉(zhuǎn)換
??? 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;
} ??
總結(jié)
以上是生活随笔為你收集整理的(3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12月7日学习内容整理:ORM单表操作
- 下一篇: 【系列5】使用Dockerfile创建带