2011-09-12 23 views
5

El buscador de contorno OpenCV 2 devuelve vector<Point2i>, pero a veces querrás utilizarlos con una función que requiera vector<Point2f>. ¿Cuál es la manera más rápida y elegante de convertir?Convierte el vector OpenCV 2 <Point2i> en el vector <Point2f>

Aquí hay algunas ideas. Una función de conversión muy general para cualquier cosa que se puede convertir a 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; 
} 

Pero esto utiliza un búfer adicional, así que no es ideal. He aquí un enfoque que pre-asigna el vector llama entonces 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()); 
} 

Por último, el uso de 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)); 
} 

Respuesta

9

Suponiendo que el horario de verano y son vectores, en OpenCV 2.x se puede decir:

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

Y en 2.3.x OpenCV se puede decir:

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

UPDATE:tipo() es una función de la Mat y no de la clase std :: vector. Por lo tanto, no puede llamar al dst.type().

Si crea una instancia Mat utilizando el horario de verano como entrada a continuación, se puede llamar al tipo de función () para el nuevo objeto creado:

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

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

1

Tenga en cuenta que la conversión de CV :: Point2f a cv: : Point2i puede tener resultados inesperados.

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

Producirá "1".

mientras

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

resultará en "2, 1".

Eso significa que Point2f to Point2i redondeará, mientras que el tipo de fundición se truncará.

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

Cuestiones relacionadas