openCV文档图像校正之巧用cvMinAreaRect2()函数

openCV文档图像校正之巧用cvMinAreaRect2()函数

996.icu LICENSE

  • 问题
  • 解决方案
  • 原理探究:什么是cvMinAreaRect2()函数
  • 总结

阅读之前注意:

本文阅读建议用时:45min
本文阅读结构如下表:

项目 下属项目 测试用例数量
问题 0
解决方案 1
原理探究:什么是cvMinAreaRect2()函数 1
总结 0

问题

对于倾斜的文档图像,我们首先需要找出倾斜角,之后旋转校正即可。
比如把下图
原图
校正为下图
这里写图片描述

解决方案

之前我有写过系列文档图像倾斜校正的Matlab程序,思路可以借鉴。但是现在我提出来的解决方法是另外一种思路:当我们把文字经过闭运算、膨胀、腐蚀等处理后得到连成大概像一个矩形的长条。类似下图:
这里写图片描述
那么我们可以找到最长的长条。之后如果我们能够计算出长条的外接矩形的话,外接矩形的倾斜角即是图像的倾斜角!事实上,openCV给我们提供了非常方便的函数来寻找这样的矩形,使用cvMinAreaRect2()函数即可得到这个长条的外接矩形,而外接矩形的倾斜角能够直接查询到。
以下是具体代码(注意看注释):

//主要应用了cvMinAreaRect2()函数 得到线的倾斜角
#include <iostream>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/opencv.hpp>//如果要包含所有库

using namespace cv;

//图片旋转操作 
void imrotate(Mat& src, Mat& dst, double angle)
{
   
   
	cv::Point2f center((float)src.cols / 2, (float)src.rows / 2);
	cv::Mat rot = cv::getRotationMatrix2D(center, angle, 1);
	cv::Rect bbox = cv::RotatedRect(center, src.size(), angle).boundingRect();

	rot.at<double>(0, 2) += bbox.width / 2.0 - center.x;
	rot.at<double>(1, 2) += bbox.height / 2.0 - center.y;
	cv::warpAffine(src, dst, rot, bbox.size());
}

void main()
{
   
   
	int i = 0, j = 0;
	Mat img = imread("26.bmp", 0);//读取图像img。0表示转换为灰度图像读入
	Mat saveImg = imread("26.bmp", 0);
	//imshow("savwImg", saveImg);
	if (img.empty())
	{
   
   
		printf("当前文件目录下没有那张图片\n");
		system("pause"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值