OpenCV247 鼠标选择ROI区域

最近做的项目需要用鼠标去选择ROI区域,因此就搜索资源并参照网上些许例子,整合为如下代码,功能是选择一幅图像中的ROI区域,并且显示ROI区域,代码如下

/*******************************************************
*功能:ROI                                             *
*作者:JerryShi                                        *
*Date:2013.12.27                                       *
*Time: 15:52:44                                        *
********************************************************/
// MouseROI.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"

bool drawing = false;    //鼠标点击flag
Rect rect(-1,-1,-1,-1);  //ROI
Point Origin(-1,-1);     //起点
Mat ScrImg;              //输入图像
Mat DstImg;              //ROI


/*------------------------------------------------------/
/功能:鼠标处理事件函数
/event:鼠标事件  x,y: 鼠标当前坐标 flag:
/param:函数指针
/------------------------------------------------------*/
void OnMouseMove(int event,int x,int y,int flag,void* param = NULL);

int main(int argc,char* argv[])
{
	ScrImg = imread("G:\\visaul studio2010\\MobRobot\\Graduation\\HOG_test\\lena.JPEG",-1);

	cvNamedWindow("SrcImg",1);
	cvSetMouseCallback("SrcImg",OnMouseMove,NULL); 
	imshow("SrcImg",ScrImg);
	waitKey(0);
	return 0;
}

void OnMouseMove(int event,int x,int y,int flag,void* param /* = NULL */)
{
	//左键按下,且不移动
	if (event == CV_EVENT_LBUTTONDOWN && !CV_EVENT_MOUSEMOVE)
	{
		drawing = true;
		Origin = cvPoint(x,y);    //获取坐标
		rect = cvRect(x,y,0,0);   //设置lefttop 坐标
	}
	else if ((event == CV_EVENT_MOUSEMOVE) &&((flag && CV_EVENT_FLAG_LBUTTON)))
	{
		//鼠标移动,且左键已按下
		if (drawing)
		{
			rect.x = MIN(Origin.x,x);   //获取最左边点的坐标
			rect.y = MIN(Origin.y,y);
			rect.height = abs(Origin.x - x);
			rect.width = abs(Origin.y - y);
		}
	}
	else if (event == CV_EVENT_LBUTTONUP)
	{
		//如果左键弹起,说明ROI区域选择结束
		//若ROI长宽为0则返回提示
		drawing = false;
		if (rect.height == 0 || rect.width ==0)
		{
			cout << "You have not choose any rectangle area !" << endl;
		}
		namedWindow("DstImg",1);
		ScrImg(rect).copyTo(DstImg);
		imshow("DstImg",DstImg);
		imwrite("DstImg.jpg",DstImg);
		rectangle(ScrImg,Point(rect.x,rect.y),Point(rect.x + rect.width,rect.y + rect.height),cvScalar(0,255,0));
		imshow("SrcImg",ScrImg);
		waitKey(0);
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值