最近做的项目需要用鼠标去选择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); } }
OpenCV247 鼠标选择ROI区域
最新推荐文章于 2022-11-11 16:44:13 发布