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 ...
随机推荐
- Linux 指令(一)文件/目录操作
1. 创建目录 mkdir 格式 mkdir [OPTION]... DIRECTORY... 选项 -p 递归创建 -v 创建时提示 例: root@ubuntu:/home/eko/x# mkdi ...
- 异常+远程控制Linux-14
什么是异常 a=8950/0 ZeroDivisioonError: division by zero print (a) ************** b = [1,2] ...
- 完美解决ubuntu下sublime中文输入问题
声明 1.本人整理文章,转载请注明出处. 2.参考资料 http://my.oschina.net/tsl0922/blog/113495 问题描述 在ubuntu下想使用sublime,但是不能输入 ...
- Windows环境安装Django步骤
前提:已经安装Python 1.先从Django官网下载压缩包:https://www.djangoproject.com/download/ 2.解压Django,如我解压到 D:\Python\D ...
- 机器学习进阶-边缘检测-Canny边缘检测 1.cv2.Canny(进行Canny边缘检测)
1. cv2.Canny(src, thresh1, thresh2) 进行canny边缘检测 参数说明: src表示输入的图片, thresh1表示最小阈值,thresh2表示最大阈值,用于进一步删 ...
- javascript_ajax 地址三级联动
1.三级地址联动思路如下: 2.建立数据库.这里直接使用网上的地址数库,最后一个字段无用,先不去管它 3.建立一个server.php 文件 <?php // 数据库连接 mysql_conne ...
- Servlet基本_オブジェクトのスコープ
1.スコープ種類Servletには以下のスコープがあります.Request.Session.Applicationの順にスコープは広くなっていきます.・Applicationスコープ:アプリケーション ...
- mysql decimal
可能做程序的人都知道,float类型是可以存浮点数(即小数类型),但是float有个坏处,当你给定的数据是整数的时候,那么它就以整数给你处理. 这样我们在存取货币值的时候自然遇到问题,我的defaul ...
- php运行代码流程和性能优化方法
---恢复内容开始--- php文件->扫描->zd引擎去理解->opcodes->执行->输出 例子,用white随机循环20000数据进行性能测试,分别对比isset ...
- Structs复习 Action传递参数
Structs传递参数通常有三种方式 下面我来一个个介绍 1.属性 Jar包 web.xml <?xml version="1.0" encoding="UTF-8 ...