OpenCV:鼠标画直线并显示坐标

【天问】存于咸阳宫内,为秦始皇的配剑。当一个人成为天下至尊,权利已是他手中最锋利的宝剑,所谓“天问”不正是一种举剑问天、舍我其谁的王者气势的体现吗?

【鼠标操作】

1、回调函数

CV_EXPORTS void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata = 0);

回调函数的作用:每次在窗口上进行鼠标操作,都会调用此函数,放在waitKey()函数前面,保证能够回调。

函数参数介绍:

​const string& winname:windows视窗名称,对名为winname的视窗进行鼠标监控。
MouseCallback onMouse:鼠标响应处理函数,监听鼠标的点击,移动,松开,判断鼠标的操作类型,并进行响应的函数处理。
void* userdata = 0 :鼠标响应处理函数的ID,与鼠标相应处理函数相匹配就行,暂时只用到默认为0的情况。

 操作实例

namedWindow("src", WINDOW_AUTOSIZE);//WINDOW_AUTOSIZE:系统默认,显示自适应
src = imread("0.jpg", 1);//1:为原图颜色,0:为灰度图,黑白颜色    
src.copyTo(dst);   
setMouseCallback("src", on_mouse, 0);

实例解析

(1)src:创建的窗口的名字,跟namedWindow("src", WINDOW_AUTOSIZE);是对应的,如果不先创建一个窗口,那么后面的鼠标就没法操作了。
(2)on_mouse:自己创建的一个鼠标响应处理函数名(调用函数),跟一般的调用函数一样。

【渊虹】人有信仰,剑亦有剑魂,当天下第一剑客盖聂,遇到天问之下最著名的宝剑渊虹,绝世搭档由此诞生。从此,盖聂无论是帮助秦始皇消灭刺杀者,还是反叛秦国流亡天下,渊虹都一直与他为伴,如今虽断,不过相信总有一天渊虹能够完

2、鼠标响应处理函数

void on_mouse(int event,int x,int y,int flags,void *ustc)

函数参数介绍:

​​int event:鼠标操作时间的整数代号,在opencv2.4.5中,event鼠标事件总共有10种,从0-9依次代表如下:

#define CV_EVENT_MOUSEMOVE 0            滑动
#define CV_EVENT_LBUTTONDOWN 1          左键点击
#define CV_EVENT_RBUTTONDOWN 2          右键点击
#define CV_EVENT_MBUTTONDOWN 3          中间点击
#define CV_EVENT_LBUTTONUP 4            左键释放
#define CV_EVENT_RBUTTONUP 5            右键释放
#define CV_EVENT_MBUTTONUP 6            中间释放
#define CV_EVENT_LBUTTONDBLCLK 7        左键双击
#define CV_EVENT_RBUTTONDBLCLK 8        右键双击
#define CV_EVENT_MBUTTONDBLCLK 9        中间释放

 int x,int y:代表鼠标位于窗口的(x,y)坐标位置,窗口左上角默认为原点,向右为x轴,向下为y轴;

 int flags:代表鼠标的拖拽事件,以及键盘鼠标联合事件,总共有32种事件,依次如下: 

#define CV_EVENT_FLAG_LBUTTON 1           左键拖拽
#define CV_EVENT_FLAG_RBUTTON 2           右键拖拽
#define CV_EVENT_FLAG_MBUTTON 4           中间拖拽
#define CV_EVENT_FLAG_CTRLKEY 8     (8~15)按Ctrl不放事件
#define CV_EVENT_FLAG_SHIFTKEY 16   (16~31)按Shift不放事件
#define CV_EVENT_FLAG_ALTKEY 32       (32~39)按Alt不放事件

void *ustc:函数参数的编号(暂时用不到)。

操作实例

​​if (event == EVENT_LBUTTONDOWN)
{ 
    //左键按下;
}
else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))
{  
    // 鼠标移动;
}
else if (event == EVENT_LBUTTONUP)
{   
    //左键弹起;
}

​

鼠标操作除了用if().......else if()............之外,还可以用switch() case x:break;来写。

