实现思路:最大外接矩阵边缘检测+旋转+选取ROI区域裁剪

代码:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <math.h>
#include <iostream>using namespace std;
using namespace cv;Mat img1, gray, canny_gray, dest;
double threshold_value = 180.0;void RotateImg(void);
void GetTargetImg(Mat img);int main(int argc, char * argv[])
{img1 = imread("../img/11.png");imshow("原始图像", img1);RotateImg();         //旋转图片GetTargetImg(img1);  //裁剪图片if (waitKey() == 27)return 0;
}void RotateImg(void)
{Mat canny_output;vector<vector<Point>> contours;vector< Vec4i> hireachy;Mat drawImg = Mat::zeros(img1.size(), CV_8UC3);cvtColor(img1, gray, COLOR_BGR2BGRA);Canny(gray, canny_output, threshold_value, threshold_value * 2, 3, false);imshow("Canny算子图像", canny_output);findContours(canny_output, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));float maxw = 0;float maxh = 0;int angle = 0;for (int t = 0; t < contours.size(); t++){RotatedRect rotate = minAreaRect(contours[t]);angle = abs(rotate.angle);if (angle > 0){maxw = max(maxw, rotate.size.width);maxh = max(maxh, rotate.size.height);}}RNG rng(12345);for (int t = 0; t < contours.size(); t++){RotatedRect rota = minAreaRect(contours[t]);if (maxw == rota.size.width && maxh == rota.size.height){angle = rota.angle;          //找到合适的旋转角度        }}Point2f center(img1.cols / 2, img1.rows / 2);Mat rotaImg = getRotationMatrix2D(center, angle, 1.0);  //找到旋转矩阵warpAffine(img1, dest, rotaImg, img1.size(), INTER_LINEAR);imshow("摆正后的图像", dest);
}void GetTargetImg(Mat img)
{Mat canny_output;vector<vector<Point>> contours;vector< Vec4i> hireachy;Mat drawImg = Mat::zeros(dest.size(), CV_8UC3);Rect box;cvtColor(dest, gray, COLOR_BGR2BGRA);Canny(gray, canny_output, threshold_value, threshold_value * 2, 3, false);Mat drawImage = Mat::zeros(dest.size(), CV_8UC3);findContours(canny_output, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));int maxw = dest.cols*0.5;int maxh = dest.rows*0.5;cout << "maxw: " << maxw << "maxh: " << maxh << endl;RNG rng(12345);int angle = 0;for (int t = 0; t < contours.size(); t++){RotatedRect rota = minAreaRect(contours[t]);float  angle = abs(rota.angle);cout << "angle:" << angle << endl;if (maxw < rota.size.width && maxh < rota.size.height){cout << "最小外包矩形:" << box << endl;           box = rota.boundingRect();            //找到裁剪矩阵             }}if (box.width > 0 && box.height > 0){Mat roiimg = dest(box);imshow("结果图像", roiimg);          //显示裁剪后的图像imwrite("1.1.jpg",roiimg);           //保存图片}
}

原始图片:

摆正后的图片:

最后的处理结果:

OpenCV案例(一):切边相关推荐

  1. opencv案例: 车辆检测

    opencv案例: 车辆检测 说明:这是在哔哩哔哩上看李超老师的视频时,他讲的案例,我是搬运工. 实现功能: 1.识别出图片中的汽车对象 2.对车辆进行统计,并将统计结果展示出来 涉及到的知识点: 图 ...

  2. OpenCV案例(三): 玉米颗粒计数

    本案例主要完成对玉米颗粒数量的计算,由于颗粒存在重叠的现象,因此需要对这种情况进行一定的图像处理,分离出每个颗粒的轮廓. 代码: #include <iostream> #include ...

  3. OpenCv-C++-小案例实战-切边(二)

    接上篇文章- 一般的,一个扫描的文件是不可能完完全全摆正了的.它多多少少会有些倾斜. 现在有如下图片: 它逆时针进行了旋转,那么想要把多余的白边去掉且摆正应该怎么做呢? 步骤如下: 1.边缘检测 2. ...

  4. OpenCV案例(四): 投射矫正

           仿射变换是二维坐标间的线性变换, 故而变换后的图像仍然具有原图的一些性质,包括"平直性"以及"平行性",常用于图像翻转(Flip).旋转(Rota ...

  5. OpenCV案例(二):选取圆对象

    OpenCV提供了一些基本的形态学处理方法与绘图操作,比如膨胀.腐蚀.开闭操作.画圆,画椭圆,画线,画矩形,在图像里插入文字等功能. 代码: #include <iostream> #in ...

  6. OpenCv案例(一):OpenCvSharp识别图像中物体个数

    需求:识别下图中零件的个数,包括其中有粘连部分:同理,可以识别零件以及其他产线样品数量;(如果不知如何使用OpenCvSharp,参考该文章(OpenCvSharp安装)中第一部分内容) 识别图像: ...

  7. OpenCv案例(二):基于OpenCVSharp计算图像中的圆的周长和面积

    需求:求下图中圆形的面积和周长: 原图如下: 处理后图像: 计算结果: 代码如下: public Mat GetObjectByImg(Mat src,out double retArea, out ...

  8. 机器视觉——OpenCV案例分析基础(二)(给图片打马赛克与图像的运算处理)

    给图片打马赛克与图像的运算处理 一.理论分析 二.代码分析 2.1 对图像全局采用马赛克处理 2.2 局部马赛克 2.3 对图片进行运算处理 2.3.1 图像的或运算 2.3.2 图像的与运算 2.3 ...

  9. 【OpenCV案例合集】竟还有如此的神仙代码,爱了爱了......真有趣(附3款源码)

    导语 哈喽,我是木木子~ 在家无聊打发时间的时候,就是刷抖音嘛~我想你们也是哈! 昨天刚刚刷了蛮多模特秀的噶,好东西给大家分享嘛~你问我啥感觉:2个字:好看,三个字:超 好看~哈哈哈 ​ 色彩,是美术 ...

最新文章

  1. 决策树算法详解(2)
  2. umi搭建react+antd项目(六)父子组件通讯
  3. 10个实用Linux运维命令
  4. react学习(44)----只更新它需要更新的部分
  5. STL源码剖析 multiset 和 multimap
  6. 将一个输入流(InputStream)写入到一个文件中
  7. MySQL中char、varchar和text的区别
  8. Linux 命令(35)—— iconv 命令
  9. excel文件修复工具_七款免费的PDF处理工具
  10. mysql数据库的基本使用流程
  11. 使用MySQL Workbench备份和还原数据库
  12. 内网集群 无法通信_IPSEC连接成功,内网之间却无法互相通信。
  13. No installations recognized 以及 nvm use切换node版本无效的解决办法
  14. Python标准库:内置函数complex([real[, imag]])
  15. 安徽大别山农家乐包吃住
  16. 【吐槽大会】互联网大厂秋招版
  17. js判断字符串是不是一个纯数字
  18. centos7.2安装五笔输入法的方法
  19. 右下角图标不见了的解决办法
  20. 利用Web Audio API将振动数据转化为音频数据并播放

热门文章

  1. 将一个十六进制数的字符串参数转换成整数返回
  2. java将当前页面隐藏,java 如何将当前程序隐藏到任务栏(类似windows上的其他程序)...
  3. java成员修饰词 友好的_Java的类成员访问权限修饰词(以及类访问权限)
  4. PHP32向右位移2位是多少,PHP的二进制位移操作
  5. javascript学习之闭包
  6. 大规模文本分类实验-项目日志
  7. history模式 nginx配置_Vue history模式Nginx配置
  8. web python template injection_XCTF Web_python_template_injection
  9. C++ std:: 的坑
  10. 使用阿富汗和巴基斯坦地区的SRTM数据生成山体阴影和彩色地形图