opencv - 如何在低通滤波图像上找到轮廓?
问题描述
我是计算机视觉的新手。所以我不知道以下代码的内部实现,因此我无法调试错误。谁能指出以下代码中的错误?
该代码使用框过滤器和边缘检测核矩阵的组合将停车图像转换为二进制。然后我试图找到轮廓。现在我知道在可以使用 cv2.threshold() 函数导出的二值图像上找到轮廓,从滤波器和内核矩阵获得的图像不也是二值图像吗?
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('parking spot1.jpg',1)
k3 = np.array(([-1,-1,-1],[-1,8,-1],[-1,-1,-1]))
low_filter = cv2.boxFilter(img, -1, (4,4))
output_low = cv2.filter2D(low_filter, -1, k3)
plt.subplot(2, 2, 1)
plt.imshow(img)
plt.title('Original Image')
plt.subplot(2, 2, 2)
plt.imshow(output_low)
plt.title('matrix1')
plt.show()
img, ret, heirarchy = cv2.findContours(output_low, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
你认为我做错了什么?我真的很感激这个问题的解释或方向。
提前非常感谢。
我面临的错误是:
() 中的 Traceback (最近一次调用最后一次) ----> 1 img, ret, heirarchy = cv2.findContours(output_low, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
错误:OpenCV(3.4.3)/io/opencv/modules/imgproc/src/contours.cpp:199:错误:(-210:不支持的格式或格式组合)[开始]FindContours在模式时仅支持CV_8UC1图像!= CV_RETR_FLOODFILL 否则仅在函数 'cvStartFindContours_Impl 中支持 CV_32SC1 图像
解决方案
请正确阅读过滤的文档。明确指出输出与源具有相同的大小和类型。因此,您的 output_low 是三维的,cv2.findContours
不能应用于它。您可以按照您所说的那样采用阈值,也可以简单地将 output_low 转换为灰度,然后找到轮廓。
编辑
我想我的答案在说明通道和图像深度之间的差异时并不清楚。从滤波器和核矩阵得到的图像不一定是一维或灰度的。它与输入矩阵的大小相同,这意味着通道数也相等。因此,如果您的输入图像是灰度的,那么输出将是一维的。
你可以参考这里阅读更多关于channels 和 depth 的区别。
因此,如果您想要灰度的结果,cv2.boxFilter
只需cv2.filter2D
在对其应用过滤之前将原始图像转换为灰度。
img = cv2.imread('opencv1.png', 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
k3 = np.array(([-1,-1,-1],[-1,8,-1],[-1,-1,-1]))
low_filter = cv2.boxFilter(gray, -1, (4,4))
output_low = cv2.filter2D(low_filter, -1, k3)
您的错误清楚地表明FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images
. C1
in和表示通道数只能是一个CV_8UC1
。CV_32SC1
推荐阅读
- javascript - 创建异步函数以稍后在快速路由中调用结果
- python - 获取除标签列表之外的所有标签 BeautifulSoup
- java - 从 Collection 继承的类 Collection 接口
- groovy - 将 key->values 映射转换为 value->keys 的 Groovy 方法
- ibm-cloud - 为什么 Compose for MySQL API 的“download_link”结果设置为“true”而不是 url?
- java - BigDecimal 除法为某些计算返回错误的结果
- swift-package-manager - 如何将 swift 包置于编辑模式?
- python - 在 python 字典中高效加载多个 Keras 模型
- sql - SQL避免子查询上的多部分标识符
- javascript - AWS SDK 等待异步调用完成?