2011-09-12 99 views
5

OpenCV 2輪郭ファインダはvector<Point2i>を返しますが、vector<Point2f>を必要とする関数でこれらを使用したいことがあります。変換する最も速く、最もエレガントな方法は何ですか?OpenCV 2ベクトル<Point2i>をベクトルに変換<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; 
} 

しかし、これは余分なバッファを使用していますので、それは理想的ではありません。

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使用:ここでのアプローチは、ベクターが、その後copy()呼び出す前に、割り当てていることだベクトルを

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

答えて

9

と仮定すると、srcとdstのがあり、OpenCVの2.xの中であなたが言うことができます。

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

そして、OpenCVの2.3.x以降にあなたが言うことができます。

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

UPDATE:タイプ()のstd ::ベクトルクラスのマットとしない機能です。したがって、dst.type()に電話することはできません。新しく作成されたオブジェクトのための

あなたが入力としてDSTを使用してマットのインスタンスを作成する場合は、あなたがタイプ(関数を呼び出すことができます)

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

thx!明確にする:cv :: Mat(src).convertTo(dst、cv :: Mat(dst).type()); – Flayn

1

が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

関連する問題