本篇文章给大家分享的是有关使用OpenCV怎么实现鼠标框选并显示框选区域,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
<强> cvSetImageROI函数强>(基于给定的矩形设置图像的ROI(感兴趣区域,有趣的地区))
空白cvSetImageROI (IplImage *形象,CvRect矩形)
<强>参数:强>
图像图像头,待处理图像
矩形ROI感兴趣区域矩形
<强> cvResetImageROI函数强>(释放基于给定的矩形设置图像的ROI(感兴趣区域,有趣的地区))
空白cvResetImageROI (IplImage *图像)
<强>参数:强>
图像图像头,待处理图像
<强> cvcop函数强>(拷贝一个数组给另一个数组)
在使用这个函数之前,你必须用cvCreateImage()一类的函数先开一段内存,然后传递给dst.cvCopy会把src中的数据复制到dst的内存中。
复制只会复制ROI区域,相当于函数cvCopy从输入数组中复制选定的成分到输出数组。
空白cvCopy (const CvArr * src, CvArr * dst, const CvArr *面具=NULL),
<强>参数:强>
src 输入数组
dst 输出数组
mask 操作掩码是8比特单通道的数组,它指定了输出数组中被改变的元素,
<强> cvCloneImage函数强>(复制图像数据)
在使用函数之前,不用开辟内存。该函数会自己开一段内存,然后复制好形象里面的数据,然后把这段内存中的数据返回给你。
克隆是把所有的都复制过来,也就是说不论你是否设置Roi, Coi等影响副本的参数,克隆都会原封不动的克隆过来。
IplImage * cvCloneImage (const IplImage *图像),
<强>参数:强>图像输入源图像数据
返回值:IplImage *,输出图像指针
注意:使用cvCloneImage()容易造成内存泄露,所以慎用。
cvCloneImage()每次使用时编译器会分配新的内存空间,不会覆盖以前的内容,所以如果在循环中使用内存会迅速减小,每次用完都需要用cvRelease来释放。
解决方法是使用cvCopy函数代替。
,源代码:
# include & lt; cv.h> # include & lt; highgui.h> # include & lt; stdio.h> , IplImage *, src =, 0,, IplImage *, tmp =, 0,, 时间=IplImage *, tmp1 0; 时间=IplImage *, org 0; void on_mouse (, int 事件,int x,, int y, int 旗帜,void *,科大) { ,static CvPoint pre_pt =, {1 1}; ,static CvPoint cur_pt =, {1 1}; ,CvFont 字体; ,cvInitFont(和字体,CV_FONT_HERSHEY_SIMPLEX,, 0.5, 0.5, 0,, 1,, CV_AA);//初始化字体 ,char 临时[16]; , ,如果(,(event ==, CV_EVENT_LBUTTONDOWN),和(旗帜),)//鼠标左键按下时 {大敌; ,sprintf(临时“(% d % d)“, x, y);//格式化字符串=,,pre_pt  cvPoint (x, y);//获取当前点坐标值 ,cvPutText (src,临时,pre_pt,,,字体,,cvScalar(0, 0, 0, 255));//在图像是打印字符 ,cvCircle (src的不同之处是,pre_pt, 2, cvScalar (255, 0, 0, 0),, CV_FILLED,, CV_AA,, 0,);//在图像上画圆 ,cvShowImage (,“src",, src ); ,//cvCopy (src, tmp);//这句有没有,就是单目标和多目标的问题 ,} ,else 如果(,(event ==, CV_EVENT_MOUSEMOVE),,,, (flags ,, CV_EVENT_LBUTTONDOWN)) ,{//鼠标移动并且鼠标左键按下 ,sprintf(临时“(% d % d)“, x, y);//格式化字符串=,,cur_pt  cvPoint (x, y);//获取当前点坐标值, ,cvPutText (src,临时,cur_pt,,,字体,,cvScalar(0, 0, 0, 255));//在图像是打印字符 ,cvRectangle (src, pre_pt,, cur_pt,, cvScalar(0255, 0, 0), 2, 8, 0,);//在图像上画矩形 ,cvShowImage (,“src",, src ); src, cvCopy (tmp);//将img复制到临时图像tmp上,用于实时显示 ,} ,else 如果(==,,event  CV_EVENT_LBUTTONUP ) ,{//鼠标左键弹起 ,sprintf(临时“(% d % d)“, x, y);//字体格式化=,,cur_pt  cvPoint (x, y);//获取当前点坐标值, ,cvPutText (src,临时,cur_pt,,,字体,,cvScalar(0, 0, 0, 255));//在图像是打印字符 ,cvCircle (src的不同之处是,cur_pt, 2, cvScalar (255, 0, 0, 0),, CV_FILLED,, CV_AA,, 0,);//在图像上画圆 ,cvRectangle (src的不同之处是,pre_pt, cur_pt,, cvScalar(0255, 0, 0), 2, 8, 0,);//在图像上画矩形 ,cvShowImage (,“src",, src ); , ,/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */,int 宽度=abs (pre_pt.x-cur_pt.x);,//两点横坐标差, ,,,int 身高=abs (pre_pt.y-cur_pt.y);,//两点纵坐标差, ,,,如果(宽度==0,| |,身高==0), ,,,{,//两者中有一个为零时销毁窗口 ,,,,,cvDestroyWindow (“dst");, ,,,,,返回,, ,,,}, ,,,tmp1 =, cvCreateImage (cvSize(宽度、高度),组织→深度、组织→nChannels),, ,,,CvRect 矩形,, ,,,如果(pre_pt.x使用OpenCV怎么实现鼠标框选并显示框选区域