OpenCV轮廓vectorvector
OpenCV轮廓vectorvector,vector,vector,vector
轮廓周围绘制矩形框
vector<vector<Point>>,vector<V e c 4 i>,vector<R e c t>,vector<R o t a t e d R e c t>
刚开始学OpenCV没多久遇到这些个东西不知道是什么,搞得很不舒服。
通过给轮廓绘制矩形框弄明白了这些东西。
vector<vector<Point>>:
vector容器里面放了一个vector容器,子容器里放点
vector<V e c 4 i>:放了4维int向量
vector<R e ct>: 像素width * height from 位置(x*y)
vector<R o t a t e d R e c t>:如图三个成员
上述结果的代码如下:
- #include <opencv2/opencv.hpp>
- #include <iostream>
- using namespace cv;
- using namespace std;
- int main() {
- Mat src, gray_src, drawImg, bin_output;
- src = imread("F:/Temp_vs/pic/09.jpg");
- namedWindow("input", CV_WINDOW_AUTOSIZE);
- namedWindow("output", CV_WINDOW_AUTOSIZE);
- imshow("input", src);
- cvtColor(src, gray_src, CV_BGR2GRAY);
- blur(gray_src, gray_src, Size(10, 10), Point(-1, -1), BORDER_DEFAULT);
- //这些个类型
- vector<vector<Point>> contours;
- vector<Vec4i> hierarchy;
- threshold(gray_src, bin_output, 144, 255, 0); //二值化
- findContours(bin_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); //找轮廓
- //这些个类型
- vector<vector<Point>> contours_poly(contours.size());
- vector<Rect> poly_rects(contours.size());
- vector<RotatedRect> minRect(contours.size());
- //取点
- for (size_t i = 0; i < contours.size(); i++)
- {
- approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true); //减少轮廓点数
- poly_rects[i]=boundingRect(contours_poly[i]);//获取绘制矩形数据
- if (contours_poly[i].size() > 5) {
- minRect[i] = minAreaRect(contours_poly[i]);//获取绘制旋转矩形数据
- }
- }
- //开始绘制
- src.copyTo(drawImg);
- Point2f pst[4];//储存单个旋转矩形的四个点
- cout << "----------Point2f pst[4]------------" << endl;
- for (size_t i = 0; i < contours.size(); i++)
- {
- rectangle(drawImg, poly_rects[i], Scalar(255, 0, 0), 2, 8);//绘制矩形框
- minRect[i].points(pst);//用线段画矩形,将RotatedRect类型转化为四个点
- for (size_t u = 0; u < 4; u++)
- {
- line(drawImg, pst[u], pst[(u + 1) % 4], Scalar(0, 255, 0), 2, 8);
- cout << pst[u]; //显示pst的数据
- }
- cout << endl;
- Rect brect = minRect[i].boundingRect(); //返回包含旋转矩形的最小矩形
- rectangle(drawImg, brect,Scalar(0, 0, 255));
- }
- cout << endl;
- imshow("output", drawImg);
- cout << "----------vector<vector<Point>> contours_poly------------" << endl;
- for (size_t i = 0; i < contours_poly.size(); i++)
- {
- cout << "第" << i << "行:";
- for (size_t j = 0; j < contours_poly[i].size(); j++)
- {
- cout<<contours_poly[i][j];
- }
- cout << endl;
- }
- cout << endl;
- cout << "----------vector<Vec4i> hierarchy------------" << endl;
- for (size_t i = 0; i < hierarchy.size(); i++)
- {
- cout << hierarchy[i] << endl;
- }
- cout << endl;
- cout << "----------vector<Rect> poly_rects------------" << endl;
- for (size_t i = 0; i < poly_rects.size(); i++)
- {
- cout << poly_rects[i]<<endl;
- }
- cout << endl;
- cout << "---------vector<RotatedRect> minRect------------" << endl;
- for (size_t i = 0; i <minRect.size(); i++) //显示一下点minRect
- {
- cout <<"angle:"<< minRect[i].angle<<" center:"<< minRect[i].center<<" size:"<< minRect[i].size<<endl;
- }
- cout << endl;
- waitKey(0);
- return 0;
- }
OpenCV轮廓vectorvector的更多相关文章
- OpenCV 轮廓基本特征
http://blog.csdn.net/tiemaxiaosu/article/details/51360499 OpenCV 轮廓基本特征 2016-05-10 10:26 556人阅读 评论( ...
- 【转载】openCV轮廓操作
声明:非原创,转载自互联网,有问题联系博主 1.轮廓的提取 从图片中将目标提取出来,常常用到的是提取目标的轮廓. OpenCV里提取目标轮廓的函数是findContours(), 它的输入图像是一幅二 ...
- OpenCV 轮廓检测
使用OpenCV可以对图像的轮廓进行检测.这是之前用过的代码,挺简单的,回顾一下.主要要进行以下2步操作: 1.cvThreshold():对图像进行二值化处理 2.cvFindContours(): ...
- OpenCV轮廓检测,计算物体旋转角度
效果还是有点问题的,希望大家共同探讨一下 // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : 定义控制台应用程序的入 ...
- Opencv轮廓计数(学习)
#include <iostream>#include <opencv2/opencv.hpp>#include <opencv2/xfeatures2d.hpp> ...
- OpenCV —— 轮廓
把检测出的边缘像素组装成轮廓 —— cvFindContours OpenCV 使用内存存储器来统一管理各种动态对象的内存.内存存储器在底层被实现为一个有许多相同大小的内存块组成的双向链表 内存储 ...
- opencv轮廓外接矩形
1.寻找轮廓 api void cv::findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray ...
- opencv——轮廓发现与轮廓(二值图像)分析
引言 二值图像分析最常见的一个主要方式就是轮廓发现与轮廓分析,其中轮廓发现的目的是为轮廓分析做准备,经过轮廓分析我们可以得到轮廓各种有用的属性信息. 这里顺带提下边缘检测,和轮廓提取的区别: 边缘检测 ...
- opencv轮廓处理函数详细
ApproxChains 用多边形曲线逼近 Freeman 链 CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage, int me ...
随机推荐
- Android Data Binding Library
Data Binding Library Data Binding Library是一个支持库,允许您使用声明格式(而不是编程)将布局中的UI组件与应用程序中的数据源绑定. 布局通常在调用UI框架方法 ...
- C# 趣味小程序(4)——遍历特定目录及其子目录
//递归方法遍历目录,并统计其中文件的数目 private int statisticFiles(string directory) { int st ...
- Flex+BlazeDS+java通信详细笔记
整了很长时间的通信,还是一直有一点问题.现在搞定了,记录一下,也跟有需求的同学们共享. 我重新把所有的过程再做一遍. 1新建Flex+BlazeDS+JAVA项目 右键.新建Flex项目 其中blaz ...
- 【ASP.NET 进阶】PDF文件在线预览(类似百度文库)
工作需要完成文档的在线预览,现在完成了第一步PDF文件的预览,步骤是通过PDF转换工具pdf2swf.exe把PDF文件转换为SWF文件,然后通过FlexPaper就可以预览了.效果如下(GIF图片太 ...
- 关于阿里云图片识别接口的demo
服务器处理过程 $host = "https://dm-53.data.aliyun.com"; $path = "/rest/160601/ocr/ocr_vehicl ...
- 用U盘制作启动盘后空间变小的恢复方法
先把u盘插好, 运行cmd(按住键盘左下角第二个windows键的同时按R), 输入diskpart,回车, (此时可以再输入list disk,回车,能看到这台电脑的所有磁盘大致情况,u盘一般是磁盘 ...
- python 机器学习实践入门
机器学习概念概念 机器 学习是计算机科学的一个分支,从模式识别.人工智能和计算学习理论发展而来,我们可以将其作为数据挖掘的工具 侧重用于数据分析方法理解给定的数据 目的是:开发能够从先前观测的数据,通 ...
- java字符串格式化:String.format()方法的使用
转自:http://kgd1120.iteye.com/blog/1293633 常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的读者应 ...
- Python 3 学习笔记(3)
模块 编写模块 # fibo.py # Fibonacci numbers module def fib(n): # write Fibonacci series up to n a, b = 0, ...
- k8s的内置DNS增加父系DNS方法
我们都知道K8S有内置DNS,是在搭建K8S时候以容器方式起来的,那么有时候我们需要解析内部DNS地址该怎么办呢,我们可以搭建个内部DNS 但是怎么让K8S通过内部DNS解析呢? 可以尝试如下方法 在 ...