《学习OpenCV(中文版)》第4章 练习5a

/*定义各种形状*/
#define SHAPE_NONE 0
#define SHAPE_LINE 1
#define SHAPE_RECT 2
#define SHAPE_CIRCLE 3
#define SHAPE_ELLIPSE 4
#define SHAPE_PLYGON 5
 
#define SHAPE_COUNT 6	//总的形状数,包括清空(SHAPE_NONE)
#define _ERASER 6		//橡皮擦标识
 
int width = 300;
int height = 300;
int shape_status = SHAPE_NONE;		//记录各种状态
CvPoint begin_pointend_point;		//鼠标摁下及松开时的坐标
void on_mouse_callback(int eventint xint yint flagsvoidparam) {
	IplImageimg1 = (IplImage*)param;
	switch(event) {
	case CV_EVENT_LBUTTONDOWN:			//鼠标左边点击,确定行为
		{
			int perWidth = width/SHAPE_COUNT;	//每个按钮的宽度
			if(y>height) {					//点击自定义的按钮
				if(x<perWidth) {
					shape_status = SHAPE_LINE;
				} else if(x<2*perWidth) {
					shape_status = SHAPE_RECT;
				} else if(x<3*perWidth) {
					shape_status = SHAPE_CIRCLE;
				} else if(x<4*perWidth) {
					shape_status = SHAPE_ELLIPSE;
				} else if(x<5*perWidth) {
					shape_status = SHAPE_PLYGON;
				} else {
					shape_status = SHAPE_NONE;
					cvSetImageROI(img1cvRect(0, 0, widthheight));	//清空画面
					cvZero(img1);
					cvResetImageROI(img1);
				}
			} else {
				//记录起点
				if(shape_status != SHAPE_NONE) {
					begin_point.x = x;
					begin_point.y = y;
				}				
			}
			break;
		}
	case CV_EVENT_RBUTTONDOWN:
		{
			shape_status = _ERASER;
			break;
		}
	case CV_EVENT_LBUTTONUP:		//鼠标左键起来时,各种画图
		{
			if(y<height) {			//在画面区域时
				cvSetImageROI(img1cvRect(0, 0, widthheight));	//限定在画面区域,避免自定义按钮被覆盖或清空
				//记录终点
				if(shape_status != SHAPE_NONE) {
					end_point.x = x;
					end_point.y = y;
				}
				switch(shape_status) {
				case SHAPE_LINE:
					{
						cvLine(img1begin_pointend_pointcvScalar(255, 0, 0));	//画直线
						break;
					}
				case SHAPE_RECT:
					{
						cvRectangle(img1begin_pointend_pointcvScalar(0, 255, 0));	//画矩形
						break;
					}
				case SHAPE_CIRCLE:
					{
						cvCircle(
							img1begin_point,	//以起点为圆心
							std::sqrt(std::pow(1.0*(end_point.x-begin_point.x), 2)+std::pow(1.0*(end_point.y-begin_point.y), 2)*1.0f),	//两点距离为半径
							cvScalar(0, 0, 255));
						break;
					}
				case SHAPE_ELLIPSE:
					{
						cvEllipse(
							img1cvPoint((begin_point.x+end_point.x)/2, (begin_point.y+end_point.y)/2),	//两点中点为中心
							cvSize(std::abs(end_point.x - begin_point.x), std::abs(end_point.y - begin_point.y)),	//两点为对角所确定的矩形区域
							0,
							0,
							360,
							cvScalar(255, 255, 0)
							);
						break;
					}
				case SHAPE_PLYGON:
					//do nothing,还没想好怎么画
 
					break;
				}
				cvResetImageROI(img1);
			}
			cvShowImage("Picture"img1);
			break;
		}
	case CV_EVENT_RBUTTONUP:
		{
			shape_status = SHAPE_NONE;
			break;
		}
	case CV_EVENT_MOUSEMOVE:
		{
			if(shape_status == _ERASER && y<height) {
				for(int i=-2; i<=2; i++) {		//橡皮擦,以(x,y)为中心的大小为5的矩形橡皮擦
					for(int j=-2; j<=2; j++) {
						//所经过的点复原为0
						*(cvPtr2D(img1y+ix+j)+0) = 0;
						*(cvPtr2D(img1y+ix+j)+1) = 0;
						*(cvPtr2D(img1y+ix+j)+2) = 0;
					}
				}				
			}
			cvShowImage("Picture"img1);
			break;
		}
	}
}
void myGUI5a() {
	cvNamedWindow("Picture");
	int delta = 40;
	IplImageimg = cvCreateImage(cvSize(widthheight+delta), IPL_DEPTH_8U, 3);	//加20用于做按钮
	cvZero(img);
	//自定义按钮
	//cvLine(img, cvPoint(0, height), cvPoint(width, height), cvScalar(255, 255, 255));
	int perWidth = width/SHAPE_COUNT;	//每个按钮的宽度
	for(int i=0; i<SHAPE_COUNTi++) {
		int next_row = height + delta;
		int next_col = (i+1)*perWidth;
		int color = 255 - 20*i;			//按钮不同颜色
		for(int row=height;row<next_rowrow++) {
			for(int col=i*perWidth;col<next_colcol++) {
				*(cvPtr2D(imgrowcol)+0) = color;
				*(cvPtr2D(imgrowcol)+1) = color;
				*(cvPtr2D(imgrowcol)+2) = color;
			}
		}
	}
	
	cvSetMouseCallback("Picture"on_mouse_callbackimg);
	cvShowImage("Picture"img);
	cvWaitKey(0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值