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

#include <highgui.h>
#include <cv.h>
#include "opencv_libs.h"

#pragma comment (lib,"opencv_calib3d231d.lib")
#pragma comment (lib,"opencv_contrib231d.lib")
#pragma comment (lib,"opencv_core231d.lib")
#pragma comment (lib,"opencv_features2d231d.lib")
#pragma comment (lib,"opencv_flann231d.lib")
#pragma comment (lib,"opencv_gpu231d.lib")
#pragma comment (lib,"opencv_haartraining_engined.lib")
#pragma comment (lib,"opencv_highgui231d.lib")
#pragma comment (lib,"opencv_imgproc231d.lib")
#pragma comment (lib,"opencv_legacy231d.lib")
#pragma comment (lib,"opencv_ml231d.lib")
#pragma comment (lib,"opencv_objdetect231d.lib")
#pragma comment (lib,"opencv_ts231d.lib")
#pragma comment (lib,"opencv_video231d.lib")

/*
 *《学习OpenCV》第四章第三题a
 * 完成时间:22:17 3/30 星期六 2013
 */

/* 矩形框 */
CvRect rect;

bool draw = false;   // 标记是否在画

IplImage* img;
IplImage * temp;
IplImage * original;

void draw_rect(IplImage* img, CvRect rect)
{
	cvRectangle( img, 
		cvPoint( rect.x, rect.y ),
		cvPoint( rect.x + rect.width, rect.y + rect.height),
		cvScalar( 0x00, 0x00, 0xff) );
	printf("draw\n");
}

// 鼠标回调函数
void my_mouse_callback( int event, int x, int y, int flags, void* param)
{
	IplImage* image = (IplImage*) param;

	switch( event )
	{
	case CV_EVENT_MOUSEMOVE:
		{
			if(draw)
			{
				rect.width = x - rect.x;
				rect.height = y - rect.y;
			}
		}
		break;
	case CV_EVENT_LBUTTONDOWN:
		{
			draw = true;
			rect = cvRect( x, y, 0, 0 );
		}
		break;
	case CV_EVENT_LBUTTONUP:
		{
			draw = false;
			if(rect.width < 0)
			{
				rect.x += rect.width;
				rect.width *= -1;
			}
			if(rect.height < 0)
			{
				rect.y += rect.height;
				rect.height *= -1;
			}
			// draw
			draw_rect(image, rect);
		}
		break;
		// 在右键按下时清除
	case CV_EVENT_RBUTTONDOWN:
		cvCopyImage(original, img);
		printf("clear.\n");
		break;
	}
}

int main()
{
	img = cvLoadImage( "lena.bmp", 1 );

	rect = cvRect( -1, -1, 0, 0);
	
	// 副本
    temp = cvCloneImage( img );
	original = cvCloneImage(img);
	
	cvNamedWindow("draw rect");
	cvSetMouseCallback("draw rect", my_mouse_callback, (void*)img);

	while(1)
	{
		cvCopyImage(img, temp);

		if(draw)
		{
			draw_rect( temp , rect );
		}

		cvShowImage( "draw rect", temp);

		if(cvWaitKey(15) == 27)
			break;
	}
	cvReleaseImage(&img);
	cvReleaseImage(&temp);
	cvReleaseImage(&original);
	cvDestroyAllWindows();

	return 0;
}

运行结果:


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值