opencv如何在显示的窗口中用鼠标提取一块区域

如题所述

//自己写的代码,拖动鼠标截取一部分图像
#include <cv.h>
#include <highgui.h>

bool drawing = false;
CvRect rect;
CvPoint origin;
IplImage* src;
IplImage* dst;

void onMouse(int event,int x,int y,int flags,void* param = NULL);

int main(int argc, char* argv[])
{
src = cvLoadImage("D:\\Lena.jpg", -1);
cvNamedWindow("源图片",1);
cvSetMouseCallback("源图片",onMouse,NULL);//捕捉鼠标
cvShowImage("源图片",src);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&dst);
return 0;
}
//鼠标事件处理函数
void onMouse(int event,int x,int y,int flags,void* param)
{
if(event == CV_EVENT_LBUTTONDOWN && !CV_EVENT_MOUSEMOVE)
{
drawing = true;
origin=cvPoint(x,y);
rect=cvRect(x,y,0,0);
}
else if(event==CV_EVENT_MOUSEMOVE)
{
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 )
{
drawing = false;
if(rect.height==0 || rect.width==0)
{
cvDestroyWindow("截图");
return;
}
dst=cvCreateImage(cvSize(rect.width,rect.height),src->depth,src->nChannels);
cvSetImageROI(src,rect);
cvCopy(src,dst);
cvResetImageROI(src);

cvNamedWindow("截图",1);
cvShowImage("截图",dst);
cvSaveImage("截图.jpg",dst);
cvWaitKey(0);
cvDestroyWindow("截图");
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-05-22
opencv的cvNamedeWindow创建的窗口有鼠标点击或者移动的回调函数,可以在这里面做
得到想要得到的矩形左上角和右下角两个点的坐标(这也是图片对象像素的相对指针),利用这两个点构造一个矩形,对远图像cvSetImageIOR就可以了,操作完别忘了cvReleaseIOR本回答被网友采纳
第2个回答  2012-07-26
使用MFC做的界面 可以使用onleftbuttondown 和up获取鼠标点坐标,然后转化到图像坐标,就可以了。
相似回答