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

#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实践::切边的更多相关文章
- SVM:从理论到OpenCV实践
(转载请注明出处:http://blog.csdn.net/zhazhiqiang/ 未经允许请勿用于商业用途) 一.理论 参考网友的博客: (1)[理论]支持向量机1: Maximum Marg ...
- HOG:从理论到OpenCV实践
(转载请注明出处:http://blog.csdn.net/zhazhiqiang/ 未经允许请勿用于商业用途) 一.理论 1.HOG特征描述子的定义: locally normalised ...
- 【opencv实践】边缘检测
边缘检测: 一.canny算子 Canny边缘检测根据对信噪比与定位乘积进行测度,得到最优化逼近算子,也就是Canny算子.类似与 LoG 边缘检测方法,也属于先平滑后求导数的方法. 二.canny算 ...
- OpenCV实践之路——人脸检测(C++/Python) 【转】
转自:http://blog.csdn.net/xingchenbingbuyu/article/details/51105159 版权声明:本文为博主原创文章,转载请联系作者取得授权. 本文由@星沉 ...
- OpenCV实践之路——Python的安装和使用
本文由@星沉阁冰不语出品,转载请注明作者和出处. 文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/50936076 微博:http ...
- opencv实践::对象提取与测量
问题描述 照片是来自太空望远镜的星云图像,科学家想知道它的面 积与周长. 解决思路 方法一: 通过二值分割+图像形态学+轮廓提取 #include <opencv2/opencv.hpp> ...
- opencv实践::透视变换
问题描述 拍摄或者扫描图像不是规则的矩形,会对后期处理产生不 好影响,需要通过透视变换校正得到正确形状. 解决思路 通过二值分割 + 形态学方法 + Hough直线 +透视变换 #include &l ...
- opencv实践::对象计数
问题描述 真实案例,农业领域经常需要计算对象个数 或者在其它领域拍照自动计数,可以提供效率,减低成本 解决思路 通过二值分割+形态学处理+距离变换+连通区域计算 #include <opencv ...
- opencv实践::对象的提取
问题描述 真实案例,对图像中对象进行提取,获取这样对象,去掉其它干扰和非目标对象. 解决思路 二值分割 + 形态学处理 +横纵比计算 #include <opencv2/opencv.hpp&g ...
随机推荐
- IO流的工具类
1.需要先导入jar包: FilenameUtils import org.apache.commons.io.FilenameUtils; public class FilenameUtilesDe ...
- PacMan 01——玩家移动
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- wait()与notify()
一,前言 简单画了一下线程的流程图,只是一个大概.如图所示,线程有多种状态,那么不同状态之间是如何切换的,下面主要总结关于wait()和notify()的使用. 二,wait() wait ...
- UploadFile
import org.apache.hadoop.conf.*; import org.apache.hadoop.fs.*; import java.io.IOException; import j ...
- asp.netcore 3.0 Docker Nginx(震惊,原来docker是这样的!)
引言 Docker发布于2013年,Docker是dotCloud公司创始人在法国期间发起的一个公司内部项目,他是dotCloud多年云技术的一个革新.Docker在容器基础上进行了一步的封装,从网络 ...
- let与var的区别
1.let作用域局限于当前代码块 文章中//后面的均为打印结果 代码1: { var str1 = "小花"; let str2 = "小明"; console ...
- Linux 删除命令rm
Linux rm命令用于删除一个文件或者目录. 语法:rm [options] name... 参数: 1.-i 删除前逐一询问确认. 2.-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认. 3 ...
- yii2 验证规则使用方法
required : 必须值验证属性 [['字段名'],required,'requiredValue'=>'必填值','message'=>'提示信息']; #说明:CRequiredV ...
- 正则表达式在Java中使用
正则表达式 定义 用一组特殊的字符来描述一组字符串的格式 用于验证字符串是否满足格式 不关心字符串的内容是否有效 1. 基本正则表达式所谓正则表达式就是使用一系列预定义的特殊字符来描述一个字符串的格式 ...
- LeetCode正则表达式匹配
题目描述 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 ...