最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Opencv二幀差法檢測運(yùn)動(dòng)目標(biāo)與提取輪廓

 更新時(shí)間:2020年03月21日 16:02:43   作者:洛基Nickey  
這篇文章主要為大家詳細(xì)介紹了Opencv使用二幀差法檢測運(yùn)動(dòng)目標(biāo)與提取輪廓,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

Opencv學(xué)習(xí)之二幀差法運(yùn)動(dòng)目標(biāo)檢測與輪廓提取 ,供大家參考,具體內(nèi)容如下

代碼是從網(wǎng)上摘抄學(xué)習(xí)的,加了好多注釋,感覺就像邊看書邊做筆記一樣,給人以滿足的享受。Let's do this!

#include "highgui.h"
#include "cv.h"
#include "stdio.h"
#include <time.h>
#include <math.h>
#include <string.h>

const double MHI_DURATION=0.1;//運(yùn)動(dòng)跟蹤的最大持續(xù)時(shí)間0.1s
const double MAX_TIME_DELTA=0.5//最大時(shí)間增量0.5s
const double MIN_TIME_DELTA=0.05;//最小時(shí)間增量0.05s
const int N=3;
const int CONTOUR_MAX_AERA=16;

/*做幀差時(shí)要用到的圖像緩沖*/
IplImage **buf=0;
int last=0;
/*臨時(shí)圖像*/
IplImage* mhi=0;//運(yùn)動(dòng)歷史圖像mhi

CvConnectedComp* cur_comp,mincomp;
/*typedef struct CvConnectedComp 
 {
 double area; //區(qū)域的面積
 CvScalar value; //區(qū)域顏色的平均值
 CvRect rect; //是一個(gè)區(qū)域的外接矩形
 CvSeq * contour; //指向另一個(gè)序列的指針
 };*/
/*定義一個(gè)內(nèi)存存儲(chǔ)器*/
CvMemStorage* storage;
/*二維坐標(biāo)系下的點(diǎn),類型為整型,通常以0點(diǎn)為原點(diǎn),有x、y坐標(biāo)*/
CvPoint pt[4];

/*當(dāng)前畫面索引*/
int nCurFrameIndex=0;

