從零開始的嵌入式圖像圖像處理(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
/usr / include /opencv2
LIBS += /usr /lib /gnueabihf /libopencv_highgui.so \
/usr /lib /gnueabihf /libopencv_core.so \
/usr /lib /gnueabihf /libopencv_imgproc.so

#
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();
}
# 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();
}
二、第二個例子
圖像處理必須和攝像頭打交道,具體的配置請看下一節。但是現在,如果直接使用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
# 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;
}
# 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;
}