一、程序实现探索
基于前面算法可以很好的处理人民币和发票两种情况的倾斜矫正,那文本矫正可以吗?我赶紧试了一下,结果是失败的。
认真分析一下,还是很容易看出文本矫正失败的原因的。
原因就在于,人民币图像和发票图像他们有明显的的边界轮廓,而文本图像没有。文本图像的背景是白色的,所以我们没有办法像人民币发票那类有明显边界的矩形物体那样,提取出轮廓并旋转矫正。
经过深入分析可以看出,虽然文本类图像没有明显的边缘轮廓,但是他们有一个很重要的特征,那就是每一行文字都是呈现一条直线形状,而且这些直线都是平行的!
对于这种情况,我想到了另一种方法:基于直线探测的矫正算法。
首先介绍一下我的算法思路:
1.用霍夫线变换探测出图像中的所有直线
2.计算出每条直线的倾斜角,求他们的平均值
3.根据倾斜角旋转矫正
4.最后根据文本尺寸裁剪图片
然后给出OpenCV的实现算法:
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
#define ERROR 1234
//度数转换
double DegreeTrans(double theta)
{
double res = theta / CV