#include<opencv2/opencv.hpp>
#include<iostream>
#include<cmath>
using namespace std;
using namespace cv;
const char input[] = "Input image";
const char output[] = "Output image";
void fileCutLine(int, void*);//对图片边缘切取
void rotateImage(int,void*);//对于图片进行旋转矫正
Mat src, dst,rotateSrc;
int main(void) {
src = imread("..\\cutLineTest.jpg");
rotateSrc = imread("..\\rotateTestImage.jpg");
if (src.empty()||rotateSrc.empty()) {
cout << "Loading image failed!" << endl;
return -1;
}
pyrDown(rotateSrc, rotateSrc);
namedWindow(input, WINDOW_AUTOSIZE);
namedWindow(output, WINDOW_AUTOSIZE);
int thresh = 134;
//createTrackbar("Control threshold", output, &thresh, 255, fileCutLine);
//fileCutLine(thresh, 0);
createTrackbar("Rotate fix", output, &thresh, 255, rotateImage);
rotateImage(thresh, 0);
//imshow(input, src);
imshow(input, rotateSrc);
waitKey(0);
return 0;
}
void fileCutLine(int thresh, void*) {
Mat gray;
Mat border;
Mat kernel = Mat(Size(3, 3), CV_8UC1);
cvtColor(src, gray, COLOR_BGR2GRAY);
GaussianBlur(gray, gray, Size(7, 7), 0);
//高斯模糊降噪
Canny(gray, border, thresh, 2 * thresh);
//通过开操作将黑色边缘上的水映文字去掉
morphologyEx(border, border, MORPH_OPEN, kernel);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(border, contours,hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE,Point(0,0));
Rect mask;//最后获得的正确范围的遮罩
//Mat temp = Mat::zeros(src.size(), CV_8UC3);
//临时图像承载,用于观察边框
for (int i = 0; i < contours.size(); i++){
RotatedRect rect = minAreaRect(contours[i]);
Point2f corner[4];
//设置图片尺度条件,进行边缘矩形筛选
if ((rect.size.width > src.cols*0.75) && rect.size.height>src.rows*0.75) {
rect.points(corner);
//cout << "************************" << endl;
line(border, corner[0], corner[1], Scalar(0, 0, 255),2);
line(border, corner[1], corner[2], Scalar(0, 0, 255),2);
line(border, corner[3], corner[2], Scalar(0, 0, 255),2);
line(border, corner[3], corner[0], Scalar(0, 0, 255),2);
mask = rect.boundingRect();//返回包含旋转矩形的矩形
}
}
cout << mask.width << ' ' << mask.height << endl;
cout << src.cols << ' ' << src.rows << endl;
//imshow("temp", temp);
dst = src(mask);//比较好用
imshow(output, border);
if (!dst.empty()) {
imshow("Result", dst);
}
}
//如果图片是倾斜
void rotateImage(int thresh,void*) {
//Mat gray;
Mat border;
Mat kernel = Mat(Size(3, 3), CV_8UC1);
//cvtColor(rotateSrc, gray, COLOR_BGR2GRAY);
Canny(rotateSrc, border, thresh, 2 * thresh);
//通过开操作将黑色边缘上的水映文字去掉
//morphologyEx(border, border, MORPH_OPEN, kernel);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(border, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0));
double angle = 0;//需要记录角度
Point2f center=Point2f(rotateSrc.rows/2,rotateSrc.cols/2);
Size fixSize;
Rect mask;
Mat temp = Mat(rotateSrc.size(),CV_8UC3);
for (int i = 0; i < contours.size(); i++){
RotatedRect rect = minAreaRect(contours[i]);
//center = rect.center;
Point2f corner[4];
rect.points(corner);
for (int j = 0; j < 4; j++) {
line(temp, corner[j], corner[(j + 1) % 4], Scalar(255,255,255), 2);
}
if (rect.angle != 0) {
angle = rect.angle;
cout << "Angle:" << angle << endl;
}
}
Mat martix = getRotationMatrix2D(center, angle, 1);//得到仿射矩阵
warpAffine(rotateSrc, dst, martix, rotateSrc.size());
imshow("result", dst);
imshow(output,border);
}

