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)
小智 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
| 归档时间: |
|
| 查看次数: |
14239 次 |
| 最近记录: |