如何从任何角度检测字母“ H”

时间:2019-06-05 11:10:05

标签: python opencv detection contour

我正在努力使用python检测openCV中的特定形状。具体形状是字母“ H”。

我考虑过多种方法。模板匹配和OCR不会在任何角度工作,因此我正在考虑使用Canny边缘检测。 能否请您提供一些有关如何从此处前进的指导。应用Canny过滤器后,如何检查字母“ H”是否存在?

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
binary = cv2.erode(gray, None, iterations=2)
median_filter = cv2.medianBlur(binary, 3)
edges = cv2.Canny(median_filter, 120, 180)

bin, contours, _hierarchy = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    cnt_len = cv2.arcLength(cnt, True)
    cnt = cv2.approxPolyDP(cnt, 0.02 * cnt_len, True)

cv2.imshow("crop", binary)
cv2.imshow("Frame", edges)
cv2.imshow("frame", frame)
key = cv2.waitKey(1) & 0xFF

if key == ord("q"):
    break

cv2.destroyAllWindows()

2 个答案:

答案 0 :(得分:0)

最简单(但很慢)的解决方案是在许多旋转版本的图像上运行模板匹配或OCR。 OCR方法通常至少具有较小的旋转公差,因此您可能不需要那么多。如果计算的复杂性不是问题,那么这就是我要做的,因为它非常健壮。

如果需要快速解决方案,则可以尝试使用启发式方法首先找到轮换。例如,您可以找到优势边缘方向。对于H,优势边缘方向将是H侧面的垂直条的方向。使用该方向,您可以校正旋转并使用OCR或模板匹配。当然,这不适用于任意模式。

答案 1 :(得分:0)

您可以在使用Canny Edge之后使用霍夫变换。您将总是得到两条平行线,一条垂直于两条直线,而不必寻找角度。那已经在OpenCV(概率线转换)中实现了。之后,您需要检查输出线的平行性,最后检查垂直线,在垂直线处应连接所有线。 Link

// runs detection
HoughLinesP(image, linesP, rho, (CV_PI / 180)*theta, threshold, minLineLength, maxLineGap); 
    }
//Draw lines
for (int i = 0; i < linesP.size(); i++)
    {
        Vec4i l = linesP[i];
        line(image, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(255, 255, 255), 3, LINE_AA);
    }
//continue here