首页 文章

openCv查找边/轮廓的坐标

提问于
浏览
1

假设我有下面的图像,其中有一个带有白色标签的文件夹图像 . 我想要的是检测文件夹的 endpoints 坐标和它上面的白纸(两个矩形) . 使用坐标,我想知道文件夹上纸张的确切位置 .

GIVEN:内部白纸矩形总是固定大小,所以我们可以在某处使用这些知识吗?

我是opencv的新手,并试图找到一些关于如何解决这个问题的指导?

问题陈述:我们不能依赖基于颜色的解决方案,因为这只是一个例子,文件夹和矩形纸的颜色都可以改变 . 可能还有其他嘈杂的纸张,但有一件事给出,整个文件夹和大矩形纸在任何给定时间总是最大的两个矩形 .

我试过opencv canny进行边缘检测,它看起来像这个图像 .

现在我如何找到外部矩形和内部矩形的坐标 .

Image

3 回答

  • 1

    对于此图像,有三种域颜色: (1) the background-yellow (2) the folder-blue (3) the paper-white . 使用颜色信息可能有帮助,我在 RGBHSV 分析它像这样:

    enter image description here

    如您所见(第二行,第三个单元格),如果您首先找到文件夹掩码,则可以在 H(HSV) 中轻松分隔区域 .

    我们可以选择

    我的步骤:(1)使用inRange(hsv,(80,10,20),(150,255,255))在HSV中找到文件夹区域蒙版(2)在蒙版上找到轮廓并按宽度和高度过滤它们

    结果如下:

    enter image description here


    有关:

    Choosing the correct upper and lower HSV boundaries for color detection withcv::inRange (OpenCV)

    How to define a threshold value to detect only green colour objects in an image :Opencv

  • 0

    您可以选择(自适应阈值)[https://docs.opencv.org/3.4/d7/d4d/tutorial_py_thresholding.html]

    • 获取图像的色调通道 .

    enter image description here

    • 使用特定块大小执行自适应阈值 . 我使用15的大小为图像大小的一半 .

    enter image description here

    这与您期望的颜色不变 . 现在你可以继续提取你需要的东西!

  • 1

    此解决方案有助于识别图像的白皮书区域 . 这是解决方案的完整代码:

    import cv2
    import numpy as np
    image = cv2.imread('stack2.jpg',-1)
    paper = cv2.resize(image,(500,500))
    ret, thresh_gray = cv2.threshold(cv2.cvtColor(paper, cv2.COLOR_BGR2GRAY),
                            200, 255, cv2.THRESH_BINARY)
    image, contours, hier = cv2.findContours(thresh_gray, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
    for c in contours:
        area = cv2.contourArea(c)
        rect = cv2.minAreaRect(c)
        box = cv2.boxPoints(rect)
        # convert all coordinates floating point values to int
        box = np.int0(box)
        # draw a green 'nghien' rectangle
        if area>500:
            cv2.drawContours(paper, [box], 0, (0, 255, 0),1)
            print([box])
    cv2.imshow('paper', paper)
    cv2.imwrite('paper.jpg',paper)
    cv2.waitKey(0)
    

    首先使用手动阈值(200),您可以检测图像中的纸张 .

    ret, thresh_gray = cv2.threshold(cv2.cvtColor(paper, cv2.COLOR_BGR2GRAY), 200, 255, cv2.THRESH_BINARY)
    

    之后你应该找到轮廓并获得 minAreaRect() . 然后你应该获得该矩形(框)的坐标并绘制它 .

    rect = cv2.minAreaRect(c)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    cv2.drawContours(paper, [box], 0, (0, 255, 0),1)
    

    为了避免图像的白色小区域,您可以使用 area = cv2.contourArea(c) 并检查 if area>500drawContours() .

    final output:

    控制台输出提供白皮书的坐标 .

    console output:

    [array([[438, 267],
           [199, 256],
           [209,  60],
           [447,  71]], dtype=int64)]
    

相关问题