【问题标题】:How to convert vector<cv::Point2d> to vector<cv::Point>?如何将向量<cv::Point2d> 转换为向量<cv::Point>?
【发布时间】:2015-12-21 12:27:55
【问题描述】:

有没有简单的解决方案如何将vector&lt;cv::Point2d&gt; 转换为vector&lt;cv::Point&gt;?像这里C++ convert vector<int> to vector<double>

这些类型是模板化的:

typedef Point_<double> Point2d;

typedef Point_<int> Point2i;
typedef Point2i Point;


/*!
  template 2D point class.

  The class defines a point in 2D space. Data type of the point coordinates is specified
  as a template parameter. There are a few shorter aliases available for user convenience.
  See cv::Point, cv::Point2i, cv::Point2f and cv::Point2d.
*/
template<typename _Tp> class Point_
{
public:
    typedef _Tp value_type;

    // various constructors
    Point_();
    Point_(_Tp _x, _Tp _y);
    Point_(const Point_& pt);
    Point_(const CvPoint& pt);
    Point_(const CvPoint2D32f& pt);
    Point_(const Size_<_Tp>& sz);
    Point_(const Vec<_Tp, 2>& v);

    Point_& operator = (const Point_& pt);
    //! conversion to another data type
    template<typename _Tp2> operator Point_<_Tp2>() const;

    //! conversion to the old-style C structures
    operator CvPoint() const;
    operator CvPoint2D32f() const;
    operator Vec<_Tp, 2>() const;

    //! dot product
    _Tp dot(const Point_& pt) const;
    //! dot product computed in double-precision arithmetics
    double ddot(const Point_& pt) const;
    //! cross-product
    double cross(const Point_& pt) const;
    //! checks whether the point is inside the specified rectangle
    bool inside(const Rect_<_Tp>& r) const;

    _Tp x, y; //< the point coordinates
};

【问题讨论】:

    标签: c++ templates opencv vector point


    【解决方案1】:

    您可以完全按照那里的描述使用向量范围构造函数

    #include <opencv2\opencv.hpp>
    #include <vector>
    using namespace cv;
    using namespace std;
    
    int main()
    {
        vector<Point2d> vd{ { 1.1, 2.2 }, { 3.3, 4.4 }, {5.5, 6.6} };
        vector<Point> v(vd.begin(), vd.end());
    
        // Print for debug
        copy(vd.begin(), vd.end(), ostream_iterator<Point2d>(cout, " "));
        cout << endl;
        copy(v.begin(), v.end(), ostream_iterator<Point>(cout, " "));
    
        return 0;
    }
    

    这将起作用,因为您可以使用以下命令从 Point2d 构建 Point

    template<typename _Tp> template<typename _Tp2> inline Point_<_Tp>::operator Point_<_Tp2>() const
    { return Point_<_Tp2>(saturate_cast<_Tp2>(x), saturate_cast<_Tp2>(y)); }
    

    【讨论】:

      【解决方案2】:

      由于没有从 cv::Point2D 到 cv::Point 的转换,我建议使用 lambda(未经测试):

      vector<cv::Point2d> src ;
      vector<cv::Point> dest ;
      
      std::copy(src.begin(), 
                src.end(), 
                [&dest](const cv::Point2d &item) {
                dest.push_back(cv::Point(pt.x, pt.y)) ;}) ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-19
        相关资源
        最近更新 更多