python-opencv绘图功能及鼠标事件

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颜色翻转。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值