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

OpenCV實(shí)現(xiàn)平均背景法

 更新時(shí)間:2020年03月21日 07:12:35   作者:thystar  
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)平均背景法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

平均背景法的基本思想是計(jì)算每個(gè)像素的平均值和標(biāo)準(zhǔn)差作為它的背景模型。

平均背景法使用四個(gè)OpenCV函數(shù):

  • cvAcc(),累積圖像;
  • cvAbsDiff() ,計(jì)算一定時(shí)間內(nèi)的每幀圖像只差;
  • cvInRange(), 將圖像分割成前景區(qū)域和背景區(qū)域;
  • cvOr(), 將不同的彩色通道圖像中合成為一個(gè)掩膜圖像

代碼:

/*
平均背景法
*/
 
#include "highgui.h"
#include "cv.h"
#include<stdlib.h>
#include<stdio.h>
 
//為不同的臨時(shí)指針圖像和統(tǒng)計(jì)屬性創(chuàng)建指針
 
//Float, 3-channel images
IplImage* IavgF, * IdiffF, * IprevF, * IhiF, *IlowF;
 
IplImage* Iscratch, *Iscratch2;
 
//Float 1-channel images
 
IplImage* Igray1, * Igray2, * Igray3;
IplImage* Ilow1, * Ilow2, * Ilow3;
IplImage* Ihi1, *Ihi2, * Ihi3;
 
//Byte, 1-channel image
IplImage* Imask;
IplImage* Imaskt;
 
//Counts number of images learned for averaging later.
float Icount;
 
// 創(chuàng)建一個(gè)函數(shù)來(lái)給需要的所有臨時(shí)圖像分配內(nèi)存
//為了方便,我們傳遞一幅圖像(來(lái)自視頻)作為大小參考來(lái)分配臨時(shí)圖像
 
void AllocateImages(IplImage* I)
{
 CvSize sz = cvGetSize(I);
 IavgF = cvCreateImage(sz, IPL_DEPTH_32F, 3);
 IdiffF = cvCreateImage(sz, IPL_DEPTH_32F,3);
 IprevF = cvCreateImage(sz, IPL_DEPTH_32F,3);
 IhiF = cvCreateImage(sz, IPL_DEPTH_32F, 3);
 IlowF = cvCreateImage(sz, IPL_DEPTH_32F,3);
 
 Ilow1 = cvCreateImage(sz, IPL_DEPTH_32F,1);
 Ilow2 = cvCreateImage(sz, IPL_DEPTH_32F,1);
 Ilow3 = cvCreateImage(sz, IPL_DEPTH_32F,1);
 Ihi1 = cvCreateImage(sz, IPL_DEPTH_32F,1);
 Ihi2 = cvCreateImage(sz, IPL_DEPTH_32F,1);
 Ihi3 = cvCreateImage(sz, IPL_DEPTH_32F,1);
 cvZero(IavgF);
 cvZero(IdiffF);
 cvZero(IprevF);
 cvZero(IhiF);
 cvZero(IlowF);
 Icount = 0.00001;
 
 Iscratch = cvCreateImage(sz, IPL_DEPTH_32F,3);
 Iscratch2 = cvCreateImage(sz, IPL_DEPTH_32F,3);
 
 Igray1 = cvCreateImage(sz, IPL_DEPTH_32F,1);
 Igray2 = cvCreateImage(sz, IPL_DEPTH_32F,1);
 Igray3 = cvCreateImage(sz, IPL_DEPTH_32F,1);
 
 Imask = cvCreateImage(sz, IPL_DEPTH_8U, 1);
 Imaskt = cvCreateImage(sz, IPL_DEPTH_8U,1);
 
 cvZero(Iscratch);
 cvZero(Iscratch2);
}
 
//學(xué)習(xí)累積背景圖像和每一幀圖像差值的絕對(duì)值
// Learn the background statistics for one more frame
// I is a color sample of the background, 3-channel, 8u
void accumulateBackground(IplImage *I)
{
 static int first = 1;
 cvCvtScale(I, Iscratch, 1, 0);
 if(!first)
 {
 cvAcc(Iscratch,IavgF);
 cvAbsDiff(Iscratch, IprevF, Iscratch2);
 cvAcc(Iscratch2,IdiffF);
 Icount += 1.0;
 }
 first = 0;
 cvCopy(Iscratch, IprevF);
}
 