在调整阈值时加了traceBar,调的时候方便一些。  

结果如下(图是百度上随便找的):

opencv图像倾斜校正和切边的更多相关文章

  1. OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...

  2. 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  3. Opencv 图像叠加 添加水印

    Opencv 图像叠加 添加水印 C++: void Mat::copyTo(OutputArray m) const C++: void Mat::copyTo(OutputArray m, Inp ...

  4. opencv图像读取-imread

    前言 图像的读取和保存一定要注意imread函数的各个参数及其意义,尽量不要使用默认参数,否则就像数据格式出现错误(here)一样,很难查找错误原因的: re: 1.opencv图像的读取与保存; 完

  5. 学习 opencv---(12)OpenCV 图像金字塔:高斯金字塔,拉普拉斯金字塔与图片尺寸缩放

    在这篇文章里,我们一起学习下 图像金字塔 的一些基本概念,如何使用OpenCV函数pyrUp和pyrDown 对图像进行向上和向下采样,以及了解专门用于缩放图像尺寸的resize函数的用法.此博文一共 ...

  6. [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget(第二部分)

    本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...

  7. [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget (第一部分)

    本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...

  8. 关于OpenCV图像操作的默认参数问题

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51559490 在使用OpenCV以及其 ...

  9. OpenCV:OpenCV图像旋转的代码

    OpenCV图像旋转的代码 cv::transpose( bfM, bfM ) 前提:使用两个矩阵Mat型进行下标操作是不行的,耗费的时间太长了.直接使用两个指针对拷贝才是王道.不知道和OpenCV比 ...

随机推荐

  1. Djangoday1 入门及第一个apphelloworld

    1 Django基础指令新建一个django project新建app创建数据库表,更新数据库表或字段使用开发服务器清空数据库创建超级管理员导出数据 导入数据Django 项目环境终端数据库命令行更多 ...

  2. FBV与CBV 及CBV源码分析

    FBV与CBV 及CBV源码分析 FBV(Function Based View) 基于函数的视图 基于函数的视图,我们一直在用没啥好讲的,就是导入模块调用函数执行业务 CBV(Class Based ...

  3. Nginx源码构建

    1.上传或下载nginx软件包,并解压 rz 2.搭建nginx安装环境 yum install gcc-c++ zlib-devel pcre-devel openssl-devel automak ...

  4. io流函数略解(java)[一]

    背景 最近在做安卓的过程中,因为im app经常涉及到读取与写入的io问题,所以总结一下.下文使用的是java语言. 实践 材料: java eclipse 1.File 在操作系统中我们一般能看到的 ...

  5. 区块链学习笔记:D02 区块链的技术发展历史和趋势

    对于区块链的技术发展历史,其实在我的印象中也就对比特币有所了解,也听过什么火币之类的玩意,但是具体是什么.怎么运作的就不清楚了... 这次的内容首先是讲解了区块链的技术演进,一张图一目了然,虽然里面涉 ...

  6. Ubuntu 18.04.3 LTS Virtualbox提示“Kernel driver not installed (rc=-1908)”问题修复一例

    前两天Ubuntu升级了,重启后启动virtualbox保存 从错误报告上反映出来的问题原因是因为某些内核驱动程序没有经过编译,所以Virtualbox无法正常运行.事实上,在Ubuntu上处理这个问 ...

  7. CSS 3D图片翻转 ——3D Flipping Effect

    效果: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  8. vue脚手架安装,新建项目,打包

    1.安装node.js 从node官网下载并安装node,安装步骤很简单,只要一路“next”就可以了. 2.安装cnpm 淘宝镜像 npm install -g cnpm --registry=ht ...

  9. Unity3d 与 Objective-C 数据交互,持续更新中

    Unity 3D是用于3D游戏编程的语言,它是一个用C\C++编写的强大的库.而在游戏中经常要接入用OC编写的SDK,这就涉及到了Unity3d 和 OC之间的数据交互.XCode是完成兼容C语言的. ...

  10. Xcode 10 Error: Multiple commands produce

    目录 Xcode 9.4.1运行react-native 可以,但是在Xcode 10运行报错,报错信息如下: 解决方法 1. 选择 File > Project Settings (或者 Fi ...