ããä¸å¸§å·®åç®æ³æ¯ç¸é»ä¸¤å¸§å·®åç®æ³çä¸ç§æ¹è¿æ¹æ³ï¼å®éåè¿ç»ä¸å¸§è§é¢å¾åè¿è¡å·®åè¿ç®ï¼æ¶é¤ç±äºè¿å¨èæ¾é²èæ¯å½±åï¼ä»èæå精确çè¿å¨ç®æ è½®å»ä¿¡æ¯ã该ç®æ³çåºæ¬åçæ¯æ¯å
éåè§é¢å¾ååºåä¸è¿ç»ä¸å¸§å¾å并åå«è®¡ç®ç¸é»ä¸¤å¸§çå·®åå¾åï¼ç¶åå°å·®åå¾åéè¿éåéå½çéå¼è¿è¡äºå¼åå¤çï¼å¾å°äºå¼åå¾åï¼æåå¨æ¯ä¸ä¸ªåç´ ç¹å¾å°çäºå¼å¾åè¿è¡é»è¾ä¸è¿ç®ï¼è·åå
±åé¨åï¼ä»èè·å¾è¿å¨ç®æ çè½®å»ä¿¡æ¯ãããä¸å¸§å·®æ³çå
·ä½ç®æ³å¦ä¸ãããæåè¿ç»çä¸å¸§å¾åï¼Iï¼k-1ï¼ï¼Iï¼kï¼ï¼Iï¼k+1ï¼ ãããï¼1ï¼ dï¼k,k-1ï¼ [x,y] = Iï¼kï¼[x,y] - Iï¼k-1ï¼[x,y] ;ããdï¼k,k+1ï¼[x,y] = Iï¼k+1ï¼[x,y] - Iï¼kï¼[x,y] ;ããï¼2ï¼ bï¼k,k-1ï¼[x,y] = 1; if dï¼k,k-1ï¼ [x,y] >= T;ããbï¼k,k-1ï¼[x,y] = 0; if dï¼k,k-1ï¼ [x,y] < T;ããbï¼k+1,kï¼[x,y] = 1 if dï¼k+1,kï¼ [x,y] >= T;ããbï¼k+1,kï¼[x,y] = 0 if dï¼k+1,kï¼ [x,y] < T;ããï¼3ï¼ Bï¼kï¼[x,y] = 1 ; if bï¼k,k-1ï¼[x,y] && bï¼k+1,kï¼[x,y] == 1 ;ããBï¼kï¼[x,y] = 0 ; if bï¼k,k-1ï¼[x,y] && bï¼k+1,kï¼[x,y] ==0 ;ããæ¯è¾å
³é®çå°±æ¯ç¬¬2æ¥çéå¼Tçéåé®é¢ï¼å纯ç¨otsuç®æ³åå²è²ä¼¼ææä¸å¤ªå¥½ï¼å¦ææå¨è®¾ç½®ä¸ä¸ªè¾å°çå¼ï¼å¦10ï¼ææè¿è¡ãããç¨otsuåéå¼å®ç°çä¸ä¸ªä¸åå·®æ³ä»£ç ãææä¸æ¯å¾å¥½ãããè¿è¡ç¯å¢ VS2008ï¼OpenCV2.0ï¼windows XP .ãã[cpp] view plaincopyprint?#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;ãã#pragma commentï¼lib, âhighgui200.libâï¼ãã#pragma commentï¼lib, âcv200.libâï¼ãã#pragma commentï¼lib, âcxcore200.libâï¼ãã#pragma commentï¼lib, âcvaux200.libâï¼ãã#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ï¼âE:\\Motion\\IndoorGTTest2.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, 255, CV_THRESH_BINARYï¼ï¼ããint mbest2 = otsuï¼Imask2ï¼ï¼ããcvSmoothï¼Imask2,Imask2, CV_MEDIANï¼ï¼ããcvThresholdï¼Imask2,Imask2,mbest2, 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;ãã}
温馨提示:答案为网友推荐,仅供参考