OpenCV第3课 图像的绘制以及基本操作(补)

0.前言

关于多边形绘制函数cv2.polylines,它的第二个参数pts,用以表征所画多边形的顶点坐标,其数据类型可以是数组,也可以是列表。在网上看到有两种写法,如下:

写法一:

pts = np.array([[10,10],[100,10],[100,100],[10,100]],np.int32) 
pts=pts.reshape((-1,1,2))
cv2.polylines(image,[pts],True,(255,0,0),5)

写法二:

pts = np.array([[10,10],[100,10],[100,100],[10,100]],np.int32)	 
pts=pts.reshape((1,-1,2))
cv2.polylines(image, pts,True,(255,0,0),5)

这两种写法都能绘出多边形,哪种更合理呢,那就要从pts为啥要用三维数组讲起了。

1. 三维数组的维度含义

在OpenCV中使用三维数组绘制多边形是为了支持多轮廓、多线段的灵活绘制需求。

三维数组的结构通常为 (num_contours, num_points_per_contour, 2),具体含义如下:

  • 第一维 (num_contours):表示要绘制的轮廓(多边形/线段)的数量。
    例如:绘制3个独立的轮廓(如3个矩形或3条线段)。
  • 第二维 (num_points_per_contour):表示单个轮廓中的点的数量。
    例如:一个矩形需要4个顶点,一条线段需要2个端点。
  • 第三维 (2):表示每个点的二维坐标 (x, y)。

        因此,即使只绘制一个多边形,也需要将其包裹成三维数组。例如:

pts = np.array([[10,10],[100,10],[100,100],[10,100]],np.int32)
pts=pts.reshape((1,-1,2))
cv2.polylines(image,pts,True,(255,0,0),5)

      此处通过reshape(1, -1, 2),将原始二维数组转换为 (1,4,2),表示:

  • 1个轮廓(多边形)
  • 4个顶点
  • 每个顶点是二维坐标。

如果需要绘制多个多边形,三维数组能直接支持批量操作:

pts = np.array([[10,10],[100,10],[100,100],[10,100],[30,30],[200,30],[200,200],[30,200]],np.int32)
pts=pts.reshape((2,-1,2))
cv2.polylines(image,pts,True,(255,0,0),5)

     如上,写法二的数组各维度的物理意义是清晰的。

2. 写法一分析

pts = np.array([[10,10],[100,10],[100,100],[10,100]],np.int32)	 
pts=pts.reshape((-1,1,2))
cv2.polylines(image,[pts],True,(255,0,0),5)

   这种写法的pts的维度为(4,1,2),每个点是作为一个独立的轮廓,故需要把[pts]作为参数。

   如要绘制双轮廓,则可:

pts = np.array([[10,10],[100,10],[100,100],[10,100]],np.int32)
pts=pts.reshape((-1,1,2))
pts2 = np.array([[30,30],[200,30],[200,200],[30,200]],np.int32)
pts2=pts2.reshape((-1,1,2))
cv2.polylines(image,[pts,pts2],True,(255,0,0),5)

   如上述,该写法虽然可行,但三维数组的各维度定义不清,不建议使用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式老牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值