//setHighThreshold和setLowThreshold都是基于每一幀圖像平均絕對(duì)差設(shè)置閾值的有效函數(shù)
void setHighThreshold(float scale)
{
 cvConvertScale(IdiffF, Iscratch, scale);
 cvAdd(Iscratch, IavgF, IhiF);
 cvSplit(IhiF, Ihi1, Ihi2, Ihi3, 0);
}
void setLowThreshold(float scale)
{
 cvConvertScale(IdiffF, Iscratch, scale);
 cvSub(IavgF, Iscratch, IlowF);
 cvSplit(IlowF, Ilow1, Ilow2, Ilow3, 0);
}
 
//當(dāng)積累了足夠多的幀圖像之后,就將其轉(zhuǎn)化為一個(gè)背景的統(tǒng)計(jì)模型
//計(jì)算每一個(gè)像素的均值和方差觀測(cè)
void createModelsfromStats()
{
 cvConvertScale(IavgF, IavgF, (double)(1.0/Icount));
 cvConvertScale(IdiffF, IdiffF, (double)(1.0/Icount));
 
 //Make sure diff is always something
 
 cvAddS(IdiffF, cvScalar(1.0, 1.0, 1.0), IdiffF);
 setHighThreshold(7.0);
 setLowThreshold(6.0);
}
 
//有了背景模型,同時(shí)給出了高,低閾值,就能用它將圖像分割為前景和背景
// Create a binary: 0,255 mask where 255 means foregrond pixel
// I Input image, 3-channel, 8u
//Imask 
void backgroundDiff(IplImage* I)
{
 cvCvtScale(I, Iscratch, 1, 0);
 cvSplit(Iscratch, Igray1, Igray2, Igray3, 0);
 
 //Channel 1
 cvInRange(Igray1, Ilow1, Ihi1, Imask);
 
 //Channel 2
 cvInRange(Igray2, Ilow2, Ihi2, Imaskt);
 cvOr(Imask, Imaskt, Imask);
 
 //Channel 3
 cvInRange(Igray3, Ilow3, Ihi3, Imaskt);
 cvOr(Imask, Imaskt, Imask);
 
 //Finally, invert the result
 cvSubRS(Imask, cvScalar(255), Imask);
}
 
//完成背景建模后, 釋放內(nèi)存
void DeallocateImage()
{
 cvReleaseImage(&IavgF);
 cvReleaseImage(&IdiffF);
 cvReleaseImage(&IprevF);
 cvReleaseImage(&IhiF);
 cvReleaseImage(&IlowF);
 cvReleaseImage(&Ilow1);
 cvReleaseImage(&Ilow2);
 cvReleaseImage(&Ilow3);
 cvReleaseImage(&Iscratch);
 cvReleaseImage(&Iscratch2);
 cvReleaseImage(&Igray1);
 cvReleaseImage(&Igray2);
 cvReleaseImage(&Igray3);
 cvReleaseImage(&Imaskt);
}
 
//主函數(shù)
int main()
{
 CvCapture* capture = cvCreateFileCapture("tree.avi");
 if(!capture)
 {
 return -1;
 }
 cvNamedWindow("win1");
 cvNamedWindow("win2");
 
 IplImage* rawImage = cvQueryFrame(capture);
 cvShowImage("win1", rawImage);
 
 AllocateImages(rawImage);
 int i = 0;
 while(1)
 {
 if(i <= 30)
 {
  accumulateBackground(rawImage);
  if(i == 30)
  {
  createModelsfromStats();
  }
 }
 else
 {
  backgroundDiff(rawImage);
 }
 cvShowImage("win2", Imask);
 
 if(cvWaitKey(33) == 27)
 {
  break;
 }
 if(!(rawImage = cvQueryFrame(capture)))
 {
  break;
 }
 cvShowImage("win1", rawImage);
 if(i == 56 || i == 63)
  cvWaitKey();
 i = i+1;
 }
 DeallocateImage();
 return 0;
}

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

