利用单应性矩阵实现文档对齐显示
重磅干货,第一时间送达
本文转载自微信公众号:OpenCV学堂
关注获取更多计算机视觉与深度学习知识
有时候文本图像,需要适当的校正之后才会得到比较好的对齐显示,常用的方法有两个,一个是基于几何变换,另外一个是基于透视变换。常见的处理步骤如下:
文本对象轮廓提取或者手动调整
应用几何变换或者透视变换实现显示对齐
然后再继续其它的后续处理
如果可以得到文档的四个轮廓点就可以进行单应性矩阵计算,然后完成透视变换实现文档对齐显示。首先看一下我的运行效果:
最左侧是输入的图像,中间是轮廓分析之后得到四个顶点,右侧是单应性矩阵变换之后得到输出结果。
代码实现
实现步骤
1.首先对输入图像进行二值变换,然后进行轮廓分析,得到文档轮廓
2.调用approxPolyDP函数进行轮廓逼近,找到四个顶点坐标,这里需要注意一下,使用approxPolyDP函数进行轮廓逼近的时候,最后一个参数是表示轮廓逼近得到轮廓与原来轮廓之后的距离差值,值越小越逼近真实轮廓。我们这里希望得到一个大致近似的矩形即可,所以该值要尽可能的大一点,这个也是使用这个函数的一个编程技巧。
3.得到四个点之后,创建目标点,然后调用findHomography,得到变换矩阵H,基于H完成透视变换得到最终的输出。
第一步的代码实现如下:
Mat src = imread("D:/images/mytest.jpg");
Mat image = src.clone();
Mat gray, binary;
cvtColor(image, gray, COLOR_BGR2GRAY);
threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
// 发现轮廓
vector<vector> contours;
vector hierachy;
findContours(binary, contours, hierachy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
int index = -1;
double max = -1;
double angle = 0;
for (int i = 0; i < contours.size(); i++) {
double area = contourArea(contours[i]);
if (area > max) {
max = area;
index = i;
}
}
drawContours(image, contours, index, Scalar(0, 255, 0), 2, 8);
输出如下:
第二步的代码实现如下:
// 寻找矩形轮廓四个点
Mat approxCurves;
approxPolyDP(contours[index], approxCurves, 100, true);
printf("rows : %d, cols : %d \n", approxCurves.rows, approxCurves.cols);
vector srcPts;
for (int n = 0; n < approxCurves.rows; n++) {
Vec2i pt = approxCurves.at(n, 0);
printf("pt.x= %d, pt.y = %d \n", pt[0], pt[1]);
srcPts.push_back(Point2f(pt[0], pt[1]));
circle(image, Point(pt[0], pt[1]), 12, Scalar(0, 0, 255), 8, 8, 0);
}
imwrite("D:/result.png", image);
输出如下:
第三步,透视变换
Mat h = findHomography(srcPts, dstPts);
warpPerspective(src, dst, h, src.size());
imwrite("D:/correct_document.png", dst);
输出如下:
好消息!
小白学视觉知识星球
开始面向外开放啦👇👇👇
下载1:OpenCV-Contrib扩展模块中文版教程 在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。 下载2:Python视觉实战项目52讲 在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。 下载3:OpenCV实战项目20讲 在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。 交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~