OpenCV-Python学习(13)—— OpenCV 多边形填充与绘制(cv.fillPoly、cv.polylines)

这篇具有很好参考价值的文章主要介绍了OpenCV-Python学习(13)—— OpenCV 多边形填充与绘制(cv.fillPoly、cv.polylines)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 知识点

  1. 学习 cv.polylines 函数的使用;
  2. 学习 cv.fillPoly 函数的使用。

2. 绘制折线或多边形 cv.polylines 函数说明

2.1 函数使用
cv.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]]) → img
2.2 参数说明
参数 说明
img 表示要在其上绘制矩形的图像的img对象。
pts 表示一个或多个点集。
isClosed 表示标志,决定所绘制的多边形是否闭合。若为 True ,则画若干个闭合多边形;若为 False ,则画一条连接所有点的折线。
color 表示颜色。
thickness 表示线宽,注意:必须大于0
lineType 表示绘制直线的线性,默认为 LINE_8。
shift 表示坐标精确到小数点后第几位。
2.3 lineType 值说明
描述
cv.LINE_4 表示 4 邻接线型。
cv.LINE_8 表示 8 邻接线型。
cv.LINE_AA 表示抗锯齿线型,图像更平滑。

3. 填充颜色 cv.fillPoly 函数说明

3.1 函数使用
cv.fillPoly(img, pts, color[, lineType[, shift[, offset]]]) → img
3.2 参数说明
参数 说明
img 表示要在其上绘制矩形的图像的img对象。
pts 表示一个或多个点集。
color 表示颜色。
lineType 表示绘制直线的线性,默认为 LINE_8。
shift 表示坐标精确到小数点后第几位。
3.3 lineType 值说明
描述
cv.LINE_4 表示 4 邻接线型。
cv.LINE_8 表示 8 邻接线型。
cv.LINE_AA 表示抗锯齿线型,图像更平滑。

4. 注意

  1. thickness 线宽的值必须大于0;
  2. isClosed 闭合标志为 True 时绘制若干个闭合多边形;闭合标志为 False 时绘制一条连接所有点的折线;
  3. pts 点集表示函数 cv.polylines 与 cv.fillPoly 可以绘制或填充一个或多个多边形;
  4. pts 点集参数必须设置dtype=np.uint8。

5. 实例

5.1 实例代码
import cv2 as cv
import numpy as np

# 以五角星的重心为原点,计算各点坐标
def get_star_point(r = 100):
  # 计算没一份的度数和内五边形的r
  pi_val = np.pi / 180
  min_r = r * np.sin(18 * pi_val) / np.cos(36 * pi_val)
  # 外五边形的坐标
  a = [0,r]
  b = [r * np.cos(18 * pi_val), r * np.sin(18 * pi_val)]
  c = [r * np.cos(54 * pi_val), - r * np.sin(54 * pi_val)]
  d = [- r * np.cos(54 * pi_val), - r * np.sin(54 * pi_val)]
  e = [- r * np.cos(18 * pi_val), r * np.sin(18 * pi_val)]
  # 内五边形的坐标
  in_a = [min_r * np.cos(54 * pi_val),min_r * np.sin(54 * pi_val)]
  in_b = [min_r * np.cos(18 * pi_val),- min_r * np.sin(18 * pi_val)]
  in_c = [0, - min_r]
  in_d = [- min_r * np.cos(18 * pi_val),- min_r * np.sin(18 * pi_val)]
  in_e = [- min_r * np.cos(54 * pi_val),min_r * np.sin(54 * pi_val)]
  return {
    "out": [a, b, c, d, e],
    "in": [in_a, in_b, in_c, in_d, in_e]
  }

# 绘制五边形
def create_pentagon(a,b,c,d,e,isClosed=True,color=(0,0,255),fill=False,fillColor=(255,0,0)):
  img = np.ones((200, 200, 3), np.uint8)*255
  pts = np.array([a,b,c,d,e])
  # 向左上角移动100像素原点
  pts[:,:] += 100
  cv.polylines(img, [pts], isClosed, color,1)
  # 判断是否填充多边形
  if fill:
    cv.fillPoly(img,[pts],fillColor)
  return img