相關(guān)文章

  • C++中volatile限定符的實(shí)現(xiàn)示例

    C++中volatile限定符的實(shí)現(xiàn)示例

    volatile關(guān)鍵字在C和C++中用于確保編譯器不優(yōu)化特定變量的訪問(wèn),主要用于多線程和硬件交互場(chǎng)景,本文就來(lái)介紹C++中volatile限定符的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-11-11
  • C語(yǔ)言深入分析遞歸函數(shù)的實(shí)現(xiàn)

    C語(yǔ)言深入分析遞歸函數(shù)的實(shí)現(xiàn)

    遞歸(recursive)函數(shù)是“自己調(diào)用自己”的函數(shù),無(wú)論是采用直接或間接調(diào)用方式。間接遞歸意味著函數(shù)調(diào)用另一個(gè)函數(shù)(然后可能又調(diào)用第三個(gè)函數(shù)等),最后又調(diào)用第一個(gè)函數(shù)。因?yàn)楹瘮?shù)不可以一直不停地調(diào)用自己,所以遞歸函數(shù)一定具備結(jié)束條件
    2022-04-04
  • C語(yǔ)言文件操作之fread函數(shù)詳解

    C語(yǔ)言文件操作之fread函數(shù)詳解

    fread()函數(shù)用來(lái)從指定文件中讀取塊數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言文件操作之fread函數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • C++11 thread多線程編程創(chuàng)建方式

    C++11 thread多線程編程創(chuàng)建方式

    這篇文章主要介紹了C++11 thread多線程編程的相關(guān)知識(shí),包括線程的創(chuàng)建方式結(jié)束方式及互斥鎖的實(shí)例代碼詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C語(yǔ)言實(shí)現(xiàn)圖的最短路徑Floyd算法

    C語(yǔ)言實(shí)現(xiàn)圖的最短路徑Floyd算法

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)圖的最短路徑Floyd算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++使用OpenCV實(shí)現(xiàn)證件照藍(lán)底換成白底功能(或其他顏色如紅色)詳解

    C++使用OpenCV實(shí)現(xiàn)證件照藍(lán)底換成白底功能(或其他顏色如紅色)詳解

    這篇文章主要介紹了C++使用OpenCV實(shí)現(xiàn)證件照藍(lán)底換成白底功能(或其他顏色如紅色),結(jié)合實(shí)例形式詳細(xì)分析了OpenCV顏色轉(zhuǎn)換相關(guān)操作原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-12-12
  • C++抽象數(shù)據(jù)類(lèi)型介紹

    C++抽象數(shù)據(jù)類(lèi)型介紹

    這篇文章主要介紹了C++抽象數(shù)據(jù)類(lèi)型,我們?cè)趯W(xué)數(shù)據(jù)結(jié)構(gòu)的時(shí)候,經(jīng)常遇到的一個(gè)概念就是抽象數(shù)據(jù)類(lèi)型(Abstract Data Type),簡(jiǎn)稱(chēng)ADT。下面我們就對(duì)ADT作更多介紹,需要的朋友可以參考一下
    2022-01-01
  • C++中virtual繼承的深入理解

    C++中virtual繼承的深入理解

    本篇文章是對(duì)C++中的virtual繼承進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • c++實(shí)現(xiàn)高精度加法

    c++實(shí)現(xiàn)高精度加法

    高精度運(yùn)算是指參與運(yùn)算的數(shù)(加數(shù),減數(shù),因子……)范圍大大超出了標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型(整型,實(shí)型)能表示的范圍的運(yùn)算。例如,求兩個(gè)200位的數(shù)的和。這時(shí),就要用到高精度算法了。
    2017-05-05
  • C語(yǔ)言中邏輯運(yùn)算符與條件運(yùn)算符的學(xué)習(xí)教程

    C語(yǔ)言中邏輯運(yùn)算符與條件運(yùn)算符的學(xué)習(xí)教程

    這篇文章主要介紹了C語(yǔ)言中邏輯運(yùn)算符與條件運(yùn)算符的學(xué)習(xí)教程,條件運(yùn)算符問(wèn)號(hào)即三目運(yùn)算符使用起來(lái)十分方便,需要的朋友可以參考下
    2016-04-04

最新評(píng)論

华阴市| 南漳县| 黄大仙区| 无棣县| 涿鹿县| 芜湖县| 莱阳市| 资阳市| 西平县| 夏邑县| 珠海市| 松阳县| 鄂托克前旗| 高碑店市| 嫩江县| 凉城县| 东城区| 永寿县| 崇阳县| 安达市| 元朗区| 余江县| 合水县| 区。| 丁青县| 博兴县| 铜川市| 东海县| 梁平县| 扎囊县| 偏关县| 秭归县| 崇左市| 阿合奇县| 舞阳县| 鄯善县| 东乌珠穆沁旗| 望城县| 吉隆县| 图们市| 南岸区|