python - 尝试在opencv python中获取轮廓区域时出错

标签 python opencv image-processing

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

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

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不支持我的图像?

另一种方法:

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

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

我的图片:

Hair

我的代码:
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()

最佳答案

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

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,它将变成黑色,变成白色,白色变成黑色,为您提供正确的轮廓。

关于python - 尝试在opencv python中获取轮廓区域时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54406167/

相关文章:

Python 结构将 root 密码作为命令行参数传递不起作用

C++ 修复 OpenCV squares.cpp 示例以合并封闭的正方形

matlab - Matlab 计算机视觉工具箱功能是如何制作/编写的?

Android:快速旋转CameraPreview

python-3.x - 如何使用 python 和 PIL 检测图像的特定边框细节并根据它进行裁剪?

matlab - 如何找到图像中边缘的法线

python - curve_fit函数与原始数据不完美拟合

python - DataFrame.drop 不会删除 Pandas 中的预期行

google-chrome - 具有大量 html 的 Chrome 性能缓慢/糟糕

python - 无法使用 cx_freeze 和 PySide2 进行编译