/*定義用來更新運(yùn)動(dòng)歷史圖像的函數(shù)*/
/*img-輸入視頻幀;dst-檢測結(jié)果*/
void update(IplImage *img,IplImage *dst,int diff_threshold)
{
 /*獲得當(dāng)前時(shí)間,單位是秒*/
 double timestamp=clock()/100;
 /*獲得輸入視頻幀的尺寸,用存到size中*/
 CvSize size=cvSize(img->width,img->height);
 /*做幀差要用到的中間變量*/
 int i,idx1,idx2;
 /*當(dāng)前幀與上一幀做幀差之后,得到的圖像數(shù)據(jù)存儲(chǔ)在nimg中*/
 IplImage* nimg;
 /*這步暫時(shí)沒看懂- -!*/
 IplImage* pyr=cvCreateImage(cvSize((size.width&-2)/2,(size.height&-2)/2),8,1);
 /*定義一個(gè)內(nèi)存存儲(chǔ)器*/
 CvMemStorage* stor;
 /*創(chuàng)建一個(gè)可增長的序列seq*/
 CvSeq* seq;

 /*先進(jìn)行數(shù)據(jù)的初始化*/
 /*如果歷史圖像為空,或者歷史圖像尺寸與輸入的當(dāng)前幀尺寸不吻合(這意味著打開了新的視頻?)*/
 if(!mhi||mhi->width!=size.width||mhi->height!=size.height)
 {
 /*如果buf還未初始化,則為buf分配內(nèi)存*/
 if(buf==0)
 {
  /*N=3*/
  buf=(IplImage**)malloc(N*sizeof(buf[0]));
  /*將指針s所指向的某一塊內(nèi)存中的每個(gè)字節(jié)的內(nèi)容全部設(shè)置為ch指定的ASCII值,塊的大小由第三個(gè)參數(shù)指定:memset(void *s,char ch,unsigned n)。此處作用相當(dāng)于將buf內(nèi)的元素全部置零*/
  memset(buf,0,N*sizeof(buf[0]));
 }
 /*若buf已經(jīng)初始化了,也將buf置零*/
 for(i=0;i<N;i++)
 {
  cvReleaseImage(&buf[i]);
  buf[i]=cvCreateImage(size,IPL_DEPTH_8U,1);
  cvZero(buf[i]);
 }
 /*重新初始化運(yùn)動(dòng)歷史圖像mhi*/
 cvReleaseImage(&mhi);
 mhi=cvCreateImage(size,IPL_DEPTH_32F,1);
 cvZero(mhi);
 }

 /*將當(dāng)前要處理的幀轉(zhuǎn)化為灰度圖,放到buf的最后一幀*/
 cvCvtColor(img,buf[last],CV_BGR2GRAY);
 /*這三部是為了做幀差,讓buf[idx1]永遠(yuǎn)保存的是上一幀,buf[idx2]保存當(dāng)前幀*/
 idx1=last;
 idx2=(last+1)%N;
 last=idx2;
 /*做幀差,函數(shù) cvAbsDiff 計(jì)算兩個(gè)數(shù)組差的絕對值*/
 nimg=buf[idx2];
 cvAbsDiff(buf[idx1],buf[idx2],nimg);
 /*幀差之后,將得到的圖像二值化*/
 cvThreshold(nimg,nimg,50,255,CV_THRESH_BINARY);
 /*去掉超時(shí)的影像以更新運(yùn)動(dòng)歷史圖像*/
 cvUpdateMotionHistory(nimg,mhi,timestamp,MHI_DURATION);
 cvConvert(mhi,dst);
 /*中值濾波,消除小的噪聲
 函數(shù)cvPyrDown使用Gaussian金字塔分解對輸入圖像向下采樣,去除噪聲,圖像是原圖像的四分之一
 函數(shù)cvDialate做膨脹操作,去除目標(biāo)的不連續(xù)空洞
 函數(shù)cvPyrUp使用Gaussian金字塔分解對輸入圖像向上采樣,恢復(fù)圖像,圖象是原圖像的四倍*/
 cvSmooth(dst,dst,CV_MEDIAN,3,0,0,0);
 cvPyrDown(dst,pyr,CV_GAUSSIAN_5x5);
 cvDilate(pyr,pyr,0,1);
 cvPyrUp(pyr,dst,CV_GAUSSIAN_5x5);

 /*創(chuàng)建輪廓*/
 stor=cvCreateMemStorage(0);
 seq=cvCreateSeq(CV_SEQ_ELTYPE_POINT,//從預(yù)定義的序列類型中選擇一合適的類型
 sizeof(CvSeq),//此參數(shù)表示序列頭部的大?。槐仨毚笥诨虻扔趕izeof(CvSeq)
 /*第三個(gè)參數(shù)是元素的大小,以字節(jié)計(jì)。這個(gè)大小必須與序列類型(由seq_flags指定)相一致,例如,對于一個(gè)點(diǎn)的序列,元素類型 CV_SEQ_ELTYPE_POINT應(yīng)當(dāng)被指定,參數(shù)elem_size必須等同于sizeof(CvPoint)。
*/
 sizeof(CvPoint),
 stor);//指向前面定義的內(nèi)存存儲(chǔ)器的指針

 /*找到所有輪廓*/
 cvFindContours(dst,//源二值圖像
 stor,//返回輪廓的容器
 &seq,//輸出參數(shù),第一個(gè)外接輪廓的地址。
 sizeof(CvContour),
 CV_RETR_EXTERNAL,//mode:EXTERNAL——只查找最外的輪廓
 CV_CHAIN_APPROX_NONE,//輪廓近似的方法,具體見百度百科- -
 cvPoint(0,0));

 /*直接用CONTOUR中的矩形來畫輪廓*/
 /*遍歷seq序列*/
 for(;seq;seq=seq->h_next)
 {
 /*直接使用輪廓的矩形,調(diào)取rect會(huì)得到與x、y軸平行的矩形,并非最小矩形*/
 CvRect r=((CvContour*)cont)->rect;//將序列類型轉(zhuǎn)換成輪廓類型的指針?
 /*矩形的面積小于輪廓面積的話,舍棄;矩形面積也不能過小*/
 if((r.height*r.width>CONTOUR_MAX_AERA)&&(r.height*r.width>2560))
 {
  /*cvRectangle函數(shù)通過對角線兩個(gè)頂點(diǎn),繪制矩形*/
  cvRectangle(img,//圖像
  cvPoint(r.x,r.y),//一個(gè)頂點(diǎn)
  cvPoint(r.x + r.width, r.y + r.height),//另一個(gè)頂點(diǎn)
  CV_RGB(255,0,0),//線條顏色
  1,//線條粗細(xì)程度
  CV_AA,//線條類型
  0); //坐標(biāo)點(diǎn)的小數(shù)點(diǎn)位數(shù)
 }
 }

 /*函數(shù)調(diào)用完畢,釋放內(nèi)存*/
 cvReleaseMemStorage(&stor);
 cvReleaseImage(&pyr);
}