def create_five_pointed_star(a,b,c,d,e,
isClosed=True,
color=(0,0,255),
fill=False,
fillColor=(255,0,0)):
  img = np.ones((200, 200, 3), np.uint8)*255
  pts = np.array([a,c,e,b,d])
  # 向左上角移动100像素原点
  pts[:,:] += 100
  cv.polylines(img, [pts], isClosed, color,1)
  # 判断是否填充多边形
  if fill:
    cv.fillPoly(img,[pts],fillColor)
  return img

def create_five_pointed_star_all(
  a,b,c,d,e,
  in_a,in_b,in_c,in_d,in_e,
  isClosed=True,
  color=(0,0,255),
  fill=False,
  fillColor=(255,0,0)):
  img = np.ones((200, 200, 3), np.uint8)*255
  pts = np.array([a,in_a,b,in_b,c,in_c,d,in_d,e,in_e])
  # 向左上角移动100像素原点
  pts[:,:] += 100
  cv.polylines(img, [pts], isClosed, color,1)
  # 判断是否填充多边形
  if fill:
    cv.fillPoly(img,[pts],fillColor)
  return img

def create_demo():
  # 以五角星长轴半径计算各点坐标,注意计算坐标需要倒转
  star_points = get_star_point(60)
  [a,b,c,d,e] = list(map(lambda items: list(map(lambda val: - int(val), items)), star_points.get("out")))
  [in_a, in_b, in_c, in_d, in_e] = list(map(lambda items: list(map(lambda val: - int(val), items)), star_points.get("in")))
  # 
  img = np.ones((600, 600, 3), np.uint8)*255
  # 不闭合折线
  # 五角星【线交叉】
  img[0:200,0:200] = create_five_pointed_star(a,b,c,d,e,isClosed=False)
  # 五边形
  img[200:400,0:200] = create_pentagon(a,b,c,d,e,isClosed=False)
  # 五角星【十点】
  img[400:600,0:200] = create_five_pointed_star_all(a,b,c,d,e,in_a,in_b,in_c,in_d,in_e,isClosed=False)

  # 闭合多边形
  # 五角星【线交叉】
  img[0:200,200:400] = create_five_pointed_star(a,b,c,d,e)
  # 五边形
  img[200:400,200:400] = create_pentagon(a,b,c,d,e)
  # 五角星【十点】
  img[400:600,200:400] = create_five_pointed_star_all(a,b,c,d,e,in_a,in_b,in_c,in_d,in_e)

  # # 闭合填充多边形
  # # 五角星【线交叉】
  img[0:200,400:600] = create_five_pointed_star(a,b,c,d,e,fill=True)
  # 五边形
  img[200:400,400:600] = create_pentagon(a,b,c,d,e,fill=True)
  # 五角星【十点】
  img[400:600,400:600] = create_five_pointed_star_all(a,b,c,d,e,in_a,in_b,in_c,in_d,in_e,fill=True)

  cv.imshow("img", img)
  cv.waitKey(0)
  cv.destroyAllWindows()

if __name__ == "__main__":
  create_demo()
5.2 实例运行结果

cv::fillpoly,OpenCV-Python学习,python,opencv,学习文章来源地址https://www.toymoban.com/news/detail-596603.html

6. 总结

  1. 由于计算五角星各点坐标时,采用的时数学的四象限坐标,以重心为原点,创建坐标;
  2. opencv 绘制图形时,x轴和数学坐标轴一样,但是y是以向下为正轴,同时坐标原点在图像的左上角[0,0]位置;
  3. 通过以上两点,可以知道第一:需要将计算的y轴坐标取反;第二:需要将计算点的原点进行位移计算。

