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 ...
随机推荐
- 关于URI和URL的区别
URI:统一资源标志符(Uniform Resource Identifier)URL:统一资源定位符(uniform resource location) URN = Universal Resou ...
- 通过HTTP请求响应过程了解HTTP协议
通过HTTP请求响应过程了解HTTP协议 http://www.cnblogs.com/YeChing/p/6337378.html
- Windows环境安装Django步骤
前提:已经安装Python 1.先从Django官网下载压缩包:https://www.djangoproject.com/download/ 2.解压Django,如我解压到 D:\Python\D ...
- Cause: java.sql.SQLException: The user specified as a definer ('root'@'%') does not exist
权限问题,授权 给 root 所有sql 权限 mysql> grant all privileges on *.* to root@"%" identified by &q ...
- css:在容器内文字超过容器范围,显示一行加省略号或者两行加省略号
一.显示一行加省略号:各浏览器兼容 .box{ width: 100px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; } ...
- 解决linux中ssh登录Warning:Permanently added (RSA) to the list of known hosts
原因: 在执行scp id_rsa.pub root@hostname:/root/.ssh这一步时,没在本机的/root/.ssh下生成known_hosts文件. 解决方案: vi /etc/ss ...
- linux下给PHP安装拓展
要先完成了上一篇文章的phpize的操作,并激活它才能下一步. 下载拓展,在http://pecl.php.net/这个网站下载,其他的有可能不成功,我之前还很纳闷phpize已经调试通过了,但是切换 ...
- Android对接WebService -- The given SOAPAction http://webservice.ams.cnpc.com/getServerTime does not match an operation.
问题描述:Chrome Restlet下模拟请求出现如下问题 The given SOAPAction http://webservice.ams.cnpc.com/getServerTime doe ...
- JAVAWEB 一一 框架整合(SSH,Spring+Struts2+Hibernate IOC/DI AOP声明式事务处理 定时任务)
package org.springframework.orm.hibernate3; import java.io.Serializable; import java.util.List; impo ...
- C#图像处理:Stream 与 byte[] 相互转换,byte[]与string,Stream 与 File 相互转换等
C# Stream 和 byte[] 之间的转换 一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = 0; Ima ...