2012-06-05 9 views
5

Sto tentando di utilizzare cv::calcOpticalFlowPyrLK ma a volte un'asserzione interna in quella funzione non riesce. L'asserzione è npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0. Sto usando OpenCV 2.3.1. Il codice sorgente per questa funzione è disponibile here.cv :: goodFeaturesToTrack non restituisce alcuna funzionalità

È difficile comprendere il codice, soprattutto a causa della mia limitata esperienza con la computer grafica e la mancanza di commenti. Perché questa affermazione viene innescata e cosa dice del mio problema?

Edit: chiamo la funzione come segue:

cv::calcOpticalFlowPyrLK(curBwFrame, prvFrame, features, newFeatures, trackingStatus, errors); 

ho scoperto che il features vettore, che è stato ottenuto chiamando cv::goodFeaturesToTrack(curBwFrame, features, 5, 0.2, 0.5, skinMask); con una maschera non vuota che sembra essere sufficientemente grande e un immagine valida, non contiene alcuna funzionalità. Come può accadere?

curBwFrame

curBwFrame

skinMask

skinMask

sono in grado di riprodurre il problema utilizzando il seguente frammento di codice:

#include <vector> 
#include <cassert> 
#include <opencv2\opencv.hpp> 
using std::vector; 
using namespace cv; 

int main() { 
    vector<Point2f> features; 
    cv::Mat curBwFrame = imread("curBwFrame.png"); 
    cv::cvtColor(curBwFrame, curBwFrame, CV_RGB2GRAY); 
    imwrite("test.png", curBwFrame); 

    cv::Mat skinMask = imread("skinMask.png"); 
    cv::cvtColor(skinMask, skinMask, CV_RGB2GRAY); 
    imwrite("test.png", skinMask); 

    cv::goodFeaturesToTrack(curBwFrame, features, 5, 0.2, 0.5, skinMask); 
    assert(features.size() > 0); 

    return 0; 
} 
+1

asserzioni controlli che argomento di input è un vettore di punti. Ed è difficile rispondere alla tua domanda senza il tuo codice. –

+0

Ho aggiunto ulteriori informazioni sopra, ma non sono sicuro di quali altre informazioni potrebbero essere pertinenti. Potrei scaricare alcuni frammenti di codice grandi qui ma probabilmente contengono molte informazioni irrilevanti. – Pieter

+0

Mi dispiace per il fatto di aver mescolato alcune chiamate di funzione in precedenza. Ho aggiunto lo snippet corretto sopra! Posso postare la maschera e l'immagine sorgente anche per 'goodFeaturesToTrack' se è necessario. – Pieter

risposta

4

Il problema principale sono la vostra parameters.In il (cambio non compatibilità tra 2.3.1) OpenCV 2.3.2 documentation questa è la descrizione dei parametri del metodo:

void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04) 

Parametri:

  • immagine - Ingresso Immagine a singolo canale a 32 bit oa virgola mobile a 32 bit.
  • angoli
  • - Vettore di uscita degli angoli rilevati.
  • maxCorners - Numero massimo di angoli da restituire. Se ci sono più angoli di quelli trovati, viene restituito il più forte.
  • qualityLevel - Parametro che caratterizza la qualità minima accettata degli angoli dell'immagine.Il valore del parametro viene moltiplicato per la migliore misura di qualità dell'angolo , che è l'autovalore minimo (vedere cornerMinEigenVal()) o la risposta della funzione Harris (vedere cornerHarris()). Gli angoli con la misura di qualità inferiore al prodotto vengono rifiutati. Ad esempio, se l'angolo migliore ha la qualità measure = 1500 e il qualityLevel = 0.01, allora tutti gli angoli con la misura di qualità inferiore a 15 vengono rifiutati.
  • minDistanza - Minima distanza euclidea tra gli angoli restituiti .
  • maschera - Regione di interesse facoltativa. Se l'immagine non è vuota (è necessario che il abbia il tipo CV_8UC1 e le stesse dimensioni dell'immagine), lo specifica la regione in cui vengono rilevati gli angoli.
  • blockSize - Dimensione di un blocco medio per il calcolo di una matrice di covariazione derivata su ciascun quartiere di pixel. Vedi cornerEigenValsAndVecs().
  • useHarrisDetector - Parametro che indica se utilizzare un rilevatore Harris (vedere cornerHarris()) o cornerMinEigenVal().
  • k - Parametro libero del rilevatore Harris.

