如何检测字母“H”从任何昂

2024-04-18 23:39:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力使用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()

Tags: truelen字母filtercv2framemedian形状
2条回答

在使用Canny边之后,可以使用Hough变换。你总是会得到两条平行线,一条垂直于两条直线,而不必寻找角度。这已经在OpenCV(Probabilistic Line Transformation)中实现了。之后,您需要检查输出线的平行性,最后检查垂直线,所有线都应该连接在一起。 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

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

如果你需要一个快速的解决方案,你可以尝试使用启发式找到旋转第一。例如,可以找到主边方向。对于H,主边方向是H边上垂直条的方向。使用该方向可以更正旋转并使用OCR或模板匹配。这当然不适用于任意模式。你知道吗

相关问题 更多 >