<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Qt介面實現 點選 執行緒啟動按鈕播放視訊
左邊介面顯示原視訊 右邊介面顯示車輛識別視訊
結果展示如下:
初始介面
點選執行緒啟動後,即可車輛識別
設計好介面後最好先儲存
對按鈕設定槽函數
難點在於:執行緒同步問題
需要使用到connect函數中的第五個引數【第五個引數 具體說明如下】
1 AutoConnection 為預設引數,由傳送訊號決定,如果傳送訊號和接受訊號是同一個執行緒,則呼叫DirectConnection。如果不在同一個執行緒則呼叫QueuedConnection;
2 DirectConnection 槽函數執行於訊號傳送者所在的執行緒,效果上就像是直接在訊號傳送的位置呼叫了槽函數
3 QueuedConnection 槽函數在控制回到接收者所線上程的事件迴圈時被呼叫,槽函數執行於訊號接收者所線上程。傳送訊號後,槽函數不會立即被呼叫,等到接收者當前函數執行完,進入事件迴圈之後,槽函數才會被呼叫。多執行緒下用這個型別
4 BlockingQueuedConnection 槽函數的呼叫時機與Qt::QueuedConnection 一致,不過在傳送完訊號後,傳送者所線上程會阻塞,直到槽函數執行完。接收者和傳送者絕對不能在一個執行緒,否則會死鎖。在多執行緒間需要同步的場合會用到這個
5 UniqueConnection 此型別可通過 “|” 與以上四個結合在一起使用。此型別為當某個訊號和槽已經連線時,在進行重複連線時就會失敗,可避免重複連線。如果重複連線,槽函數會重複執行
Widget
標頭檔案匯入OpenCV包
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<opencv2/opencv.hpp> #include"videothread.h" using namespace cv; namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); void paintEvent(QPaintEvent *e); private slots: void on_pushButton_clicked(); public slots: //繫結執行緒 需要兩幀畫面 原圖和處理之後的圖 接收由同一個訊號傳送來的兩幀畫面 void ChangeImg(Mat oldimg,Mat newimg); private: Ui::Widget *ui; videothread *pthread; QImage oldimg; QImage newimg; }; #endif // WIDGET_H
原始檔 介面實現
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); this->pthread = new videothread("D:/00000000000003jieduanshipincailliao/carMove.mp4"); //由於執行緒同步問題 需要使用第五個引數 connect(this->pthread,SIGNAL(send2UI(Mat,Mat)),this,SLOT(ChangeImg(Mat,Mat)),Qt::BlockingQueuedConnection); } Widget::~Widget() { delete ui; } void Widget::paintEvent(QPaintEvent *e) { ui->label->setPixmap(QPixmap::fromImage(this->oldimg)); ui->label_2->setPixmap(QPixmap::fromImage(this->newimg)); //qDebug()<<"paintEvent"; } void Widget::on_pushButton_clicked() { this->pthread->start(); } void Widget::ChangeImg(Mat oldimg,Mat newimg) { //Mat是BGR 而QImage是RGB 需要轉換顏色 cvtColor(oldimg,oldimg,CV_BGR2RGB); cvtColor(newimg,newimg,CV_BGR2RGB); this->oldimg = QImage(oldimg.data,oldimg.cols,oldimg.rows,QImage::Format_RGB888); this->oldimg = this->oldimg.scaled(ui->label->width(),ui->label->height()); this->newimg = QImage(newimg.data,newimg.cols,newimg.rows,QImage::Format_RGB888); this->newimg = this->newimg.scaled(ui->label_2->width(),ui->label_2->height()); //update(); }
VideoThread
標頭檔案匯入OpenCV包
#ifndef VIDEOTHREAD_H #define VIDEOTHREAD_H #include<QThread> #include<opencv2/opencv.hpp> #include<vector> #include<QDebug> #include <QObject> using namespace std; using namespace cv; class videothread : public QThread { Q_OBJECT public: //explicit videothread(QObject *parent = 0); //執行緒傳參視訊路徑 videothread(char *path); void run(); private: VideoCapture cap; Mat frame;//讀一幀 Mat temp;//儲存上一幀 signals: //傳送訊號 void send2UI(Mat oldimg,Mat newimg); public slots: }; #endif // VIDEOTHREAD_H
原始檔 幀差法 車輛識別
#include "videothread.h" videothread::videothread(char *path):QThread() { //開啟一個視訊 cap.open(path); } void videothread::run() { int count = 0; Mat resFrame,diff; Mat frontGray,afterGray; vector<vector<Point>>contours; Mat element = cv::getStructuringElement(MORPH_RECT,Size(3,3)); Mat element2 = cv::getStructuringElement(MORPH_RECT,Size(20,20)); int x,y,w,h; while (cap.read(frame)) { count++; if(count == 1) { //儲存第一幀 temp = frame.clone(); continue; } else { //繪製矩形 使用此幀 resFrame = frame.clone(); //1 灰度處理 目的 RGB三通道轉灰度單通道 壓縮到原圖片三分之一大小 cvtColor(temp,frontGray,CV_RGB2GRAY); cvtColor(frame,afterGray,CV_RGB2GRAY); //2 幀差處理 目的 找到幀與幀之間的差異(正在運動的物體) absdiff(frontGray,afterGray,diff); //3 二值化處理 目的 將灰度圖繼續識別轉換為黑白分明的影象 threshold(diff,diff,25,255,CV_THRESH_BINARY); //4 影象降噪 //4-1 腐蝕處理 目的 去除白色噪點 erode(diff,diff,element); //4-2 膨脹 目的 把白色區域變大 dilate(diff,diff,element2); //5 提取關鍵點 //5-1 查詢特徵點 findContours(diff,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0,0)); //qDebug()<<contours.size(); //5-2 提取關鍵點 vector<vector<Point>>contours_poly(contours.size()); vector<Rect>boundRect(contours.size()); //5-3 確定下四個點來用於框選目標物體 int num=contours.size(); for(int i = 0;i < num;i++) { approxPolyDP(Mat(contours[i]),contours_poly[i],3,true); //多邊擬合 boundRect[i]=boundingRect(Mat(contours_poly[i])); x=boundRect[i].x; y=boundRect[i].y; w=boundRect[i].width; h=boundRect[i].height; //繪製矩形 rectangle(resFrame,Point(x,y),Point(x+w,y+h),Scalar(0,0,255),2); } } temp = frame.clone(); emit send2UI(frame,resFrame); msleep(1); } }
主入口Qt視窗顯示
#include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
到此這篇關於Qt+OpenCV利用幀差法實現車輛識別的文章就介紹到這了,更多相關Qt OpenCV車輛識別內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45