《学习OpenCV》练习题第四章第三题a

  1 #include <highgui.h>
  2 #include <cv.h>
  3 #include "opencv_libs.h"
  4 
  5 #pragma comment (lib,"opencv_calib3d231d.lib")
  6 #pragma comment (lib,"opencv_contrib231d.lib")
  7 #pragma comment (lib,"opencv_core231d.lib")
  8 #pragma comment (lib,"opencv_features2d231d.lib")
  9 #pragma comment (lib,"opencv_flann231d.lib")
 10 #pragma comment (lib,"opencv_gpu231d.lib")
 11 #pragma comment (lib,"opencv_haartraining_engined.lib")
 12 #pragma comment (lib,"opencv_highgui231d.lib")
 13 #pragma comment (lib,"opencv_imgproc231d.lib")
 14 #pragma comment (lib,"opencv_legacy231d.lib")
 15 #pragma comment (lib,"opencv_ml231d.lib")
 16 #pragma comment (lib,"opencv_objdetect231d.lib")
 17 #pragma comment (lib,"opencv_ts231d.lib")
 18 #pragma comment (lib,"opencv_video231d.lib")
 19 
 20 /*
 21  *《学习OpenCV》第四章第三题a
 22  * 完成时间:22:17 3/30 星期六 2013
 23  */
 24 
 25 /* 矩形框 */
 26 CvRect rect;
 27 
 28 bool draw = false;   // 标记是否在画
 29 
 30 IplImage* img;
 31 IplImage * temp;
 32 IplImage * original;
 33 
 34 void draw_rect(IplImage* img, CvRect rect)
 35 {
 36     cvRectangle( img, 
 37         cvPoint( rect.x, rect.y ),
 38         cvPoint( rect.x + rect.width, rect.y + rect.height),
 39         cvScalar( 0x00, 0x00, 0xff) );
 40     printf("draw
");
 41 }
 42 
 43 // 鼠标回调函数
 44 void my_mouse_callback( int event, int x, int y, int flags, void* param)
 45 {
 46     IplImage* image = (IplImage*) param;
 47 
 48     switch( event )
 49     {
 50     case CV_EVENT_MOUSEMOVE:
 51         {
 52             if(draw)
 53             {
 54                 rect.width = x - rect.x;
 55                 rect.height = y - rect.y;
 56             }
 57         }
 58         break;
 59     case CV_EVENT_LBUTTONDOWN:
 60         {
 61             draw = true;
 62             rect = cvRect( x, y, 0, 0 );
 63         }
 64         break;
 65     case CV_EVENT_LBUTTONUP:
 66         {
 67             draw = false;
 68             if(rect.width < 0)
 69             {
 70                 rect.x += rect.width;
 71                 rect.width *= -1;
 72             }
 73             if(rect.height < 0)
 74             {
 75                 rect.y += rect.height;
 76                 rect.height *= -1;
 77             }
 78             // draw
 79             draw_rect(image, rect);
 80         }
 81         break;
 82         // 在右键按下时清除
 83     case CV_EVENT_RBUTTONDOWN:
 84         cvCopyImage(original, img);
 85         printf("clear.
");
 86         break;
 87     }
 88 }
 89 
 90 int main()
 91 {
 92     img = cvLoadImage( "lena.bmp", 1 );
 93 
 94     rect = cvRect( -1, -1, 0, 0);
 95     
 96     // 副本
 97     temp = cvCloneImage( img );
 98     original = cvCloneImage(img);
 99     
100     cvNamedWindow("draw rect");
101     cvSetMouseCallback("draw rect", my_mouse_callback, (void*)img);
102 
103     while(1)
104     {
105         cvCopyImage(img, temp);
106 
107         if(draw)
108         {
109             draw_rect( temp , rect );
110         }
111 
112         cvShowImage( "draw rect", temp);
113 
114         if(cvWaitKey(15) == 27)
115             break;
116     }
117     cvReleaseImage(&img);
118     cvReleaseImage(&temp);
119     cvReleaseImage(&original);
120     cvDestroyAllWindows();
121 
122     return 0;
123 }

运行结果:

原文地址:https://www.cnblogs.com/qdsclove/p/3351187.html