【问题标题】:Error while trying to get area of contour in opencv python尝试在opencv python中获取轮廓区域时出错
【发布时间】:2019-01-29 01:49:50
【问题描述】:

我有一个小项目,我需要计算头发部分的面积,并判断哪一个覆盖了两个图像中更大的区域。我有另一个用于毛发提取的代码。然而,它并没有像预期的那样给出结果。您可能已经从下图中猜到了。我稍后会处理它。

我正在尝试从轮廓计算面积,这给了我这样的错误:

OpenCV(3.4.4) C:\projects\opencv-python\opencv\modules\imgproc\src\contours.cpp:195: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function 'cvStartFindContours_Impl'

那么,为什么findContours 不支持我的图片?

另一种方法:

我只需要找到头发部分的区域。所以,我想计算所有白色像素覆盖的区域,然后从整个图像的区域中减去它。在这种情况下,我不知道如何计算所有白色像素覆盖的区域。我是这么想的,因为头发颜色可以变化,但背景总是白色的。

那么,这种技术可行吗?或者请针对上述错误提出一些解决方案?

我的形象:

我的代码:

import cv2
import numpy as np

img = cv2.imread("Hair.jpg")

_, contours, _ = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

c = max(contours, key = cv2.contourArea)

cv2.drawContours(img, [c], -1, (255,255, 255), -1) 

area = cv2.contourArea(c)
print(area)

cv2.imshow("contour", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【问题讨论】:

    标签: python opencv image-processing


    【解决方案1】:

    你的错误已经说明出了什么问题,特别是这部分:

    FindContours supports only CV_8UC1 images when mode
    

    这意味着它必须是灰度图像。你传递了一个加载的图像:

    img = cv2.imread("Hair.jpg")
    

    默认情况下返回CV_8UC3 中的图像,或者简单地说,BGR 颜色空间。即使您的图像只有黑白。解决方案,加载为灰度:

    img = cv2.imread("Hair.jpg", cv2.IMREAD_GRAYSCALE)
    

    另外,我注意到这是一个.jpg 文件,它可能会引入一些您可能不喜欢/不想要的工件。要删除它们,请使用阈值:

    ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
    

    希望对你有帮助,如果没有,请发表评论


    更新:

    findContours 函数以黑色为背景,白色为前景。在你的情况下是相反的。但是有一个简单的方法可以解决这个问题,只需在传递图像时反转图像:

    _, contours, _ = cv2.findContours(255-img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    

    255 是图像可以具有的最大值,这会将黑色变为白色,将白色变为黑色,从而为您提供正确的轮廓。

    【讨论】:

    • 感谢它解决了寻找轮廓问题。但是,轮廓仅在图像的外部正方形边界中绘制,而不是在头发部分中。我什至将代码从 'cv2.drawContours(img, [c], -1, (255,255, 255), -1)' 更改为 'cv2.drawContours(img, [c], 0, (0,255, 0),-1)'。但仍然没有效果。我什至尝试过使用 cv2.drawContours(img, contours, -1, (255,255, 255), -1) 仍然是同样的问题。
    • _, 轮廓, _ = cv2.findContours(255-img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) 给出预期值的错误 3,得到 2,但是,轮廓,_ = cv2.findContours( 255-img,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)工作。感谢您提供有关错误的所有详细信息。这些知识对于我们无法从 opencv 文档中了解的错误处理非常重要。感谢您的帮助。
    • @Gkisi27 取决于您返回不同参数的版本:) 我只是从您的代码示例中复制一个。文档说背景是黑色的,但是是的,有些东西有时很难看到
    猜你喜欢
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    相关资源
    最近更新 更多