openCv查找边/轮廓的坐标

时间:2018-06-12 23:49:35

标签: opencv opencv-contour

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

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

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

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

我尝试过opencv canny进行边缘检测,看起来就像这张图片。

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

Image

3 个答案:

答案 0 :(得分: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 with`cv::inRange` (OpenCV)

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

答案 1 :(得分:1)

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

  1. 获取图像的色调通道。
  2. enter image description here

    1. 使用特定块大小执行自适应阈值。我使用15的大小为图像大小的一半。
    2. enter image description here

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

答案 2 :(得分:0)

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

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()

最终输出:

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

控制台输出:

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