Ti consiglio di giocare un po 'con qualityLevel e minDistance per soddisfare le tue esigenze.

+0

Con qualityLevel = 0.1 ero già in grado di rilevare 5 funzioni. –

+0

In che modo un valore di 0.1 influisce sul margine di errore? So che aumenterà, ma è un valore di qualità comunemente usato o è considerato inaffidabile? – Pieter

+0

Cosa intendi per margine di errore? goodFeaturesToTrack funziona su una classificazione di "grado" di ciascun pixel su una finestra con dimensione blockSize.Più grande è questo "grado", più probabilmente questo pixel è una caratteristica giustamente differenziabile, il che significa che se tale caratteristica viene vista in altre condizioni, come la diversa illuminazione ambientale o la posa della telecamera, sarà comunque classificata come la stessa funzione. Se un pixel non ha un voto abbastanza grande, non è classificato come caratteristica. Più piccolo è il qualityLevel, più piccolo è il "grado" necessario per classificare un pixel come caratteristica, rendendo meno distanti le funzionalità estratte. –

1

Hai provato goodFeaturesToTrack senza una maschera per vedere se rileva funzionalità all'interno della regione mascherata? È possibile che, poiché l'immagine è scura e che la regione è un po 'non strutturata, GoodFeaturesToTrack non riesce a trovare le caratteristiche lì.

Si potrebbe anche provare ORB or FAST anziché goodFeaturesToTrack. Ho usato con successo ORB con calcOpticalFlowPyrLK (ma non ho provato ad usare una maschera).

Oppure si può provare a rallegrare l'immagine o addirittura a migliorare il contrasto. Non sono sicuro se questo porta miglioramenti, perché penso che il problema più grande del tuo scenario sia che gli oggetti nella scena non hanno abbastanza trama o angoli, che sono le caratteristiche più adatte per questi rivelatori. Ti consiglio di provare ORB e vedere se ottieni più punti.

+0

Quando la regione della maschera viene omessa, seleziona i seguenti pixel: (864, 1170) e (859, 1149). Nessuno di questi punti rientra nella regione della maschera. Non ho familiarità con ORB e FAST. Dove posso trovare ulteriori informazioni su queste tecniche? Non ho [trovato] (https://encrypted.google.com/search?hl=en&q=site%3Aopencv.willowgarage.com%20orb%20fast%20goodfeaturestotrack) le informazioni nei loro documenti. – Pieter

+0

Se rileva solo quei punti senza una maschera, molto probabilmente conferma ciò che ho spiegato nella risposta. Lo aggiornerò con ulteriori informazioni. –

0

L'immagine inizia a colori? Usa cv :: transform per migliorare il contrasto del colore prima di convertirlo in grigio. Scatta per una gamma completa di grigio, da 0 a 255. Non preoccuparti di saturare l'immagine al di fuori della maschera.

0

Se il codice è simile a quello:

Imgproc.goodFeaturesToTrack(mCurrentFrame, initial, NUMBER_OF_FEATURES, 0.1, 10); 
//The OpenCV opticalFlow will crash if the feature vector does not include any elements 
if (initial.elemSize() == 0) { 
    return; 
} 
initial.convertTo(mPrevPts, CvType.CV_32FC2); 

Video.calcOpticalFlowPyrLK(mPreviousFrame, mCurrentFrame, mPrevPts, mNextPts, status,err); 

Assicurarsi di non dimenticare la dichiarazione controllando la dimensione del vettore di feature (initial.elemSize() == 0).

Se questo vettore è vuoto, la conversione da una matrice di punti a virgola mobile inserita dal initial.convertTo() riga non avviene e l'asserzione apparirà quando chiama calOpticalFlowPyrLK

Problemi correlati