0

有没有办法根据盒子周围的 4 个小方块来获取盒子内的内容(我已经注意到红色虚线矩形)?

宣布

我的代码:

# Read and resize image
img_input = cv2.imread(args.pop('image'), )
img_input_height, img_input_width, _ = img_input.shape
img_input_ap = img_input_width / img_input_height
img_input_width = int(const_image_max_height * img_input_ap)
img_input = cv2.resize(img_input, (img_input_width, img_input_height,), )

# Process image color
img_final = img_input.copy()
img_gray = cv2.cvtColor(img_input, cv2.COLOR_BGR2GRAY, )
img_blur = cv2.GaussianBlur(img_gray, (5, 5,), 5)
img_canny = cv2.Canny(img_blur, 10, 70, )

# Find around contours
img_canny_contours, _ = cv2.findContours(
   img_canny,
   cv2.RETR_EXTERNAL,
   cv2.CHAIN_APPROX_NONE, 
)

# Find square contours
img_preview = img_final.copy()
for contour in img_canny_contours:
    rect = cv2.boundingRect(contour)
    rect_width = rect[2]
    rect_height = rect[3]
    if 0.8 <= (rect_width / rect_height) <= 1.2:
        # Now I founded the squares...

# Now I need to find the rectangle between 4 squares founded here...

cv2.imshow('img_preview', img_preview)
cv2.waitKey()
cv2.destroyAllWindows()

当前结果:在此处输入图像描述

4

1 回答 1

0

一种方法,考虑到OpenCV 绘图函数不支持虚线。

首先读取灰度、模糊和阈值的图像:

blurred = cv2.GaussianBlur(im, (5, 5), 0)
threshold = 200
apply_val = 255
ret, th = cv2.threshold(blurred, threshold, apply_val, cv2.THRESH_BINARY)

findContorus 函数cv2.RETR_CCOMPas 检索模式一起使用:

contours, hierarchy = cv2.findContours(th, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)

将顶点恢复为轮廓的中心,跳过第一个是图像边界的顶点:

vertex = []
for c in contours[1:]:
    moment = cv2.moments(c)
    cx = int(moment["m10"] / moment["m00"])
    cy = int(moment["m01"] / moment["m00"])
    vertex.append((cx, cy))

现在您需要对顶点进行排序,您可以定义一个方法,这是手动的:

sorted_vertex = [vertex[1], vertex[0], vertex[2], vertex[3]]
vertex_rotated = sorted_vertex[1:] + sorted_vertex[:1]
vertex_pairs = list(zip(sorted_vertex, vertex_rotated))

您可以使用 绘制多边形sorted_vertex或使用 绘制一系列线vertex_pairs

res = np.ones_like(im) * 255
res = cv2.cvtColor(res2, cv2.COLOR_GRAY2BGR)

for a, b in vertex_pairs:
    cv2.line(res2, a, b, (0, 0, 255), 5)

得到这个结果(在 SO 上寻找一种绘制虚线的方法):

在此处输入图像描述

于 2020-06-27T06:52:21.407 回答