将OpenCV 2向量<Point2i>转换为向量<Point2f>

Kyl*_*ald 7 c++ opencv stl

OpenCV 2轮廓查找器返回a 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;
}
Run Code Online (Sandbox Code Playgroud)

但是这会使用额外的缓冲区,因此它并不理想.这是一种预先分配向量然后调用的方法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());
}
Run Code Online (Sandbox Code Playgroud)

最后,使用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));
}
Run Code Online (Sandbox Code Playgroud)

Kyl*_*ald 11

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

cv::Mat(src).copyTo(dst);
Run Code Online (Sandbox Code Playgroud)

在OpenCV 2.3.x中,您可以说:

cv::Mat(src).convertTo(dst, dst.type());  
Run Code Online (Sandbox Code Playgroud)

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

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

cv::Mat(dst).type();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!澄清一下:cv :: Mat(src).convertTo(dst,cv :: Mat(dst).type()); (2认同)

小智 6

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

float j = 1.51;    
int i = (int) j;
printf("%d", i);
Run Code Online (Sandbox Code Playgroud)

将导致“1”。

尽管

cv::Point2f j(1.51, 1.49);
cv::Point2i i = f;
std::cout << i << std::endl;
Run Code Online (Sandbox Code Playgroud)

将导致“2, 1”。

这意味着, Point2f 到 Point2i 将四舍五入,而类型转换将截断。

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