矩形,使用python3,opencv3进行轮廓检测

时间:2018-07-01 18:02:36

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

我想从图像中检测纸张。我使用了meanBlur,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()

代码结果: 结果

1 个答案:

答案 0 :(得分: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()

结果:

enter image description here