python - 如何用opencv填充盒子里面的盒子

标签 python opencv

好的,既然没有人回答,让我试着改变一下我的问题, 如何才能尝试识别这些盒子?

我要检测的图片

得到这个:

我想得到的图片

我遇到了麻烦,因为盒子里有白色字母。(我想) 谁能提供解决方案?

我从 CV 开始,做一个简单的项目来学习。 我正在尝试将盒子放在盒子里并计算它们。 我正在检测边缘并进行 Thresh 二进制 inv。 我明白了,我认为它非常好,我应该可以使用它,

处理后的图片

在我继续检测形状后,我只找到一个盒子,一个大盒子。

我的想法是: A)问题是里面的盒子没有“完成” B) 线条不是一段

但是对于我读到的内容,如果它检测到边缘,它应该看到它有 4 个,并且被检测为一个矩形。

代码如下

thresh = cv2.threshold(edges, 177, 255, cv2.THRESH_BINARY_INV)[1]

cv2.imshow("Image", thresh)
cv2.waitKey(0)

cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
    cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]
sd = ShapeDetector()

在我遍历边缘并尝试用绿色绘制它们之后

还有我的形状检测器

class ShapeDetector:
def __init__(self):
    pass

def detect(self, c):
    print("ola")
    # initialize the shape name and approximate the contour
    shape = "unidentified"
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.04 * peri, True)

    if len(approx) == 4:
        # compute the bounding box of the contour and use the
        # bounding box to compute the aspect ratio
        (x, y, w, h) = cv2.boundingRect(approx)
        ar = w / float(h)
        print( "Found one!")
        shape = "rectangulo"

    return shape

提前致谢

最佳答案

而不是 cv2.RETR_EXTERNAL(仅检索外部轮廓),您应该使用其他东西,例如 cv2.RETR_LIST(包含所有轮廓的简单列表)或 cv2.RETR_TREE(层次结构中的所有轮廓)。

参见 https://docs.opencv.org/3.1.0/d9/d8b/tutorial_py_contours_hierarchy.html

编辑: RETR_TREE 更复杂,但会为您提供其他轮廓内有哪些轮廓的信息,因此您可以忽略其中一些。

如果你想要完美的矩形,你应该绘制 boundingRect() 的结果而不是原始轮廓。

如果您发现重叠的矩形,您还可以添加更多条件来消除它们(例如,w 和 h 应该在最小值和最大值之间)。

关于python - 如何用opencv填充盒子里面的盒子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48853997/

相关文章:

python - 如何使用平滑技术消除姿势估计中的抖动?

python - 为什么 ConfigParser items() 给出原始字符串,而 get() 返回 bool/float/等?

opencv - 保存提取的特征opencv

c++ - 如何在函数内部访问 Mat 类型参数的变量名

android - opencv4android 做对象跟踪

c++ OpenCV将垫子变成一维数组

python 和 pygame 图像移动

python - 计算生成器/迭代器中项目数的最短方法是什么?

Python 和 MySQL 连接器 : AttributeError: 'CMySQLCursor' object has no attribute 'next'

opencv - 如何将 Kinect 的深度数据映射到它的 RGB 颜色?