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

opencv實(shí)現(xiàn)三幀差法解析

 更新時(shí)間:2020年03月21日 06:25:21   作者:xiao__run  
這篇文章主要介紹了opencv實(shí)現(xiàn)三幀差法的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

今天和大家談?wù)勅龓罘▉?lái)實(shí)現(xiàn)運(yùn)動(dòng)目標(biāo)檢測(cè)吧,其中運(yùn)動(dòng)檢測(cè)畫框?qū)崿F(xiàn)追蹤方法多種多樣,大家可以自行百度,后面我也會(huì)一一實(shí)現(xiàn),今天我先給大家玩玩三幀差法吧;;;;(注釋非常清楚哦,程序也極其簡(jiǎn)單的)

幀差法是最為常用的運(yùn)動(dòng)目標(biāo)檢測(cè)和分割方法之一,基本原理就是在圖像序列相鄰兩幀或三幀間采用基于像素的時(shí)間差分通過(guò)閉值化來(lái)提取出圖像中的運(yùn)動(dòng)區(qū)域。首先,將相鄰幀圖像對(duì)應(yīng)像素值相減得到差分圖像,然后對(duì)差分圖像二值化,在環(huán)境亮度變化不大的情況下,如果對(duì)應(yīng)像素值變化小于事先確定的閡值時(shí),可以認(rèn)為此處為背景像素:如果圖像區(qū)域的像素值變化很大,可以認(rèn)為這是由于圖像中運(yùn)動(dòng)物體引起的,將這些區(qū)域標(biāo)記為前景像素,利用標(biāo)記的像素區(qū)域可以確定運(yùn)動(dòng)目標(biāo)在圖像中的位置。由于相鄰兩幀間的時(shí)間間隔非常短,用前一幀圖像作為當(dāng)前幀的背景模型具有較好的實(shí)時(shí)性,其背景不積累,且更新速度快、算法簡(jiǎn)單、計(jì)算量小。算法的不足在于對(duì)環(huán)境噪聲較為敏感,閩值的選擇相當(dāng)關(guān)鍵,選擇過(guò)低不足以抑制圖像中的噪聲,過(guò)高則忽略了圖像中有用的變化。對(duì)于比較大的、顏色一致的運(yùn)動(dòng)目標(biāo),有可能在目標(biāo)內(nèi)部產(chǎn)生空洞,無(wú)法完整地提取運(yùn)動(dòng)目標(biāo)。

簡(jiǎn)單說(shuō)一下程序思路哈,參考了一下opencv官網(wǎng)教程

#include<iostream>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;
using namespace std;
const unsigned char FORE_GROUD = 255;int thresh = 10;
int main(int argc,char*argv[])
{   
 VideoCapture video(argv[1]); //判斷如果video是否可以打開 
 if(!video.isOpened())  
 return -1;  

//用于保存當(dāng)前幀的圖片 

 Mat currentBGRFrame;  
//用來(lái)保存上一幀和當(dāng)前幀的灰度圖片 
 Mat previousSecondGrayFrame; Mat previousFirstGrayFrame; Mat currentGaryFrame; 
 //保存兩次的幀差 
Mat previousFrameDifference; //previousFrameFirst - previousFrameSecond的差分 
Mat currentFrameDifference;  //currentFrame - previousFrameFirst; 
 //用來(lái)保存幀差的絕對(duì)值 
Mat absFrameDifferece; 
//用來(lái)顯示前景 
 Mat previousSegmentation; Mat currentSegmentation; Mat segmentation; 
 //顯示前景 
 namedWindow("segmentation",1); 
 createTrackbar("閾值:","segmentation",&thresh,FORE_GROUD,NULL); 
 //幀數(shù) 
 int numberFrame = 0; 
//形態(tài)學(xué)處理用到的算子 
 Mat morphologyKernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));  
 for(;;) 
 {  //讀取當(dāng)前幀  
 video >> currentBGRFrame;  
 //判斷當(dāng)前幀是否存在  
 if(!currentBGRFrame.data)   
 break;   
  numberFrame++;  
 //顏色空間的轉(zhuǎn)換  
 cvtColor(currentBGRFrame,currentGaryFrame,COLOR_BGR2GRAY);   
 if( numberFrame == 1)  {  
 //保存當(dāng)前幀的灰度圖   
 previousSecondGrayFrame = currentGaryFrame.clone();    
  //顯示視頻  
 imshow("video",currentBGRFrame);   continue;  }  
 else if( numberFrame == 2)  
 {   
 //保存當(dāng)前幀的灰度圖  
  previousFirstGrayFrame = currentGaryFrame.clone();   
 //previousFirst - previousSecond   
 subtract(previousFirstGrayFrame,previousSecondGrayFrame,previousFrameDifference,Mat(),CV_16SC1);   
 //取絕對(duì)值   
 absFrameDifferece = abs(previousFrameDifference);      
 //位深的改變   
 absFrameDifferece.convertTo(absFrameDifferece,CV_8UC1,1,0);   
 //閾值處理  
 threshold(absFrameDifferece,previousSegmentation,double(thresh),double(FORE_GROUD),THRESH_BINARY);    
  //顯示視頻  
 imshow("video",currentBGRFrame);   
 continue;  }  
 else  
 {   
 //src1-src2   
subtract(currentGaryFrame,previousFirstGrayFrame,currentFrameDifference,Mat(),CV_16SC1);    
   //取絕對(duì)值  
  absFrameDifferece = abs(currentFrameDifference);      
 //位深的改變   absFrameDifferece.convertTo(absFrameDifferece,CV_8UC1,1,0); 
   //閾值處理   
 threshold(absFrameDifferece,currentSegmentation,double(thresh),double(FORE_GROUD),THRESH_BINARY);  //與運(yùn)算   
 bitwise_and(previousSegmentation,currentSegmentation,segmentation);    //中值濾波   
medianBlur(segmentation,segmentation,3); //形態(tài)學(xué)處理(開閉運(yùn)算)   
 //morphologyEx(segmentation,segmentation,MORPH_OPEN,morphologyKernel,Point(-1,-1),1,BORDER_REPLICATE);   
 morphologyEx(segmentation,segmentation,MORPH_CLOSE,morphologyKernel,Point(-1,-1),2,BORDER_REPLICATE);      
      //找邊界   
 vector< vector<oint> > contours;   
 vector<Vec4i> hierarchy;   
 //復(fù)制segmentation  
  Mat tempSegmentation = segmentation.clone();  
  findContours( segmentation, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );//CV_RETR_TREE  
  vector< vector<oint> > contours_poly( contours.size() );     
  /*存儲(chǔ)運(yùn)動(dòng)物體*/   
  vector<Rect> boundRect;   
  boundRect.clear();      
 //畫出運(yùn)動(dòng)物體   
 for(int index = 0;index < contours.size() ;index++)   
 {   
 approxPolyDP( Mat(contours[index]), contours_poly[index], 3, true );   
  Rect rect = boundingRect( Mat(contours_poly[index]) );    
 rectangle(currentBGRFrame,rect,Scalar(0,255,255),2);   }  
 //顯示視頻  
 imshow("video",currentBGRFrame);      
 //前景檢測(cè)   
imshow("segmentation",segmentation);   
 //保存當(dāng)前幀的灰度圖   
 previousFirstGrayFrame = currentGaryFrame.clone();      
 //保存當(dāng)前的前景檢測(cè)   
 previousSegmentation = currentSegmentation.clone();  
 }    
 if(waitKey(33) == 'q')   
 break; 
 } 
 return 0;
}

