OpenCV的三幀差法
阿新 • • 發佈:2018-11-03
<div id="article_content" class="article_content">
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 672px; top: 523px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">// threeDifferent.cpp : 定義控制檯應用程式的入口點。</span><span> </span></span></li><li class=""><span><span class="comment">//</span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="preprocessor">#include "stdafx.h"</span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include "highgui.h" </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include "cv.h" </span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include "cxcore.h" </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include "cvaux.h" </span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include <iostream> </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include <cstdio> </span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include <cstring> </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include <cmath> </span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include <algorithm> </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include <queue> </span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include <vector> </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include <windows.h> </span><span> </span></span></li><li class="alt"><span><span class="keyword">using</span><span> </span><span class="keyword">namespace</span><span> std; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="preprocessor">#define GET_IMAGE_DATA(img, x, y) ((uchar*)(img->imageData + img->widthStep * (y)))[x] </span><span> </span></span></li><li class=""><span><span class="datatypes">int</span><span> T = 10; </span></span></li><li class="alt"><span><span class="datatypes">int</span><span> Num[300]; </span></span></li><li class=""><span><span class="datatypes">int</span><span> Sum[300]; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">void</span><span> InitPixel(IplImage * img, </span><span class="datatypes">int</span><span> &_low, </span><span class="datatypes">int</span><span> &_top) </span></span></li><li class="alt"><span>{ </span></li><li class=""><span> memset(Num,0,<span class="keyword">sizeof</span><span>(Num)); </span></span></li><li class="alt"><span> memset(Sum,0,<span class="keyword">sizeof</span><span>(Sum)); </span></span></li><li class=""><span> _low = 255; </span></li><li class="alt"><span> _top = 0; </span></li><li class=""><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = 0;i < img->height;i++) </span></span></li><li class="alt"><span> { </span></li><li class=""><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> j = 0;j < img->width;j++) </span></span></li><li class="alt"><span> { </span></li><li class=""><span> <span class="datatypes">int</span><span> temp = ((uchar*)(img->imageData + img->widthStep*i))[j]; </span></span></li><li class="alt"><span> <span class="keyword">if</span><span>(temp < _low) </span></span></li><li class=""><span> _low = temp; </span></li><li class="alt"><span> <span class="keyword">if</span><span>(temp > _top) </span></span></li><li class=""><span> _top = temp; </span></li><li class="alt"><span> Num[temp] += 1; </span></li><li class=""><span> } </span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = 1 ; i < 256 ; i++) </span></span></li><li class="alt"><span> { </span></li><li class=""><span> Sum[i] = Sum[i-1]+ i*Num[i]; </span></li><li class="alt"><span> Num[i] += Num[i-1]; </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li><li class=""><span><span class="datatypes">int</span><span> otsu (IplImage *img) </span></span></li><li class="alt"><span>{ </span></li><li class=""><span> <span class="datatypes">int</span><span> _low,_top,mbest=0; </span></span></li><li class="alt"><span> <span class="datatypes">float</span><span> mn = img->height*img->width; </span></span></li><li class=""><span> InitPixel(img,_low,_top); </span></li><li class="alt"><span> <span class="datatypes">float</span><span> max_otsu = 0; </span></span></li><li class=""><span> mbest = 0; </span></li><li class="alt"><span> <span class="keyword">if</span><span>( _low == _top) </span></span></li><li class=""><span> mbest = _low; </span></li><li class="alt"><span> <span class="keyword">else</span><span> </span></span></li><li class=""><span> { </span></li><li class="alt"><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = _low; i< _top ; i++) </span></span></li><li class=""><span> { </span></li><li class="alt"><span> <span class="datatypes">float</span><span> w0 = (</span><span class="datatypes">float</span><span>)((Num[_top]-Num[i]) / mn); </span></span></li><li class=""><span> <span class="datatypes">float</span><span> w1 = 1 - w0; </span></span></li><li class="alt"><span> <span class="datatypes">float</span><span> u0 = (</span><span class="datatypes">float</span><span>)((Sum[_top]-Sum[i])/(Num[_top]-Num[i])); </span></span></li><li class=""><span> <span class="datatypes">float</span><span> u1 = (</span><span class="datatypes">float</span><span>)(Sum[i]/Num[i]); </span></span></li><li class="alt"><span> <span class="datatypes">float</span><span> u = w0*u0 + w1*u1; </span></span></li><li class=""><span> <span class="datatypes">float</span><span> g = w0*(u0 - u)*(u0 - u) + w1*(u1 - u)*(u1 - u); </span></span></li><li class="alt"><span> <span class="keyword">if</span><span>( g > max_otsu) </span></span></li><li class=""><span> { </span></li><li class="alt"><span> mbest = i; </span></li><li class=""><span> max_otsu = g; </span></li><li class="alt"><span> } </span></li><li class=""><span> } </span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="keyword">return</span><span> mbest; </span></span></li><li class="alt"><span>} </span></li><li class=""><span><span class="datatypes">int</span><span> main() </span></span></li><li class="alt"><span>{ </span></li><li class=""><span> <span class="datatypes">int</span><span> ncount=0; </span></span></li><li class="alt"><span> IplImage *image1=NULL; </span></li><li class=""><span> IplImage *image2=NULL; </span></li><li class="alt"><span> IplImage *image3=NULL; </span></li><li class=""><span> IplImage *Imask =NULL; </span></li><li class="alt"><span> IplImage *Imask1=NULL; </span></li><li class=""><span> IplImage *Imask2=NULL; </span></li><li class="alt"><span> IplImage *Imask3=NULL; </span></li><li class=""><span> IplImage *mframe=NULL; </span></li><li class="alt"><span> CvCapture *capture = cvCreateFileCapture(<span class="string">"2.avi"</span><span>); </span></span></li><li class=""><span> <span class="comment">//CvCapture *capture = cvCreateCameraCapture(0); </span><span> </span></span></li><li class="alt"><span> cvNamedWindow(<span class="string">"src"</span><span>); </span></span></li><li class=""><span> cvNamedWindow(<span class="string">"dst"</span><span>); </span></span></li><li class="alt"><span> cvNamedWindow(<span class="string">"Imask1"</span><span>); </span></span></li><li class=""><span> cvNamedWindow(<span class="string">"Imask2"</span><span>); </span></span></li><li class="alt"><span> cvNamedWindow(<span class="string">"Imask3"</span><span>); </span></span></li><li class=""><span> <span class="comment">//cvCreateTrackbar("T","dst",&T,255,0); </span><span> </span></span></li><li class="alt"><span> <span class="keyword">while</span><span>(mframe=cvQueryFrame(capture)) </span></span></li><li class=""><span> { </span></li><li class="alt"><span> <span class="datatypes">DWORD</span><span> start=GetTickCount(); </span></span></li><li class=""><span> <span class="keyword">if</span><span>(ncount>1000000000) </span></span></li><li class="alt"><span> ncount=100; </span></li><li class=""><span> ncount+=1; </span></li><li class="alt"><span> <span class="keyword">if</span><span>(ncount==1) </span></span></li><li class=""><span> { </span></li><li class="alt"><span> image1=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class=""><span> image2=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class="alt"><span> image3=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class=""><span> Imask =cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class="alt"><span> Imask1=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class=""><span> Imask2=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class="alt"><span> Imask3=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class=""><span> </span></li><li class="alt"><span> cvCvtColor(mframe,image1,CV_BGR2GRAY); </span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">if</span><span>(ncount==2) </span></span></li><li class=""><span> cvCvtColor(mframe,image2,CV_BGR2GRAY); </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">if</span><span>(ncount>=3) </span></span></li><li class="alt"><span> { </span></li><li class=""><span> <span class="keyword">if</span><span>(ncount==3) </span></span></li><li class="alt"><span> cvCvtColor(mframe,image3,CV_BGR2GRAY); </span></li><li class=""><span> <span class="keyword">else</span><span> </span></span></li><li class="alt"><span> { </span></li><li class=""><span> cvCopy(image2,image1); </span></li><li class="alt"><span> cvCopy(image3,image2); </span></li><li class=""><span> cvCvtColor(mframe,image3,CV_BGR2GRAY); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> cvAbsDiff(image2,image1,Imask1); </span></li><li class=""><span> cvAbsDiff(image3,image2,Imask2); </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">//cvShowImage("Imask1",Imask1); </span><span> </span></span></li><li class="alt"><span> <span class="comment">//cvShowImage("Imask2",Imask2); </span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="datatypes">int</span><span> mbest1 = otsu(Imask1); </span></span></li><li class=""><span> cvSmooth(Imask1, Imask1, CV_MEDIAN); </span></li><li class="alt"><span> cvThreshold(Imask1,Imask1,<span class="comment">/*mbest1*/</span><span>10, 255, CV_THRESH_BINARY); </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="datatypes">int</span><span> mbest2 = otsu(Imask2); </span></span></li><li class=""><span> cvSmooth(Imask2,Imask2, CV_MEDIAN); </span></li><li class="alt"><span> cvThreshold(Imask2,Imask2,<span class="comment">/*mbest2*/</span><span>10, 255, CV_THRESH_BINARY); </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">// cout<<mbest1<<" "<<mbest2<<endl; </span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> cvAnd(Imask1,Imask2,Imask); </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">// cvErode(Imask, Imask); </span><span> </span></span></li><li class=""><span> <span class="comment">// cvDilate(Imask,Imask); </span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="datatypes">DWORD</span><span> finish=GetTickCount(); </span></span></li><li class="alt"><span> <span class="comment">// cout<<finish-start<<"ms"<<endl; </span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> cvShowImage(<span class="string">"src"</span><span>,image2); </span></span></li><li class=""><span> cvShowImage(<span class="string">"dst"</span><span>,Imask); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="datatypes">char</span><span> c = cvWaitKey(30); </span></span></li><li class="alt"><span> <span class="keyword">if</span><span>(c==27) </span></span></li><li class=""><span> <span class="keyword">break</span><span>; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">return</span><span> 0; </span></span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre class="cpp" name="code" style="display: none;">// threeDifferent.cpp : 定義控制檯應用程式的入口點。
//
#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
#include "cxcore.h"
#include "cvaux.h"
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
#include <windows.h>
using namespace std;
#define GET_IMAGE_DATA(img, x, y) ((uchar*)(img->imageData + img->widthStep * (y)))[x]
int T = 10;
int Num[300];
int Sum[300];
void InitPixel(IplImage * img, int &_low, int &_top)
{
memset(Num,0,sizeof(Num));
memset(Sum,0,sizeof(Sum));
_low = 255;
_top = 0;
for(int i = 0;i < img->height;i++)
{
for(int j = 0;j < img->width;j++)
{
int temp = ((uchar*)(img->imageData + img->widthStep*i))[j];
if(temp < _low)
_low = temp;
if(temp > _top)
_top = temp;
Num[temp] += 1;
}
}
for(int i = 1 ; i < 256 ; i++)
{
Sum[i] = Sum[i-1]+ i*Num[i];
Num[i] += Num[i-1];
}
}
int otsu (IplImage *img)
{
int _low,_top,mbest=0;
float mn = img->height*img->width;
InitPixel(img,_low,_top);
float max_otsu = 0;
mbest = 0;
if( _low == _top)
mbest = _low;
else
{
for(int i = _low; i< _top ; i++)
{
float w0 = (float)((Num[_top]-Num[i]) / mn);
float w1 = 1 - w0;
float u0 = (float)((Sum[_top]-Sum[i])/(Num[_top]-Num[i]));
float u1 = (float)(Sum[i]/Num[i]);
float u = w0*u0 + w1*u1;
float g = w0*(u0 - u)*(u0 - u) + w1*(u1 - u)*(u1 - u);
if( g > max_otsu)
{
mbest = i;
max_otsu = g;
}
}
}
return mbest;
}
int main()
{
int ncount=0;
IplImage *image1=NULL;
IplImage *image2=NULL;
IplImage *image3=NULL;
IplImage *Imask =NULL;
IplImage *Imask1=NULL;
IplImage *Imask2=NULL;
IplImage *Imask3=NULL;
IplImage *mframe=NULL;
CvCapture *capture = cvCreateFileCapture("2.avi");
//CvCapture *capture = cvCreateCameraCapture(0);
cvNamedWindow("src");
cvNamedWindow("dst");
cvNamedWindow("Imask1");
cvNamedWindow("Imask2");
cvNamedWindow("Imask3");
//cvCreateTrackbar("T","dst",&T,255,0);
while(mframe=cvQueryFrame(capture))
{
DWORD start=GetTickCount();
if(ncount>1000000000)
ncount=100;
ncount+=1;
if(ncount==1)
{
image1=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
image2=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
image3=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
Imask =cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
Imask1=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
Imask2=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
Imask3=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
cvCvtColor(mframe,image1,CV_BGR2GRAY);
}
if(ncount==2)
cvCvtColor(mframe,image2,CV_BGR2GRAY);
if(ncount>=3)
{
if(ncount==3)
cvCvtColor(mframe,image3,CV_BGR2GRAY);
else
{
cvCopy(image2,image1);
cvCopy(image3,image2);
cvCvtColor(mframe,image3,CV_BGR2GRAY);
}
cvAbsDiff(image2,image1,Imask1);
cvAbsDiff(image3,image2,Imask2);
//cvShowImage("Imask1",Imask1);
//cvShowImage("Imask2",Imask2);
int mbest1 = otsu(Imask1);
cvSmooth(Imask1, Imask1, CV_MEDIAN);
cvThreshold(Imask1,Imask1,/*mbest1*/10, 255, CV_THRESH_BINARY);
int mbest2 = otsu(Imask2);
cvSmooth(Imask2,Imask2, CV_MEDIAN);
cvThreshold(Imask2,Imask2,/*mbest2*/10, 255, CV_THRESH_BINARY);
// cout<<mbest1<<" "<<mbest2<<endl;
cvAnd(Imask1,Imask2,Imask);
// cvErode(Imask, Imask);
// cvDilate(Imask,Imask);
DWORD finish=GetTickCount();
// cout<<finish-start<<"ms"<<endl;
cvShowImage("src",image2);
cvShowImage("dst",Imask);
}
char c = cvWaitKey(30);
if(c==27)
break;
}
return 0;
} </pre><br>
</div>
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 672px; top: 523px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">// threeDifferent.cpp : 定義控制檯應用程式的入口點。</span><span> </span></span></li><li class=""><span><span class="comment">//</span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="preprocessor">#include "stdafx.h"</span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include "highgui.h" </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include "cv.h" </span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include "cxcore.h" </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include "cvaux.h" </span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include <iostream> </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include <cstdio> </span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include <cstring> </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include <cmath> </span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include <algorithm> </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include <queue> </span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include <vector> </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include <windows.h> </span><span> </span></span></li><li class="alt"><span><span class="keyword">using</span><span> </span><span class="keyword">namespace</span><span> std; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="preprocessor">#define GET_IMAGE_DATA(img, x, y) ((uchar*)(img->imageData + img->widthStep * (y)))[x] </span><span> </span></span></li><li class=""><span><span class="datatypes">int</span><span> T = 10; </span></span></li><li class="alt"><span><span class="datatypes">int</span><span> Num[300]; </span></span></li><li class=""><span><span class="datatypes">int</span><span> Sum[300]; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">void</span><span> InitPixel(IplImage * img, </span><span class="datatypes">int</span><span> &_low, </span><span class="datatypes">int</span><span> &_top) </span></span></li><li class="alt"><span>{ </span></li><li class=""><span> memset(Num,0,<span class="keyword">sizeof</span><span>(Num)); </span></span></li><li class="alt"><span> memset(Sum,0,<span class="keyword">sizeof</span><span>(Sum)); </span></span></li><li class=""><span> _low = 255; </span></li><li class="alt"><span> _top = 0; </span></li><li class=""><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = 0;i < img->height;i++) </span></span></li><li class="alt"><span> { </span></li><li class=""><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> j = 0;j < img->width;j++) </span></span></li><li class="alt"><span> { </span></li><li class=""><span> <span class="datatypes">int</span><span> temp = ((uchar*)(img->imageData + img->widthStep*i))[j]; </span></span></li><li class="alt"><span> <span class="keyword">if</span><span>(temp < _low) </span></span></li><li class=""><span> _low = temp; </span></li><li class="alt"><span> <span class="keyword">if</span><span>(temp > _top) </span></span></li><li class=""><span> _top = temp; </span></li><li class="alt"><span> Num[temp] += 1; </span></li><li class=""><span> } </span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = 1 ; i < 256 ; i++) </span></span></li><li class="alt"><span> { </span></li><li class=""><span> Sum[i] = Sum[i-1]+ i*Num[i]; </span></li><li class="alt"><span> Num[i] += Num[i-1]; </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li><li class=""><span><span class="datatypes">int</span><span> otsu (IplImage *img) </span></span></li><li class="alt"><span>{ </span></li><li class=""><span> <span class="datatypes">int</span><span> _low,_top,mbest=0; </span></span></li><li class="alt"><span> <span class="datatypes">float</span><span> mn = img->height*img->width; </span></span></li><li class=""><span> InitPixel(img,_low,_top); </span></li><li class="alt"><span> <span class="datatypes">float</span><span> max_otsu = 0; </span></span></li><li class=""><span> mbest = 0; </span></li><li class="alt"><span> <span class="keyword">if</span><span>( _low == _top) </span></span></li><li class=""><span> mbest = _low; </span></li><li class="alt"><span> <span class="keyword">else</span><span> </span></span></li><li class=""><span> { </span></li><li class="alt"><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = _low; i< _top ; i++) </span></span></li><li class=""><span> { </span></li><li class="alt"><span> <span class="datatypes">float</span><span> w0 = (</span><span class="datatypes">float</span><span>)((Num[_top]-Num[i]) / mn); </span></span></li><li class=""><span> <span class="datatypes">float</span><span> w1 = 1 - w0; </span></span></li><li class="alt"><span> <span class="datatypes">float</span><span> u0 = (</span><span class="datatypes">float</span><span>)((Sum[_top]-Sum[i])/(Num[_top]-Num[i])); </span></span></li><li class=""><span> <span class="datatypes">float</span><span> u1 = (</span><span class="datatypes">float</span><span>)(Sum[i]/Num[i]); </span></span></li><li class="alt"><span> <span class="datatypes">float</span><span> u = w0*u0 + w1*u1; </span></span></li><li class=""><span> <span class="datatypes">float</span><span> g = w0*(u0 - u)*(u0 - u) + w1*(u1 - u)*(u1 - u); </span></span></li><li class="alt"><span> <span class="keyword">if</span><span>( g > max_otsu) </span></span></li><li class=""><span> { </span></li><li class="alt"><span> mbest = i; </span></li><li class=""><span> max_otsu = g; </span></li><li class="alt"><span> } </span></li><li class=""><span> } </span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="keyword">return</span><span> mbest; </span></span></li><li class="alt"><span>} </span></li><li class=""><span><span class="datatypes">int</span><span> main() </span></span></li><li class="alt"><span>{ </span></li><li class=""><span> <span class="datatypes">int</span><span> ncount=0; </span></span></li><li class="alt"><span> IplImage *image1=NULL; </span></li><li class=""><span> IplImage *image2=NULL; </span></li><li class="alt"><span> IplImage *image3=NULL; </span></li><li class=""><span> IplImage *Imask =NULL; </span></li><li class="alt"><span> IplImage *Imask1=NULL; </span></li><li class=""><span> IplImage *Imask2=NULL; </span></li><li class="alt"><span> IplImage *Imask3=NULL; </span></li><li class=""><span> IplImage *mframe=NULL; </span></li><li class="alt"><span> CvCapture *capture = cvCreateFileCapture(<span class="string">"2.avi"</span><span>); </span></span></li><li class=""><span> <span class="comment">//CvCapture *capture = cvCreateCameraCapture(0); </span><span> </span></span></li><li class="alt"><span> cvNamedWindow(<span class="string">"src"</span><span>); </span></span></li><li class=""><span> cvNamedWindow(<span class="string">"dst"</span><span>); </span></span></li><li class="alt"><span> cvNamedWindow(<span class="string">"Imask1"</span><span>); </span></span></li><li class=""><span> cvNamedWindow(<span class="string">"Imask2"</span><span>); </span></span></li><li class="alt"><span> cvNamedWindow(<span class="string">"Imask3"</span><span>); </span></span></li><li class=""><span> <span class="comment">//cvCreateTrackbar("T","dst",&T,255,0); </span><span> </span></span></li><li class="alt"><span> <span class="keyword">while</span><span>(mframe=cvQueryFrame(capture)) </span></span></li><li class=""><span> { </span></li><li class="alt"><span> <span class="datatypes">DWORD</span><span> start=GetTickCount(); </span></span></li><li class=""><span> <span class="keyword">if</span><span>(ncount>1000000000) </span></span></li><li class="alt"><span> ncount=100; </span></li><li class=""><span> ncount+=1; </span></li><li class="alt"><span> <span class="keyword">if</span><span>(ncount==1) </span></span></li><li class=""><span> { </span></li><li class="alt"><span> image1=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class=""><span> image2=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class="alt"><span> image3=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class=""><span> Imask =cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class="alt"><span> Imask1=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class=""><span> Imask2=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class="alt"><span> Imask3=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1); </span></li><li class=""><span> </span></li><li class="alt"><span> cvCvtColor(mframe,image1,CV_BGR2GRAY); </span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">if</span><span>(ncount==2) </span></span></li><li class=""><span> cvCvtColor(mframe,image2,CV_BGR2GRAY); </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">if</span><span>(ncount>=3) </span></span></li><li class="alt"><span> { </span></li><li class=""><span> <span class="keyword">if</span><span>(ncount==3) </span></span></li><li class="alt"><span> cvCvtColor(mframe,image3,CV_BGR2GRAY); </span></li><li class=""><span> <span class="keyword">else</span><span> </span></span></li><li class="alt"><span> { </span></li><li class=""><span> cvCopy(image2,image1); </span></li><li class="alt"><span> cvCopy(image3,image2); </span></li><li class=""><span> cvCvtColor(mframe,image3,CV_BGR2GRAY); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> cvAbsDiff(image2,image1,Imask1); </span></li><li class=""><span> cvAbsDiff(image3,image2,Imask2); </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">//cvShowImage("Imask1",Imask1); </span><span> </span></span></li><li class="alt"><span> <span class="comment">//cvShowImage("Imask2",Imask2); </span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="datatypes">int</span><span> mbest1 = otsu(Imask1); </span></span></li><li class=""><span> cvSmooth(Imask1, Imask1, CV_MEDIAN); </span></li><li class="alt"><span> cvThreshold(Imask1,Imask1,<span class="comment">/*mbest1*/</span><span>10, 255, CV_THRESH_BINARY); </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="datatypes">int</span><span> mbest2 = otsu(Imask2); </span></span></li><li class=""><span> cvSmooth(Imask2,Imask2, CV_MEDIAN); </span></li><li class="alt"><span> cvThreshold(Imask2,Imask2,<span class="comment">/*mbest2*/</span><span>10, 255, CV_THRESH_BINARY); </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">// cout<<mbest1<<" "<<mbest2<<endl; </span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> cvAnd(Imask1,Imask2,Imask); </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">// cvErode(Imask, Imask); </span><span> </span></span></li><li class=""><span> <span class="comment">// cvDilate(Imask,Imask); </span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="datatypes">DWORD</span><span> finish=GetTickCount(); </span></span></li><li class="alt"><span> <span class="comment">// cout<<finish-start<<"ms"<<endl; </span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> cvShowImage(<span class="string">"src"</span><span>,image2); </span></span></li><li class=""><span> cvShowImage(<span class="string">"dst"</span><span>,Imask); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="datatypes">char</span><span> c = cvWaitKey(30); </span></span></li><li class="alt"><span> <span class="keyword">if</span><span>(c==27) </span></span></li><li class=""><span> <span class="keyword">break</span><span>; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">return</span><span> 0; </span></span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre class="cpp" name="code" style="display: none;">// threeDifferent.cpp : 定義控制檯應用程式的入口點。
//
#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
#include "cxcore.h"
#include "cvaux.h"
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
#include <windows.h>
using namespace std;
#define GET_IMAGE_DATA(img, x, y) ((uchar*)(img->imageData + img->widthStep * (y)))[x]
int T = 10;
int Num[300];
int Sum[300];
void InitPixel(IplImage * img, int &_low, int &_top)
{
memset(Num,0,sizeof(Num));
memset(Sum,0,sizeof(Sum));
_low = 255;
_top = 0;
for(int i = 0;i < img->height;i++)
{
for(int j = 0;j < img->width;j++)
{
int temp = ((uchar*)(img->imageData + img->widthStep*i))[j];
if(temp < _low)
_low = temp;
if(temp > _top)
_top = temp;
Num[temp] += 1;
}
}
for(int i = 1 ; i < 256 ; i++)
{
Sum[i] = Sum[i-1]+ i*Num[i];
Num[i] += Num[i-1];
}
}
int otsu (IplImage *img)
{
int _low,_top,mbest=0;
float mn = img->height*img->width;
InitPixel(img,_low,_top);
float max_otsu = 0;
mbest = 0;
if( _low == _top)
mbest = _low;
else
{
for(int i = _low; i< _top ; i++)
{
float w0 = (float)((Num[_top]-Num[i]) / mn);
float w1 = 1 - w0;
float u0 = (float)((Sum[_top]-Sum[i])/(Num[_top]-Num[i]));
float u1 = (float)(Sum[i]/Num[i]);
float u = w0*u0 + w1*u1;
float g = w0*(u0 - u)*(u0 - u) + w1*(u1 - u)*(u1 - u);
if( g > max_otsu)
{
mbest = i;
max_otsu = g;
}
}
}
return mbest;
}
int main()
{
int ncount=0;
IplImage *image1=NULL;
IplImage *image2=NULL;
IplImage *image3=NULL;
IplImage *Imask =NULL;
IplImage *Imask1=NULL;
IplImage *Imask2=NULL;
IplImage *Imask3=NULL;
IplImage *mframe=NULL;
CvCapture *capture = cvCreateFileCapture("2.avi");
//CvCapture *capture = cvCreateCameraCapture(0);
cvNamedWindow("src");
cvNamedWindow("dst");
cvNamedWindow("Imask1");
cvNamedWindow("Imask2");
cvNamedWindow("Imask3");
//cvCreateTrackbar("T","dst",&T,255,0);
while(mframe=cvQueryFrame(capture))
{
DWORD start=GetTickCount();
if(ncount>1000000000)
ncount=100;
ncount+=1;
if(ncount==1)
{
image1=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
image2=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
image3=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
Imask =cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
Imask1=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
Imask2=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
Imask3=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
cvCvtColor(mframe,image1,CV_BGR2GRAY);
}
if(ncount==2)
cvCvtColor(mframe,image2,CV_BGR2GRAY);
if(ncount>=3)
{
if(ncount==3)
cvCvtColor(mframe,image3,CV_BGR2GRAY);
else
{
cvCopy(image2,image1);
cvCopy(image3,image2);
cvCvtColor(mframe,image3,CV_BGR2GRAY);
}
cvAbsDiff(image2,image1,Imask1);
cvAbsDiff(image3,image2,Imask2);
//cvShowImage("Imask1",Imask1);
//cvShowImage("Imask2",Imask2);
int mbest1 = otsu(Imask1);
cvSmooth(Imask1, Imask1, CV_MEDIAN);
cvThreshold(Imask1,Imask1,/*mbest1*/10, 255, CV_THRESH_BINARY);
int mbest2 = otsu(Imask2);
cvSmooth(Imask2,Imask2, CV_MEDIAN);
cvThreshold(Imask2,Imask2,/*mbest2*/10, 255, CV_THRESH_BINARY);
// cout<<mbest1<<" "<<mbest2<<endl;
cvAnd(Imask1,Imask2,Imask);
// cvErode(Imask, Imask);
// cvDilate(Imask,Imask);
DWORD finish=GetTickCount();
// cout<<finish-start<<"ms"<<endl;
cvShowImage("src",image2);
cvShowImage("dst",Imask);
}
char c = cvWaitKey(30);
if(c==27)
break;
}
return 0;
} </pre><br>
</div>