【OpenCV学习笔记】二十七、轮廓特征属性及应用(四)——正外接矩形

标签: OpenCV图像处理
2017-04-01 14:35 945人阅读 评论(2) 收藏 举报
 分类:
OpenCV学习笔记(41) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

轮廓特征属性及应用(四)——正外接矩形

1.轮廓正外接矩形——boundingRect()

2.完成了三个小应用:正外接矩形的查找绘制、分割硬币轮廓、简单车牌字符分割

先上ppt:

代码:

正外接矩形的查找绘制:

[cpp] view plaincopy
  1. ///正外接矩形的查找绘制
  2. #include "opencv2/opencv.hpp"
  3. using namespace cv;
  4. #include <iostream>
  5. using namespace std;
  6. int main()
  7. {
  8. //1.查找轮廓
  9. //1.1查找轮廓前的预处理(灰度图,阈值化)
  10. Mat srcImg = imread("12.jpg",CV_LOAD_IMAGE_COLOR);
  11. imshow("srcImg", srcImg);
  12. Mat copyImg = srcImg.clone();
  13. cvtColor(srcImg,srcImg,CV_BGR2GRAY);
  14. threshold(srcImg,srcImg,100,255,CV_THRESH_BINARY);
  15. imshow("threshold",srcImg);
  16. vector <vector<Point>> contours;
  17. vector<Vec4i> hierarcy;//没用到
  18. //1.2查找轮廓
  19. findContours(srcImg,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);//最外层轮廓
  20. //1.3绘制所有轮廓
  21. drawContours(copyImg,contours,-1,Scalar(0,255,0),1,8);
  22. //2.由轮廓确定正外接矩形
  23. int width = 0;
  24. int height = 0;
  25. int x = 0;
  26. int y = 0;
  27. //2.1 定义Rect类型的vector容器boundRect存放正外接矩形,初始化大小为contours.size()即轮廓个数
  28. vector<Rect> boundRect(contours.size());
  29. //2.2 遍历每个轮廓
  30. for (int i = 0; i < contours.size(); i++)
  31. {
  32. //2.3由轮廓(点集)确定出正外接矩形
  33. boundRect[i] = boundingRect(Mat(contours[i]));
  34. //2.4获得正外接矩形的左上角坐标及宽高
  35. width = boundRect[i].width;
  36. height = boundRect[i].height;
  37. x = boundRect[i].x;
  38. y = boundRect[i].y;
  39. //2.5用画矩形方法绘制正外接矩形
  40. rectangle(copyImg,Rect(x,y,width,height),Scalar(0,0,255),1,8);
  41. }
  42. imshow("轮廓和正外接矩形", copyImg);
  43. waitKey(0);
  44. return 0;
  45. }

运行结果:

分割硬币轮廓:

[cpp] view plaincopy
  1. ///分割硬币轮廓
  2. #include "opencv2/opencv.hpp"
  3. using namespace cv;
  4. #include <iostream>
  5. using namespace std;
  6. int main()
  7. {
  8. //1.查找轮廓
  9. //1.1查找轮廓前的预处理(灰度图,阈值化)
  10. Mat srcImg = imread("33.png",CV_LOAD_IMAGE_COLOR);
  11. imshow("srcImg", srcImg);
  12. Mat copyImg = srcImg.clone();
  13. cvtColor(srcImg,srcImg,CV_BGR2GRAY);
  14. threshold(srcImg,srcImg,100,255,CV_THRESH_BINARY);
  15. imshow("threshold",srcImg);
  16. //*1.2增加了膨胀和腐蚀
  17. //因为有一个轮廓有断点,导致外接矩形是两个小的而不是一个整的,故要膨胀,将断点连起来
  18. //1.2.1定义kernel
  19. Mat kernel = getStructuringElement(MORPH_RECT,Size(5,5),Point(-1,-1));
  20. //1.2.2膨胀
  21. dilate(srcImg,srcImg,kernel,Point(-1,-1));
  22. //1.2.3腐蚀
  23. erode(srcImg,srcImg,kernel,Point(-1,-1));
  24. imshow("膨胀和腐蚀", srcImg);
  25. //1.3查找轮廓
  26. vector <vector<Point>> contours;
  27. vector<Vec4i> hierarcy;//没用到
  28. findContours(srcImg,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);//最外层轮廓
  29. //1.4绘制所有轮廓
  30. drawContours(copyImg,contours,-1,Scalar(0,255,0),1,8);
  31. //2.由轮廓确定正外接矩形
  32. int width = 0;
  33. int height = 0;
  34. int x = 0;
  35. int y = 0;
  36. //2.1 定义Rect类型的vector容器boundRect存放正外接矩形,初始化大小为contours.size()即轮廓个数
  37. vector<Rect> boundRect(contours.size());
  38. //2.2 遍历每个轮廓
  39. for (int i = 0; i < contours.size(); i++)
  40. {
  41. //2.3由轮廓(点集)确定出正外接矩形
  42. boundRect[i] = boundingRect(Mat(contours[i]));
  43. //2.4获得正外接矩形的左上角坐标及宽高
  44. width = boundRect[i].width;
  45. height = boundRect[i].height;
  46. x = boundRect[i].x;
  47. y = boundRect[i].y;
  48. //*2.5 对正外接矩形进行筛选(过滤掉小的)
  49. if (width>40 && height > 40)
  50. {
  51. //2.6用画矩形方法绘制正外接矩形
  52. rectangle(copyImg, Rect(x, y, width, height), Scalar(0, 0, 255), 1, 8);
  53. }
  54. }
  55. imshow("轮廓和正外接矩形", copyImg);
  56. waitKey(0);
  57. return 0;
  58. }

