OpenCV笔记14:抠图

  1. #include "cv.h"  
  2. #include "highgui.h"  
  3. #include <stdio.h>  
  4.   
  5. CvPoint prev_pt={-1,-1} ;  
  6. CvPoint pt_beg={-1,-1},pt_end = {-1,-1};  
  7. CvPoint pt1={-1,-1},pt2={-1,-1};  
  8. CvRect rect;  
  9. IplImage *src;  
  10. IplImage *tmp;  
  11.   
  12. void onMouse(int event,int x,int y,int flags,void *param);  
  13.   
  14. int main(int argc,char **argv)  
  15. {  
  16. IplImage *dst;  
  17. int c;  
  18. if ((argc !=2)||!(src=/blog.armyourlife.info/cvLoadImage(argv[1],1)))  
  19. {  
  20. printf("Error when Loading the Picture....Exit/n");  
  21. return -1;  
  22. }  
  23.   
  24. cvNamedWindow("SRC",1);  
  25. cvShowImage("SRC",src);  
  26. tmp = cvCloneImage(src);  
  27.   
  28. cvSetMouseCallback("SRC",onMouse,0);  
  29.   
  30. for (;;)  
  31. {   
  32. c = cvWaitKey(10);  
  33. if ((char)c=='c')  
  34. {  
  35. if (pt_beg.x!=-1)  
  36. {  
  37. rect.x = min(pt_beg.x,pt_end.x);  
  38. rect.y = min(pt_beg.y,pt_end.y);  
  39. rect.height = abs(pt_end.y-pt_beg.y);  
  40. rect.width = abs(pt_end.x-pt_beg.x);  
  41. printf("RECT:height=%d,width=%d/n",rect.height,rect.width);  
  42. cvSetImageROI(src,rect);  
  43. printf("ROI:Height=%d,Width=%d./n",src->roi->height,src->roi->width);  
  44. dst = cvCreateImage(cvSize(rect.width,rect.height),src->depth,src->nChannels);  
  45. dst = cvCloneImage(src);  
  46. printf("DST Height=%d,Width=%d/n",dst->height,dst->width);  
  47. cvNamedWindow("Selected",1);  
  48. cvShowImage("Selected",dst);  
  49. cvSaveImage("selected.jpg",dst);  
  50. printf("Finished!/n");  
  51. cvWaitKey(0);  
  52. cvDestroyWindow("Selected");  
  53. cvReleaseImage(&dst);  
  54. break;  
  55. }  
  56. }  
  57. else if ((char)c==27) //ESC to exit  
  58. {  
  59. cvReleaseImage(&tmp);  
  60. cvReleaseImage(&src);  
  61. cvDestroyWindow("SRC");  
  62. break;  
  63. }  
  64. }  
  65. return 0;  
  66. }  
  67.   
  68. void onMouse(int event,int x,int y,int flags,void *)  
  69. {  
  70. printf("x=%d,y=%d./n",x,y);  
  71. printf("Begin:x=%d,y=%d./n",pt_beg.x,pt_beg,y);  
  72. printf("END:x=%d,y=%d./n",pt_end.x,pt_end.y);  
  73. if (!tmp)  
  74. {  
  75. return ;  
  76. }  
  77.   
  78. /*判断左键是否放开,并且没有进行拖拽*/  
  79. if (event == CV_EVENT_LBUTTONUP||!(flags & CV_EVENT_FLAG_LBUTTON))  
  80. {//CV_EVENT_LBUTTONUP左键放开,CV_EVENT_FLAG_LBUTTON左键拖拽,  
  81. prev_pt=cvPoint(-1,-1);  
  82. }  
  83.   
  84. /*若左键按下则记录为起始点*/  
  85. else if (event == CV_EVENT_LBUTTONDOWN)  
  86. {  
  87. prev_pt = cvPoint(x,y);  
  88. pt_beg = cvPoint(x,y);  
  89. }  
  90.   
  91. /*若鼠标在滑动,并且在拖拽状态*/  
  92. else if (event == CV_EVENT_MOUSEMOVE && (flags && CV_EVENT_FLAG_LBUTTON) )  
  93. {  
  94. cvCopy(src,tmp);  
  95. CvPoint pt =cvPoint(x,y);  
  96.   
  97. /*得到另外两个点,以便进行矩形拖动绘制*/  
  98. pt1.x = pt.x;  
  99. pt1.y = prev_pt.y;  
  100. pt2.x = prev_pt.x;  
  101. pt2.y = pt.y;  
  102.   
  103. cvLine( tmp, prev_pt, pt1, cvScalarAll(255), 2, 8, 0 );  
  104. cvLine( tmp, prev_pt, pt2, cvScalarAll(255), 2, 8, 0 );  
  105. cvLine( tmp, pt1, pt, cvScalarAll(255), 2, 8, 0 );  
  106. cvLine( tmp, pt2, pt, cvScalarAll(255), 2, 8, 0 );  
  107.   
  108. pt_end = pt;  
  109. cvShowImage("SRC",tmp);  
  110. }  
  111. }  

通过运行改代码可以知道,显示出源图像后,按‘c’可以获取框取的ROI区域,并在Selected窗口进行了显示。
但是选框为白色,在选取白底黑目标物体的时候,选框可能 看不到,因此,本人对代码进行了改进,使得选框变为
红色,便于大家观察被选择的ROI区域。

下面是运行的结果图:

































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值