OpenCV案例(一):切边
实现思路:最大外接矩阵边缘检测+旋转+选取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案例(一):切边相关推荐
- opencv案例: 车辆检测
opencv案例: 车辆检测 说明:这是在哔哩哔哩上看李超老师的视频时,他讲的案例,我是搬运工. 实现功能: 1.识别出图片中的汽车对象 2.对车辆进行统计,并将统计结果展示出来 涉及到的知识点: 图 ...
- OpenCV案例(三): 玉米颗粒计数
本案例主要完成对玉米颗粒数量的计算,由于颗粒存在重叠的现象,因此需要对这种情况进行一定的图像处理,分离出每个颗粒的轮廓. 代码: #include <iostream> #include ...
- OpenCv-C++-小案例实战-切边(二)
接上篇文章- 一般的,一个扫描的文件是不可能完完全全摆正了的.它多多少少会有些倾斜. 现在有如下图片: 它逆时针进行了旋转,那么想要把多余的白边去掉且摆正应该怎么做呢? 步骤如下: 1.边缘检测 2. ...
- OpenCV案例(四): 投射矫正
仿射变换是二维坐标间的线性变换, 故而变换后的图像仍然具有原图的一些性质,包括"平直性"以及"平行性",常用于图像翻转(Flip).旋转(Rota ...
- OpenCV案例(二):选取圆对象
OpenCV提供了一些基本的形态学处理方法与绘图操作,比如膨胀.腐蚀.开闭操作.画圆,画椭圆,画线,画矩形,在图像里插入文字等功能. 代码: #include <iostream> #in ...
- OpenCv案例(一):OpenCvSharp识别图像中物体个数
需求:识别下图中零件的个数,包括其中有粘连部分:同理,可以识别零件以及其他产线样品数量;(如果不知如何使用OpenCvSharp,参考该文章(OpenCvSharp安装)中第一部分内容) 识别图像: ...
- OpenCv案例(二):基于OpenCVSharp计算图像中的圆的周长和面积
需求:求下图中圆形的面积和周长: 原图如下: 处理后图像: 计算结果: 代码如下: public Mat GetObjectByImg(Mat src,out double retArea, out ...
- 机器视觉——OpenCV案例分析基础(二)(给图片打马赛克与图像的运算处理)
给图片打马赛克与图像的运算处理 一.理论分析 二.代码分析 2.1 对图像全局采用马赛克处理 2.2 局部马赛克 2.3 对图片进行运算处理 2.3.1 图像的或运算 2.3.2 图像的与运算 2.3 ...
- 【OpenCV案例合集】竟还有如此的神仙代码,爱了爱了......真有趣(附3款源码)
导语 哈喽,我是木木子~ 在家无聊打发时间的时候,就是刷抖音嘛~我想你们也是哈! 昨天刚刚刷了蛮多模特秀的噶,好东西给大家分享嘛~你问我啥感觉:2个字:好看,三个字:超 好看~哈哈哈 色彩,是美术 ...
最新文章
- 决策树算法详解(2)
- umi搭建react+antd项目(六)父子组件通讯
- 10个实用Linux运维命令
- react学习(44)----只更新它需要更新的部分
- STL源码剖析 multiset 和 multimap
- 将一个输入流(InputStream)写入到一个文件中
- MySQL中char、varchar和text的区别
- Linux 命令(35)—— iconv 命令
- excel文件修复工具_七款免费的PDF处理工具
- mysql数据库的基本使用流程
- 使用MySQL Workbench备份和还原数据库
- 内网集群 无法通信_IPSEC连接成功,内网之间却无法互相通信。
- No installations recognized 以及 nvm use切换node版本无效的解决办法
- Python标准库:内置函数complex([real[, imag]])
- 安徽大别山农家乐包吃住
- 【吐槽大会】互联网大厂秋招版
- js判断字符串是不是一个纯数字
- centos7.2安装五笔输入法的方法
- 右下角图标不见了的解决办法
- 利用Web Audio API将振动数据转化为音频数据并播放
热门文章
- 将一个十六进制数的字符串参数转换成整数返回
- java将当前页面隐藏,java 如何将当前程序隐藏到任务栏(类似windows上的其他程序)...
- java成员修饰词 友好的_Java的类成员访问权限修饰词(以及类访问权限)
- PHP32向右位移2位是多少,PHP的二进制位移操作
- javascript学习之闭包
- 大规模文本分类实验-项目日志
- history模式 nginx配置_Vue history模式Nginx配置
- web python template injection_XCTF Web_python_template_injection
- C++ std:: 的坑
- 使用阿富汗和巴基斯坦地区的SRTM数据生成山体阴影和彩色地形图