【问题标题】:How can i know if a contour is open or closed in opencv?我怎么知道在opencv中轮廓是打开还是关闭?
【发布时间】:2013-02-14 14:52:41
【问题描述】:

我如何知道从“查找轮廓”函数获取的轮廓在 opencv 中是打开还是关闭?

更新

我尝试将 isContourConvex 应用于此图像:https://docs.google.com/file/d/0ByS6Z5WRz-h2RXdzVGtXUTlPSGc/edit?usp=sharing

i 提取面积最大的轮廓 并返回假。 我改变,也许,轮廓提取,扩张?

nomeimg = 'Riscalate2/JPEG/e (5).jpg'

img = cv2.imread(nomeimg)

gray = cv2.imread(nomeimg,0)#convert grayscale adn binarize

element = cv2.getStructuringElement(cv2.MORPH_CROSS,(6,6)) 
graydilate = cv2.erode(gray, element) #imgbnbin

cv2.imshow('image',graydilate)
cv2.waitKey(0)

ret,thresh = cv2.threshold(graydilate,127,255,cv2.THRESH_BINARY_INV)   # binarize

imgbnbin = thresh
cv2.imshow('bn',thresh)
cv2.waitKey()

#element = cv2.getStructuringElement(cv2.MORPH_CROSS,(2,2))
#element = np.ones((11,11),'uint8')


contours, hierarchy = cv2.findContours(imgbnbin, cv2.RETR_TREE ,cv2.CHAIN_APPROX_SIMPLE)
print(len(contours))


# Take only biggest contour basing on area
Areacontours = list()
calcarea = 0.0
unicocnt = 0.0
for i in range (0, len(contours)):
    area = cv2.contourArea(contours[i])
    #print("area")
    #print(area)
    if (area > 90 ):  #con 90 trova i segni e togli puntini
        if (calcarea<area):
            calcarea = area
            unicocnt = contours[i]


convex = cv2.isContourConvex(unicocnt)
print("convex")
print(convex)

【问题讨论】:

  • 我认为 cvcontour 是基于连接的组件,因此它们无法打开。
  • 所以我永远无法知道我的图像中是否有像“O”或“C”这样的圆圈?也许基于别的东西?

标签: python opencv contour


【解决方案1】:

您正在寻找术语 concave(如 C)与 convex(如 O)轮廓。

你猜怎么着,有一种方法可以检查凸性:

cv2.isContourConvex(contour)

【讨论】:

  • 如果轮廓是C的形状,但是加厚的版本怎么办?它不会工作,对吧?还是加厚的 Y?
  • @AbidRahmanK:什么不行?这些都是凹轮廓。对于加厚的字母 O,你会得到 2 个单独的轮廓,都是凸的。
  • 是的,我认为你是对的。我只是在凹凸之间混淆了,对不起.... :)
猜你喜欢
  • 2012-10-11
  • 2015-09-26
  • 2011-07-28
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 2018-10-12
相关资源
最近更新 更多