关于cv2. polylines()与cv2. drawContours()的类似点

关于cv2.polylines()与cv2.drawContours()的类似点

前言—opencv学习笔记,自己的总结,方便复习使用,如有误望大佬指正。

在学习到凸包时,由于手上的一本中文opencv官方教程可能是有删减原因,凸包如何画,书上也没讲清楚,于是上网搜了一下,发现有两种画凸包的方式。一种是cv2.polylines(),另一种是cv2.drawContours()。

1.对cv2.polylines()的一系列测试
自己复制粘贴然后去试试

import cv2
import numpy as np
from matplotlib import pyplot as plt
#自建图
img=np.zeros((512,512,3), np.uint8)
pts=np.array([[200,100],[100,160],[150,170],[130,250],[300,100],[250,50]],np.int32)

#以下两大块代码可以分别测试,把其他块注释掉就好
#第一块
pts=pts.reshape((-1,1,2))#第二个参数表示数组调整为一列,第三个参数表示每个元素两个值,-1表示在满足后两参数下,能有多少行就生成多少行
print(pts)#输出后就会发现这是一个有5个坐标排成一列的数组
print("[pts]的数据类型",type([pts]))#pts本是三维numpy数组,加个列表包起来就是列表数据类型了
cv2.polylines(img,pts=[pts],isClosed=True, color=(255, 255, 0), thickness=20)#[pts]是一个列表下的三维数组,其三维部分是5个坐标排成一列的数组
#cv2.polylines(img,pts=pts,isClosed=True, color=(255, 255, 0), thickness=20)#pts是三维数组,所有坐标排一列,但最后画出的结果只是5个大点

# #第二块
# pts=pts.reshape((1,-1,2))#第一个参数表示一行,第二个参数表示自适应,第三个参数表示每个元素2个值
# print(pts)#输出就会发现这是只有一行5个坐标的三维数组
# cv2.polylines(img,pts=[pts],isClosed=True, color=(255, 255, 0), thickness=20)#[pts]是一个列表下的三维数组,其三维部分是5个坐标排成一行的数组
# #cv2.polylines(img,pts=pts,isClosed=True, color=(255, 255, 0), thickness=20)#pts是三维数组,所有坐标排一行,但最后画出的结果与上一行相同,与上一块的第三行也相同

# 总结:
#     1.cv2.polylines()第二参数是三维numpy数组情况下,在数组中同行的点相连,不同行不连,但会画出这个点,所有才有五个大点情况.五个大点可能无法证明同行相连,可以自己pts.reshape(2,3,2)一下,调成一行2个坐标
#     2.cv2.polylines()第二参数是一个列表下的三维数组情况下,会将所有一行或一列的点依次相连,但一个列表下的三维数组情况下的三维数组只能是一行坐标或一列坐标,否则报错,不信自己pts.reshape()一下试试


#上两大测试块的输出部分
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.对cv2.drawContours()的一系列测试

#利用凸点检测,画出凸包
import cv2
import numpy as np
from matplotlib import pyplot as plt
#自建图
img=np.zeros((512,512,3), np.uint8)
pts=np.array([[200,100],[100,160],[150,170],[130,250],[300,100],[250,50]],np.int32)

pts=pts.reshape((-1,1,2))#第二个参数表示数组调整为一列,第三个参数表示每个元素两个值,-1表示在满足后两参数下,能有多少行就生成多少行
print(pts)#输出后就会发现这是一个有5个坐标排成一列的数组
cv2.polylines(img,pts=[pts],isClosed=True, color=(255, 255, 0), thickness=20)#[pts]是在一个列表下的3维数组,其三维部分是5个坐标排成一列的数组
#建立二值图
img2=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转灰
ret,thresh=cv2.threshold(img2,127,255,cv2.THRESH_BINARY)#灰转二值

#找轮廓
image,contours,hierarchy = cv2.findContours(thresh, 3, 2)#返回轮廓点得横纵坐标
print("找到的全部轮廓形成的数组\n",contours)#contours是在一个列表下的三维numpy数组,其中三维数组每行就一个坐标,所以n行一列,放在cv2.polylines()中一样可以用
#根据轮廓找凸点
hull = cv2.convexHull(contours[0],returnPoints=True)
print("凸点坐标形成数组\n",hull)#三维数组每行就一个坐标,所以n行一列
#连凸点
#hull=hull.reshape((1,-1,2))#一行n列,每个元素是两个值
cv2.drawContours(img, hull, -1, (0, 255, 0), 8)#三维数组,同行坐标相连
#cv2.drawContours(img, [hull], -1, (0, 255, 0), 8)#把一行或一列坐标连起来

# 总结:
#     1.cv2.drawContours()第二参数是三维numpy数组情况下,在数组中同行的点相连,不同行不连,但会画出这个点,所有才有五个大点情况.五个大点可能无法证明同行相连,可以自己pts.reshape(2,3,2)一下,调成一行2个坐标
#     2.cv2.drawContours()第二参数是一个列表下的三维数组情况下,会将所有一行或一列的点依次相连,但一个列表下的三维数组情况下的三维数组只能是一行坐标或一列坐标,否则报错,不信

#展示
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

总结:传入的参数,和最终效果几乎一模一样。具体有何不同,还得再查查。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值