OpenCV4入门教程050:旋转文本图像矫正

索引地址:系列索引

OpenCV4入门教程038:简单文字切割中介绍过文字切割。在Word中,部分文字会设置为斜体,以表达特别效果。如果是进行深度学习或者神经网络训练的话,需要提供训练数据,如果直接对斜体进行分类,那么就需要大量的斜体数据。如果我们把斜体扭正,这样我们就只需要提供正常的字体数据,就可以了。

本文将实现斜体文字矫正,处理流程为:

  • 膨胀,将空隙连接起来
  • 框出轮廓
  • 旋转每个轮廓

首先先准备斜体文字

src

完整测试代码为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include"opencv2/opencv.hpp"
using namespace std;
using namespace cv;


int main(){
//获取原始数据
Mat img = imread("text.png");
imshow("src",img);

Mat elements = getStructuringElement(MORPH_RECT,Size(10,10));
Mat dstImg;
erode(img,dstImg,elements);
imshow("erode",dstImg);

//将其转换为黑底白字
Mat imgGray,imgBin;
cvtColor(dstImg,imgGray,COLOR_BGR2GRAY);
imshow("gray",imgGray);
threshold(imgGray,imgBin,100,255,THRESH_BINARY_INV);
imshow("bin",imgBin);

//获取每个字符
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(imgBin,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());

for(size_t i=0;i<contours.size();i++){
RotatedRect RRect = minAreaRect(contours[i]);
if(RRect.size.area() < 100){
continue;
}
Point2f vertex[4];
RRect.points(vertex);
for(int j=0;j<4;j++){
line(img,Point(vertex[j]),Point(vertex[(j+1)%4]),Scalar(0,255,0),2,LINE_8);
}
double angle = RRect.angle;
if(angle < - 45) angle+=90;
//print("%f",angle);
//旋转文字
Mat rot_mat = getRotationMatrix2D(RRect.center,angle,1);
Mat rotated;
warpAffine(img,rotated,rot_mat,img.size(),INTER_CUBIC);
imshow("res",rotated);
}
printf("%d",contours.size());
imshow("src2",img);


waitKey(0);
}

效果为:

rotate

文字矫正原本是用在之前的OCR中的,后来OpenCV的处理比不上神经网络就只是演示之用。


OpenCV4入门教程050:旋转文本图像矫正
https://feater.top/opencv/rotate-and-rectify-text/
作者
JackeyLea
发布于
2020年11月10日
许可协议