// 此教程展示了如何矫正文本的偏斜。
// 程序接受一个偏斜的源图像作为输入,并显示非偏斜的文本。
#include <opencv2/core.hpp> // 包含OpenCV核心功能的头文件
#include <opencv2/imgcodecs.hpp> // 包含OpenCV图像编解码功能的头文件
#include <opencv2/highgui.hpp> // 包含OpenCV高层GUI功能的头文件
#include <opencv2/imgproc.hpp> // 包含OpenCV图像处理的头文件
#include <iostream> // 包含标准输入输出流的头文件
#include <iomanip> // 提供参数化流操纵器的头文件
#include <string> // 包含标准字符串库的头文件
using namespace cv; // 使用命名空间cv,避免每次调用OpenCV功能时都要加cv::
using namespace std; // 使用标准命名空间std
int main( int argc, char** argv )
{
// 解析命令行参数
CommandLineParser parser(argc, argv, "{@input | imageTextR.png | input image}");
// 从磁盘加载图像
Mat image = imread( samples::findFile( parser.get<String>("@input") ), IMREAD_COLOR);
// 检查图像是否为空,如果为空则显示错误信息并退出程序
if (image.empty())
{
cout << "Cannot load the image " + parser.get<String>("@input") << endl;
return -1;
}
// 将颜色图像转换为灰度图像
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
// 对灰度图像进行二值化,所有前景像素设置为255,所有背景像素设置为0
Mat thresh;
threshold(gray, thresh, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
// 应用腐蚀过滤器以去除随机噪声
int erosion_size = 1;
Mat element = getStructuringElement( MORPH_RECT, Size(2*erosion_size+1, 2*erosion_size+1), Point(erosion_size, erosion_size) );
erode(thresh, thresh, element);
// 寻找二值化图像中的所有非零像素的坐标
cv::Mat coords;
findNonZero(thresh, coords);
// 计算能包围这些点的最小矩形区域
RotatedRect box = minAreaRect(coords);
// 获取该矩形的旋转角度
float angle = box.angle;
// cv::minAreaRect函数返回的角度范围是[-90, 0),如果角度小于-45度,则需要加上90度
if (angle < -45.0f)
{
angle = (90.0f + angle);
}
// 获取矩形区域中心点用于旋转图像
Point2f center((image.cols) / 2.0f, (image.rows) / 2.0f);
// 获取旋转矩阵
Mat M = getRotationMatrix2D(center, angle, 1.0f);
Mat rotated;
// 根据计算出的角度旋转图像
stringstream angle_to_str;
angle_to_str << fixed << setprecision(2) << angle;
warpAffine(image, rotated, M, image.size(), INTER_CUBIC, BORDER_REPLICATE);
// 将旋转角度信息绘制在图像上
putText(rotated, "Angle " + angle_to_str.str() + " degrees", Point(10, 30), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(0, 0, 255), 2);
// 将旋转角度输出到控制台
cout << "[INFO] angle: " << angle_to_str.str() << endl;
// 显示原图和矫正后的图像
imshow("Input", image);
imshow("Rotated", rotated);
// 等待用户触发事件
waitKey(0);
// 程序正常退出
return 0;
}
这段代码是使用OpenCV库实现的C++程序,功能是自动检测并矫正输入的图像中文本的偏斜。主要步骤包括载入图像、转换为灰度图、二值化、去除噪点、找出最小包围矩形区域确定偏斜角度,接着计算旋转矩阵,根据旋转矩阵旋转原图,最后在旋转后的图像上标出旋转角度并显示原图和矫正后的图像。这对于图像预处理和文本识别应用是非常有用的。
warpAffine(image, rotated, M, image.size(), INTER_CUBIC, BORDER_REPLICATE);