【opencv】示例-text_skewness_correction.cpp 校正文本图像的倾斜度

c4e315f2ec9b154f0b0ba35d7b8cf45f.png

22d35fc7320685751ca74d3fbcca9c42.png

// 此教程展示了如何矫正文本的偏斜。
// 程序接受一个偏斜的源图像作为输入,并显示非偏斜的文本。


#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);

4f290175274de77ef0b0cca572c3b790.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值