2012-06-08 22 views
5

Estoy intentando aprender OpenCV, y siendo un cabeza dura, estoy tratando de ejecutar el algoritmo siguiente:OpenCV elemento de acceso desde Mat

cv::Mat cur_features; 
cv::goodFeaturesToTrack(current_image, cur_features, 400, 0.01, 0.01); 

Ahora bien, ser la persona cabeza dura, estoy interesado para ver qué cur_features está conteniendo ... esperaba un 400x2 cv :: Mat, pero en su lugar obtuve un cv de 400x1 :: Mat

No hay problema, creo que es un índice directo. Sin embargo, por la VIDA de mí NO PUEDO extraer un valor de cur_features.at (0) e imprimirlo.

¿Qué estoy haciendo mal? He visto las goodFeaturesToTrack_Demo.cpp. Algunas cosas para destacar en esa demostración que difieren para la mía. Probé los siguientes llamadas dado ese ejemplo:

std::cout << cur_features.size() << std::endl; // This throws a compile time error even though its in the example 
std::cout << cur_features.at<Point2f>(0).x << std::endl; //This throws a run time error. 

¿Alguien podría dirigir a algún tipo de documentación que explica cómo lograr mi objetivo? El goodFeaturesToTrack te dice que devuelve un OutputArray que es un vector de esquinas, pero en ninguna parte describe el tipo de esas esquinas. ¿En qué parte de la documentación buscaría esta respuesta en caso de que la obtenga con otros métodos?


Editar: También, cuál es el punto de Mat :: tipo(). No puedo encontrar dónde se puede explicar el valor devuelto ... Estoy buscando una enumeración en la documentación pero tengo problemas para encontrarla.

std::cout << current_image.type() << std::endl; //This returns 0 
std::cout << cur_features.type() << std::endl; //This returns 13 
+1

En cuanto a la enumeración de tipo, busque en types_c.h, encontrará '#define CV_8UC1 CV_MAKETYPE (CV_8U, 1)' y así sucesivamente. Eso es lo que type() devuelve – Pablo

Respuesta

5

Como sugerencia, trate de inicializar las matrices de dimensiones y tipo

cv::Mat cur_features(400,1,CV_32_FC1); //400x1 32 bits, 1 channel 
cv::Mat cur_features2(400,1,CV_32_FC2); //400x1 32 bits, 2 channels 

Para obtener un valor de una estera

int pos = 0; 
foat value = cur_features.at<float>(pos); 
cv::Vec2f value2 = cur_features2.at<Vec2f>(pos); // for a two channel, CV_23F image 

y una técnica de depuración útil para Visual Studio que me ha ayudado mucho

  • 1- Haga clic derecho cur_features al depurar.
  • 2- Inspección rápida
  • 3- escribir esto:

    (float *) cur_features.data, 400

  • 4- Usted verá todos los valores de la matriz

+0

errores corregidos: el número de canal también afecta el tipo de datos de un solo píxel, tampoco 32_FC1 sino CV_32_FC1. –

2

Aquí dice: http://opencv.itseez.com/modules/imgproc/doc/feature_detection.html

Eso debería darle una vector<Point2f> como la matriz de salida.

Se declara como tal en el goodFeaturesToTrack_Demo.cpp en mi copia local de OpenCV:

vector<Point2f> corners; 
    ... 
    /// Apply corner detection 
    goodFeaturesToTrack(src_gray, 
       corners, 
       maxCorners, 
       qualityLevel, 
       minDistance, 
       Mat(), 
       blockSize, 
       useHarrisDetector, 
       k); 

ACTUALIZACIÓN: El enlace que he dado anteriormente utiliza un argumento plantilla OutputArray para las esquinas. Los documentos en http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html para la versión 2.1 de la biblioteca hacen estado vector<Point2f>

+1

Hola Pablo, gracias por tu respuesta. Tengo problemas para encontrar el lugar en la documentación que indica que debe ser el vector . Sin embargo, estoy de acuerdo en que los ejemplos señalan el uso de un std :: vector de estructuras de Point2f. – Constantin

+0

El 'std :: vector' y' cv :: vector' son los mismos (conveniencia typedef, verifique los encabezados). Lo que NO es lo mismo es 'cv :: Vec ' –

4

Resulta que aunque mi goodFeaturesToTrack devuelve un 400x1, lo estaba haciendo en una imagen negra y por lo tanto no hay esquinas. Esto causó

cur_features.data == NULL 

situación interesante en el que el código C parece ser más fácil y más fácil de usar que el código C++.

Cuestiones relacionadas