根据opencv4.1官方文档学习,并添加个人笔记

import numpy as np
import cv2 as cv

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

# 创建黑色图像
# 3通道颜色
img = np.zeros((512, 512, 3), np.uint8)
# 单通道颜色
img1 = np.zeros((512, 512, 1), np.uint8)
# 绘制直线
# cv.line() 接受五个参数,分别为 对象,起点,终点,颜色,厚度
cv.line(img, (0, 511), (511, 0), (0, 0, 255), 5)
cv.line(img1, (0, 511), (511, 0), 255, 5)

# 绘制矩形
# cv.rectangle()  接受五个参数, 分别为 对象,左上,右下,颜色,厚度
cv.rectangle(img, (18, 23), (480, 369), (255, 0, 0), 10)
cv.rectangle(img1, (18, 23), (480, 369), 120, 10)

# 绘制圆形
# cv.circle()  五个参数 对象 中心 半径 颜色 厚度
# 厚度为<0会填充满
cv.circle(img, (255, 255), 88, (156, 24, 98), -3)
cv.circle(img1, (255, 255), 88, 55, 3)

# 绘制椭圆
# cv.ellipse 八个参数 对象  中心  轴长(长轴长,短轴长) 起始角 结束角 颜色 厚度
cv.ellipse(img, (256, 80), (100, 50), 0, 0, 180, (33, 156, 99), -1)
cv.ellipse(img1, (256, 80), (100, 50), 0, 0, 180, 255, -1)

# 要绘制多边形,首先需要顶点的坐标。
# 将这些点组成形状为ROWSx1x2的数组,其中ROWS是顶点数,并且其类型应为int32。
# 在这里,我绘制了一个带有五个顶点的黄色小多边形。
pts = np.array([[80, 55], [20, 98], [70, 20], [100, 10], [255, 88]], np.int32)
# 下面的5可换为-1,则自动识别顶点数
pts = pts.reshape((5, 1, 2))

# 如果第三个参数为False,将获得一条连接所有点的折线,而不是闭合形状。
# cv.polylines()可用于绘制多条线。
# 只需创建要绘制的所有线条的列表,然后将其传递给函数即可。
# 所有线条将单独绘制。与为每条线调用cv.line相比,绘制一组线是一种更好,更快的方法。
cv.polylines(img, [pts], True, (0, 255, 255))

# 要将文本放入图像中,需要指定以下内容。
# - 要写入的文字数据 - 要放置它的位置坐标(即数据开始的左下角)。
# - 字体类型(检查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)

cv.imshow('line', img)
cv.imshow('line1', img1)
cv.waitKey(0)

# 调查 CV中所有 'event' 并打印
events = [i for i in dir(cv) if 'EVENT' in i]
print(events)


# 鼠标回调函数
def draw_circle(event, x, y, flags, param):
    if event==cv.EVENT_LBUTTONDBLCLK:
        cv.circle(img, (x, y), 100, (255, 0, 0), -1)


drawing = False  # 如果按下鼠标,则为真
mode = True  # 如果为真,绘制矩形。按 m 键可以切换到曲线
ix, iy = -1, -1


# 鼠标回调函数
def draw_circle1(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), (0, 255, 0), 2)
            else:
                cv.circle(img, (x, y), 5, (0, 0, 255), -1)
    elif event==cv.EVENT_LBUTTONUP:
        drawing = False
        if mode==True:
            cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 2)
        else:
            cv.circle(img, (x, y), 5, (0, 0, 255), -1)


# 创建一个黑色的图像,一个窗口,并绑定到窗口的功能
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw_circle1)

while 1:
    cv.imshow('image', img)
    if cv.waitKey(20)==27:
        break
cv.destroyAllWindows()


def nothing(x):
    pass


# 创建一个黑色的图像,一个窗口
img = np.zeros((300, 512, 3), np.uint8)
cv.namedWindow('image')

# 创建颜色变化的轨迹栏
# 对于cv.getTrackbarPos()函数,
# 第一个参数是轨迹栏名称,第二个参数是它附加到的窗口名称,
# 第三个参数是默认值,第四个参数是最大值,第五个是执行的回调函数每次跟踪栏值更改。
# 回调函数始终具有默认参数,即轨迹栏位置。在例子中,函数什么都不做,所以我们简单地通过。
cv.createTrackbar('R', 'image', 0, 255, nothing)
cv.createTrackbar('G', 'image', 0, 255, nothing)
cv.createTrackbar('B', 'image', 0, 255, nothing)

# 为 ON/OFF 功能创建开关
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image', 0, 1, nothing)
while 1:
    cv.imshow('image', img)
    k = cv.waitKey(1)
    if k==27:
        break
    # 得到四条轨迹的当前位置
    r = cv.getTrackbarPos('R', 'image')
    g = cv.getTrackbarPos('G', 'image')
    b = cv.getTrackbarPos('B', 'image')
    s = cv.getTrackbarPos(switch, 'image')
    if s==0:
        img[:] = 0
    else:
        img[:] = [b, g, r]
cv.destroyAllWindows()