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函数哦!)
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显示图片操作,MFC的鼠标响应在opencv图片上失效,opencv滚轮事件没有响应问题描述解决。