好久没有更新博客了,今天临时起意,将以前写的示例代码整理了一下,暂且发布一篇,希望对大家有用!

代码一:点击时显示坐标,鼠标移动时不显示。

#include <cv.h>
#include <highgui.h>
#include <stdio.h> IplImage* src=0;
void on_mouse( int event, int x, int y, int flags, void* ustc)
{
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA); if( event == CV_EVENT_LBUTTONDOWN )
{
CvPoint pt = cvPoint(x,y);
char temp[16];
sprintf(temp,"(%d,%d)",pt.x,pt.y);
cvPutText(src,temp, pt, &font, cvScalar(255, 255, 255, 0));
cvCircle( src, pt, 2,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );
cvShowImage( "src", src );
}
} int main()
{
src=cvLoadImage("lena.jpg",1); cvNamedWindow("src",1);
cvSetMouseCallback( "src", on_mouse, 0 ); cvShowImage("src",src);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&src); return 0;
}

  代码二:鼠标移动时显示坐标,点击时不显示坐标

#include <cv.h>
#include <highgui.h>
#include <stdio.h> IplImage* src=0;
IplImage* dst=0;
void on_mouse( int event, int x, int y, int flags, void* ustc)
{
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA); if( event == CV_EVENT_MOUSEMOVE )
{
cvCopy(dst,src); CvPoint pt = cvPoint(x,y); char temp[16];
sprintf(temp,"(%d,%d)",pt.x,pt.y); cvPutText(src,temp, pt, &font, cvScalar(255, 255, 255, 0));
cvCircle( src, pt, 2,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );
cvShowImage( "src", src );
}
} int main()
{
src=cvLoadImage("lena.jpg",1);
dst=cvCloneImage(src); cvNamedWindow("src",1);
cvSetMouseCallback( "src", on_mouse, 0 ); cvShowImage("src",src);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&dst); return 0;
}

  代码三:鼠标移动和点击时均显示坐标

#include <cv.h>
#include <highgui.h>
#include <stdio.h> IplImage* src=0;
IplImage* dst=0;
void on_mouse( int event, int x, int y, int flags, void* ustc)
{
char temp[16];
CvPoint pt;
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA); if( event == CV_EVENT_MOUSEMOVE )
{
cvCopy(dst,src);
sprintf(temp,"(%d,%d)",x,y);
pt = cvPoint(x,y);
cvPutText(src,temp, pt, &font, cvScalar(255, 255, 255, 0));
cvCircle( src, pt, 2,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );
cvShowImage( "src", src );
}
else if( event == CV_EVENT_LBUTTONDOWN )
{
//cvCopy(dst,src);
sprintf(temp,"(%d,%d)",x,y);
pt = cvPoint(x,y);
cvPutText(src,temp, pt, &font, cvScalar(255, 255, 255, 0));
cvCircle( src, pt, 2,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );
cvCopy(src,dst);
cvShowImage( "src", src );
}
} int main()
{
src=cvLoadImage("lena.jpg",1);
dst=cvCloneImage(src); cvNamedWindow("src",1);
cvSetMouseCallback( "src", on_mouse, 0 ); cvShowImage("src",src);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&dst); return 0;
}

  代码四,上面的代码在边界处处理的不好,坐标值显示的不完全,下面是对代码三的改进。下面的代码还将点约束在图像的几何区域范围内。

#include <cv.h>
#include <highgui.h>
#include <stdio.h> #define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b)) //注意参数是有符号短整型,该函数的作用是使i限定为[a,b]区间内
int bound(short i,short a,short b)
{
return min(max(i,min(a,b)),max(a,b));
} IplImage* src=0;
IplImage* dst=0; void on_mouse( int event, int x, int y, int flags, void* ustc)
{
char temp[16];
CvPoint pt;
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA);
CvPoint tmp_pt = {-1,-1};
CvSize text_size;
int baseline; if( event == CV_EVENT_MOUSEMOVE )
{
cvCopy(dst,src); x=bound(x,0,src->width-1);
y=bound(y,0,src->height-1);
pt = cvPoint(x,y);
cvCircle( src, pt, 2,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 ); sprintf(temp,"(%d,%d)",x,y);
cvGetTextSize(temp,&font,&text_size,&baseline);
tmp_pt.x = bound(pt.x,0,src->width-text_size.width);
tmp_pt.y = bound(pt.y,text_size.height+baseline,src->height-1-baseline);
cvPutText(src,temp, tmp_pt, &font, cvScalar(255, 255, 255, 0)); cvShowImage( "src", src );
}
else if( event == CV_EVENT_LBUTTONDOWN )
{
//cvCopy(dst,src); pt = cvPoint(x,y);
cvCircle( src, pt, 2,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 ); sprintf(temp,"(%d,%d)",x,y);
cvGetTextSize(temp,&font,&text_size,&baseline);
tmp_pt.x = bound(pt.x,0,src->width-text_size.width);
tmp_pt.y = bound(pt.y,text_size.height+baseline,src->height-1-baseline);
cvPutText(src,temp, tmp_pt, &font, cvScalar(255, 255, 255, 0)); cvCopy(src,dst);
cvShowImage( "src", src );
}
} int main()
{
src=cvLoadImage("lena.jpg",1);
dst=cvCloneImage(src); cvNamedWindow("src",1);
cvSetMouseCallback( "src", on_mouse, 0 ); cvShowImage("src",src);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&dst); return 0;
}

  代码五,上面的代码不能撤销选定的坐标,下面的代码对此进行了改进,右击撤销最近选择的点,并用互补的颜色表示选择的点和撤销选定的点。除此之外还将选择的坐标输出到文件。在点的坐标前还有一个数表示点的选定次序。

