python - 尝试在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()
解决方案
您的错误已经说明出了什么问题,特别是这部分:
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 是图像可以具有的最大值,这会将黑色变为白色,将白色变为黑色,从而为您提供正确的轮廓。
推荐阅读
- php - 无法获取嵌套 SimpleXMLElement 的属性
- swift - iOS 14 上的旧问题:无法在 UIActivityViewController 呈现的邮件编辑器中设置取消按钮的文本颜色
- cucumber - 他们是一种在 Cucumber Extent Reports 4 中记录自定义语句的方法,而不是使用 scenario.write 方法
- hibernate - Case When Then 从 SQL 到 HQL Hibernate
- ansible - 根据多个条件选择主机执行任务
- java - 如何在java中映射批量请求响应
- python - 有没有办法可以在这个吃豆人游戏中加入一些音乐?
- python-3.x - Python列表理解:分配给多个变量
- javascript - 如何处理变量字符串中的撇号或引号?JavaScript
- reactjs - React context api - 与其他包共享数据