編譯之后,運(yùn)行./main.cpp **.avi

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

相關(guān)文章

  • 基于opencv的行人檢測(cè)(支持圖片視頻)

    基于opencv的行人檢測(cè)(支持圖片視頻)

    本文主要介紹了基于opencv的行人檢測(cè)(支持圖片視頻),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C語(yǔ)言預(yù)處理詳解

    C語(yǔ)言預(yù)處理詳解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言之預(yù)處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • 使用C語(yǔ)言操作文件的基本函數(shù)整理

    使用C語(yǔ)言操作文件的基本函數(shù)整理

    這篇文章主要介紹了使用C語(yǔ)言操作文件的基本函數(shù)整理,包括創(chuàng)建和打開以及關(guān)閉文件的操作方法,需要的朋友可以參考下
    2015-08-08
  • 利用stream實(shí)現(xiàn)一個(gè)簡(jiǎn)單的http下載器

    利用stream實(shí)現(xiàn)一個(gè)簡(jiǎn)單的http下載器

    這篇文章主要介紹了利用stream實(shí)現(xiàn)一個(gè)簡(jiǎn)單的http下載器的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • C語(yǔ)言中socket相關(guān)網(wǎng)絡(luò)編程函數(shù)小結(jié)

    C語(yǔ)言中socket相關(guān)網(wǎng)絡(luò)編程函數(shù)小結(jié)

    這篇文章主要介紹了C語(yǔ)言中socket相關(guān)網(wǎng)絡(luò)編程函數(shù)小結(jié),是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C語(yǔ)言實(shí)現(xiàn)魔方比賽管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)魔方比賽管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)魔方比賽管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++ sort排序函數(shù)用法詳解

    C++ sort排序函數(shù)用法詳解

    本文主要介紹了C++ sort排序函數(shù)用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 黑客帝國(guó)數(shù)字雨效果VC6源代碼分享

    黑客帝國(guó)數(shù)字雨效果VC6源代碼分享

    這篇文章主要介紹了黑客帝國(guó)數(shù)字雨效果VC6源代碼分享,本文直接給出實(shí)現(xiàn)代碼,Win7下編譯通過(guò),效果很酷,需要的朋友可以參考下
    2015-02-02
  • C++實(shí)現(xiàn)單鏈表刪除倒數(shù)第k個(gè)節(jié)點(diǎn)的方法

    C++實(shí)現(xiàn)單鏈表刪除倒數(shù)第k個(gè)節(jié)點(diǎn)的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)單鏈表刪除倒數(shù)第k個(gè)節(jié)點(diǎn)的方法,結(jié)合實(shí)例形式分析了C++單鏈表的定義、遍歷及刪除相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • C++實(shí)現(xiàn)LeetCode(144.二叉樹的先序遍歷)

    C++實(shí)現(xiàn)LeetCode(144.二叉樹的先序遍歷)

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

最新評(píng)論

深圳市| 马尔康县| 泊头市| 重庆市| 乌拉特前旗| 梁河县| 安泽县| 石棉县| 黔江区| 德昌县| 涞源县| 河曲县| 格尔木市| 沙雅县| 沾益县| 侯马市| 塘沽区| 和硕县| 西安市| 镇雄县| 开封县| 额尔古纳市| 明水县| 淮安市| 商都县| 兴文县| 连江县| 东乡族自治县| 抚宁县| 彭水| 临汾市| 白玉县| 景德镇市| 吉林省| 彰化县| 浏阳市| 永安市| 乌兰县| 寻乌县| 台东市| 隆安县|