运行结果:

简单车牌字符分割:

[cpp] view plaincopy
  1. ///简单车牌字符分割
  2. #include "opencv2/opencv.hpp"
  3. using namespace cv;
  4. #include <iostream>
  5. using namespace std;
  6. int main()
  7. {
  8. //1.查找轮廓
  9. //1.1查找轮廓前的预处理(灰度图,阈值化)
  10. Mat srcImg = imread("Car.jpg", CV_LOAD_IMAGE_COLOR);
  11. imshow("srcImg", srcImg);
  12. Mat copyImg = srcImg.clone();
  13. cvtColor(srcImg, srcImg, CV_BGR2GRAY);
  14. threshold(srcImg, srcImg, 100, 255, CV_THRESH_BINARY);
  15. imshow("threshold", srcImg);
  16. //1.2查找轮廓
  17. vector <vector<Point>> contours;
  18. vector<Vec4i> hierarcy;//没用到
  19. findContours(srcImg, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);//所有轮廓
  20. //1.3绘制所有轮廓
  21. drawContours(copyImg, contours, -1, Scalar(0, 255, 0), 1, 8);
  22. //2.由轮廓确定正外接矩形
  23. int width = 0;
  24. int height = 0;
  25. int x = 0;
  26. int y = 0;
  27. //2.1 定义Rect类型的vector容器boundRect存放正外接矩形,初始化大小为contours.size()即轮廓个数
  28. vector<Rect> boundRect(contours.size());
  29. //2.2 遍历每个轮廓
  30. for (int i = 0; i < contours.size(); i++)
  31. {
  32. //2.3由轮廓(点集)确定出正外接矩形
  33. boundRect[i] = boundingRect(Mat(contours[i]));
  34. //2.4获得正外接矩形的左上角坐标及宽高
  35. width = boundRect[i].width;
  36. height = boundRect[i].height;
  37. x = boundRect[i].x;
  38. y = boundRect[i].y;
  39. //*2.5 对正外接矩形进行筛选(过滤掉过小及过大的)
  40. if (width>(1.0 / 12)*srcImg.cols && width<(1.0 / 7)*srcImg.cols
  41. &&height >(1.0 / 6)*srcImg.rows&& height < (5.0 / 6)*srcImg.rows)
  42. {
  43. //2.6用画矩形方法绘制正外接矩形
  44. rectangle(copyImg, Rect(x, y, width, height), Scalar(0, 0, 255), 1, 8);
  45. //*2.7 通过ROI保存分割出的车牌字符
  46. //2.7.1 定义ROI
  47. Mat ROI = copyImg(Rect(x,y,width,height));
  48. //2.7.2 通过sprintf格式化文件存储名name
  49. char name[20] = {0};
  50. sprintf(name,"E:\\temp\\%d.jpg",i);
  51. //2.7.3 写ROI到本地
  52. imwrite(name,ROI);
  53. }
  54. }
  55. imshow("轮廓和正外接矩形", copyImg);
  56. waitKey(0);
  57. return 0;
  58. }

运行结果:

