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 ...
随机推荐
- java动态代理之CGLIB实现
动态代理(CGlib 与连接池的案例) Cglib代理: 针对类来实现代理,对指定目标 产生一个子类 通过方法拦截技术拦截所有父类方法的调用. 我们要使用cglib代理必须引入 cglib的jar包 ...
- FEDay会后-Serverless与云开发,可能是前端的下一站
进化本身是生物体与环境之间持续不断的信息交换的具体表现. -- 摘自<信息简史> 很荣幸在9月21号成都举办的第五届FEDay上作为讲师为大家分享腾讯云在近两年推出的云开发相关的技术和知识 ...
- Integer对象大小比较问题
一.问题 先来看一看例子 public class IntegerTest { public static void main(String[] args) throws Exception { In ...
- js屏蔽地区
其实不需要后台代码也可以获取地区信息的,就算是后台代码,也得需要引用一些第三方库提供免费的api接口才可以,最后还是反序列化才能得到想要的数据,那干嘛不直接找,提供好json格式的api接口,拿来js ...
- [AWS] 02 - Pipeline on EMR
Data Analysis with EMR. Video demo: Run Spark Application(Scala) on Amazon EMR (Elastic MapReduce) c ...
- [Linux] telnet 具体到某个端口Connection refused
可以参考这个链接:https://q.cnblogs.com/q/106337/
- 线控性能比拼,MKZ与CRV作为自动驾驶开发平台的全面测评
全球自动驾驶创业公司最主流的测试开发用车是林肯MKZ,这是因为其高性能高精度的线控能力表现,易于使用逆向工程实现改装,以及存在成熟的线控改造服务提供商AS和Dataspeed,共同为自动驾驶初创及辅助 ...
- ActiveMQ高级特性
一.常用配置属性 以下配置文件目录均为:${activemq_home}/conf/activemq.xml 1.定期扫描清理 ActiveMQ中有一项功能:Delete Inactive Desti ...
- 判断dom原始是否在可视区域内
isElementInViewport (el, offset = 0) { const box = el.getBoundingClientRect(), top = (box.top >= ...
- 【面试题】Java基础部分面试题
Java基础面试题 Equals与==的区别 使用==比较原生类型如:boolean,,int,char等等, 使用equals()比较对象. 1. ==是判断两个变量或类型是不是指向同一个内存空 ...