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 ...
随机推荐
- 白鹭引擎 - 显示对象与 HelloWord ( 绘制了一个红蓝相间的 2 x 2 格子 )
1: 白鹭引擎默认实在一个 640 * 1136 的画布上作画 2: 入口文件 Main.ts, 类 Main 是程序的入口 // 1, 在一个宽高为 640 * 1136 的画布上作画 // 2, ...
- hadoop的client搭建-即集群外主机访问hadoop
1增加主机映射(与namenode的映射一样): 增加最后一行 [root@localhost ~]# su - root1 [root@localhost ~]# vi /etc/hosts 12 ...
- leetcode1019
class Solution(object): def nextLargerNodes(self, head: ListNode) -> 'List[int]': n = 0 temp = he ...
- [记录] CSS 多行文本超出部分省略
如果实现单行文本的溢出显示省略号同学们应该都知道用text-overflow:ellipsis属性来,当然还需要加宽度width属来兼容部分浏览 <p style="width: 30 ...
- selenium初次接触-1
10月30日 web自动化测试的两种方式:模拟整个http客户端(压力测试,取代浏览器和人,直接和服务端进行交互),模拟用户操作(功能测试,取代人) selenium是自动化浏览器的工具包,可以用于各 ...
- mysql Lock wait timeout exceeded; try restarting transaction解决
前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处理: ...
- UI5-学习篇-12-Eclipse同步ABAP服务器UI5应用
如何在ABAP服务器上部署和运行SAPUI5应用程序 https://blogs.sap.com/2013/06/15/how-to-deploy-and-run-sapui5-application ...
- 无法解析db.properties,spring报错:Caused by: java.sql.SQLException: unkow jdbc driver : ${url}
db.properties中配置了url等jdbc连接属性: driver=org.sqlite.JDBCurl=jdbc:sqlite:D:/xxx/data/sqliteDB/demo.dbuse ...
- 07_组件三大属性(1)_state
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- spark Kryo serialization failed: Buffer overflow 错误
今天在写spark任务的时候遇到这么一个错误,我的spark版本是1.5.1. Exception in thread "main" com.esotericsoftware.kr ...