【问题标题】:rectangle, Contour detection with python3, opencv3矩形,使用 python3 进行轮廓检测,opencv3
【发布时间】:2018-07-01 18:02:36
【问题描述】:

我想从图像中检测纸张。我应用了 medianBlur、Canny、扩张、阈值等算法来查找。我能够找到工作表,但不知道如何裁剪矩形并应用变换

答题卡

这是我的代码

import numpy as np
import cv2

image = cv2.imread('im_1.jpg')
image = cv2.resize(image, (800, 600))
draw = np.zeros_like(image)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
thresh = cv2.erode(thresh, kernel, iterations=4)
thresh = cv2.dilate(thresh, kernel, iterations=4)
im, cnts, hier = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

max_area = -1
max_c = 0
for i in range(len(cnts)):
    contour = cnts[i]
    area = cv2.contourArea(contour)
    if (area > max_area):
        max_area = area
        max_c = i

contour = cnts[max_c]


rect = cv2.minAreaRect(contour)
box = cv2.boxPoints(rect)
box = np.int0(box)



cv2.drawContours(image, [box],-1, (0, 255, 0), 2)

cv2.imshow('Sheet', image)

cv2.waitKey(0)
cv2.destroyAllWindows()

代码结果: 结果

【问题讨论】:

  • 很遗憾,图片无法直接看到
  • 与传统系统相比,这样做会更加困难且容易出错。

标签: python-3.x image opencv image-processing rectangles


【解决方案1】:

您的方法存在一些小缺陷。以下代码将有所帮助。我也提到了所做的更改。

代码:

import numpy as np
import cv2

image = cv2.imread('C:/Users/Jackson/Desktop/score.jpg')

#--- Resized the image to half its dimension maintaining the aspect ratio ---
image = cv2.resize(image, (0, 0), fx = 0.5, fy = 0.5)
draw = np.zeros_like(image)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

#--- I found the inverse binary image, because contours are found for objects in white. Since the border of the page is in black you have to invert the binary image. This is where it went wrong.
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)

#--- I did not perform any morphological operation ---    
im, cnts, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

max_area = -1
max_c = 0
for i in range(len(cnts)):
    contour = cnts[i]
    area = cv2.contourArea(contour)
    if (area > max_area):
        max_area = area
        max_c = i

contour = cnts[max_c]


rect = cv2.minAreaRect(contour)
box = cv2.boxPoints(rect)
box = np.int0(box)

cv2.drawContours(image, [box],-1, (0, 255, 0), 2)

cv2.imshow('Sheet', image) 
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

【讨论】:

  • 谢谢兄弟的帮助
猜你喜欢
  • 2019-11-29
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
相关资源
最近更新 更多