将OpenCV 2向量<point2i>转换为向量<point2f> </point2f> </point2i>

时间:2011-09-12 10:07:00

标签: c++ stl opencv

OpenCV 2轮廓查找器返回vector<Point2i>,但有时您想要使用需要vector<Point2f>的函数。什么是最快,最优雅的转换方式?

以下是一些想法。对于任何可以转换为Mat的任何内容的非常通用的转换函数:

template <class SrcType, class DstType>
void convert1(std::vector<SrcType>& src, std::vector<DstType>& dst) {
  cv::Mat srcMat = cv::Mat(src);
  cv::Mat dstMat = cv::Mat(dst);
  cv::Mat tmpMat;
  srcMat.convertTo(tmpMat, dstMat.type());
  dst = (vector<DstType>) tmpMat;
}

但这会使用额外的缓冲区,所以它并不理想。这是一种预先分配向量然后调用copy()的方法:

template <class SrcType, class DstType>
void convert2(std::vector<SrcType>& src, std::vector<DstType>& dst) {
  dst.resize(src.size());
  std::copy(src.begin(), src.end(), dst.begin());
}

最后,使用back_inserter

template <class SrcType, class DstType>
void convert3(std::vector<SrcType>& src, std::vector<DstType>& dst) {
  std::copy(src.begin(), src.end(), std::back_inserter(dst));
}

2 个答案:

答案 0 :(得分:11)

假设src和dst是向量,在OpenCV 2.x中你可以说:

cv::Mat(src).copyTo(dst);

在OpenCV 2.3.x中你可以说:

cv::Mat(src).convertTo(dst, dst.type());  

UPDATE: type() Mat 的函数,而不是 std :: vector 的函数类。因此,您无法调用 dst.type()

如果使用dst作为输入创建Mat实例,则可以为新创建的对象调用函数 type()

cv::Mat(dst).type();

答案 1 :(得分:2)

请注意,从cv :: Point2f转换为cv :: Point2i可能会产生意外结果。

float j = 1.51;    
int i = (int) j;
printf("%d", i);

将导致“1”。

,而

cv::Point2f j(1.51, 1.49);
cv::Point2i i = f;
std::cout << i << std::endl;

将导致“2,1”。

这意味着,Point2f到Point2i将会循环,而类型转换会截断。

http://docs.opencv.org/modules/core/doc/basic_structures.html#point