天天看點

(4程式架構)從零開始的嵌入式圖像圖像處理(PI+QT+OpenCV)實戰演練

從零開始的嵌入式圖像圖像處理(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。

(4程式架構)從零開始的嵌入式圖像圖像處理(PI+QT+OpenCV)實戰演練
(4程式架構)從零開始的嵌入式圖像圖像處理(PI+QT+OpenCV)實戰演練

選擇“Enable”然後回車。

(4程式架構)從零開始的嵌入式圖像圖像處理(PI+QT+OpenCV)實戰演練

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

(4程式架構)從零開始的嵌入式圖像圖像處理(PI+QT+OpenCV)實戰演練

通過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]

繼續閱讀