Python机器视觉--OpenCV入门--OpenCV鼠标绘制图形

1. 绘制图形

1.1 API介绍

利用OpenCV提供的绘制图形API可以轻松在图像上绘制各种图形, 比如直线, 矩形, 圆, 椭圆等图形.

  • line(img, pt1, pt2, color, thickness, lineType, shift) 画直线

    • img: 在哪个图像上画线
    • pt1, pt2: 开始点, 结束点. 指定线的开始与结束位置
    • color: 颜色
    • thickness: 线宽
    • lineType: 线型.线型为-1, 4, 8, 16, 默认为8
    • shift: 坐标缩放比例.
  • rectangle() 参数同上 画矩形

  • circle(img, center, radius, color[, thickness[, lineType[, shift]]]) 中括号内参数表示可选参数. 画圆

  • ellipse(img, 中心点, 长宽的一半, 角度, 从哪个角度开始, 从哪个角度结束,…)

请添加图片描述

  • polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]]) 画多边形
  • fillPoly 填充多边形
  • putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]) 绘制文本
    • text 要绘制的文本
    • org 文本在图片中的左下角坐标
    • fontFace 字体类型即字体
    • fontScale 字体大小

1.2 代码实现

import cv2
import numpy as np

img = np.zeros((480, 640, 3), np.uint8)
# cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4)
# cv2.line(img, (80, 100), (380, 480), (0, 0, 255), 5, 16)

# 画矩形
# cv2.rectangle(img, (10,10), (100, 100), (0, 0, 255), -1)

# 画圆
# cv2.circle(img, (320, 240), 100, (0, 0, 255))
# cv2.circle(img, (320, 240), 5, (0, 0, 255), -1)
# 画椭圆
# cv2.ellipse(img, (320, 240), (100, 50), 15, 0, 360, (0, 0, 255), -1)

#画多边形
# pts = np.array([(300, 10), (150, 100), (450, 100)], np.int32)
# cv2.polylines(img, [pts], True, (0, 0, 255))

#填充多边形
# cv2.fillPoly(img, [pts], (255, 255, 0))
cv2.putText(img, "Hello OpenCV!", (10, 400), cv2.FONT_HERSHEY_TRIPLEX, 3, (255,0,0))
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制中文 opencv本身不支持, 因为没有中文字体.我们可以借助pillow来实现绘制中文

# 安装pillow
import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image

img = np.full((200, 200, 3), fill_value=255, dtype=np.uint8)
# 导入字体文件. 
font_path = 'msyhbd.ttc'
font = ImageFont.truetype(font_path, 15)
img_pil = Image.fromarray(img)
draw = ImageDraw.Draw(img_pil)
draw.text((10, 150), '绘制中文', font=font, fill=(0, 255, 0, 0))
img = np.array(img_pil)

# 中文会显示问号
cv2.putText(img, '中文', (10, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 1)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

小惊喜:基于OpenCV实现按l键之后拖动鼠标绘制直线, 按r键之后拖动鼠标绘制矩形, 按r键拖动鼠标绘制圆形

# 按下l, 拖动鼠标, 可以绘制直线.
# 按下r, 拖到鼠标, 可以绘制矩形
# 按下c, 拖动鼠标, 可以绘制圆. 拖动的长度可以作为半径.
import cv2
import numpy as np

# 这是一个全局标志, 判断要画什么类型的图.
curshape = 0
startpos = (0, 0)

# 创建背景图
img = np.zeros((480, 640, 3), np.uint8)

# 要监听鼠标的行为, 所以必须通过鼠标回调函数实现.
def mouse_callback(event, x, y, flags, userdata):
    # 引入全局变量
    global curshape, startpos
    # 引入非本层的局部变量用什么关键字nonlocal
    if event == cv2.EVENT_LBUTTONDOWN:
        # 记录起始位置
        startpos = (x, y)
        
    elif event ==0 and flags == 1: # 表示按下鼠标左键并移动鼠标
        if curshape == 0: # 画直线
            cv2.line(img, startpos, (x, y), (0, 0, 255), 1)
        elif curshape == 1: # 画矩形
            cv2.rectangle(img, startpos, (x, y), (0, 0, 255), 1)
        elif curshape == 2: # 画圆
            # 注意计算半径
            a = (x - startpos[0])
            b = (y - startpos[1])
            r = int((a ** 2 + b ** 2) ** 0.5)
            # 画圆的时候, 半径必须是整数
            cv2.circle(img, startpos, r, (0, 0, 255), 1)
        else: # 按其他的按键
            print('暂不支持绘制其他图形')
            
    elif event == cv2.EVENT_LBUTTONUP:
        # 判断要画什么类型的图.
        if curshape == 0: # 画直线
            cv2.line(img, startpos, (x, y), (0, 0, 255), 3)
        elif curshape == 1: # 画矩形
            cv2.rectangle(img, startpos, (x, y), (0, 0, 255), 1)
        elif curshape == 2: # 画圆
            # 注意计算半径
            a = (x - startpos[0])
            b = (y - startpos[1])
            r = int((a ** 2 + b ** 2) ** 0.5)
            # 画圆的时候, 半径必须是整数
            cv2.circle(img, startpos, r, (0, 0, 255), 1)
        else: # 按其他的按键
            print('暂不支持绘制其他图形')
            
            
# 创建窗口
cv2.namedWindow('drawshape', cv2.WINDOW_NORMAL)
# 设置鼠标回调函数
cv2.setMouseCallback('drawshape', mouse_callback)

while True:
    cv2.imshow('drawshape', img)
    # 检测按键
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
    elif key == ord('l'):
        curshape = 0
    elif key == ord('r'):
        curshape = 1
    elif key == ord('c'):
        curshape = 2
        
cv2.destroyAllWindows()
效果如图所示

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43944517/article/details/126322554