從零開始的嵌入式圖像圖像處理(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”選項,按下Enter鍵,選擇camera。

選擇“Enable”然後回車。
再選擇“Yes”,回車後樹莓派會重新啟動。
通過raspi-config工具更新了操作并使能攝像頭之後,它會告訴樹莓派攝像頭已經連接配接成功,并增加了兩個指令行工具以供使用者使用攝像頭。
raspistill
raspivid
如果是usb攝像c,現在已經可以直接使用。但是如果想內建度搞一些,直接使用csi的攝像頭,需要這樣做:
cd /etc/modules-load.d/
sudo vim modules.conf
添加
bcm2835-v4l2
(4程式架構)從零開始的嵌入式圖像圖像處理(PI+QT+OpenCV)實戰演練
需要重新開機。
二、編寫程式,擷取并顯示實時視訊
主要程式代碼:
#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
#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
#include "clickedlabel.h"
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 "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()
//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 );
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可以被點選,進行了一個類的重構工作;
至此,程式架構搭建完成,可以友善複用,完整代碼在連結為:
來自為知筆記(Wiz)附件清單
目前方向:圖像拼接融合、圖像識别
聯系方式:[email protected]