歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

利用OpenCV繪制圖像上某直線區域的RGB強度分布圖

首先,不知道這篇文章的標題合不合適,呵呵,大家有沒有更合適的標題呢。

這篇博文是在前兩篇的基礎上寫的,大家可以參看一下。下面貼代碼了。

相關鏈接:

http://www.linuxidc.com/Linux/2012-09/70010.htm
http://www.linuxidc.com/Linux/2012-09/70011.htm

  1. #include <cv.h>  
  2. #include <highgui.h>  
  3. #include <stdio.h>  
  4. #pragma comment( lib, "cv.lib" )  
  5. #pragma comment( lib, "cxcore.lib" )  
  6. #pragma comment( lib, "highgui.lib" )   
  7. IplImage* org = 0;   
  8. IplImage* img = 0;   
  9. IplImage* tmp = 0;   
  10. IplImage* msk = 0;  
  11. IplImage* dst = 0 ;  
  12. void on_mouse( int eventint x, int y, int flags, void* ustc)  
  13. {  
  14.     static CvPoint pre_pt = {-1,-1};  
  15.     static CvPoint cur_pt = {-1,-1};  
  16.     CvFont font;  
  17.     cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA);  
  18.     char temp[16];  
  19.       
  20.     ifevent == CV_EVENT_LBUTTONDOWN )  
  21.     {  
  22.         cvCopy(org,img);  
  23.         sprintf(temp,"(%d,%d)",x,y);  
  24.         pre_pt = cvPoint(x,y);  
  25.         cvPutText(img,temp, pre_pt, &font, cvScalar(0,0, 0, 255));  
  26.         cvCircle( img, pre_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );  
  27.         cvShowImage( "image", img );  
  28.           
  29.         cvCopy(img,tmp);  
  30.     }  
  31.     else ifevent == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))  
  32.     {  
  33.         cvCopy(tmp,img);  
  34.         sprintf(temp,"(%d,%d)",x,y);  
  35.         cur_pt = cvPoint(x,y);        
  36.         cvPutText(img,temp, cur_pt, &font, cvScalar(0,0, 0, 255));  
  37.         cvLine(img, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, CV_AA, 0 );  
  38.         cvShowImage( "image", img );  
  39.     }  
  40.     else ifevent == CV_EVENT_LBUTTONUP )  
  41.     {  
  42.         sprintf(temp,"(%d,%d)",x,y);  
  43.         cur_pt = cvPoint(x,y);        
  44.         cvPutText(img,temp, cur_pt, &font, cvScalar(0,0, 0, 255));  
  45.         cvCircle( img, cur_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );  
  46.         cvLine( img, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, CV_AA, 0 );  
  47.         cvSetZero(msk);  
  48.         cvLine( msk, pre_pt, cur_pt, cvScalar(255,255,255,0), 1, CV_AA, 0 );  
  49.         cvShowImage( "image", img );  
  50.         int width=org->width;  
  51.         int height=org->height;  
  52.         int step=org->widthStep;  
  53.         uchar *data=(uchar*)org->imageData;  
  54.         int mask_step=msk->widthStep;  
  55.         uchar *mask_data=(uchar*)msk->imageData;  
  56.         cvSet(dst,cvScalar(255,255,255));  
  57.         int length=cvCeil(sqrt((pre_pt.x-cur_pt.x)*(pre_pt.x-cur_pt.x)+(pre_pt.y-cur_pt.y)*(pre_pt.y-cur_pt.y)));  
  58.         double bin_width=(double)dst->width/length;  
  59.         double bin_height=(double)dst->height/255;  
  60.         int count=0;  
  61.         for(int i=0;i<width;i++)  
  62.         {  
  63.             for(int j=0;j<height;j++)  
  64.             {  
  65.                 if(mask_data[j*mask_step+i]!=0)  
  66.                 {  
  67.                     CvPoint pt;  
  68.                     pt=cvPoint(bin_width*count,(dst->height-data[j*step+i*3+2])*bin_height);  
  69.                     cvCircle(dst, pt,1,cvScalar(0,0,255,0) ,CV_FILLED, CV_AA, 0 );  
  70.                     pt=cvPoint(bin_width*count,(dst->height-data[j*step+i*3+1])*bin_height);  
  71.                     cvCircle(dst, pt,1,cvScalar(0,255,0,0) ,CV_FILLED, CV_AA, 0 );  
  72.                     pt=cvPoint(bin_width*count,(dst->height-data[j*step+i*3])*bin_height);  
  73.                     cvCircle(dst, pt,1,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );  
  74.                     count++;  
  75.                 }             
  76.             }  
  77.         }  
  78.           
  79.         cvNamedWindow("dst",1);  
  80.         cvShowImage("dst",dst);  
  81.     }  
  82. }  
  83. int main()  
  84. {  
  85.     org=cvLoadImage("lena.jpg",1);  
  86.     img=cvCloneImage(org);  
  87.     tmp=cvCloneImage(org);  
  88.     msk=cvCreateImage(cvSize(img->width,img->height),8,1);  
  89.     cvSetZero(msk);  
  90.     dst=cvCreateImage(cvSize(400,300),8,3);  
  91.     cvSet(dst,cvScalar(255,255,255));  
  92.     cvNamedWindow("image",1);  
  93.     cvSetMouseCallback( "image", on_mouse, 0 );   
  94.     cvShowImage("image",img);     
  95.     cvWaitKey(0);   
  96.     cvDestroyAllWindows();  
  97.     cvReleaseImage(&org);  
  98.     cvReleaseImage(&img);  
  99.     cvReleaseImage(&tmp);  
  100.     cvReleaseImage(&msk);  
  101.     cvReleaseImage(&dst);  
  102.     return 0;  
  103. }  

效果圖如下,上圖是繪線窗口,下圖是線上的RGB強度分布圖。

 

這裡離散的顯示分布圖,大家有沒有方法使連續起來呢?

Copyright © Linux教程網 All Rights Reserved