OpenCV学习笔记4-绘制图形和填充多边形(附代码实现)

1 绘制图形

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

1.1 画直线

  • 画直线:cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
    • img: 在哪个图像上画线
    • pt1, pt2: 开始点, 结束点. 指定线的开始与结束位置
    • color: 颜色
    • thickness: 线宽,为正
    • lineType: 线型.线型为-1, 4, 8, 16, 默认为8
      • 越大越光滑,越小锯齿状越明显
    • shift: 坐标缩放比例.
import cv2
import numpy as np

# 创建纯黑的背景图用来画图形
img = np.zeros((800, 800, 3), np.uint8)

# 4的线宽,锯齿明显
cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4)
# 16的线宽,光滑
cv2.line(img, (80, 100), (380, 480), (0, 0, 255), 5, 16)

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

1.2 画矩形

  • 画矩形:cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
    • img: 在哪个图像上矩形
    • pt1, pt2: 开始点, 结束点. 指定线的开始与结束位置
    • color: 颜色
    • thickness: 线宽
      • 为正画的是空心矩形
      • 为负画的是实心矩形
    • lineType: 线型.线型为-1, 4, 8, 16, 默认为8
      • 越大越光滑,越小锯齿状越明显
    • shift: 坐标缩放比例.
import cv2
import numpy as np

# 创建纯黑的背景图用来画图形
img = np.zeros((800, 800, 3), np.uint8)

# 为正,空心矩形
cv2.rectangle(img, (80, 100), (380, 380), (0, 255, 0), 5)

# 为负,实心矩形
cv2.rectangle(img, (80, 100), (380, 380), (0, 255, 0), -1)

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

1.3 画圆

  • 画圆:cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
    • img 在哪个图像上圆
    • center 圆心位置
    • radius 圆的半径
    • color 圆的颜色
    • thickness 圆形轮廓的粗细
      • 为正画的是空心圆
      • 为负画的是实心圆
    • lineType 圆边界类型
    • shift 坐标缩放比例.
import cv2
import numpy as np

img = np.zeros((800, 800, 3), np.uint8)
# 为正,空心圆
cv2.circle(img, (320, 240), 100, (0, 0, 255), 5, 16)

# 为负,实心圆
# cv2.circle(img, (320, 240), 100, (0, 0, 255), -1, 16)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.4 画椭圆

  • 画椭圆:cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])

    • img 在哪个图像上画椭圆

    • center 椭圆的中心点

    • axes 长宽的一半

    • angle 角度

    • startAngle 从哪个角度开始

    • endAngle 从哪个角度结束

    • color 椭圆的颜色

    • thickness 椭圆形轮廓的粗细

      • 为正画的是空心椭圆
      • 为负画的是实心椭圆
    • lineType 椭圆边界类型

    • shift 坐标缩放比例.

import cv2
import numpy as np

# 创建纯黑的背景图用来画图形
img = np.zeros((800, 800, 3), np.uint8)

# 画完整椭圆,空心
# cv2.ellipse(img, (320, 240), (100, 50), 0, 0, 360, [0, 0, 255], 5, 16)
# 画1/4椭圆,空心
# cv2.ellipse(img, (320, 240), (100, 50), 0, 0, 90, [0, 0, 255], 5, 16)
# 顺时针旋转45度,空心
# cv2.ellipse(img, (320, 240), (100, 50), 45, 0, 360, [0, 0, 255], 5, 16)
# 实心椭圆
cv2.ellipse(img, (320, 240), (100, 50), 0, 0, 360, [0, 0, 255], -1, 16)

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

1.5 画多边形

  • 画多边形:cv2.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])

    • img 哪个图像上画多边形
    • pts 多边形的点集,必须是int32位,而且是三维
    • isClosed 形成的多边形是否闭合
    • color 多边形的颜色
    • thickness 多边形轮廓的粗细,线宽无法用负数填充,可以使用cv2.fillPoly( )填充
    • lineType 多边形边界类型
    • shift 坐标缩放比例.
    import cv2
    import numpy as np
    
    # 创建纯黑的背景图用来画图形
    img = np.zeros((800, 800, 3), np.uint8)
    
    # 绘制多边形
    # pts多边形的点集, 必须是int32位
    pts = np.array([(250, 100), (150, 300), (50, 280)], np.int32)
    # 注意pts是3维的. 
    
    # 不闭合多边形
    # cv2.polylines(img, [pts], False, (0, 0, 255), 5)
    # 闭合多边形
    # cv2.polylines(img, [pts], True, (0, 0, 255), 5)
    
    cv2.imshow('draw', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

2 填充多边形

2.1 填充多边形

  • 填充多边形:cv2.fillPoly(img, pts, color[, lineType[, shift[, offset]]])
    • img 在哪个图像上填充
    • pts 多边形的点集,必须是int32位,而且是三维
    • color 填充颜色
    • lineType 边界类型
    • shift 坐标缩放比例.
    • offset 轮廓线上所有点的可选偏移量

填充一个:

import cv2
import numpy as np

# 创建纯黑的背景图用来画图形
img = np.zeros((800, 800, 3), np.uint8)

# 绘制多边形
# pts多边形的点集, 必须是int32位
pts = np.array([(250, 100), (150, 300), (50, 280)], np.int32)
# 注意pts是3维的. 

# 不闭合多边形
# cv2.polylines(img, [pts], False, (0, 0, 255), 5)
# 闭合多边形
cv2.polylines(img, [pts], True, (0, 0, 255), 5)

# 填充多边形
cv2.fillPoly(img, [pts], (0, 0, 255))

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

填充多个:

import cv2
import numpy as np

img = np.zeros((800, 800, 3), np.uint8)
area1 = np.array([[100,100],[150,100],[200,300],[50,300]])
area2 = np.array([[500,100],[700,100],[700,300],[500,300]])

cv2.fillPoly(img, [area1, area2], (255, 255, 255))

cv2.imshow('draw', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

2.2 填充凸多边形

填充凸多边形:

  • cv2.fillConvexPloy(img, points, color[, lineType[, shift]])
    • img 输入图像
    • points 凸多边形的点集,二维
    • color 填充颜色
    • lineType 边界类型
    • shift 坐标缩放比例.
import cv2
import numpy as np

img = np.zeros((800, 800, 3), np.uint8)
points = np.array([[400,100], [50,600], [200,600]])

cv2.fillConvexPoly(img, points, (255, 255, 255))

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

附OpenCV目录:OpenCV总目录学习笔记

智科专业小白,写博文不容易,如果喜欢的话可以点个赞哦!请添加图片描述

猜你喜欢

转载自blog.csdn.net/weixin_56197703/article/details/123907442