OpenCV實(shí)現(xiàn)車(chē)輛識(shí)別和運(yùn)動(dòng)目標(biāo)檢測(cè)
一:車(chē)輛識(shí)別成果展示

二:車(chē)輛識(shí)別超詳細(xì)步驟解析
步驟一:灰度化處理
灰度處理目的 RGB三通道轉(zhuǎn)灰度單通道 壓縮到原圖片三分之一大小
效果展示:【避免內(nèi)存浪費(fèi) 幀差法對(duì)前后幀圖像灰度化處理】

//1 灰度處理 目的 RGB三通道轉(zhuǎn)灰度單通道 壓縮到原圖片三分之一大小
cvtColor(frontFrame,frontGray,CV_RGB2GRAY);//前一幀灰度化處理
cvtColor(afterFrame,afterGray,CV_RGB2GRAY);//后一幀灰度化處理
//imshow("frontGray",frontGray);//測(cè)試
//imshow("afterGray",afterGray);//測(cè)試步驟二:幀差處理
幀差處理目的 找到幀與幀之間的差異(正在運(yùn)動(dòng)的物體)
效果展示:【運(yùn)動(dòng)目標(biāo)的檢測(cè):運(yùn)動(dòng)事物顯示灰度,靜止事物顯示黑度】

//2 幀差處理 目的 找到幀與幀之間的差異(正在運(yùn)動(dòng)的物體)
Mat diff;
Mat frontGray,afterGray;
absdiff(frontGray,afterGray,diff);//前后幀對(duì)比存于diff中
imshow("diff",diff);//測(cè)試步驟三:二值化處理
二值化處理 目的 將灰度圖繼續(xù)識(shí)別轉(zhuǎn)換為黑白分明的圖像
效果展示:【步驟二中運(yùn)動(dòng)事物顯示灰度,靜止事物顯示黑度,在這里進(jìn)行二值化處理,能夠黑白分明,便于計(jì)算機(jī)識(shí)別運(yùn)動(dòng)目標(biāo),如下右圖二值化處理后黑白分明】【缺點(diǎn):存在白色噪點(diǎn),如下右圖除了車(chē)輛外后面的背景也顯示白度,這就是白色噪點(diǎn),需要去除】

//3 二值化處理 目的 將灰度圖繼續(xù)識(shí)別轉(zhuǎn)換為黑白分明的圖像
threshold(diff,diff,25,255,CV_THRESH_BINARY);
imshow("threshold",diff);//測(cè)試步驟四:圖像降噪
4-1 腐蝕處理 目的 去除白色噪點(diǎn)
效果展示:【步驟三中存在的白色噪點(diǎn)能夠去除,但是在去除白色噪點(diǎn)的同時(shí),也影響了車(chē)輛的白度顯示,如下右圖可以看出,車(chē)輛白度顯示有所降低,因此還是需要改進(jìn)】

//4 圖像降噪
//4-1 腐蝕處理 目的 去除白色噪點(diǎn)
Mat element = cv::getStructuringElement(MORPH_RECT,Size(3,3));//小于3*3方塊的白色噪點(diǎn)都會(huì)被腐蝕
erode(diff,diff,element);
imshow("erode",diff);//測(cè)試4-2 膨脹處理 目的 把白色區(qū)域變大
效果展示:【如下右圖,將車(chē)輛形狀大致顯示,便于框選車(chē)輛識(shí)別操作】

//4-2 膨脹 目的 把白色區(qū)域變大
Mat element2=cv::getStructuringElement(MORPH_RECT,Size(20,20));
dilate(diff,diff,element2);
imshow("dilate",diff);//測(cè)試步驟五:提取關(guān)鍵點(diǎn) 框選運(yùn)動(dòng)目標(biāo)檢測(cè)
效果展示:車(chē)輛識(shí)別成功

