ããä¸å¸§å·®åç®æ³æ¯ç¸é»ä¸¤å¸§å·®åç®æ³çä¸ç§æ¹è¿æ¹æ³ï¼å®éåè¿ç»ä¸å¸§è§é¢å¾åè¿è¡å·®åè¿ç®ï¼æ¶é¤ç±äºè¿å¨èæ¾é²èæ¯å½±åï¼ä»èæå精确çè¿å¨ç®æ è½®å»ä¿¡æ¯ã该ç®æ³çåºæ¬åçæ¯æ¯å
éåè§é¢å¾ååºåä¸è¿ç»ä¸å¸§å¾å并åå«è®¡ç®ç¸é»ä¸¤å¸§çå·®åå¾åï¼ç¶åå°å·®åå¾åéè¿éåéå½çéå¼è¿è¡äºå¼åå¤çï¼å¾å°äºå¼åå¾åï¼æåå¨æ¯ä¸ä¸ªåç´ ç¹å¾å°çäºå¼å¾åè¿è¡é»è¾ä¸è¿ç®ï¼è·åå
±åé¨åï¼ä»èè·å¾è¿å¨ç®æ çè½®å»ä¿¡æ¯ã
ããä¸å¸§å·®æ³çå
·ä½ç®æ³å¦ä¸ã
ããæåè¿ç»çä¸å¸§å¾åï¼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;
ãã}
温馨提示:答案为网友推荐,仅供参考