功能findContours
很难找到你的盒子轮廓,因为期望在二进制图像上运行。来自文档 https://docs.opencv.org/trunk/d4/d73/tutorial_py_contours_begin.html:
为了获得更高的准确性,请使用二值图像。因此,在找到轮廓之前,请应用阈值或精明的边缘检测。
在 OpenCV 中,寻找轮廓就像从黑色背景中寻找白色物体。所以请记住,要找到的对象应该是白色的,背景应该是黑色的。
因此,之后cvtColor
函数应用threshold
确保你有黑色背景。
...
img = cv2.imread('sample.png')
gr = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, bg = cv2.threshold(gr, 127, 255, cv2.THRESH_BINARY_INV)
...
如果您运行findContours
在这个二值图像上你会发现多个盒子
要获得整个文本周围的单个框,您可以搜索iterations
参数超过morphologyEx
创建单个 blob 的函数。
...
kernel = np.ones((3,3))
closing = cv2.morphologyEx(bg, cv2.MORPH_CLOSE, kernel, iterations=5)
...
因此,在创建 blob 之后应用findContours
您已经拥有并使用最小面积矩形 https://docs.opencv.org/master/dd/d49/tutorial_py_contour_features.html找到包含所传递的点集的最小面积的旋转矩形。
...
contours, hierarchy = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(len(contours))
for i in range(len(contours)):
rect = cv2.minAreaRect(contours[i])
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img,[box],0,(127,60,255),2)
cv2.imwrite("output_box.png", img)