2012-06-08 15 views
5

sto cercando di imparare OpenCV, e di essere un duro testa, sto cercando di eseguire il seguente algoritmo:OpenCV elemento di accesso da Mat

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

Ora, essendo l'individuo testa dura, mi interessa per vedere cosa cur_features sta tenendo ... Mi aspettavo un 400x2 cv :: Mat ma invece ho ottenuto un 400x1 cv :: Mat

Nessun biggy, penso che sia forse un indice diretto. Tuttavia, per LIFE of me NON POSSO estrarre un valore da cur_features.at (0) e stamparlo.

Cosa sto sbagliando? Ho visto il buonFeaturesToTrack_Demo.cpp. Alcune cose da notare su quella demo che differiscono per la mia. Ho provato le seguenti chiamate dato quell'esempio:

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. 

Qualcuno potrebbe indirizzarmi verso una documentazione che spiega come raggiungere il mio obiettivo? GoodFeaturesToTrack ti dice che restituisce un OutputArray che è un vettore di angoli, ma da nessuna parte descrive il tipo di questi angoli. Dove nella documentazione dovrei cercare questa risposta nel caso in cui la ottenga con altri metodi?


Edit: Inoltre, cosa è il punto di Mat :: tipo(). Non riesco a trovare dove si possa spiegare il valore restituito ... Sto cercando un'enumerazione nella documentazione, ma non riesco a trovarla.

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

Per quanto riguarda l'enumerazione dei tipi, guarda in types_c.h, troverai '#define CV_8UC1 CV_MAKETYPE (CV_8U, 1)' e così via. Questo è il tipo() restituisce – Pablo

risposta

5

Come suggerimento, provare a inizializzare matrici con le dimensioni e il 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 

Per ottenere un valore di una stuoia

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 

E una tecnica di debug a portata di mano per Visual Studio che mi ha aiutato molto

  • 1- Fare clic con il tasto destro di cur_features durante il debug.
  • 2- Controllo immediato
  • 3- Write questo:

    (float *) cur_features.data, 400

  • 4- Si vedrà tutti i valori dell'array

+0

errori fissi: il numero del canale influenza anche il tipo di dati di un singolo pixel, anche non 32_FC1 ma CV_32_FC1. –

2

Qui si dice: http://opencv.itseez.com/modules/imgproc/doc/feature_detection.html

Che si dovrebbe fare un vector<Point2f> come l'array di uscita.

Si dichiara come tale nella goodFeaturesToTrack_Demo.cpp nella mia copia locale del OpenCV:

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

UPDATE: Il link che ho dato sopra utilizza un argomento di template OutputArray per gli angoli. La documentazione a http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html per la versione 2.1 della libreria fanno stato di vector<Point2f>

+1

Ciao Pablo, grazie per la tua risposta. Non riesco a trovare il punto in cui nella documentazione nota che dovrebbe essere il vettore . Tuttavia, sono d'accordo sul fatto che negli esempi si noti l'uso di un vettore std :: di strutture Point2f. – Constantin

+0

'std :: vector' e' cv :: vector' sono gli stessi (convenienza typedef, controlla le intestazioni). Ciò che NON è lo stesso è 'cv :: Vec ' –

4

Si scopre che anche se il mio goodFeaturesToTrack restituisce un 400x1, stavo facendo su un immagine in bianco e quindi senza spigoli. Ciò ha causato

cur_features.data == NULL 

situazione interessante in cui il codice C sembra essere più facile e più facile da usare rispetto al codice C++.