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));
}
答案 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