利用OpenCV計算圖像的垂直和水平積分投影

#include <cv.h>
#include <highgui.h>
#pragma comment( lib, "cv.lib" )
#pragma comment( lib, "cxcore.lib" )
#pragma comment( lib, "highgui.lib" )
int main()
{	
	IplImage * src=cvLoadImage("lena.jpg",0);
//	cvSmooth(src,src,CV_BLUR,3,3,0,0);
	cvThreshold(src,src,50,255,CV_THRESH_BINARY_INV);
	IplImage* paintx=cvCreateImage( cvGetSize(src),IPL_DEPTH_8U, 1 );
	IplImage* painty=cvCreateImage( cvGetSize(src),IPL_DEPTH_8U, 1 );
	cvZero(paintx);
	cvZero(painty);
	int* v=new int[src->width];
	int* h=new int[src->height];
	memset(v,0,src->width*4);
	memset(h,0,src->height*4);
	
	int x,y;
	CvScalar s,t;
	for(x=0;x<src->width;x++)
	{
		for(y=0;y<src->height;y++)
		{
			s=cvGet2D(src,y,x);			
			if(s.val[0]==0)
				v[x]++;					
		}		
	}
	
	for(x=0;x<src->width;x++)
	{
		for(y=0;y<v[x];y++)
		{		
			t.val[0]=255;
			cvSet2D(paintx,y,x,t);		
		}		
	}
	
	for(y=0;y<src->height;y++)
	{
		for(x=0;x<src->width;x++)
		{
			s=cvGet2D(src,y,x);			
			if(s.val[0]==0)
				h[y]++;		
		}	
	}
	for(y=0;y<src->height;y++)
	{
		for(x=0;x<h[y];x++)
		{			
			t.val[0]=255;
			cvSet2D(painty,y,x,t);			
		}		
	}
	cvNamedWindow("二值圖像",1);
	cvNamedWindow("垂直積分投影",1);
	cvNamedWindow("水平積分投影",1);
	cvShowImage("二值圖像",src);
	cvShowImage("垂直積分投影",paintx);
	cvShowImage("水平積分投影",painty);
	cvWaitKey(0);
	cvDestroyAllWindows();
	cvReleaseImage(&src);
	cvReleaseImage(&paintx);
	cvReleaseImage(&painty);
	return 0;
}

下面是代碼運行的結果:

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章