openCV实现鼠标响应裁剪图像

- 日理万妓 2022-06-12 05:10 295阅读 0赞

给定一幅图像,将其中的某一部分兴趣区域裁剪出来,这在PS中很好实现,但是使用openCV如何实现呢?因此本文主要介绍openCV使用鼠标响应来裁剪图像:
一、代码部分:

  1. #include "stdafx.h"
  2. #include "cv.h"
  3. #include <highgui.h>
  4. #include <stdio.h>
  5. IplImage* org = 0;
  6. IplImage* img = 0;
  7. IplImage* tmp = 0;
  8. IplImage* dst = 0;
  9. //The mouse cuts the image accordingly
  10. void on_mouse( int event, int x, int y, int flags, void* ustc)
  11. {
  12. static CvPoint pre_pt = {-1,-1};
  13. static CvPoint cur_pt = {-1,-1};
  14. CvFont font;
  15. cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA);
  16. char temp[16];
  17. if(event == CV_EVENT_LBUTTONDOWN)
  18. {
  19. cvCopy(org,img);
  20. sprintf(temp,"(%d,%d)",x,y);
  21. pre_pt = cvPoint(x,y);
  22. cvPutText(img,temp, pre_pt, &font, cvScalar(0,0, 0, 255));
  23. cvCircle( img, pre_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );
  24. cvShowImage( "img", img );
  25. cvCopy(img,tmp);
  26. }
  27. else if( event == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON))
  28. {
  29. cvCopy(tmp,img);
  30. sprintf(temp,"(%d,%d)",x,y);
  31. cur_pt = cvPoint(x,y);
  32. cvPutText(img,temp, cur_pt, &font, cvScalar(0,0, 0, 255));
  33. cvShowImage( "img", img );
  34. }
  35. else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))
  36. {
  37. cvCopy(tmp,img);
  38. sprintf(temp,"(%d,%d)",x,y);
  39. cur_pt = cvPoint(x,y);
  40. cvPutText(img,temp, cur_pt, &font, cvScalar(0,0,0,255));
  41. cvRectangle(img, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, 8, 0 );
  42. cvShowImage( "img", img );
  43. }
  44. else if(event == CV_EVENT_LBUTTONUP)
  45. {
  46. cvCopy(tmp,img);
  47. sprintf(temp,"(%d,%d)",x,y);
  48. cur_pt = cvPoint(x,y);
  49. cvPutText(img,temp, cur_pt, &font, cvScalar(0,0, 0, 255));
  50. cvCircle( img, cur_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );
  51. cvRectangle( img, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, 8, 0 );
  52. cvShowImage( "img", img );
  53. cvCopy(img,tmp);
  54. int width=abs(pre_pt.x-cur_pt.x);
  55. int height=abs(pre_pt.y-cur_pt.y);
  56. if(width==0 || height==0)
  57. {
  58. cvDestroyWindow("dst");
  59. return;
  60. }
  61. dst=cvCreateImage(cvSize(width,height),org->depth,org->nChannels);
  62. CvRect rect;
  63. if(pre_pt.x<cur_pt.x && pre_pt.y<cur_pt.y)
  64. {
  65. rect=cvRect(pre_pt.x,pre_pt.y,width,height);
  66. }
  67. else if(pre_pt.x>cur_pt.x && pre_pt.y<cur_pt.y)
  68. {
  69. rect=cvRect(cur_pt.x,pre_pt.y,width,height);
  70. }
  71. else if(pre_pt.x>cur_pt.x && pre_pt.y>cur_pt.y)
  72. {
  73. rect=cvRect(cur_pt.x,cur_pt.y,width,height);
  74. }
  75. else if(pre_pt.x<cur_pt.x && pre_pt.y>cur_pt.y)
  76. {
  77. rect=cvRect(pre_pt.x,cur_pt.y,width,height);
  78. }
  79. cvSetImageROI(org,rect);
  80. cvCopy(org,dst);
  81. cvResetImageROI(org);
  82. cvDestroyWindow("dst");
  83. cvNamedWindow("dst",1);
  84. cvShowImage("dst",dst);
  85. cvWaitKey(0);
  86. cvSaveImage("..\\post_img\\71253.jpg",dst);
  87. }
  88. }
  89. int _tmain(int argc, _TCHAR* argv[])
  90. {
  91. org=cvLoadImage("..\\image_norm\\71253.jpg",1);
  92. img=cvCloneImage(org);
  93. tmp=cvCloneImage(org);
  94. cvNamedWindow("img",1);
  95. cvSetMouseCallback( "img", on_mouse, 0);
  96. cvShowImage("img",img);
  97. cvWaitKey(0);
  98. cvDestroyAllWindows();
  99. cvReleaseImage(&org);
  100. cvReleaseImage(&img);
  101. cvReleaseImage(&tmp);
  102. cvReleaseImage(&dst);
  103. return 0;
  104. }

二、程序运行效果图:
这里写图片描述
将鼠标放在原图上的某一点,会显示相应点的位置坐标。至此,openCV使用鼠标响应实现图像裁剪已经实现。

发表评论

表情:
评论列表 (有 0 条评论,295人围观)

还没有评论,来说两句吧...

相关阅读

    相关 python裁剪图像

    之前以为python裁剪图像很难,后来才发现知道裁剪坐标以后(坐标根据目标检测进行坐标变换吧),就很简单了。 1.裁剪 import cv2 cut =

    相关 C#实现图像鼠标裁剪

    C\的图像裁剪很容易操作,这里给个实现的例子 关键是需要处理鼠标的事件和一些更新 实现鼠标移动的代码.注意更新不要全部重画,只有选择矩形部分重画     C\的图像裁