從零開始的嵌入式圖像圖像處理(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
為了方便后期圖像處理相關操作運用,將前面的程序封裝成框架以復用
一、打開PI自帶的攝像頭
sudo raspi
-config
移動到“5”選項,按下回車鍵,選擇camera。


選擇“Enable”然后回車。

再選擇“Yes”,回車后樹莓派會重新啟動。

通過raspi-config工具更新了操作並使能攝像頭之后,它會告訴樹莓派攝像頭已經連接成功,並增加了兩個命令行工具以供用戶使用攝像頭。
raspistill
raspivid
raspivid
如果是usb攝像c,現在已經可以直接使用。但是如果想集成度搞一些,直接使用csi的攝像頭,需要這樣做:
cd
/etc
/modules
-load.d
/
sudo vim modules.conf
sudo vim modules.conf
添加
bcm2835
-v4l2

需要重啟。
二、編寫程序,獲取並顯示實時視頻
主要程序代碼:
#
ifndef CLICKEDLABEL_H
# define CLICKEDLABEL_H
# include <QWidget >
# include <QLabel >
class ClickedLabel : public QLabel
{
Q_OBJECT
public :
ClickedLabel(QWidget *parent = 0) : QLabel(parent){}
~ClickedLabel() {}
signals :
void clicked(ClickedLabel * click); // ????
protected :
void mouseReleaseEvent(QMouseEvent *); // ?????????
};
# endif // CLICKEDLABEL_H
# define CLICKEDLABEL_H
# include <QWidget >
# include <QLabel >
class ClickedLabel : public QLabel
{
Q_OBJECT
public :
ClickedLabel(QWidget *parent = 0) : QLabel(parent){}
~ClickedLabel() {}
signals :
void clicked(ClickedLabel * click); // ????
protected :
void mouseReleaseEvent(QMouseEvent *); // ?????????
};
# endif // CLICKEDLABEL_H
#
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 > // 時間觸發
# include "clickedlabel.h"
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_MainWindow_iconSizeChanged( const QSize &iconSize);
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
void readFarme(); // 核心函數
private :
Ui : :MainWindow *ui;
QTimer *timer;
QImage *imag;
VideoCapture *videocapture;
Mat matFrame;
bool bMethod; //是否采用圖像處理算法
ClickedLabel * clickLabel;
ClickedLabel * clickLabel2;
};
# 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 > // 時間觸發
# include "clickedlabel.h"
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_MainWindow_iconSizeChanged( const QSize &iconSize);
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
void readFarme(); // 核心函數
private :
Ui : :MainWindow *ui;
QTimer *timer;
QImage *imag;
VideoCapture *videocapture;
Mat matFrame;
bool bMethod; //是否采用圖像處理算法
ClickedLabel * clickLabel;
ClickedLabel * clickLabel2;
};
# endif // MAINWINDOW_H
#
include
"clickedlabel.h"
void ClickedLabel : :mouseReleaseEvent(QMouseEvent *)
{
emit clicked( this);
}
void ClickedLabel : :mouseReleaseEvent(QMouseEvent *)
{
emit clicked( this);
}
#
include
"mainwindow.h"
# include <QApplication >
int main( int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
# include <QApplication >
int main( int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
#
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;
on_pushButton_clicked();
clickLabel = new ClickedLabel( this);
clickLabel - >setGeometry( 0, 0, 400, 400);
connect(clickLabel,SIGNAL(clicked(ClickedLabel *)), this,SLOT(on_pushButton_3_clicked()));
clickLabel2 = new ClickedLabel( this);
clickLabel2 - >setGeometry( 400, 0, 400, 400);
connect(clickLabel2,SIGNAL(clicked(ClickedLabel *)), this,SLOT(on_pushButton_2_clicked()));
}
MainWindow : : ~MainWindow()
{
delete ui;
}
void MainWindow : :on_MainWindow_iconSizeChanged( const QSize &iconSize)
{
}
//Open camera
void MainWindow : :on_pushButton_clicked()
{
videocapture = new VideoCapture( 0);
timer - >start( 33);
}
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);
clickLabel - >setPixmap(qpixmap);
}
//capture
void MainWindow : :on_pushButton_2_clicked()
{
QPixmap qpixmap = Mat2QImage(dst);
//ui->label_2->setPixmap(qpixmap);
clickLabel2 - >setPixmap(qpixmap);
}
//action
void MainWindow : :on_pushButton_3_clicked()
{
bMethod = !bMethod;
}
//exit
void MainWindow : :on_pushButton_4_clicked()
{
timer - >stop(); // ???????
videocapture - >release();
}
//////////////////////////helper??//////////////////////////////////////////////////
QPixmap Mat2QImage(Mat src)
{
QImage img;
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_Indexed8 );
}
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;
on_pushButton_clicked();
clickLabel = new ClickedLabel( this);
clickLabel - >setGeometry( 0, 0, 400, 400);
connect(clickLabel,SIGNAL(clicked(ClickedLabel *)), this,SLOT(on_pushButton_3_clicked()));
clickLabel2 = new ClickedLabel( this);
clickLabel2 - >setGeometry( 400, 0, 400, 400);
connect(clickLabel2,SIGNAL(clicked(ClickedLabel *)), this,SLOT(on_pushButton_2_clicked()));
}
MainWindow : : ~MainWindow()
{
delete ui;
}
void MainWindow : :on_MainWindow_iconSizeChanged( const QSize &iconSize)
{
}
//Open camera
void MainWindow : :on_pushButton_clicked()
{
videocapture = new VideoCapture( 0);
timer - >start( 33);
}
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);
clickLabel - >setPixmap(qpixmap);
}
//capture
void MainWindow : :on_pushButton_2_clicked()
{
QPixmap qpixmap = Mat2QImage(dst);
//ui->label_2->setPixmap(qpixmap);
clickLabel2 - >setPixmap(qpixmap);
}
//action
void MainWindow : :on_pushButton_3_clicked()
{
bMethod = !bMethod;
}
//exit
void MainWindow : :on_pushButton_4_clicked()
{
timer - >stop(); // ???????
videocapture - >release();
}
//////////////////////////helper??//////////////////////////////////////////////////
QPixmap Mat2QImage(Mat src)
{
QImage img;
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_Indexed8 );
}
QPixmap qimg = QPixmap : :fromImage(img) ;
return qimg;
}
三、程序要點和結果展示
1、直接調用OpenCV的攝像頭模塊,實踐證明在Linux上面很有效;
2、為了能夠讓label可以被點擊,進行了一個類的重構工作;
至此,程序框架搭建完成,可以方便復用,完整代碼在鏈接為:
附件列表
