涉及到两方面的内容:1. 用鼠标画出矩形。2.在图像上绘制出点的坐标

  1. 用鼠标绘制矩形,涉及到鼠标的操作,opencv中有鼠标事件的介绍。需要用到两个函数:回调函数CvMouseCallback和注册回调函数cvSetMouseCallback.

当回调函数被调用时,opencv会传入合适的值,当鼠标有动作时,有所反应,比如画线,描点。

void CvMouseCallback(int event,int x,int y,int flags,void * param);

event 为鼠标事件类型,值为以下一种:CV_EVENT_MOUSEMOVE,CV_EVENT_LBUTTONDOWN,CV_EVENT_RBUTTONDOWN,CV_EVENT_MBUTTONDOWN,CV_EVENT_RBUTTONUP,CV_EVENT_LBUTTONUP,CV_EVENT_MBUTTONUP,CV_EVENT_LBUTTONBLCLK,CV_EVENT_RBUTTONBLCLK,CV_EVENT_MBUTTONBLCLK.

x,y表示事件发生时鼠标位置的x,y坐标值。

flags的值表示了别的键如ctrl,shift键是否被触发。

Param可以以任何结构方式传递额外的参数信息。

void cvSetMouseCallback(const char* window_name,CvMouseCallback on_mouse,void* param);

第一个参数指定了回调函数需要注册到的窗口,也就是产生事件的窗口。第二个参数为回调函数,第三个参数用来传递额外信息给回调函数中的param参数。

  1. 在图像上绘出点的坐标涉及到opencv中的绘图中的字体和文字。主要有函数cvPutText和cvInitFont.

void cvPutText(CvArr* img,const char* text,CvPoint origin,const CvFont* font,CvScalar clolor);

这个函数可以在图像上输出一些文本。

text所指向的文本将打印到图像上。若将点的坐标打印到图像上,就需要把点的坐标变成字符串,要用到sprintf函数。

Origin为指定文本框的左下角位置。

Void cvInitFont(CvFont* font,int font_face,double hscale,double vscale,double shear=0,int thinckness=1,int line_type=8);

hscale和vscale表示字体的高度和宽度。Shear=0.0字体不倾斜,shear=1.0,字体倾斜。

Opencv程序和结果如下所示。

#include <opencv2/opencv.hpp>
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
void my_mouse_callback(int event,int x,int y,int flags,void* param);
CvRect box;
bool drawing_box=false;
void draw_box(IplImage* img,CvRect rect)
{
cvRectangle(img,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),cvScalar(0x00,0x00,0xff));
}
CvFont font;
int main()
{ cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.4,0.4,,,);
box=cvRect(-,-,,);
IplImage* image=cvLoadImage("1.bmp");
cout<<"**"<<image->width<<" "<<image->height<<"**"<<endl;
//cvZero(image);
IplImage* temp=cvCloneImage(image);
cvNamedWindow("Box Example");
cvSetMouseCallback("Box Example",my_mouse_callback,(void*)image); while()
{
cvCopy(image,temp);
if(drawing_box) draw_box(temp,box);
cvShowImage("Box Example",temp);
if(cvWaitKey()==) break;
} cvSaveImage("temp.jpg",temp);
cvReleaseImage(&image);
cvReleaseImage(&temp);
cvDestroyWindow("Box Example");
return ; }
void my_mouse_callback(int event,int x,int y,int flags,void* param)
{
IplImage* image=(IplImage*)param;
switch(event)
{
case CV_EVENT_MOUSEMOVE:
{
if(drawing_box)
{
box.width=x-box.x;
box.height=y-box.y;
}
}
break;
case CV_EVENT_LBUTTONDOWN:
{
drawing_box=true;
box=cvRect(x,y,,);
cout<<box.x<<" "<<box.y<<endl;
}
break;
case CV_EVENT_LBUTTONUP:
{
drawing_box=false;
draw_box(image,box);
cout<<box.x<<" "<<box.y<<"&&"<<box.width<<" "<<box.height<<endl;
char s1[];
char s2[]; sprintf(s1,"(%d,%d)",box.x,box.y);
sprintf(s2,"%d",box.y); cvPutText(image,s1,cvPoint(box.x,box.y),&font,CV_RGB(,,)); }
break;
}
}

