OpenCV-绘图函数

首先需要
import cv2
import nump as np

创建画布

img = np.zeros((画布长度, 画布宽度 , 3), np.uint8)

直线

cv2.line(img, start, end, color, thickness)

img:想要绘制的那副图像(画布)
start:起始坐标,例如(0, 0)
end:终止坐标,例如(255, 255)
color:线的颜色,例如(255, 0, 0)
thickness:线的粗细,例如5

矩形

cv2.retangle(img, start, end, color, thickness)

start: 左上角坐标
end:右下角坐标

cv2.circle(img, center, radius, color, thickness)
center:圆心坐标
radius:半径
thickness:线的粗细,若为-1则画出实心圆

椭圆

cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness, lineType = LINE_8, shift = 0)
img:图像
center:圆心坐标
axes:长轴和短轴的长度,例如(80,40)
angle:偏转的角度
startAngle:圆弧起始角的角度
endAngle:圆弧终止角的角度
color:线条的颜色
thickness:线条的粗细程度
lineType:线条的类型
shift:圆心坐标点和轴的精度

多边形

#首先构造多边形点的数组
pst=np.arry([[x1,y1], [x2,y2]..., [xn,yn]], np.int32) # 必须是np.int32

#使用polylines函数画多边形
cv2.polylines(img, [pst], isClosed, color, thickness=None,lineType=None, shift=None)
# isClosed参数中,Ture表示闭合,False表示仅保留线段

添加文字

cv2.putText(img, text, center,lineType, size,color, thickness)
lineType:字体类型,推荐使用cv2.LINE_AA
size:字体大小
thickness:线条粗细

把鼠标当画笔

查看所有被支持的鼠标事件

import cv2
import numpy as np
events = [i for i in dir(cv2) if 'EVENT'in i]
print(events)   # 输出可用的鼠标事件

在这里插入图片描述
其中,常用的几个:
0:cv2.EVENT_MOUSEMOVE 鼠标移动事件
1:cv.EVENT_LBUTTONDOWN 鼠标左键按下事件
2:cv.EVENT_RBUTTONDOWN 鼠标右键按下事件
3:cv.EVENT_MBUTTONDOWN 鼠标中键按下事件
4:cv.EVENT_LBUTTONUP 鼠标左键释放事件
5:cv.EVENT_RBUTTONUP 鼠标右键释放事件
6:cv.EVENT_MBUTTONUP 鼠标中键释放事件
7:cv.EVENT_LBUTTONBLCLK 鼠标左键双击事件
8:cv.EVENT_RBUTTONBLCLK 鼠标右键双击事件
9:cv.EVENT_MBUTTONBLCLK 鼠标中键双击事件
10:cv.EVENT_MOUSEWHEEL 滑动滚轮上下滚动
11:cv.EVENT_MOUSEHWHEEL 滑动滚轮左右滚动

简单的点击绘制图形

import cv2
import numpy as np

def draw_circle(event, x, y, flags, param):
    if event == 0:# 鼠标拖拽
            cv2.circle(img, (x, y), 5, (255, 0, 0), -1)

# 创建窗体并将窗体与回调函数绑定
img = np.zeros((255, 255, 3), np.uint8)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.setMouseCallback('image', draw_circle)

while(1):
    cv2.imshow('image', img)
    if cv2.waitKey(20)&0xFF == 27:
        break
cv2.destroyAllWindows()

拖动鼠标绘制图形

import cv2
import numpy as np

drawing = False #鼠标未按下时为False,按下为True
mode = True	#矩形和曲线的转换,键盘按下m转换
xi, yi = -1, -1 #记录按下的起始位置

def draw_rectangle(event, x, y, flags, param):
    global drawing, xi, yi, mode
    #当鼠标按下时
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        xi, yi = x, y
    #当鼠标按下并拖拽时
    elif event == cv2.EVENT_MOUSEMOVE and drawing:
        if mode == True:	#画矩形
            cv2.rectangle(img, (xi, yi), (x, y), (123, 231, 165), -1)
        else:	#画圆形
            cv2.circle(img, (x, y), 3, (123, 231, 165), -1)
    #鼠标松开时,drawing改为False
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False

img = np.zeros((300, 300, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_rectangle)
while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1)&0xFF
    if k == ord('m'):
        mode = not mode
    elif k == 27:
        break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值