我正在研究一个文本识别项目,该项目需要从图像中检测和识别文本。 图片中有两行短文字(320像素* 320像素)。第一行是国家/地区代码的缩写。第二行是拨号代码。整个图像可以任意角度旋转。下面是一些示例。
图片一
图片二
图三
因为文本很短,所以像霍夫变换(检测长行),傅立叶变换和轮廓投影之类的方法效果不佳。我正在使用轮廓检测来检测文本块的角度。但是,如果文本块为三角形,则无法正常工作。此外,如果文本块为矩形,则在倾斜后,文本将变为上下颠倒,左侧颠倒和右侧颠倒。有人可以建议吗?
file = r"/home/hank/Desktop/af_36.jpg"
image = cv2.imread(os.path.normpath(file))
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3, 3), 0)
_, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
dilation = cv2.dilate(thresh, kernel, iterations=1)
contours, hierarchy = cv2.findContours(dilation, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = [contours[i] for i in range(len(contours)) if
not (hierarchy[0][i][3] >= 0 and hierarchy[0][i][2] == -1)]
angles = []
for cnt in contours:
rect = cv2.minAreaRect(cnt)
angles.append(rect[2])
angle = sum(angles)/len(angles)
print(angle)
答案 0 :(得分:0)
如何不检测文本,请尝试检测2个文本(上下)之间的空格。
(1)最简单的方法。
对图像进行阈值处理以找到文本(单词= 1,单词= 0,然后找到阈值框的中心点。中间点x和y应该为空白。
尝试旋转以中点为中心的线(相同长度),宽度jsut很好地触摸顶部和底部文本。具有最大非零像素(意味着线不与文本重叠)的结果为1的结果应该是文本所在的角度。
(2)使用旧的人脸检测路由。 使用类似harr的图案,模板在N旋转角度下匹配。
对于所有x,y和角度的循环
然后逐渐完善。
例如,这是harr功能的angle 0版本。通过模板匹配使它与图像对齐。然后对齐旋转的样式,并在上一个角度模板匹配图像的顶部添加。连接所有模板匹配结果,并运行min-max来找到最高的回报