OpenCV之响应鼠标(四):在图像上绘制出矩形并标出起点的坐标
涉及到两方面的内容:1. 用鼠标画出矩形。2.在图像上绘制出点的坐标
- 用鼠标绘制矩形,涉及到鼠标的操作,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参数。
- 在图像上绘出点的坐标涉及到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之响应鼠标(四):在图像上绘制出矩形并标出起点的坐标的更多相关文章
- python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框
最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...
- opencv —— setMouseCallback 响应鼠标操作事件
鼠标操作:setMouseCallback 函数 借助回调函数,实现对鼠标每次操作的相应,即每进行一步鼠标操作,都会执行一次回调函数. void setMouseCallback(const stri ...
- OpenCV学习笔记(4)——图像上的算术运算
学习图像上的算术运算,加法,减法,位运算等 1.图像加法 使用cv2.add()将两幅图像进行加法运算,也可以用numpy运算,直接img+img1.两幅图像的大小和类型必须一致,或者第二个图像可以是 ...
- OpenCV之响应鼠标(一):利用鼠标获取坐标
好久没有更新博客了,今天临时起意,将以前写的示例代码整理了一下,暂且发布一篇,希望对大家有用! 代码一:点击时显示坐标,鼠标移动时不显示. #include <cv.h> #include ...
- OpenCV之响应鼠标(二):函数cvSetMouseCallback()和其副程式onMouse()的使用(OpenCV2.4.5)
每當滑鼠在視訊視窗介面點擊一下的時候,都會有固定三個動作 1.點擊(Click) 2.放開(Down)3.滑動(move) 因此,程式執行滑鼠在點擊的時候onMouse()都會連續跑三次,代表滑鼠在點 ...
- OpenCV中响应鼠标消息 (转)
#include <cv.h> #include <highgui.h> #include <stdio.h> #pragma comment(lib," ...
- OpenCV之响应鼠标(三):响应鼠标信息
转自:http://blog.csdn.net/haihong84/article/details/6599838 程序代碼如下: #include <cv.h>#include < ...
- c#图片上绘制半透明矩形
p.CreateGraphics().FillRectangle( ,Color.LightGreen)), iLeft, iTop, iRight - iLeft, iBottom - iTop); ...
- OpenCV计算机视觉学习(8)——图像轮廓处理(轮廓绘制,轮廓检索,轮廓填充,轮廓近似)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 1, ...
随机推荐
- 转!!java中Object转String
Object转为String的几种形式 在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object.toString ...
- Hbase之遍历获取数据
import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.HBaseConfiguration;import ...
- C++ Primer 第三章 标准库类型string运算
1. 标准库类型 string string表示可变长的字符序列,使用string必须首先包含string头文件.如何初始化类的对象是由类本身决定的. int n; string s1;//默认初始化 ...
- PV UV IP含义及区别
--------首先来看看ip.uv和pv的定义---------- PV(访问量):即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次. UV(独立访客):即Unique Vis ...
- arithmetic
字典序算法 http://www.cnblogs.com/darklights/p/5285598.html 字典排序(lexicographical order)是一种对于随机变量形成序列的排序方法 ...
- PLI与Pillow
PIL概念 XXXXX 注意 PIL不兼容setuptools. Pillow概念 Pillow(PIL fork)是用来处理raster图像的Python图像库,即像素数据的矩阵. 查阅PIL的 ...
- parent,parents和closest
1.parent parent() 获得当前匹配元素集合中每个元素的父元素,使用选择器进行筛选是可选的. <ul id="menu" style="width:10 ...
- centos修改文件及文件夹权限
查看文件权限的语句: 在终端输入:ls -l xxx.xxx (xxx.xxx是文件名) 那么就会出现相类似的信息,主要都是这些:-rw-rw-r-- 一共有10位数 其中: 最前面那个 - 代表的是 ...
- poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)
题目链接:poj1122 FDNY to the Rescue! 题意:给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路口之间没有直接路径,再给 ...
- jquery 行交换 上移 下移
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...