Opencv 的各个vector容器探究

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Opencv 的各个vector容器探究

各个vector


放了一个vector容器,子容器里放点


vector<vector<Point>>


放了4维int向量


vector<Vec4i>


像素width * height from 位置(x*y)


vector<Rect>


矩形偏移角度、中心、大小


vector<RotatedRect>


轮廓周围绘制矩形框


刚开始学OpenCV没多久遇到这些个东西不知道是什么,搞得很不舒服。


通过给轮廓绘制矩形框弄明白了这些东西。


代码如下:


#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>  
using namespace std;
using namespace cv;
int main() {
  Mat src, gray_src, drawImg, bin_output;
  src = imread("./shape.png");
  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;
}


运行结果为:




相关文章
|
4月前
|
存储 C++ 容器
如何将没有复制或移动构造函数的对象放入vector容器
如何将没有复制或移动构造函数的对象放入vector容器
42 0
|
6月前
|
存储 算法 编译器
8.STL中Vector容器的常见操作(附习题)
8.STL中Vector容器的常见操作(附习题)
|
6月前
|
C++ 容器
C++之评委打分案例(vector与deque容器练习)
C++之评委打分案例(vector与deque容器练习)
|
6月前
|
存储 算法 C++
C++一分钟之-容器概览:vector, list, deque
【6月更文挑战第21天】STL中的`vector`是动态数组,适合随机访问,但插入删除非末尾元素较慢;`list`是双向链表,插入删除快但随机访问效率低;`deque`结合两者优点,支持快速双端操作。选择容器要考虑操作频率、内存占用和性能需求。注意预分配容量以减少`vector`的内存重分配,使用迭代器而非索引操作`list`,并利用`deque`的两端优势。理解容器内部机制和应用场景是优化C++程序的关键。
72 5
|
6月前
|
存储 算法 C++
【C++/STL】:vector容器的基本使用
【C++/STL】:vector容器的基本使用
42 1
|
5月前
|
存储 安全 C++
|
5月前
|
存储 算法 C++
【C++】详解STL容器之一的 vector
【C++】详解STL容器之一的 vector
|
6月前
|
算法 C++ 容器
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
269 0
|
6月前
|
算法 编译器 Linux
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
51 0
|
6月前
|
存储 缓存 C++
Vector容器介绍
Vector容器介绍