问题描述
  真实案例,扫描仪扫描到的法律文件,需要切边,去掉边 缘空白,这样看上去才真实。

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h> using namespace cv;
using namespace std; #define IMAGE_PATH "D:/case2.png" Mat src, gray_src, tmp_src, dst;
int threshold_value = ;
int max_level = ;
const char* roi_win = "Final Result"; void FindROI(int, void*); void Check_Skew(int, void*); int main(int argc, char** argv) {
src = imread(IMAGE_PATH);
if (src.empty()) {
printf("could not load image...\n");
return -;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src); //纠正图像角度
Check_Skew(, ); //图像切边
FindROI(, ); waitKey();
return ;
} void Check_Skew(int, void*) {
//寻找最大轮廓
Mat canny_output;
cvtColor(src, gray_src, COLOR_BGR2GRAY);
//Canny 算法做边缘检测
Canny(gray_src, canny_output, threshold_value, threshold_value * , , false); //在二值图像中寻找轮廓
vector<vector<Point>> contours;
vector<Vec4i> hireachy;
findContours(canny_output, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(, )); //创建一张黑色的图,每个像素的每个通道都为0,Scalar(0,0,0)
//Mat drawImg = Mat::zeros(src.size(), CV_8UC3); float maxw = ;//矩形宽
float maxh = ;//矩形高
double degree = ;
for (size_t t = ; t < contours.size(); t++) {
RotatedRect minRect = minAreaRect(contours[t]);
//矩形角度绝对值
degree = abs(minRect.angle);
if (degree > ) {
maxw = max(maxw, minRect.size.width);
maxh = max(maxh, minRect.size.height);
}
if (degree > ) {
if (maxw == minRect.size.width && maxh == minRect.size.height) {
degree = minRect.angle;
}
}
}
printf("max contours width : %f\n", maxw);
printf("max contours height : %f\n", maxh);
printf("max contours angle : %f\n\n\n", degree); //寻找几何中心
Point2f center(src.cols / , src.rows / );
//旋转degree角度
Mat rotm = getRotationMatrix2D(center, degree, 1.0);
//对图像做仿射变换
warpAffine(src, tmp_src, rotm, src.size(), INTER_LINEAR, , Scalar(, , ));
imshow("Correct Image", tmp_src);
} void FindROI(int, void*) {
//灰度图
cvtColor(tmp_src, gray_src, COLOR_BGR2GRAY);
Mat canny_output;
//Canny 算法做边缘检测
Canny(gray_src, canny_output, threshold_value, threshold_value * , , false); //在二值图像中寻找轮廓
vector<vector<Point>> contours;
vector<Vec4i> hireachy;
findContours(canny_output, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(, )); //定义最小轮廓
float minw = tmp_src.cols*0.5;
float minh = tmp_src.rows*0.5; float minstW = 0.0;
bool bfirst = true;
RotatedRect minstRect;
Rect bbox;
for (size_t t = ; t < contours.size(); t++) {
RotatedRect minRect = minAreaRect(contours[t]);
if (minRect.size.width > minw && minRect.size.height > minh && minRect.size.width < (src.cols - )) {
{
//找宽度最小的矩形,既是要找的图像。
printf("t = %d, w = %f , h = %f \n",t, minRect.size.width, minRect.size.height);
if (bfirst)
{
minstW = minRect.size.width;
minstRect = minRect;
bfirst = false;
}
else
{
float tmp = min(minstW, minRect.size.width);
if (tmp < minstW)
{
minstW = tmp;
minstRect = minRect;
}
}
}
}
}
bbox = minstRect.boundingRect();
if (bbox.width > && bbox.height > ) {
Mat roiImg = tmp_src(bbox);
imshow(roi_win, roiImg);
}
return;
}

