2011-09-12 14 views
5

Il rilevatore di profili OpenCV 2 restituisce un vector<Point2i>, ma a volte si desidera utilizzarli con una funzione che richiede uno vector<Point2f>. Qual è il modo più veloce ed elegante per convertire?convertire il vettore OpenCV 2 <Point2i> nel vettore <Point2f>

Ecco alcune idee. Una funzione di conversione molto generale per tutto ciò che può essere convertito in un 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; 
} 

Ma questo utilizza un buffer in più, quindi non è l'ideale. Ecco un approccio che pre-assegna il vettore poi chiama 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()); 
} 

Infine, utilizzando un back_inserter: src

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

risposta

9

Supponendo e DST sono vettori, in OpenCV 2.x si può dire:

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

E in OpenCV 2.3.x si può dire:

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

UPDATE:tipo() è una funzione della Mat e non del std :: vector classe. Pertanto, non è possibile chiamare dst.type().

Se si crea un'istanza Mat utilizzando l'ora legale come input quindi è possibile chiamare il tipo di funzione () per l'oggetto appena creato:

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

thx! per chiarire: cv :: Mat (src) .convertTo (dst, cv :: Mat (dst) .type()); – Flayn

1

Essere consapevoli del fatto che la conversione da cv :: Point2f al cv: : Point2i potrebbe avere risultati imprevisti.

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

Risulterà in "1".

mentre

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

si tradurrà in "2, 1".

Ciò significa che Point2f to Point2i verrà arrotondato, mentre il cast di tipo verrà troncato.

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

Problemi correlati