#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <vector>
#include <fstream>
using namespace std; #define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b)) //注意参数是有符号短整型,该函数的作用是使i限定为[a,b]区间内
int bound(short i,short a,short b)
{
return min(max(i,min(a,b)),max(a,b));
} CvScalar getInverseColor(CvScalar c)
{
CvScalar s;
for(int i=0;i<=2;++i)
{
s.val[i]=255-c.val[i];
}
return s;
} IplImage* src=0;
IplImage* dst=0;
int n=0;
vector<CvPoint> points; void on_mouse( int event, int x, int y, int flags, void* ustc)
{
CvPoint pt;
CvPoint tmp_pt = {-1,-1};
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.4, 0.4, 0, 1, CV_AA);
char temp[16];
CvSize text_size;
int baseline; CvScalar clrPoint=cvScalar(255,0,0,0);
CvScalar clrText=cvScalar(255, 255, 255, 0); if( event == CV_EVENT_MOUSEMOVE )
{
cvCopy(dst,src); x=bound(x,0,src->width-1);
y=bound(y,0,src->height-1);
pt = cvPoint(x,y);
cvCircle( src, pt, 2,clrPoint ,CV_FILLED, CV_AA, 0 ); sprintf(temp,"%d (%d,%d)",n+1,x,y);
cvGetTextSize(temp,&font,&text_size,&baseline);
tmp_pt.x = bound(pt.x,0,src->width-text_size.width);
tmp_pt.y = bound(pt.y,text_size.height+baseline,src->height-1-baseline);
cvPutText(src,temp, tmp_pt, &font, clrText); cvShowImage( "src", src );
}
else if( event == CV_EVENT_LBUTTONDOWN)
{
pt = cvPoint(x,y);
points.push_back(pt); n++;
cvCircle( src, pt, 2, clrPoint ,CV_FILLED, CV_AA, 0 ); sprintf(temp,"%d (%d,%d)",n,x,y);
cvGetTextSize(temp,&font,&text_size,&baseline);
tmp_pt.x = bound(pt.x,0,src->width-text_size.width);
tmp_pt.y = bound(pt.y,text_size.height+baseline,src->height-1-baseline);
cvPutText(src,temp, tmp_pt, &font, clrText); cvCopy(src,dst);
cvShowImage( "src", src );
}
else if( event == CV_EVENT_RBUTTONDOWN )
{
if(!points.empty())
{
cvCopy(dst,src); pt=points.back();
points.pop_back();
cvCircle( src, pt, 2, getInverseColor(clrPoint),CV_FILLED, CV_AA, 0 ); sprintf(temp,"%d (%d,%d)",n,pt.x,pt.y); --n;
cvGetTextSize(temp,&font,&text_size,&baseline);
tmp_pt.x = bound(pt.x,0,src->width-text_size.width);
tmp_pt.y = bound(pt.y,text_size.height+baseline,src->height-1-baseline);
cvPutText(src,temp, tmp_pt, &font, getInverseColor(clrText)); cvCopy(src,dst);
cvShowImage( "src", src );
}
}
} int main()
{
src=cvLoadImage("lena.jpg",1);
dst=cvCloneImage(src); cvNamedWindow("src",1);
cvSetMouseCallback( "src", on_mouse, 0 ); cvShowImage("src",src);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&dst); ofstream file("sample.txt");
if(!file)
{
cout << "open file error!";
return 1;
}
vector<CvPoint>::iterator it=points.begin();
for(;it!=points.end();++it)
{
file<< it->x<<','<<it->y<<endl;
}
file<<endl;
file.close(); return 0;
}

  其的演示如下:

sample.txt中的内容如下:

319,351
382,284
275,292
194,249
357,210
424,260
350,251
305,238
274,189
227,140
224,375

  

转自:http://blog.csdn.net/quarryman/article/details/8450387