//5 提取關(guān)鍵點(diǎn)
//5-1 查找特征點(diǎn)
vector<vector<Point>>contours;
findContours(diff,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0,0));
//5-2 提取關(guān)鍵點(diǎn)
vector<vector<Point>>contours_poly(contours.size());
vector<Rect>boundRect(contours.size());
//5-3 確定下四個(gè)點(diǎn)來(lái)用于框選目標(biāo)物體
int x,y,w,h;
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);
}三:車(chē)輛識(shí)別完整代碼
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat moveCheck(Mat &frontFrame,Mat &afterFrame)
{
Mat resFrame,diff;
Mat frontGray,afterGray;
//克隆當(dāng)前幀畫(huà)面 返回最終結(jié)果
resFrame = afterFrame.clone();
//1 灰度處理 目的 RGB三通道轉(zhuǎn)灰度單通道 壓縮到原圖片三分之一大小
cvtColor(frontFrame,frontGray,CV_RGB2GRAY);
cvtColor(afterFrame,afterGray,CV_RGB2GRAY);
//imshow("frontGray",frontGray);
//imshow("afterGray",afterGray);
//2 幀差處理 目的 找到幀與幀之間的差異(正在運(yùn)動(dòng)的物體)
absdiff(frontGray,afterGray,diff);
//imshow("diff",diff);
//3 二值化處理 目的 將灰度圖繼續(xù)識(shí)別轉(zhuǎn)換為黑白分明的圖像
threshold(diff,diff,25,255,CV_THRESH_BINARY);
//imshow("threshold",diff);
//4 圖像降噪
//4-1 腐蝕處理 目的 去除白色噪點(diǎn)
Mat element = cv::getStructuringElement(MORPH_RECT,Size(3,3));//小于3*3方塊的白色噪點(diǎn)都會(huì)被腐蝕
erode(diff,diff,element);
//imshow("erode",diff);
//4-2 膨脹 目的 把白色區(qū)域變大
Mat element2=cv::getStructuringElement(MORPH_RECT,Size(20,20));
dilate(diff,diff,element2);
//imshow("dilate",diff);
//5 提取關(guān)鍵點(diǎn)
//5-1 查找特征點(diǎn)
vector<vector<Point>>contours;
findContours(diff,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0,0));
//5-2 提取關(guān)鍵點(diǎn)
vector<vector<Point>>contours_poly(contours.size());
vector<Rect>boundRect(contours.size());
//5-3 確定下四個(gè)點(diǎn)來(lái)用于框選目標(biāo)物體
int x,y,w,h;
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);
}
return resFrame;
}
int main(int argc, char *argv[])
{
Mat frame;
Mat temp;
Mat res;
int count = 0;
VideoCapture cap("D:/00000000000003jieduanshipincailliao/carMove.mp4");//視頻路徑
while (cap.read(frame))
{
count++;
if(count == 1)
{
res = moveCheck(frame,frame);
}
else
{
res = moveCheck(temp,frame);
}
imshow("frame",frame);
imshow("res",res);//最終車(chē)輛識(shí)別成果
temp = frame.clone();
waitKey(15);
}
return 0;
}當(dāng)然,夜晚的車(chē)輛也能夠正常識(shí)別

不過(guò),本次的幀差法的車(chē)輛識(shí)別存在弊端,只要是運(yùn)動(dòng)的物體都會(huì)識(shí)別,比如,博主打開(kāi)攝像頭,動(dòng)一動(dòng)手指頭,也會(huì)被框選識(shí)別,因此是有一定弊端的

不過(guò),這種幀差法的運(yùn)動(dòng)目標(biāo)檢測(cè),在夜晚監(jiān)控中是非常廣泛地應(yīng)用到,因?yàn)橛腥魏蔚娘L(fēng)吹草動(dòng),都會(huì)被框選識(shí)別。
到此這篇關(guān)于OpenCV實(shí)現(xiàn)車(chē)輛識(shí)別和運(yùn)動(dòng)目標(biāo)檢測(cè)的文章就介紹到這了,更多相關(guān)OpenCV車(chē)輛識(shí)別和運(yùn)動(dòng)目標(biāo)檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python opencv檢測(cè)目標(biāo)顏色的實(shí)例講解
- Python+OpenCV目標(biāo)跟蹤實(shí)現(xiàn)基本的運(yùn)動(dòng)檢測(cè)
- Python Opencv任意形狀目標(biāo)檢測(cè)并繪制框圖
- OpenCV實(shí)現(xiàn)幀差法檢測(cè)運(yùn)動(dòng)目標(biāo)
- OpenCV+python實(shí)現(xiàn)實(shí)時(shí)目標(biāo)檢測(cè)功能
- 基于深度學(xué)習(xí)和OpenCV實(shí)現(xiàn)目標(biāo)檢測(cè)
- 如何使用Python和OpenCV進(jìn)行實(shí)時(shí)目標(biāo)檢測(cè)實(shí)例詳解
相關(guān)文章
JSON Web Tokens的實(shí)現(xiàn)原理
本文主要介紹了JSON Web Tokens的實(shí)現(xiàn)原理。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-04-04
python tkinter庫(kù)實(shí)現(xiàn)氣泡屏保和鎖屏
這篇文章主要為大家詳細(xì)介紹了python tkinter庫(kù)實(shí)現(xiàn)氣泡屏保和鎖屏,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的驗(yàn)證碼程序
這篇文章主要介紹了Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的驗(yàn)證碼程序,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
pytorch中dataloader 的sampler 參數(shù)詳解
這篇文章主要介紹了pytorch中dataloader 的sampler 參數(shù)詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09
python算法學(xué)習(xí)之桶排序算法實(shí)例(分塊排序)
本代碼介紹了python算法學(xué)習(xí)中的桶排序算法實(shí)例,大家參考使用吧2013-12-12
Python?中?Selenium?的?send_keys()?函數(shù)用法小結(jié)
send_keys() 是將數(shù)字、文本和符號(hào)等鍵盤(pán)輸入發(fā)送到應(yīng)用程序的文本框的過(guò)程, send_keys() 是 WebDriver 的一部分,每個(gè)鍵盤(pán)輸入都會(huì)發(fā)送到此元素,這篇文章主要介紹了Python?中?Selenium?的?send_keys()?函數(shù),需要的朋友可以參考下2023-11-11
Python3實(shí)現(xiàn)發(fā)送郵件和發(fā)送短信驗(yàn)證碼功能
這篇文章主要介紹了Python3實(shí)現(xiàn)發(fā)送郵件和發(fā)送短信驗(yàn)證碼功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01

