(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

  

爲了方便後期圖像處理相關操做運用,將前面的程序封裝成框架以複用html

1、打開PI自帶的攝像頭算法

sudo raspi -config

移動到「5」選項,按下回車鍵,選擇camera。vim

選擇「Enable」而後回車。bash

20131007211419547-0

再選擇「Yes」,回車後樹莓派會從新啓動。框架

20131007211419511-0

經過raspi-config工具更新了操做並使能攝像頭以後,它會告訴樹莓派攝像頭已經鏈接成功,並增長了兩個命令行工具以供用戶使用攝像頭。ide

raspistill
raspivid
若是是usb攝像c,如今已經能夠直接使用。可是若是想集成度搞一些,直接使用csi的攝像頭,須要這樣作:
 
cd /etc /modules -load.d /
sudo vim modules.conf
添加
bcm2835 -v4l2
 
須要重啓。
2、編寫程序,獲取並顯示實時視頻
主要程序代碼:
# 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 "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;
}
 
3、程序要點和結果展現
一、直接調用OpenCV的攝像頭模塊,實踐證實在Linux上面頗有效;
二、爲了可以讓label能夠被點擊,進行了一個類的重構工做;
至此,程序框架搭建完成,能夠方便複用,完整代碼在連接爲:
 
 
 





附件列表

相關文章
相關標籤/搜索