假设我有以下图片,其中有一个带有白色标签的文件夹图片。 我想要的是检测文件夹的端点坐标和它上面的白纸(两个矩形)。 使用坐标,我想知道文件夹上纸张的确切位置。
GIVEN: 内部白纸矩形总是具有固定的大小,所以我们可以在某处使用这些知识吗?
我是opencv的新手,并试图找到一些关于我应该如何解决这个问题的指导?
问题陈述:我们不能依赖基于颜色的解决方案,因为这只是一个例子,文件夹和矩形纸的颜色都可以改变。 可能还有其他嘈杂的纸张,但有一件事是,整个文件夹和大矩形纸在任何给定时间总是最大的两个矩形。
我尝试过opencv canny进行边缘检测,看起来就像这张图片。
现在如何找到外部矩形和内部矩形的坐标。
答案 0 :(得分:1)
对于此图片,有三种域颜色:(1) the background-yellow (2) the folder-blue (3) the paper-white
。使用颜色信息可能有所帮助,我在RGB
和HSV
分析它,如下所示:
如您所见(第二行,第三个单元格),如果您首先找到文件夹掩码,则可以在H(HSV)
中轻松分隔区域。
我们可以选择
我的步骤:
(1)使用
在HSV中找到文件夹区域掩码inRange(hsv, (80, 10, 20), (150, 255, 255))
(2)在面具上找到轮廓并按宽度和高度过滤
结果如下:
相关:
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)
答案 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>500
和drawContours()
。
最终输出:
控制台输出提供白皮书的坐标。
控制台输出:
[array([[438, 267],
[199, 256],
[209, 60],
[447, 71]], dtype=int64)]