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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("截图");

参考技术A opencv的cvNamedeWindow创建的窗口有鼠标点击或者移动的回调函数,可以在这里面做
得到想要得到的矩形左上角和右下角两个点的坐标(这也是图片对象像素的相对指针),利用这两个点构造一个矩形,对远图像cvSetImageIOR就可以了,操作完别忘了cvReleaseIOR
参考技术B 使用MFC做的界面 可以使用onleftbuttondown 和up获取鼠标点坐标,然后转化到图像坐标,就可以了。

VC6.0中用openCV函数对图像的操作求大神回答!

本人需要用VC6.0的openCV函数对图像进行抠图操作,具体是这样的,给了一个源图像,给定一个区域的位置坐标和区域大小,然后要求把这一块区域图像抠下来,保存成另一张图像。
能不能跟我说一下具体的方法,思路是什么?用哪些openCV函数?每个函数作用是什么?
(ps:一定要是opencv函数哦!)

int main()

IplImage* src = cvLoadImage("image.jpg");

CvRect roi; // 给定的区域的位置坐标和区域大小
roi.x = 0; roi.y = 0; // roi的x,y,是给定的区域的左上角坐标
roi.width = 20; //width, height 是给定的区域的宽、高
roi.height = 20;

IplImage* dst = cvCreateImage(cvSize(roi.width,roi.height),src->depth,src->nChannals);

cvSetImageROI(src, roi); // 在原图上标定感兴趣的区域
cvCopy(src,dst);//将原图上感兴趣的区域copy到dst图像上
cvResetImageROI(src); //释放标定的原图的感兴趣区域

cvNamedWindow("src"); // 显示图像

cvShowImage("src",src);
cvNamedWindow("dst");
cvShowImage("dst",dst);

cvWaitKey(0);

cvDestroyAllWindows();
cvReleaseImage(&src); //释放图像
cvReleaseImage(&dst);

return 0;

追问

谢谢

参考技术A 这个其实很简单,用一个cvcopy函数就行,你敢信?O(∩_∩)O哈哈~。但是这里要设置好对应的mask.
void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );
src
输入数组。
dst
输出数组。
mask
操作掩码是8比特单通道的数组,它指定了输出数组中被改变的元素。
刚才说了这个mask很重要,因为你知道坐标,如果是矩形区域那最好,更容易。如果是不规则的,也可以,只要你设置好mask这个矩阵就行。希望对你有帮助哦,有时候看起来麻烦的在opencv里面是不难的。
参考技术B 额。。很简单的。用opencv里面的ROI就可以鸟,你自己去学习一下ROI,然后保存下就ok

以上是关于opencv如何在显示的窗口中用鼠标提取一块区域的主要内容,如果未能解决你的问题,请参考以下文章

利用OpenCV窗口鼠标事件设置函数setMouseCallback()实现显示当前鼠标坐标截取指定区域图像等功能;顺便介绍函数putText()circle()rectangle()

OpenCV利用鼠标在如下图所示的MFC视频图像上画直线?

opencv与mfc显示图片操作,MFC的鼠标响应在opencv图片上失效,opencv滚轮事件没有响应问题描述解决。

opencv中检测出人脸之后,需要把检测出的人脸区域提取出来,用作人脸识别,那么如何提取人脸区域

opencv显示图片的问题

VC6.0中用openCV函数对图像的操作求大神回答!