import cv2 as cv
import numpy as np
#rgb转bgr
def rgb(r,g,b,a=None):
if not a:
bgr_tuple = (b,g,r)
else:
bgr_tuple = (b,g,r,a)
return bgr_tuple
#定义背景图片样式
def defineCanvas(width,height,color):
alpha = len(color)
canvas = np.zeros((width,height,alpha),np.uint8)
for x in canvas:
for y in x[...]:
y[...] = [i for i in color]
return canvas
#创建背景图
canvas = defineCanvas(500,500,rgb(255,255,255))
#(img:图片,
# pt1:起始坐标,
# pt2:结束坐标,
# color:BGR颜色,
# thickness?:line-weight,
# lineType?:line-style,
# shift?:线条皱缩)
cv.line(canvas,(0,0),(500,500),rgb(0,0,255),4,cv.LINE_AA,1)
#(img:图片,
# pt1:左上坐标,
# pt2:右下坐标,
# color:BGR颜色,
# thickness?:line-weight,
# lineType?:line-style,
# shift?:图形皱缩)
cv.rectangle(canvas,(0,0),(200,200),rgb(0,255,0),2,cv.LINE_AA,1)
#(img:图片,
# center:圆心坐标,
# radius:半径,
# color:BGR颜色,
# thickness?:line-weight,
# lineType?:line-style,
# shift?:图形皱缩)
cv.circle(canvas,(200,200),50,rgb(100,10,20),2,cv.LINE_AA,1)
#(img:图片,
# center:圆心坐标,
# axes:长轴与短轴,
# angel:椭圆旋转角度,
# startAngel:开始角度,
# endAngel:结束角度,
# color:BGR颜色,
# thickness?:line-weight,
# lineType?:line-style,
# shift?:图形皱缩)
cv.ellipse(canvas,(250,250),(200,100),90,0,360,rgb(100,10,20),2,cv.LINE_AA,0)
#(img:图片,
# pts:多边形数组,
# isClosed:是否闭合路径,
# color:BGR颜色,
# thickness?:line-weight,
# lineType?:line-style,
# shift?:图形皱缩)
pts = np.array([[10,5],[20,30],[70,20],[50,10]],np.int32) #多边形1
pts1 = np.array([[100,5],[200,30],[170,20],[150,10]],np.int32) #多边形2
cv.polylines(canvas,[pts,pts1],True,rgb(100,10,20),2,cv.LINE_AA,0)
#(img:图片,
# text:文本,
# org:文本基准点,
# fontFace:文本类型,
# fontScsle:文本缩放,
# color:BGR颜色,
# thickness?:line-weight,
# lineType?:line-style,
# bottomLeftOrigin?:文本翻转)
cv.putText(canvas,'Hello World',(0,200),cv.FONT_HERSHEY_SIMPLEX,2,rgb(100,10,20),2,cv.LINE_AA,True)
#事件event
#['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']
#利用事件监听实现简单画笔功能
#画笔轨迹保存
track = []
#多边形原型
def ptsArr(arr):
ptsArr = np.array(arr,np.int32)
return [ptsArr]
#鼠标事件回调函数
def mouse_move_cbk(event,x,y,flags,param):
if event == cv.EVENT_MOUSEMOVE and flags == 1:
track.append([x,y])
cv.polylines(canvas,ptsArr(track),False,rgb(100,10,20),2,cv.LINE_AA,0)
cv.imshow('canvas',canvas)
elif event == cv.EVENT_LBUTTONUP:
track.clear()
cv.namedWindow('canvas')
#鼠标事件监听
cv.setMouseCallback('canvas',mouse_move_cbk)
cv.imshow('canvas',canvas)
cv.waitKey(0)
cv.destroyAllWindows()
注意点:
(1).鼠标事件的回调函数只能触发一种事件,例如无法同时监听鼠标按下并移动两种事件同时发生的情况,但是有其他的解决办法。
最简单且常用的就是在外部定义一个flag变量记录mousedown状态,之后再判断mousemove。
这里的解决办法采取的是判断函数内的参数flags,如果有mousedown,flag则为1,否则为0
(2).在opencv中所有颜色都为bgr,与正常的rgb通道刚好相反。可以自己建立一个函数去将rgb颜色翻转。