/處理視頻,主函數(shù)/
int main(int argc,char**argv)
{
 IplImage *motion=0;
 CvCapture *capture=0;
 /*讀取視頻幀*/
 capture=cvCaptureFromFile("D:\\視頻\\01.mp4");
 if(capture)
 {
 cvNamedWindow("Motion",1);
 for(;;)
 {
  IplImage *image;
  /*使用cvGrabFrame函數(shù)抓取幀*/
  if(!cvGrabFrame(capture))
  break;
  /*使用cvRetrieveFrame函數(shù)取回被cvGrabFrame抓取的幀*/
  image=cvRetrieveFrame(capture);
  if(image)
  {
  /*如果motion并未初始化,說明這是第一幀。我們將motion初始化*/
  if(!motion)
  {
   motion=cvCreateImage(cvSize(image->width,image->height),8,1);
   cvZero(motion);
   /*需要保證內(nèi)存存儲(chǔ)的順序和取出的幀相同*/
   motion->origin=image->origin;
  }
  }
  /*若取出了新的一幀,而且motion不為空,則更新畫面*/
  update(image,motion,10);
  /*顯示處理過的圖像*/
  cvShowImage("Motion",image);

  /*10ms內(nèi)檢測到用戶按了任意鍵,均退出*/
  if(cvWaitKey(10)>=0)
  break;
 }
 /*當(dāng)上面這個(gè)for循環(huán)執(zhí)行結(jié)束時(shí),說明視頻已經(jīng)處理完成或者用戶停止處理視頻了*/
 cvReleaseCapture(&capture);
 cvDestroyWindow("Motion");
 }
 return 0;
}

經(jīng)過測試,這個(gè)程序能夠成功檢測并用紅色方框圈出移動(dòng)的車輛和行人。

待改進(jìn)的地方有:

①視頻處理速度慢,導(dǎo)致視頻處理速度只有視頻正常播放速度的二分之一。

②對于行人的檢測,畫出的紅色方框不穩(wěn)定,不是將整個(gè)行人框出,經(jīng)常會(huì)分別框出一個(gè)人的幾個(gè)不同部位orz。

③當(dāng)兩個(gè)物體稍有重疊時(shí),會(huì)將重疊物體當(dāng)作一個(gè)物體圈出。

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

