首页 > 解决方案 > 尝试在opencv python中获取轮廓区域时出错

问题描述

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

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

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()

标签: pythonopencvimage-processing

解决方案


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

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 是图像可以具有的最大值,这会将黑色变为白色,将白色变为黑色,从而为您提供正确的轮廓。


推荐阅读