OpenCV之响应鼠标(一):利用鼠标获取坐标的更多相关文章

  1. OpenCV之响应鼠标(二):函数cvSetMouseCallback()和其副程式onMouse()的使用(OpenCV2.4.5)

    每當滑鼠在視訊視窗介面點擊一下的時候,都會有固定三個動作 1.點擊(Click) 2.放開(Down)3.滑動(move) 因此,程式執行滑鼠在點擊的時候onMouse()都會連續跑三次,代表滑鼠在點 ...

  2. 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域

    这是两个相关的程序,前者是后者的基础.实际上前一个程序也是在前面博文的基础上做的修改,请参考<在OpenCV中利用鼠标绘制直线> .下面贴出代码. 程序之一,在OpenCV中利用鼠标绘制矩 ...

  3. 【CITE】利用鼠标绘图C#

    实例018 利用鼠标绘图 光盘位置:光盘\MR\01\018 在常用的画图软件中,用户一般都可以通过鼠标在其中绘图,那么该功能是如何实现的呢?本实例将讲解如何使用C#实现通过拖动鼠标在窗体上绘图的功能 ...

  4. 用VBS控制鼠标(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击、鼠标右击)

    Demon's Blog 忘记了,喜欢一个人的感觉 Demon's Blog  »  程序设计  »  用VBS控制鼠标(获取鼠标坐标.鼠标移动.鼠标单击.鼠标双击.鼠标右击) « bbPress积分 ...

  5. WPF 3D 获取鼠标在场景的3d坐标

    原文:WPF 3D 获取鼠标在场景的3d坐标 上一篇中我们谈到了WPF 3d做图的一些简单原理,这里我们简单介绍一下怎样获得鼠标在场景中的3d坐标,知道了3d坐标就可以进行很多操作了: 首先介绍一下3 ...

  6. 有关鼠标在页面body获取点击事件的问题

    首先说到这个问题我们先来谈谈body的高度问题,关于body高度的设置. 有些小伙伴可能就会说这个是多么的简单,直接进行如下操作不就可以了 body{ height:100%; } 这个设置虽然是想法 ...

  7. Javascript获取当前鼠标在元素内的坐标定位

    代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> <tit ...

  8. 简单利用XSS获取Cookie信息实例演示

    简单利用XSS获取Cookie信息实例演示   首先要找到一个有XXS的站,这里就不整什么大站了,谷歌一下inurl:'Product.asp?BigClassName',搜出来的命中率也比较高.随便 ...

  9. c#全局鼠标事件以及鼠标事件模拟

    最近在编写Max插件时,其主容器FlowLayoutPanel由于隐藏了滚动条,要实现按住鼠标中键上下拖动的功能,因此尝试了全局鼠标事件.以及鼠标勾子,可惜由于Max不争气?都未能实现,于是代码报废, ...

  10. JS——鼠标在盒子中的坐标

    核心思想: 1.复杂版本:鼠标pageX.pageY的值减去盒子距离顶端的offsetLeft.offsetTop值就是鼠标在盒子中的坐标 2.简单版本:offsetX.offsetY就可获取鼠标相对 ...

随机推荐

  1. Html_在线客服静态网页

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. commonJS — 对象操作(for Object)

    for Object github: https://github.com/laixiangran/commonJS/blob/master/src/forObject.js 代码 /** * Cre ...

  3. 【转】loading 三种实现方式

    转载:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=76872 一.通过动画实现 定义res/anim/loading.xml如 ...

  4. C语言中随机数相关问题

    用C语言产生随机数重要用到rand函数.srand函数.及宏RAND_MAX(32767),它们均在stdlib.h中进行了声明. int rand(void);//生成一个随机数 voidsrand ...

  5. 弹出框--self

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. 1.1 ASP.NET MVC简介

    1.什么是ASP.NET MVC? (1)它是个怎么样的产品? ASP.NET MVC是微软公司.NET平台上的一个Web开发框架,它为开发者提供了一种构建结构良好的Web应用程序的方式.自2007年 ...

  7. jmeter 实时搜索结果

    因为JMeter 2.13你可以得到实时搜索结果发送到后端通过 后端侦听器 使用潜在的任何后端(JDBC.JMS网络服务,€Š) 通过提供一个实现类 AbstractBackendListenerCl ...

  8. 10大html5前端框架

    Bootstrap 首先说 Bootstrap,估计你也猜到会先说或者一定会有这个( 呵呵了 ),这是说明它的强大之处,拥有框架一壁江山的势气.自己刚入道的时候本着代码任何一个字母都得自己敲出来挡我者 ...

  9. express+nodecoffee写passport登录验证实例(二)

    二:实现登录认证 passport官网文档:  http://passportjs.org/guide/ passport验证使用一种被称为“策略”的方式来验证请求,策略支持3种类型的验证:用户名密码 ...

  10. apache2.4域名配置参数

    apache2.4和 2.2版本的配置有区别 2.4的配置如下 <VirtualHost *:80>DocumentRoot /www/web/projectServerName www. ...