OpenCV学习笔记】二十七、轮廓特征属性及应用(四)——正外接矩形相关推荐

  1. OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc

    OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...

  2. OpenCV学习笔记(十七):查找并绘制轮廓:findContours(),drawContours(),approxPolyDP()

    OpenCV学习笔记(十七):查找并绘制轮廓:findContours() 1.findContours() 函数 该函数使用Suzuki85算法从二值图像中检索轮廓.轮廓线是一种用于形状分析.目标检 ...

  3. OpenCV学习笔记(十七):图像修补:inpaint()

    OpenCV学习笔记(十七):图像修补:inpaint() inpaint()函数 使用区域邻域在图像中还原选定区域. void inpaint( InputArray src, // 表示要修复的图 ...

  4. uniapp 学习笔记二十七 购物车总价计算及弹窗交互逻辑完善

    uniapp 学习笔记二十七 购物车总价计算及弹窗交互逻辑完善 uniapp 学习笔记二十七 购物车总价计算及弹窗交互逻辑完善 cart.vue <template><view> ...

  5. opencv学习笔记4:获取图像属性

    获取形状属性 使用shape ,返回图像的 行数,列数,通道数的元祖 灰度图:返回 行数 ,列数 彩色图:返回 行数,列数,通道数 算例 灰度图 import cv2 i=cv2.imread('le ...

  6. Mr.J-- jQuery学习笔记(二十七)--DOM操作方法(删除获取文本)

    清除 <body> <button>调用remove</button> <div>我是div<p>我是段落</p> </d ...

  7. OpenCv学习笔记(二)--Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解

    (一)Mat矩阵(图像容器)创建时CV_8UC1,CV_8UC2等参数详解 1--Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类 2--创建一个Mat对象的方法很多,我们现在先看一下M ...

  8. Qt学习笔记(二十七):QLabel 的常用方法

    一.QLabel 的构造函数: 1.QLabel(QWidget * parent = 0, Qt::WindowFlags f = 0):创建 QLabel 控件时,指定其父对象,并设置其窗口属性( ...

  9. C++语法学习笔记二十七: 引用折叠,转发、完美转发,forward

    实例代码 // 引用折叠,转发.完美转发,forward#include <iostream>using namespace std;template<typename T> ...

  10. opencv学习笔记二十一:使用HSV颜色空间实现颜色识别

    一.颜色空间介绍        RGB 颜色空间是大家最熟悉的颜色空间,即三基色空间,任何一种颜色都可以由该三种 颜色混合而成.然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV( ...

最新文章

  1. pythonslice_shift_3. 数据模型
  2. linux 发行版 suse opensuse 区别
  3. 关于Spring Boot WebSocket整合以及nginx配置详解
  4. iOS开发隐藏键盘方法总结
  5. ResNeXt 之 输入数据预处理代码详解
  6. list python 转tensor_Tensorflow模型量化4 --pb转tflite(uint8量化)小结
  7. C++基础知识总结(一)
  8. java学习(42):巩固练习
  9. 多域名解析及延伸知识点
  10. 图像处理-RBG图像和灰度图像
  11. 冒号和他的学生们(连载18)——系统语言
  12. 中的live_张杰两首歌曲连唱彰显LIVE实力 青春演说温暖人心
  13. comon lisp标准_Common Lisp 的一些函数
  14. 解决ppt复制到Word的图片导出PDF后出现黑线问题,word转PDF图片不清晰的问题,ppt转矢量图问题
  15. 苹果付费app共享公众号_公众号+搭建知识付费网课分销平台聚合型玩法解析
  16. MySQL复制表数据到新表的方法 亲测可用
  17. C#钉钉官方工作流和自定义工作流代码实现
  18. 解决onenote同步慢的问题
  19. xpath用于HTML文档通过元素,理解HTML和XPath
  20. 安全审计——等级保护日志审计要求的一种解决方案

热门文章

  1. XP蓝屏代码集(转)
  2. 安装linux-mysql-yum方式
  3. mybatis-plus中的select
  4. 飞信机器人 ld-linux.so.2,基于linux的飞信机器人2010版安装
  5. php 查oracle 表不存在报错处理,合同信息查询时,报错提示oracle数据库执行异常,表或视图不存在...
  6. python mount回调函数_python类(4)——自己造第一个轮子
  7. ubuntu 串口调试工具推荐_Qt开源作品3-串口调试助手
  8. Java基础:List集合和Set接口
  9. LeetCode:每日一题(2020.4.13)
  10. CSS:布局——伸缩布局flex