首页 > 解决方案 > 如何从任何角度检测字母“H”

问题描述

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

我考虑了多种方法来做到这一点。模板匹配和 OCR 在任何角度都不起作用,所以我正在考虑使用精明的边缘检测。你们中的任何人都可以提供一些关于如何从这里继续前进的指导。应用 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()

标签: pythonopencvdetectioncontour

解决方案


使用 Canny Edge 后,您可以使用 Hough 变换。您将始终获得两条平行线和一条垂直于两条直线的直线,而无需寻找角度。这已经在 OpenCV(概率线变换)中实现。之后,您需要检查输出线的平行度,最后是垂直线,所有线都应在此处连接。 关联

// 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

推荐阅读