【太阿】儒家圣使伏念的佩剑。据剑谱介绍,太阿乃诸侯威道之剑,其剑气存于天地之间,只有内心之威才能催动剑气之威。太阿的现任主人儒家掌门伏念,器宇轩昂,乃是非常有威仪之人,而他独创圣王剑法,与太阿的剑气可谓相得益彰,能够找到这样一位主人,乃太阿之幸。

【显示坐标】

函数实例

​sprintf(temp_1,"x:%d,y:%d",x,y);           putText(src,temp_1,Point(x,y),FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,255,255));

实例解析

(1)把要输出的内容给字符串(数组)

sprintf(temp_1,"x:%d,y:%d",x,y);

temp_1:字符串(char temp_1[20];)

x,y:要输出到图像上的坐标值

(2)把文本输出到图像上

putText(src,temp_1,Point(x,y),FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,255,255));

src:要显示的图像

temp_1:字符串(char temp_1[20];)

Point(x,y):要输出到图像上的位置

FONT_HERSHEY_SIMPLEX:字体

0.5:大小,可以随意改,找最合适的

Scalar(0,255,255):黄色

【干将莫邪】   干将、莫邪是两把剑,但是没有人能分开它们。干将、莫邪是两个人,同样,也没有人能将他们分开。干将、莫邪是干将、莫邪铸的两把剑。干将是雄剑,莫邪是雌剑。干将、莫邪是一把挚情之剑。 

 

【画线操作】

画线使用line函数就简单多了,只需要知道起点和终点就行了。

函数实例

line(src, pre_pt, cur_pt, Scalar(0, 255,0), 1, CV_AA, 0);

函数解析

src:源图像

pre_pt:起点坐标(第一次按下鼠标产生的点)

cur_pt:终点坐标(鼠标移动后,最后停下的点)

Scalar(0, 255,0):线的颜色

0为黑色,255为白色,由RGB在一起组合成各种颜色

颜色组合列表:

Scalar(0, 0,0)---------------------------------------黑色
Scalar(0, 0,255)------------------------------------红色
Scalar(0, 255,0)------------------------------------绿色
Scalar(255,0,0)-------------------------------------蓝色
Scalar(255, 255,0)---------------------------------青色
Scalar(255, 0,255)---------------------------------紫色
Scalar(0, 255,255)---------------------------------黄色
Scalar(255, 255,255)------------------------------白色

 thickness:线条宽度

lineType:线型

线型列表:      

8(or omitted) - 8-connected line.
4 - 4-connected line.
CV_AA- antialiased line.

【雪霁】雪霁乃道家历代供奉的名剑,因道家门派分立,被各派轮流供奉,如今为人宗掌门逍遥子佩剑。雪霁是目前已公布十大名剑中最“纤细”的一柄,这正符合道家思想中以柔克刚的理念,同时,其因纤细,更不容易给对手造成致命的伤口,也是道家仁爱之心的一种体现。因此,雪霁与其说是一柄剑,倒不如说是一种道家精神的象征。

【画圆操作】

由于鼠标操作时,左键按下要有一个标记,也就一点,而我们通常的做法就是画一个半径小点的圆做点。

函数实例

circle(src, cur_pt, 3, Scalar(255,0, 0), CV_FILLED, CV_AA, 0);

实例解析

src:源图像

cur_pt:实时坐标点,作为圆的圆心

radius:圆的半径

Scalar(255,0, 0):颜色,跟上面一样

thickness:线粗,如果值是正,圆外轮廓的厚度,如果值是负,表示要绘制一个填充圆

lineType线类型

【水寒】大师徐夫子专门根据高渐离绝技“易水寒”特点所铸,可以在他的内力催动下凝水为冰,威力更甚,因此水寒剑虽名列第七,但是对于高渐离来说却是最合适的。

【具体操作流程】

OpenCV:鼠标画直线并显示坐标_第1张图片

