// 此教程展示了如何矫正文本的偏斜。
// 程序接受一个偏斜的源图像作为输入,并显示非偏斜的文本。#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; // 使用标准命名空间stdint 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,所有背景像素设置为0Mat 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);