到了这里,关于OpenCV-Python学习(13)—— OpenCV 多边形填充与绘制(cv.fillPoly、cv.polylines)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于C++ 的OpenCV绘制多边形,多边形多条边用不用的颜色绘制

    使用基于C++的OpenCV库来绘制多边形,并且为多边形的不同边使用不同的颜色,可以按照以下步骤进行操作: 首先,确保你已经安装了OpenCV库并配置好了你的开发环境。 导入必要的头文件: 创建一个空白的图像,然后绘制多边形,并为每条边选择不同的颜色: 在这个示例中,

    2024年02月13日
    浏览(28)
  • opencv 判断点在多边形内外

            基于Python 和 OpenCV 画出多边形,以及判断某个点是不是在多边形内。         函数定义:cv2.pointPolygonTest(contour, pt, measureDist)         函数功能:找到图像里的点和轮廓之间的最短距离. 它返回的距离当点在轮廓外的时候是负值,当点在轮廓内是正值,如果

    2024年02月12日
    浏览(34)
  • 使用OpenCV的函数polylines()绘制多条相连的线段和多边形;使用函数fillPoly()绘制带填充效果的多边形

    函数polylines()可用来根据点集绘制多条相连的线段,也可用来绘制多边形。 函数polylines()有两种原型,这里只向大家介绍比较常用的那种原型。 函数polylines()的C++原型如下: 函数polylines()的Python原型如下: 函数polylines()的参数意义如下: img—绘制的多条相连线段或多边形所在

    2024年02月04日
    浏览(41)
  • Android OpenCV(三十七):轮廓外接多边形

    参数四:closed,逼近曲线是否闭合的标志,true表示封闭,false,表示不封闭。 该方法使用的是 Douglas-Peucker algorithm(道格拉斯-普克算法) 。 Douglas-Peukcer算法 由D.Douglas和T.Peueker于1973年提出,也称为 拉默-道格拉斯-普克算法 、 迭代适应点算法 、 分裂与合并算法 、 D-P算法

    2024年04月13日
    浏览(33)
  • OpenCV 对轮廓进行多边形逼近(Polygon Approximation)

    在 OpenCV 中, cv::approxPolyDP 是一个函数,用于对轮廓进行多边形逼近(Polygon Approximation)。它可以将复杂的轮廓逼近为简化的多边形,从而减少轮廓的数据点,使轮廓更加紧凑。 函数原型如下: 参数说明: curve : 输入的轮廓点,可以是一个 std::vectorcv::Point 或 cv::Mat 类型的数

    2024年02月15日
    浏览(26)
  • OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形

    轮廓近似(Contour Approximation)是指对轮廓进行逼近或拟合,得到近似的轮廓。在图像处理中,轮廓表示了图像中物体的边界,因此轮廓近似可以用来描述和识别物体的形状。 多边形拟合(Approximating Polygons)是将轮廓逼近成一个由直线段构成的多边形。常见的有最小包围矩形

    2024年02月10日
    浏览(31)
  • [C++] opencv - approxPolyDP(多边形拟合)函数介绍和使用场景

    OpenCV中的 approxPolyDP() 函数用于对形状进行逼近,以减少多边形的顶点数,可以用于对图像轮廓点进行多边形拟合。 函数原型如下: 其中, curve 是输入的点集,类型为 InputArray, 可以是 Mat 、 vectorPoint 等; approxCurve是输出的点集,类型为 OutputArray, 也是 Mat 类型; epsilon 是精

    2024年03月14日
    浏览(43)
  • [C++] opencv - fillPoly(填充多边形)函数介绍和使用场景

    fillPoly() 函数是OpenCV中用于绘制填充多边形的函数。函数原型如下: fillPoly() 函数适用于需要绘制填充多边形的场景,例如在图像上绘制一个封闭的图形、制作一个简单的遮罩等。   fillPoly() 函数是OpenCV中用于绘制填充多边形的函数。可以用来绘制实心三角形,实心矩形,实

    2024年02月19日
    浏览(32)
  • OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合

    目录 1.轮廓外接最大矩形boundingRect() 2.轮廓外接最小矩形minAreaRect() 3.轮廓外接多边形approxPolyDP() 1.轮廓外接最大矩形boundingRect() Rect cv::boundingRect ( InputArray array ) array:输入的灰度图像或者2D点集,数据类型为vectorPoint或者Mat。 示例代码:  轮廓外接最大矩形的结果: 2.轮廓外接

    2024年02月09日
    浏览(27)
  • OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字

    目录 1.绘制直线line() 2.绘制圆形circle() 3.绘制椭圆形ellipse()  4.绘制矩形rectangle() 5.绘制多边形 fillPoly()  6.绘制文字putText() 7.例子 1.绘制直线line() img:绘制圆形的图像 ptl:直线起始点在图像中的坐标 pt2: 直线终点在图像中的坐标 color:圆形的颜色,用三通道表示 thickness:轮廓的宽

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包