2015-12-21 423 views
1

有没有简单的解决方案如何将vector<cv::Point2d>转换为vector<cv::Point>?像这里的东西C++ convert vector<int> to vector<double>如何把矢量<cv::Point2d>转换成矢量<cv::Point>?

此类型模板:

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 
}; 

回答

0

由于没有从CV转换:: Point2D从简历::点我建议一个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)) ;}) ; 
5

你可以做完全如上所述使用矢量范围构造器

#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)); } 
相关问题