OpenCV中的绘图功能

绘制几何形状

使用以下常用参数

  • img:要绘制形状的图像
  • color:形状的颜色。对于BGR,将其作为元组传递,例如:(255, 0, 0)对应蓝色。对于灰度,只需传递标量值即可。
  • 厚度:线或圆等的粗细。若对闭合图形(如圆)传递-1,它将填充形状。默认厚度=1
  • lineType:线的类型,默认情况下为8 连接线。cv.LINE_AA 给出了抗锯齿的线条,看起来非常适合曲线。

画线

绘制一条线,需传递线的开始和结束坐标。
cv.line(img, (0, 0), (30, 40), (255, 0, 0), 3) 绘制一条厚度3的蓝色线

画矩形

绘制矩形,需传递矩形的左上角和右下角
cv.rectangle(img, (30, 40), (80, 70), (255, 255, 0), -1)
以线的末端为矩形左上角绘制一个长为50,宽为30的青色矩形并填充

画圆圈

绘制一个圆,需传递其中心坐标和半径
cv.circle(img, (55, 55), 15, (0, 255, 255), -1)
绘制一个半径为15的黄色圆在矩形内部并填充

画椭圆

绘制椭圆,需传递椭圆的中心位置,轴长度(长轴长度,短轴长度)。angle是椭圆沿逆时针方向旋转的角度;startAngle和endAngle表示从主轴沿顺时针方向测量的椭圆弧的开始和结束。cv.ellipse(img, (256, 256), (100, 50), 0, 0, 360, 255, -1)
在图像的中心绘制一个完整蓝色椭圆形。

画多边形

绘制多边形,需要顶点的坐标。将这些点组成形状为ROWSx1x2的数组,其中ROWS是顶点数,其类型为int32。

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

绘制一个带有4个顶点的紫色小多边形
注意:若cv.polylines() 函数第三个参数为False,将绘制一条连接所有点的折线,而不是闭合形状。cv.polylines() 可用于绘制多条线。只需创建要绘制的所有线条的列表,将其传递给函数即可。

向图像添加文本

文本放入图像中,需指定以下内容。要写入的文字数据、放置的位置坐标(文字数据的左下角)、字体类型(检查cv.putText 获取支持的字体)、字体比例(指定字体大小)、颜色、厚度、线条类型等常规内容。为了更好的外观,建议使用lineType = cv.LINE_AA

font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA)

在图像中添加OpenCV文本,白色、厚度为2

完整示例

import numpy as np
import cv2 as cv

img = np.zeros((512, 512, 3), np.uint8) #创建黑色的图像
cv.line(img, (0, 0), (30, 40), (255, 0, 0), 3)  #绘制一条厚度3的蓝色线
cv.rectangle(img, (30, 40), (80, 70), (255, 255, 0), -1)
cv.circle(img, (55, 55), 15, (0, 255, 255), 3)
cv.ellipse(img,(256, 256),(100, 50), 0, 0, 360, 255, -1)
pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv.polylines(img, [pts], True, (255, 0, 255))
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA)
cv.imshow('geometry',img)
if cv.waitKey(0) == ord('q'):
    cv.destroyAllWindows

结果如下:
在这里插入图片描述

鼠标作为画笔

鼠标可用事件

可使用以下程序代码列出鼠标的可用事件

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

使用鼠标回调函数

创建鼠标回调函数具有特定的格式,该格式在所有地方都相同,仅在功能上有所不同,可使用鼠标回调函数实现鼠标相关事情。
在鼠标双击的地方绘制一个蓝色填充的圆圈,按ESC键退出窗口

import cv2 as cv
import numpy as np

#鼠标回调函数(实现在鼠标双击的地方绘制一个蓝色填充的圆圈)
def draw_circle(event, x, y, flags, param):
    if event == cv.EVENT_LBUTTONDBLCLK:
        cv.circle(img, (x, y), 100, (255, 0, 0), -1)

#创建一个黑色的图像,一个窗口,并绑定到窗口的功能
img = np.zeros((5112, 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()

在这里插入图片描述
通过拖动鼠标来绘制矩形或圆形(取决于选择的模式) ,按r画矩形,按c画圆形

import cv2 as cv
import numpy as np

drawing = False
mode = True
ix, iy = -1, -1

def draw(event, x, y, flags, param):
    global ix, iy, drawing, mode
    if event == cv.EVENT_LBUTTONDOWN:
        drawing = True  #按下鼠标,则为真
        ix, iy = x, y
    elif event == cv.EVENT_MOUSEMOVE:
        if drawing == True:
            if mode == True:
                cv.rectangle(img, (ix, iy), (x, y), (255, 255, 0), -1)
            else:
                cv.circle(img, (x, y), 6, (0, 255, 255), -1)
    elif event == cv.EVENT_LBUTTONUP:
        drawing = False
        if mode == True:
                cv.rectangle(img, (ix, iy), (x, y), (255, 255, 0), -1)
        else:
            cv.circle(img, (x, y), 6, (0, 255, 255), -1)
#创建一个黑色的图像,一个窗口,并绑定到窗口的功能
img = np.zeros((5112, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw)
while(1):
    cv.imshow('image', img)
    if cv.waitKey(20) & 0xFF == ord('c'):   #按下c键使用另一种模式(画圆)
        mode = False
    elif cv.waitKey(20) & 0xFF == ord('r'):   #按下r键使用第一种模式(画矩形)
        mode = True    
    if cv.waitKey(20) & 0xFF == 27:
        break
cv.destroyAllWindows()

在这里插入图片描述

轨迹栏作为调色板

创建一个简单的应用程序,显示指定的颜色。有一个显示颜色的窗口,以及三个用于指定B、G、R颜色的轨迹栏。滑动轨迹栏,可相应地更改窗口颜色。默认情况下,初始颜色将设置为黑色。对于cv.getTrackbarPos()函数,第一个参数是轨迹栏名称,第二个参数是它附加到的窗口名称,第三个参数是默认值,第四个参数是最大值,第五个是执行的回调函数每次跟踪栏值更改。回调函数始终具有默认参数,即轨迹栏位置。

import cv2 as cv
import numpy as np

def brush_color(x):
    pass
#鼠标回调函数(实现在鼠标双击的地方绘制一个圆圈)
def draw_circle(event, x, y, flags, param):
    if event == cv.EVENT_LBUTTONDBLCLK:
        cv.circle(img, (x, y), 3, color, -1)
#创建一个黑色的图像,一个窗口
img = np.zeros((300, 500, 3), np.uint8)
cv.namedWindow('palette')
cv.imshow('palette', img)
#创建颜色变化的轨迹栏
cv.createTrackbar('R', 'palette', 0, 255, brush_color)
cv.createTrackbar('G', 'palette', 0, 255, brush_color)
cv.createTrackbar('B', 'palette', 0, 255, brush_color)
cv.setMouseCallback('palette', draw_circle)
while(1):
    cv.imshow('palette', img)
    r = cv.getTrackbarPos('R', 'palette')
    g = cv.getTrackbarPos('G', 'palette')
    b = cv.getTrackbarPos('B', 'palette')
    color = [g, b, r]
    if cv.waitKey(20) & 0xFF == 27:
        break
cv.destroyAllWindows()

在这里插入图片描述
学习来源:OpenCV中文文档

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值