亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

OpenCV實(shí)現(xiàn)幀間差分法詳解

 更新時(shí)間:2020年03月21日 10:23:09   作者:特種軍靴  
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)幀間差分法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了OpenCV實(shí)現(xiàn)幀間差分法的具體方法,供大家參考,具體內(nèi)容如下

一.基本概念

基于視頻的車輛檢測(cè)算法種類很多:光流法檢測(cè),幀差法,背景消除法(其中包括:直方圖法,平均值法,單分布和混合高斯分布背景模型,Kalman濾波等),邊緣檢測(cè)法,運(yùn)動(dòng)矢量檢測(cè)法...下面分享的是運(yùn)動(dòng)目標(biāo)檢測(cè)算法中最基本的方法—幀間差分法。

相鄰幀間圖像差分思想:檢測(cè)出了相鄰兩幀圖像中發(fā)生變化的區(qū)域。該方法是用圖像序列中的連續(xù)兩幀圖像進(jìn)行差分,然后二值化該灰度差分圖像來(lái)提取運(yùn)動(dòng)信息。由幀間變化區(qū)域檢測(cè)分割得到的圖像,區(qū)分出背景區(qū)域和運(yùn)動(dòng)車輛區(qū)域,進(jìn)而提取要檢測(cè)的車輛目標(biāo)。

它是通過(guò)比較圖像序列中前后兩幀圖像對(duì)應(yīng)像素點(diǎn)灰度值的不同,通過(guò)兩幀相減,如果灰度值很小,可以認(rèn)為該點(diǎn)無(wú)運(yùn)動(dòng)物體經(jīng)過(guò);反之灰度變化很大,則認(rèn)為有物體經(jīng)過(guò)。第k幀和k+1幀圖像fk(x,y),fk+l(x,y)之間的變化用一個(gè)二值差分圖像D(x,y)表示,如式:

二值圖中0對(duì)應(yīng)前后未變化的地方,1對(duì)應(yīng)變化的地方。流程圖如下圖所示:

幀差法的特點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,運(yùn)算速度快,對(duì)于動(dòng)態(tài)環(huán)境自適應(yīng)性是很強(qiáng)的,對(duì)光線的變化不是十分的敏感。但是在運(yùn)動(dòng)體內(nèi)易產(chǎn)生空洞.特別是目標(biāo)運(yùn)動(dòng)速度較快時(shí),影響目標(biāo)區(qū)域準(zhǔn)確提取。我們以年輛檢測(cè)為例,車輛檢測(cè)除了要檢測(cè)出運(yùn)動(dòng)車輛.同時(shí)還要檢測(cè)出暫時(shí)停止的車輛,在這個(gè)方面,此類方法無(wú)能為力。而且如果車輛的體積較大,那么車輛在前后幀中根容易產(chǎn)生重疊部分,尤其是大貨車,這使得幀問(wèn)差分的結(jié)果主要為車頭和車尾。車輛中間部分的差分值相對(duì)報(bào)?。纬煽斩矗焕跈z測(cè)。

二.程序源代碼

#include "stdafx.h"
#include "highgui.h"
#include "cxcore.h"
#include "ml.h"
#include "cv.h"
 