相關(guān)文章

  • OpenCV實(shí)現(xiàn)圖像腐蝕

    OpenCV實(shí)現(xiàn)圖像腐蝕

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)圖像腐蝕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言數(shù)據(jù)結(jié)構(gòu)不掛科指南之隊(duì)列詳解

    C語言數(shù)據(jù)結(jié)構(gòu)不掛科指南之隊(duì)列詳解

    這篇博客主要介紹一下隊(duì)列的概念,并且采用 C 語言,編寫兩種存儲(chǔ)實(shí)現(xiàn)方式:順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ),當(dāng)然還有常規(guī)的隊(duì)列基本操作的實(shí)現(xiàn)算法
    2022-09-09
  • 單鏈表實(shí)現(xiàn)反轉(zhuǎn)的3種方法示例代碼

    單鏈表實(shí)現(xiàn)反轉(zhuǎn)的3種方法示例代碼

    單鏈表的反轉(zhuǎn)是常見的面試題目,下面這篇文章主要給大家介紹了關(guān)于單鏈表實(shí)現(xiàn)反轉(zhuǎn)的3種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • C語言自定義數(shù)據(jù)類型的結(jié)構(gòu)體、枚舉和聯(lián)合詳解

    C語言自定義數(shù)據(jù)類型的結(jié)構(gòu)體、枚舉和聯(lián)合詳解

    這篇文章主要給大家介紹了關(guān)于C語言自定義數(shù)據(jù)類型的結(jié)構(gòu)體、枚舉和聯(lián)合的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • C++11中l(wèi)onglong超長整型和nullptr初始化空指針

    C++11中l(wèi)onglong超長整型和nullptr初始化空指針

    本文介紹?C++11?標(biāo)準(zhǔn)中新添加的?long?long?超長整型和?nullptr?初始化空指針,在?C++11?標(biāo)準(zhǔn)下,相比?NULL?和?0,使用?nullptr?初始化空指針可以令我們編寫的程序更加健壯,本文結(jié)合示例代碼給大家詳細(xì)講解,需要的朋友跟隨小編一起看看吧
    2022-12-12
  • 使用C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)

    使用C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)

    這篇文章主要介紹了使用C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++實(shí)現(xiàn)LeetCode(102.二叉樹層序遍歷)

    C++實(shí)現(xiàn)LeetCode(102.二叉樹層序遍歷)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(102.二叉樹層序遍歷),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++ MD5的源碼實(shí)例詳解

    C++ MD5的源碼實(shí)例詳解

    這篇文章主要介紹了C++ MD5的源碼實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 詳解Matlab如何繪制小提琴圖

    詳解Matlab如何繪制小提琴圖

    小提琴圖 (Violin Plot)是用來展示多組數(shù)據(jù)的分布狀態(tài)以及概率密度。這種圖表結(jié)合了箱形圖和密度圖的特征,主要用來顯示數(shù)據(jù)的分布形狀。本文將介紹如何利用Matlab繪制小提琴圖,需要的可以參考一下
    2022-02-02
  • C/C++ winsock實(shí)現(xiàn)不同設(shè)備實(shí)時(shí)通訊的示例代碼

    C/C++ winsock實(shí)現(xiàn)不同設(shè)備實(shí)時(shí)通訊的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C/C++如何利用winsock連接實(shí)現(xiàn)不同設(shè)備實(shí)時(shí)通訊,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09

最新評論

庆城县| 札达县| 济南市| 房山区| 浙江省| 喀喇沁旗| 武义县| 建平县| 抚宁县| 南召县| 绩溪县| 交城县| 马山县| 准格尔旗| 遵义市| 绩溪县| 嘉峪关市| 万源市| 高青县| 伽师县| 清丰县| 岳池县| 汽车| 巴东县| 台湾省| 余江县| 共和县| 周宁县| 乌兰县| 大名县| 来安县| 华容县| 南华县| 乌拉特后旗| 翼城县| 明水县| 佛冈县| 临桂县| 九龙县| 尉犁县| 和政县|