利用OpenCV计算图像的垂直和水平积分投影


本文的测试图像是标准的lena图像。

代码:

  1. #include <cv.h>  
  2. #include <highgui.h>  
  3. #pragma comment( lib, "cv.lib" )  
  4. #pragma comment( lib, "cxcore.lib" )  
  5. #pragma comment( lib, "highgui.lib" )   
  6. int main()  
  7. {     
  8.     IplImage * src=cvLoadImage("lena.jpg",0);  
  9. //  cvSmooth(src,src,CV_BLUR,3,3,0,0);   
  10.     cvThreshold(src,src,50,255,CV_THRESH_BINARY_INV);  
  11.     IplImage* paintx=cvCreateImage( cvGetSize(src),IPL_DEPTH_8U, 1 );  
  12.     IplImage* painty=cvCreateImage( cvGetSize(src),IPL_DEPTH_8U, 1 );  
  13.     cvZero(paintx);  
  14.     cvZero(painty);  
  15.     int* v=new int[src->width];  
  16.     int* h=new int[src->height];  
  17.     memset(v,0,src->width*4);  
  18.     memset(h,0,src->height*4);  
  19.       
  20.     int x,y;  
  21.     CvScalar s,t;  
  22.     for(x=0;x<src->width;x++)  
  23.     {  
  24.         for(y=0;y<src->height;y++)  
  25.         {  
  26.             s=cvGet2D(src,y,x);           
  27.             if(s.val[0]==0)  
  28.                 v[x]++;                   
  29.         }         
  30.     }  
  31.       
  32.     for(x=0;x<src->width;x++)  
  33.     {  
  34.         for(y=0;y<v[x];y++)  
  35.         {         
  36.             t.val[0]=255;  
  37.             cvSet2D(paintx,y,x,t);        
  38.         }         
  39.     }  
  40.       
  41.     for(y=0;y<src->height;y++)  
  42.     {  
  43.         for(x=0;x<src->width;x++)  
  44.         {  
  45.             s=cvGet2D(src,y,x);           
  46.             if(s.val[0]==0)  
  47.                 h[y]++;       
  48.         }     
  49.     }  
  50.     for(y=0;y<src->height;y++)  
  51.     {  
  52.         for(x=0;x<h[y];x++)  
  53.         {             
  54.             t.val[0]=255;  
  55.             cvSet2D(painty,y,x,t);            
  56.         }         
  57.     }  
  58.     cvNamedWindow("二值图像",1);  
  59.     cvNamedWindow("垂直积分投影",1);  
  60.     cvNamedWindow("水平积分投影",1);  
  61.     cvShowImage("二值图像",src);  
  62.     cvShowImage("垂直积分投影",paintx);  
  63.     cvShowImage("水平积分投影",painty);  
  64.     cvWaitKey(0);  
  65.     cvDestroyAllWindows();  
  66.     cvReleaseImage(&src);  
  67.     cvReleaseImage(&paintx);  
  68.     cvReleaseImage(&painty);  
  69.     return 0;  
  70. }  

下面是代码运行的结果:


相关内容