void main()
{
 CvCapture* capture;
 capture=cvCaptureFromFile("video.avi");//獲取視頻
 cvNamedWindow("camera",CV_WINDOW_AUTOSIZE);
 cvNamedWindow("moving area",CV_WINDOW_AUTOSIZE);
 
 
 IplImage* tempFrame;//用于遍歷capture中的幀,通道數(shù)為3,需要轉(zhuǎn)化為單通道才可以處理
 IplImage* currentFrame;//當(dāng)前幀
 IplImage* previousFrame;//上一幀
 /*
 CvMat結(jié)構(gòu),本質(zhì)上和IplImage差不多,但是因?yàn)镮plImage里的數(shù)據(jù)只能用uchar的形式存放,當(dāng)需要這些圖像數(shù)據(jù)看作數(shù)據(jù)矩陣來(lái)運(yùn)算時(shí),0~255的精度顯然滿足不了要求;
然而CvMat里卻可以存放任意通道數(shù)、任意格式的數(shù)據(jù)
 */
 CvMat* tempFrameMat;
 CvMat* currentFrameMat; //IplImage要轉(zhuǎn)成CvMat進(jìn)行處理
 CvMat* previousFrameMat;
 
 int frameNum=0;
 while(tempFrame=cvQueryFrame(capture))
 {
 //tempFrame=cvQueryFrame(capture);
 frameNum++;
 if(frameNum==1)
 {
 //第一幀先初始化各個(gè)結(jié)構(gòu),為它們分配空間
 previousFrame=cvCreateImage(cvSize(tempFrame->width,tempFrame->height),IPL_DEPTH_8U,1);
 currentFrame=cvCreateImage(cvSize(tempFrame->width,tempFrame->height),IPL_DEPTH_8U,1);
 currentFrameMat=cvCreateMat(tempFrame->height, tempFrame->width, CV_32FC1);
 previousFrameMat=cvCreateMat(tempFrame->height, tempFrame->width, CV_32FC1);
 tempFrameMat=cvCreateMat(tempFrame->height, tempFrame->width, CV_32FC1);
 //此時(shí)這些IplImage和CvMat都是空的,沒(méi)有存有數(shù)據(jù)
 }
 if(frameNum>=2)
 {
 cvCvtColor(tempFrame, currentFrame, CV_BGR2GRAY);//轉(zhuǎn)化為單通道灰度圖,此時(shí)currentFrame已經(jīng)存了tempFrame的內(nèi)容
 /*
 用cvConvert將IplImage轉(zhuǎn)為CvMat,接下來(lái)用cvAbsDiff對(duì)它們處理
 經(jīng)過(guò)轉(zhuǎn)換后,currentFrame沒(méi)有改變,但是tempFrameMat已經(jīng)存了currentFrame的內(nèi)容
 */
 cvConvert(currentFrame,tempFrameMat);
 cvConvert(previousFrame,previousFrameMat);
 
 cvAbsDiff(tempFrameMat,previousFrameMat,currentFrameMat);//做差求絕對(duì)值
 /*
 在currentFrameMat中找大于20(閾值)的像素點(diǎn),把currentFrame中對(duì)應(yīng)的點(diǎn)設(shè)為255
 此處閾值可以幫助把車輛的陰影消除掉
 */
 cvThreshold(currentFrameMat,currentFrame,20,255.0,CV_THRESH_BINARY);
  //cvConvert(currentFrameMat,currentFrame); //觀察不二值化的情況
 
 cvDilate(currentFrame,currentFrame); //膨脹
 cvErode(currentFrame,currentFrame); //腐蝕
 cvFlip(currentFrame, NULL, 0); //垂直翻轉(zhuǎn)
 //顯示圖像
 cvShowImage("camera",tempFrame);
 cvShowImage("moving area",currentFrame);
 }
 //把當(dāng)前幀保存作為下一次處理的前一幀
 cvCvtColor(tempFrame, previousFrame, CV_BGR2GRAY);
 cvWaitKey(33);
 
 }//end while
 
 //釋放資源
 cvReleaseImage(&tempFrame);
 cvReleaseImage(&previousFrame);
 cvReleaseImage(&currentFrame);
 
 cvReleaseCapture(&capture);
 cvReleaseMat(&previousFrameMat);
 cvReleaseMat(&currentFrameMat);
 cvDestroyWindow("camera");
 cvDestroyWindow("moving area");
}

【注意】代碼復(fù)制他處,略有改動(dòng),進(jìn)行視頻輸出矯正(源代碼昰倒的圖像)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程

    Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++實(shí)現(xiàn)單例模式的方法

    C++實(shí)現(xiàn)單例模式的方法

    這篇文章主要為大家介紹了C++實(shí)現(xiàn)單例模式的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C++解析Json的方法詳解【jsoncpp】

    C++解析Json的方法詳解【jsoncpp】

    這篇文章主要介紹了C++解析Json的方法,結(jié)合實(shí)例形式分析了C++操作json格式數(shù)據(jù)的相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下
    2017-06-06
  • Qt控件之QLabel用法及技巧

    Qt控件之QLabel用法及技巧

    QLabel是Qt中的一個(gè)控件類,用于顯示文本或圖像的控件類之一,本文主要介紹了Qt控件之QLabel用法及技巧,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Qt中QDateTimeEdit的具體使用

    Qt中QDateTimeEdit的具體使用

    本文主要介紹了Qt中QDateTimeEdit的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Visual studio setup.exe 安裝vs2022報(bào)錯(cuò)的解決方案

    Visual studio setup.exe 安裝vs2022報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了Visual studio setup.exe 安裝vs2022報(bào)錯(cuò)的解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • C++實(shí)現(xiàn)獲取指定代碼段的cpu占用

    C++實(shí)現(xiàn)獲取指定代碼段的cpu占用

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)獲取指定代碼段的cpu占用的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下
    2023-12-12
  • 基于C語(yǔ)言實(shí)現(xiàn)的aes256加密算法示例

    基于C語(yǔ)言實(shí)現(xiàn)的aes256加密算法示例

    這篇文章主要介紹了基于C語(yǔ)言實(shí)現(xiàn)的aes256加密算法,結(jié)合具體實(shí)例形式詳細(xì)分析了C語(yǔ)言實(shí)現(xiàn)的aes256加密算法實(shí)現(xiàn)步驟與使用技巧,需要的朋友可以參考下
    2017-02-02
  • CISBitmap派生的VC++位圖透明類實(shí)例

    CISBitmap派生的VC++位圖透明類實(shí)例

    這篇文章主要介紹了CISBitmap派生的VC++位圖透明類,比較實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • c++中strcpy函數(shù)在VS2015無(wú)法使用的問(wèn)題

    c++中strcpy函數(shù)在VS2015無(wú)法使用的問(wèn)題

    這篇文章主要介紹了c++中strcpy函數(shù)在VS2015無(wú)法使用的問(wèn)題,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-11-11

最新評(píng)論