歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 利用OpenCV繪制圖像上某直線區域的RGB強度分布圖

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

日期:2017/3/1 10:10:34   编辑:Linux編程

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

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

相關鏈接:

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 event, int 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. if( event == CV_EVENT_LBUTTONDOWN )
  20. {
  21. cvCopy(org,img);
  22. sprintf(temp,"(%d,%d)",x,y);
  23. pre_pt = cvPoint(x,y);
  24. cvPutText(img,temp, pre_pt, &font, cvScalar(0,0, 0, 255));
  25. cvCircle( img, pre_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );
  26. cvShowImage( "image", img );
  27. cvCopy(img,tmp);
  28. }
  29. else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))
  30. {
  31. cvCopy(tmp,img);
  32. sprintf(temp,"(%d,%d)",x,y);
  33. cur_pt = cvPoint(x,y);
  34. cvPutText(img,temp, cur_pt, &font, cvScalar(0,0, 0, 255));
  35. cvLine(img, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, CV_AA, 0 );
  36. cvShowImage( "image", img );
  37. }
  38. else if( event == CV_EVENT_LBUTTONUP )
  39. {
  40. sprintf(temp,"(%d,%d)",x,y);
  41. cur_pt = cvPoint(x,y);
  42. cvPutText(img,temp, cur_pt, &font, cvScalar(0,0, 0, 255));
  43. cvCircle( img, cur_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );
  44. cvLine( img, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, CV_AA, 0 );
  45. cvSetZero(msk);
  46. cvLine( msk, pre_pt, cur_pt, cvScalar(255,255,255,0), 1, CV_AA, 0 );
  47. cvShowImage( "image", img );
  48. int width=org->width;
  49. int height=org->height;
  50. int step=org->widthStep;
  51. uchar *data=(uchar*)org->imageData;
  52. int mask_step=msk->widthStep;
  53. uchar *mask_data=(uchar*)msk->imageData;
  54. cvSet(dst,cvScalar(255,255,255));
  55. 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)));
  56. double bin_width=(double)dst->width/length;
  57. double bin_height=(double)dst->height/255;
  58. int count=0;
  59. for(int i=0;i<width;i++)
  60. {
  61. for(int j=0;j<height;j++)
  62. {
  63. if(mask_data[j*mask_step+i]!=0)
  64. {
  65. CvPoint pt;
  66. pt=cvPoint(bin_width*count,(dst->height-data[j*step+i*3+2])*bin_height);
  67. cvCircle(dst, pt,1,cvScalar(0,0,255,0) ,CV_FILLED, CV_AA, 0 );
  68. pt=cvPoint(bin_width*count,(dst->height-data[j*step+i*3+1])*bin_height);
  69. cvCircle(dst, pt,1,cvScalar(0,255,0,0) ,CV_FILLED, CV_AA, 0 );
  70. pt=cvPoint(bin_width*count,(dst->height-data[j*step+i*3])*bin_height);
  71. cvCircle(dst, pt,1,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );
  72. count++;
  73. }
  74. }
  75. }
  76. cvNamedWindow("dst",1);
  77. cvShowImage("dst",dst);
  78. }
  79. }
  80. int main()
  81. {
  82. org=cvLoadImage("lena.jpg",1);
  83. img=cvCloneImage(org);
  84. tmp=cvCloneImage(org);
  85. msk=cvCreateImage(cvSize(img->width,img->height),8,1);
  86. cvSetZero(msk);
  87. dst=cvCreateImage(cvSize(400,300),8,3);
  88. cvSet(dst,cvScalar(255,255,255));
  89. cvNamedWindow("image",1);
  90. cvSetMouseCallback( "image", on_mouse, 0 );
  91. cvShowImage("image",img);
  92. cvWaitKey(0);
  93. cvDestroyAllWindows();
  94. cvReleaseImage(&org);
  95. cvReleaseImage(&img);
  96. cvReleaseImage(&tmp);
  97. cvReleaseImage(&msk);
  98. cvReleaseImage(&dst);
  99. return 0;
  100. }

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

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

Copyright © Linux教程網 All Rights Reserved