利用OpenCV绘制图像上某直线区域的RGB强度分布图

#include <cv.h>   #include <highgui.h>   #include <stdio.h>   #pragma comment( lib, "cv.lib" )   #pragma comment( lib, "cxcore.lib" )   #pragma comment( lib, "highgui.lib" )    IplImage* org = 0;    IplImage* img = 0;    IplImage* tmp = 0;    IplImage* msk = 0;   IplImage* dst = 0 ;   void on_mouse( int eventint x, int y, int flags, void* ustc)   {       static CvPoint pre_pt = {-1,-1};       static CvPoint cur_pt = {-1,-1};       CvFont font;       cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA);       char temp[16];              ifevent == CV_EVENT_LBUTTONDOWN )       {           cvCopy(org,img);           sprintf(temp,"(%d,%d)",x,y);           pre_pt = cvPoint(x,y);           cvPutText(img,temp, pre_pt, &font, cvScalar(0,0, 0, 255));           cvCircle( img, pre_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );           cvShowImage( "image", img );                      cvCopy(img,tmp);       }       else ifevent == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))       {           cvCopy(tmp,img);           sprintf(temp,"(%d,%d)",x,y);           cur_pt = cvPoint(x,y);                 cvPutText(img,temp, cur_pt, &font, cvScalar(0,0, 0, 255));           cvLine(img, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, CV_AA, 0 );           cvShowImage( "image", img );       }       else ifevent == CV_EVENT_LBUTTONUP )       {           sprintf(temp,"(%d,%d)",x,y);           cur_pt = cvPoint(x,y);                 cvPutText(img,temp, cur_pt, &font, cvScalar(0,0, 0, 255));           cvCircle( img, cur_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );           cvLine( img, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, CV_AA, 0 );           cvSetZero(msk);           cvLine( msk, pre_pt, cur_pt, cvScalar(255,255,255,0), 1, CV_AA, 0 );           cvShowImage( "image", img );           int width=org->width;           int height=org->height;           int step=org->widthStep;           uchar *data=(uchar*)org->imageData;           int mask_step=msk->widthStep;           uchar *mask_data=(uchar*)msk->imageData;           cvSet(dst,cvScalar(255,255,255));           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)));           double bin_width=(double)dst->width/length;           double bin_height=(double)dst->height/255;           int count=0;           for(int i=0;i<width;i++)           {               for(int j=0;j<height;j++)               {                   if(mask_data[j*mask_step+i]!=0)                   {                       CvPoint pt;                       pt=cvPoint(bin_width*count,(dst->height-data[j*step+i*3+2])*bin_height);                       cvCircle(dst, pt,1,cvScalar(0,0,255,0) ,CV_FILLED, CV_AA, 0 );                       pt=cvPoint(bin_width*count,(dst->height-data[j*step+i*3+1])*bin_height);                       cvCircle(dst, pt,1,cvScalar(0,255,0,0) ,CV_FILLED, CV_AA, 0 );                       pt=cvPoint(bin_width*count,(dst->height-data[j*step+i*3])*bin_height);                       cvCircle(dst, pt,1,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );                       count++;                   }                          }           }                      cvNamedWindow("dst",1);           cvShowImage("dst",dst);       }   }   int main()   {       org=cvLoadImage("lena.jpg",1);       img=cvCloneImage(org);       tmp=cvCloneImage(org);       msk=cvCreateImage(cvSize(img->width,img->height),8,1);       cvSetZero(msk);       dst=cvCreateImage(cvSize(400,300),8,3);       cvSet(dst,cvScalar(255,255,255));       cvNamedWindow("image",1);       cvSetMouseCallback( "image", on_mouse, 0 );        cvShowImage("image",img);          cvWaitKey(0);        cvDestroyAllWindows();       cvReleaseImage(&org);       cvReleaseImage(&img);       cvReleaseImage(&tmp);       cvReleaseImage(&msk);       cvReleaseImage(&dst);       return 0;   }  

效果图如下,上图是绘线窗口,下图是线上的RGB强度分布图。

利用OpenCV绘制图像上某直线区域的RGB强度分布图

利用OpenCV绘制图像上某直线区域的RGB强度分布图

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/06a754a0de4ea255c988f270f30a0698.html