zoukankan      html  css  js  c++  java
  • 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>:如图三个成员

    上述结果的代码如下:

    1.  
      #include <opencv2/opencv.hpp>
    2.  
      #include <iostream>
    3.  
       
    4.  
      using namespace cv;
    5.  
      using namespace std;
    6.  
       
    7.  
      int main() {
    8.  
      Mat src, gray_src, drawImg, bin_output;
    9.  
       
    10.  
      src = imread("F:/Temp_vs/pic/09.jpg");
    11.  
      namedWindow("input", CV_WINDOW_AUTOSIZE);
    12.  
      namedWindow("output", CV_WINDOW_AUTOSIZE);
    13.  
      imshow("input", src);
    14.  
       
    15.  
      cvtColor(src, gray_src, CV_BGR2GRAY);
    16.  
      blur(gray_src, gray_src, Size(10, 10), Point(-1, -1), BORDER_DEFAULT);
    17.  
       
    18.  
      //这些个类型
    19.  
      vector<vector<Point>> contours;
    20.  
      vector<Vec4i> hierarchy;
    21.  
       
    22.  
      threshold(gray_src, bin_output, 144, 255, 0); //二值化
    23.  
      findContours(bin_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); //找轮廓
    24.  
       
    25.  
      //这些个类型
    26.  
      vector<vector<Point>> contours_poly(contours.size());
    27.  
      vector<Rect> poly_rects(contours.size());
    28.  
      vector<RotatedRect> minRect(contours.size());
    29.  
       
    30.  
      //取点
    31.  
      for (size_t i = 0; i < contours.size(); i++)
    32.  
      {
    33.  
      approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true); //减少轮廓点数
    34.  
       
    35.  
      poly_rects[i]=boundingRect(contours_poly[i]);//获取绘制矩形数据
    36.  
       
    37.  
      if (contours_poly[i].size() > 5) {
    38.  
      minRect[i] = minAreaRect(contours_poly[i]);//获取绘制旋转矩形数据
    39.  
      }
    40.  
      }
    41.  
       
    42.  
      //开始绘制
    43.  
      src.copyTo(drawImg);
    44.  
      Point2f pst[4];//储存单个旋转矩形的四个点
    45.  
      cout << "----------Point2f pst[4]------------" << endl;
    46.  
      for (size_t i = 0; i < contours.size(); i++)
    47.  
      {
    48.  
      rectangle(drawImg, poly_rects[i], Scalar(255, 0, 0), 2, 8);//绘制矩形框
    49.  
       
    50.  
      minRect[i].points(pst);//用线段画矩形,将RotatedRect类型转化为四个点
    51.  
       
    52.  
      for (size_t u = 0; u < 4; u++)
    53.  
      {
    54.  
      line(drawImg, pst[u], pst[(u + 1) % 4], Scalar(0, 255, 0), 2, 8);
    55.  
      cout << pst[u]; //显示pst的数据
    56.  
      }
    57.  
      cout << endl;
    58.  
      Rect brect = minRect[i].boundingRect(); //返回包含旋转矩形的最小矩形
    59.  
      rectangle(drawImg, brect,Scalar(0, 0, 255));
    60.  
      }
    61.  
      cout << endl;
    62.  
      imshow("output", drawImg);
    63.  
       
    64.  
      cout << "----------vector<vector<Point>> contours_poly------------" << endl;
    65.  
      for (size_t i = 0; i < contours_poly.size(); i++)
    66.  
      {
    67.  
      cout << "第" << i << "行:";
    68.  
      for (size_t j = 0; j < contours_poly[i].size(); j++)
    69.  
      {
    70.  
      cout<<contours_poly[i][j];
    71.  
      }
    72.  
      cout << endl;
    73.  
      }
    74.  
      cout << endl;
    75.  
       
    76.  
      cout << "----------vector<Vec4i> hierarchy------------" << endl;
    77.  
      for (size_t i = 0; i < hierarchy.size(); i++)
    78.  
      {
    79.  
      cout << hierarchy[i] << endl;
    80.  
      }
    81.  
      cout << endl;
    82.  
       
    83.  
      cout << "----------vector<Rect> poly_rects------------" << endl;
    84.  
      for (size_t i = 0; i < poly_rects.size(); i++)
    85.  
      {
    86.  
      cout << poly_rects[i]<<endl;
    87.  
      }
    88.  
      cout << endl;
    89.  
       
    90.  
      cout << "---------vector<RotatedRect> minRect------------" << endl;
    91.  
      for (size_t i = 0; i <minRect.size(); i++) //显示一下点minRect
    92.  
      {
    93.  
      cout <<"angle:"<< minRect[i].angle<<" center:"<< minRect[i].center<<" size:"<< minRect[i].size<<endl;
    94.  
      }
    95.  
      cout << endl;
    96.  
       
    97.  
      waitKey(0);
    98.  
      return 0;
    99.  
      }

    萍水相逢逢萍水,浮萍之水水浮萍!
  • 相关阅读:
    Kaggle 神器 xgboost
    改善代码可测性的若干技巧
    IDEA 代码生成插件 CodeMaker
    Elasticsearch 使用中文分词
    Java性能调优的11个实用技巧
    Lucene 快速入门
    Java中一个字符用unicode编码为什么不是两字节
    lucene 的评分机制
    面向对象设计的 10 条戒律
    2019.10.23-最长全1串(双指针)
  • 原文地址:https://www.cnblogs.com/AIBigTruth/p/10526383.html
Copyright © 2011-2022 走看看