OpenCV绘制基本图形及鼠标响应事件

  • Post author:
  • Post category:其他



目录


1.绘制形状


1.1仔细观察以下函数,其实每个函数只有几个特殊的参数是专有的,其他大都是相同的


1.2共有参数


1.3专属参数


2.鼠标绘图


2.1鼠标响应事件


2.2鼠标回调函数


2.3鼠标事件


2.4使用范例



1.绘制形状

1.1仔细观察以下函数,其实每个函数只有几个特殊的参数是专有的,其他大都是相同的


画圆:cv2.


circle

(img,

center, radius

, color[, thickness[, lineType[, shift]]])


画线:cv2.


line

(img,

pt1, pt2

, color[, thickness[, lineType[, shift]]])


画矩形:cv2.


rectangle

(img,

pt1, pt2

, color[, thickness[, lineType[, shift]]])


画多边形/多线段:cv2.


polylines

(img,

[


pts], isClosed

, color[, thickness[, lineType[, shift]]])


写文本:cv2.


putText

(img,

text, org, fontFace, fontScale

, color[, thickness[, lineType[, bottomLeftOrigin]]])


画椭圆:cv2.ellipse

(img,

center, axes, angle, startAngle, endAngle

, color[, thickness[, lineType[, shift]]]),附画椭圆参数图:

下面介绍一下各个参数的含义:

1.2共有参数

  • img:要绘制的图像,绘制前跟绘制后是同一个图像。
  • color:采用RGB颜色模式,用来指定描绘的形状的颜色。值得注意的是,三数值并不是按顺序代表RGB,而是(B,G,R)
  • thickness:绘制的图像的线宽。值得注意的是,如果线宽为负则将填满整个图像。
  • lineType:线段类型。可以取值8, 4, 和CV_AA, 分别代表8邻接连接线,4邻接连接线和反锯齿连接线。默认值为8邻接。为了获得更好地效果可以选用CV_AA(采用了高斯滤波),不常用。
  • shift:表示点坐标中小数点的位数,不常用

1.3专属参数

①圆:

  • center:圆的圆心坐标
  • radius:圆的半径大小

②线:

  • pt1:线的起始坐标
  • pt2:线的终点坐标

③矩形:

  • pt1:矩形左上角
  • pt2:矩形右下角

④多线段/多边形:

  • [pts]:一组点位,描述多边形的各个角的位置

范例:

pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))

不少人可能会注意到reshape()函数,那就稍微了解一下吧。

reshape(参数1,参数2)函数是在不改变数据内容的情况下,改变一个数组的格式。

参数1是表示数组的格式如(3,4)表示设置为3行4列,而(3,4,1)是表示每1个数值组成一个数据,将数据组织成3行4列的样式,若输入-1Python就是根据其他数自动调整。

参数2是设置数据的读/写数据,可选C,F,A,默认为C。

如范例中的reshape((-1,1,2))是表示将两个数值组成一个数据,将数据组织为1列n行的形式。默认先读和写都以行优先。

具体可参考:

numpy中reshape方法详解



python中reshape的用法

  • isClosed:’True’/’False’可选。若是False则图形为由点数组组成的闭合多边形。若为Ture则只将各个点连起来组成多线段。

⑤文本:

  • text:要绘制的文本字符串
  • org:绘制的文本的左下角
  • fontFace:字体
  • fontScale:字体大小

⑥椭圆:

  • center:椭圆中心,形式为(x,y)
  • axes:轴长度,形式为(l1,l2),l1为长轴长,l2为短轴长。
  • angle:整个椭圆逆时针旋转的角度。

范例:0度与60度

  • startAngle, endAngle:startAngle和endAngle表示从主轴沿顺时针方向测量的椭圆弧的开始和结束。即给出0和360给出完整的椭圆

绘制图像官方文档:


https://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html#gettextsize

2.鼠标绘图

注意区分鼠标事件/鼠标回调函数/鼠标响应时间。

先说结论:

  1. 鼠标事件是人对鼠标的敲打,如左键按下,左键双击,左键放开等。
  2. 鼠标回调函数是针对鼠标事件发生后程序应该执行的动作。
  3. 鼠标相应事件是指名鼠标回调函数发生所在的图像,土话来说就是你想把鼠标回调函数应用在哪个图像上。

那么自顶而下依次学习这3个概念:

2.1鼠标响应事件

# 布置前提环境
import cv2 as cv
cv.namedWindow('image')

# 响应事件使用范例
cv.setMouseCallback('image',鼠标回调函数)

所以设置鼠标响应事件是非常简单的,你只需设置你的(鼠标)回调函数。

2.2鼠标回调函数

函数原型:

on_mouse(event, x, y, flags, param)

# on_mouse:函数名,可随意命名
# event:鼠标事件
# x,y:鼠标事件发生的坐标
# flags:是CV_EVENT_FLAG的组合
# param:是用户定义的传递到setMouseCallback函数调用的参数

使用范例:

def draw_circle(event,x,y,flags,param):
    if event == cv.EVENT_LBUTTONDBLCLK:
        cv.circle(img,(x,y),100,(255,0,0),1)

所以现在你只需了解鼠标事件event与flags

2.3鼠标事件

使用以下代码查看所有可选鼠标事件:

import cv2 as cv
events = [i for i in dir(cv) if 'EVENT' in i]
print( events )

# 输出结果
# ['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']

①具体参数说明:

event参数:

  • EVENT_MOUSEMOVE 0 //滑动
  • EVENT_LBUTTONDOWN 1 //左键点击
  • EVENT_RBUTTONDOWN 2 //右键点击
  • EVENT_MBUTTONDOWN 3 //中键点击
  • EVENT_LBUTTONUP 4 //左键放开
  • EVENT_RBUTTONUP 5 //右键放开
  • EVENT_MBUTTONUP 6 //中键放开
  • EVENT_LBUTTONDBLCLK 7 //左键双击
  • EVENT_RBUTTONDBLCLK 8 //右键双击
  • EVENT_MBUTTONDBLCLK 9 //中键双击

flags参数:

  • EVENT_FLAG_LBUTTON 1 //左键拖曳
  • EVENT_FLAG_RBUTTON 2 //右键拖曳
  • EVENT_FLAG_MBUTTON 4 //中键拖曳
  • EVENT_FLAG_CTRLKEY 8 //(8~15)按 Ctrl 不放
  • EVENT_FLAG_SHIFTKEY 16 //(16~31)按 Shift 不放
  • EVENT_FLAG_ALTKEY 32 //(32~39)按 Alt 不放

②使用说明:

在使用中

  • event事件为主
  • flags事件为辅,可以不写。

范例:

def draw_circle(event,x,y,flags,param):
    if event == 0:    #只要鼠标在图像范围内移动就会不断画图
        cv.circle(img,(x,y),100,(255,0,0),1)

若再设置flags==1后:单纯的鼠标在图像内移动不会画图,只有满足鼠标移动+鼠标左键保持按下才会开始画图。

def draw_circle(event,x,y,flags,param):
    if event == 0 and flags == 1:
        cv.circle(img,(x,y),100,(255,0,0),1)

2.4使用范例

import numpy as np
import cv2 as cv

# 鼠标回调函数
def draw_circle(event,x,y,flags,param):
    if event == 0 and flags == 1:
        cv.circle(img,(x,y),100,(255,0,0),1)

# 创建一个黑色的图像,将鼠标响应事件绑定到窗口
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
    cv.imshow('image',img)
    if cv.waitKey(20) & 0xFF == 27:
        break
cv.destroyAllWindows()



版权声明:本文为Cristiano2000原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。