opencv实践::切边的更多相关文章

  1. SVM:从理论到OpenCV实践

    (转载请注明出处:http://blog.csdn.net/zhazhiqiang/ 未经允许请勿用于商业用途)   一.理论 参考网友的博客: (1)[理论]支持向量机1: Maximum Marg ...

  2. HOG:从理论到OpenCV实践

    (转载请注明出处:http://blog.csdn.net/zhazhiqiang/ 未经允许请勿用于商业用途) 一.理论 1.HOG特征描述子的定义:     locally normalised ...

  3. 【opencv实践】边缘检测

    边缘检测: 一.canny算子 Canny边缘检测根据对信噪比与定位乘积进行测度,得到最优化逼近算子,也就是Canny算子.类似与 LoG 边缘检测方法,也属于先平滑后求导数的方法. 二.canny算 ...

  4. OpenCV实践之路——人脸检测(C++/Python) 【转】

    转自:http://blog.csdn.net/xingchenbingbuyu/article/details/51105159 版权声明:本文为博主原创文章,转载请联系作者取得授权. 本文由@星沉 ...

  5. OpenCV实践之路——Python的安装和使用

    本文由@星沉阁冰不语出品,转载请注明作者和出处. 文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/50936076 微博:http ...

  6. opencv实践::对象提取与测量

    问题描述 照片是来自太空望远镜的星云图像,科学家想知道它的面 积与周长. 解决思路 方法一: 通过二值分割+图像形态学+轮廓提取 #include <opencv2/opencv.hpp> ...

  7. opencv实践::透视变换

    问题描述 拍摄或者扫描图像不是规则的矩形,会对后期处理产生不 好影响,需要通过透视变换校正得到正确形状. 解决思路 通过二值分割 + 形态学方法 + Hough直线 +透视变换 #include &l ...

  8. opencv实践::对象计数

    问题描述 真实案例,农业领域经常需要计算对象个数 或者在其它领域拍照自动计数,可以提供效率,减低成本 解决思路 通过二值分割+形态学处理+距离变换+连通区域计算 #include <opencv ...

  9. opencv实践::对象的提取

    问题描述 真实案例,对图像中对象进行提取,获取这样对象,去掉其它干扰和非目标对象. 解决思路 二值分割 + 形态学处理 +横纵比计算 #include <opencv2/opencv.hpp&g ...

随机推荐

  1. Visual Studio Code安装Python环境

    如何在全宇宙最强编辑器安装Python运行环境 (雾 首先安装Python2和Python3,如果只需要用到一个的话,直接安装即可运行,不存在转换问题. 安装Python扩展,直接搜索安装即可. 更改 ...

  2. selenium WebDriver 截取网站的验证码

    在做爬虫项目的时候,有时候会遇到验证码的问题,由于某些网站的验证码是动态生成的,即使是同一个链接,在不同的时间访问可能产生不同的验证码, 一 刚开始的思路就是打开这个验证码的链接,然后通过java代码 ...

  3. 分别设计点类Point和圆类Circle,点类有两个私有数据纵坐标和横坐标;圆类有也两个私有数据圆心和半径,其中圆心是一个点类对象;要求如下所述: (1) 通过构造方法初始化数据成员,数据成员的初始化通过构造方法的参数传递;(2) 分别编写点和圆的输出函数,其中圆的输出包括圆心和半径的输出;点的输出x,y;

    题目相对简单: package naizi; public class Circle { //私有成员及构造方法 private Point center; private int r; Circle ...

  4. HTML连载38-内边距属性、外边距属性

    一.内边距属性 1.定义:边框和内容之间的距离就是内边距 2.分开写 padding-top:数字px: padding-left:数字px: padding-bottom:数字px: padding ...

  5. java8 新特性精心整理

    前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和 JVM 等方面的十多个新特 ...

  6. 构建企业级数据湖?Azure Data Lake Storage Gen2实战体验(中)

    引言 相较传统的重量级OLAP数据仓库,“数据湖”以其数据体量大.综合成本低.支持非结构化数据.查询灵活多变等特点,受到越来越多企业的青睐,逐渐成为了现代数据平台的核心和架构范式. 因此数据湖相关服务 ...

  7. cocos 微信小游戏切后台卡住

    1.cocos 安装目录下搜索以下代码并注掉opts["preserveDrawingBuffer"] = true;”2.CocosCreator\resources\engin ...

  8. XSS攻击-原理学习

    本文优先发布于简书https://www.jianshu.com/p/04e0f8971890 1.百度百科XSS,跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样 ...

  9. Linux 笔记:核心思想、常用命令以及脚本语法

    总结于 <鸟哥的 Linux 私房菜 - 基础学习篇> ,图片也来自于此. 核心思想 目录树结构(directory tree) Linux 系统是基于目录树结构的,这是它的核心思想.目录 ...

  10. [Python]字典的简单用法

    Python中的字典与现实中字典类似,从字典中可以找到“鱼”字:鱼类是体被骨鳞.以鳃呼吸.通过尾部和躯干部的摆动以及鳍的协调作用游泳和凭上下颌摄食的变温水生脊椎动物.类比到Python的字典中,把“鱼 ...