【湛卢】湛泸是一把剑,更是一只眼睛。湛泸:湛湛然而黑色也。这把通体黑色浑然无迹的长剑让人感到的不是它的锋利,而是它的宽厚和慈祥。它就像上苍一只目光深邃、明察秋毫的黑色的眼睛,注视着君王、诸侯的一举一动。君有湛泸剑是一把仁道之剑。

【程序源码】

/**
@ 1、读取读片
@ 2、显示图片,延迟卡死
@ 3、一直进行鼠标操作,进行绘图,显示图片
*/
#include
#include
#include
#include
#include 
using namespace cv;

Mat src;
Mat dst;

void on_mouse(int event, int x, int y, int flags, void* ustc)
{
    static Point pre_pt ;
    static Point cur_pt ;
    char temp_1[20];
   // 如果要在图片的任意位置作为起始点,这两步就不需要了
    //pre_pt=Point(-1,-1);
    //cur_pt=Point(-1,-1);
    if (event == CV_EVENT_LBUTTONDOWN)
    {
        dst.copyTo(src);
        pre_pt = Point(x, y);
        //sprintf(temp_1,"x:%d,y:%d",x,y);
        //xiaolei=Rect(x1,y1,0,0);
        //putText(src,temp_1,Point(x,y),FONT_HERSHEY_SIMPLEX,0.5,Scalar(255,255,255));
        circle(src, pre_pt, 0.5, cvScalar(255, 0, 0), CV_FILLED, CV_AA, 0);
        imshow("src", src);
    }
    else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))
    {
        dst.copyTo(src);
        cur_pt = Point(x, y);
        sprintf(temp_1,"x:%d,y:%d",x,y);
        //xiaolei=Rect(x1,y1,0,0);
        putText(src,temp_1,Point(x,y),FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,255,255));
        line(src, pre_pt, cur_pt, cvScalar(0, 255,0), 1, CV_AA, 0);
        imshow("src", src);
    }
    else if (event == CV_EVENT_LBUTTONUP)
    {
        dst.copyTo(src);
        cur_pt = Point(x, y);
        sprintf(temp_1,"x:%d,y:%d",x,y);
        //xiaolei=Rect(x1,y1,0,0);
        putText(src,temp_1,Point(x,y),FONT_HERSHEY_SIMPLEX,0.4,Scalar(0,255,255));
        circle(src, cur_pt, 3, cvScalar(255,0, 0), CV_FILLED, CV_AA, 0);
        line(src, pre_pt, cur_pt, cvScalar(0, 255,0), 1, CV_AA, 0);
        imshow("src", src);
    }
}

int main()
{
    //注意:这一步必须要有,不然进行不了鼠标操作
    namedWindow("src", WINDOW_AUTOSIZE);//WINDOW_AUTOSIZE:系统默认,显示自适应
    src = imread("0.jpg", 1);//1:为原图颜色,0:为灰度图,黑白颜色
    src.copyTo(dst);

    setMouseCallback("src", on_mouse, 0);

    imshow("src", src);
    waitKey(0);

    return 0;
}

【赤霄】汉高祖刘邦斩蛇所用之剑。这是一把饰有七彩珠、九华玉的寒光逼人、刃如霜雪的宝剑,剑身镌刻两个篆字:赤霄。汉高祖刘邦凭此剑于大泽怒斩白蛇,开始其帝王一生。赤霄剑是一把帝道之剑。

【效果图】

OpenCV:鼠标画直线并显示坐标_第2张图片

参考博客

http://blog.csdn.net/thefutureisour/article/details/7523925
http://www.cnblogs.com/techdreaming/p/5193835.html
​http://blog.csdn.net/NCHFGFB/article/details/51516030

【凌虚】剑谱排名第十位宝剑凌虚,为齐鲁三杰中张良的佩剑。此剑的名字也侧面反映了张良的能力,身怀经天纬地之才,胸藏救世济民之志。凌虚虽为神兵利器,但是却未曾沾染血腥,以剑载志,以剑明心,才是张良的真正目的。

OpenCV:鼠标画直线并显示坐标_第3张图片

OpenCV:鼠标画直线并显示坐标_第4张图片

 

 

你可能感兴趣的:(《OpenCV学习笔记》)