实验结果:

OpenCV之响应鼠标(四):在图像上绘制出矩形并标出起点的坐标的更多相关文章

  1. python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框

    最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...

  2. opencv —— setMouseCallback 响应鼠标操作事件

    鼠标操作:setMouseCallback 函数 借助回调函数,实现对鼠标每次操作的相应,即每进行一步鼠标操作,都会执行一次回调函数. void setMouseCallback(const stri ...

  3. OpenCV学习笔记(4)——图像上的算术运算

    学习图像上的算术运算,加法,减法,位运算等 1.图像加法 使用cv2.add()将两幅图像进行加法运算,也可以用numpy运算,直接img+img1.两幅图像的大小和类型必须一致,或者第二个图像可以是 ...

  4. OpenCV之响应鼠标(一):利用鼠标获取坐标

    好久没有更新博客了,今天临时起意,将以前写的示例代码整理了一下,暂且发布一篇,希望对大家有用! 代码一:点击时显示坐标,鼠标移动时不显示. #include <cv.h> #include ...

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

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

  6. OpenCV中响应鼠标消息 (转)

    #include <cv.h> #include <highgui.h> #include <stdio.h> #pragma comment(lib," ...

  7. OpenCV之响应鼠标(三):响应鼠标信息

    转自:http://blog.csdn.net/haihong84/article/details/6599838 程序代碼如下: #include <cv.h>#include < ...

  8. c#图片上绘制半透明矩形

    p.CreateGraphics().FillRectangle( ,Color.LightGreen)), iLeft, iTop, iRight - iLeft, iBottom - iTop); ...

  9. OpenCV计算机视觉学习(8)——图像轮廓处理(轮廓绘制,轮廓检索,轮廓填充,轮廓近似)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 1, ...

随机推荐

  1. OpenGL的glViewPort窗口设置函数实现分屏

    之前实现过全景图片查看(OpenGL的几何变换3之内观察全景图),那么我们需要进行分屏该如何实现呢?如下图: 没错就是以前提过的glViewPort函数,废话不多说了,我直接上代码: //从这里开始进 ...

  2. 使用Python获取Linux系统的各种信息

    哪个Python版本? 当我提及Python,所指的就是CPython 2(准确的是2.7).我会显式提醒那些相同的代码在CPython 3 (3.3)上是不工作的,以及提供一份解释不同之处的备选代码 ...

  3. 八大排序算法的 Python 实现

    转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...

  4. hdu 4548 筛法求素数 打表

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4548 Problem Description 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题 ...

  5. Django开发博客- 页面美化

    css是一种用来描述某种标记语言写的web站点的样式语言.这里我们并不想展开讨论,关于CSS我在这里推荐一个很不错的资源: Codeacademy HTML & CSS course 不想从头 ...

  6. uploader上传

    综述 Uploader是非常强大的异步文件上传组件,支持ajax.iframe.flash三套方案,实现浏览器的全兼容,调用非常简单,内置多套主题支持和常用插件,比如验证.图片预览.进度条等. 广泛应 ...

  7. python 基础学习(字典对象,set对象)

    1.dict 字典对象 a.定义对象 d={'a':14,'b':12}b.通过key获取value d['a'] 方法1.判断key是否存在 if 'a' in d: d['a']方法2:通过用ge ...

  8. Windows NT访问权限

    #define SECTION_QUERY 0x0001 #define SECTION_MAP_WRITE 0x0002 #define SECTION_MAP_READ 0x0004 #defin ...

  9. PowerDesigner生成SQL脚本时,对象带有双引号的问题解决

    在pdm查看脚本时,发现表名和字段名带有双引号: 1.create table"cfg_user_card_account"  ( 2.  "user_card_acco ...

  10. struts2视频学习笔记 11-12(动态方法调用,接收请求参数)

    课时11 动态方法调用 如果Action中存在多个方法时,可以使用!+方法名调用指定方法.(不推荐使用) public String execute(){ setMsg("execute&q ...