使用OpenCV怎么实现鼠标框选并显示框选区域

  介绍

本篇文章给大家分享的是有关使用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怎么实现鼠标框选并显示框选区域