OpenCV non fornisce una funzione RANSAC di per sé o almeno in tale forma che puoi semplicemente chiamarla e farla (es. cv::ransac(...)
). Tutte le funzioni/metodi che sono in grado di usare RANSAC hanno un flag che lo abilita. Tuttavia questo non è sempre utile se in realtà vuoi fare qualcos'altro con i calcoli inresensivi di RANSAC dopo aver stimato un'omografia/matrice fondamentale, ad esempio, creare un buon grafico in Octave o software/libreria simile dei punti, applicare algoritmi aggiuntivi sul restante serie di corrispondenze filtrate ecc.OpenCV: come ottenere punti iniziali usando findHomography()/findFundamental() e RANSAC
Dopo aver abbinato due immagini si ottiene un vettore di corrispondenze. Insieme a questo abbiamo ovviamente 2 set di punti chiave (uno per ogni immagine) che sono stati utilizzati nel processo di abbinamento. Usando le corrispondenze e i punti chiave creiamo due vettori di punti (ad esempio cv::Point2f points
) e li passiamo a findHomography()
. Dai post this e this ho scoperto come esattamente gli inlier sono contrassegnati usando una maschera, che passiamo a quella funzione. Ogni riga all'interno della maschera si riferisce a un valore inlier/outlier. Tuttavia non sono in grado di capire come utilizzare le informazioni dell'indice delle righe dai miei due insiemi di punti. Guardare il codice sorgente di OpenCV non mi ha portato troppo lontano. In findFundamental()
(simile a findHomography()
quando si tratta della sua firma e della parte maschera) usano compressPoints()
, che sembra in qualche modo combinare i due set che abbiamo come input (punti di origine e destinazione) in uno. Durante il test per determinare la natura della maschera ho provato 2 set di punti abbinati (convertito da cv::Keypoints
a cv::Point2f
- una procedura standard). Ogni set contiene 300 punti quindi in totale abbiamo 600 punti. La maschera restituita contiene 300 righe (i valori non sono importanti per questo argomento).
EDIT: Mentre scrivevo questo ho scoperto la risposta (vedi sotto) ma ho deciso di postare comunque questa domanda nel caso qualcuno avesse bisogno di queste informazioni il prima possibile e in forma compatta. Nota che abbiamo ancora bisogno di una funzione di OpenCV, che supporti RANSAC. Quindi, se hai una serie di punti ma non hai intenzione di calcolare l'omografia o la matrice fondamentale, questo non è ovviamente il modo e oserei dire che non sono riuscito a trovare nulla di utile nell'API di OpenCV che possa aiutare a evitare questo ostacolo, quindi devi usare una libreria esterna.
Per la prima frase, in realtà la riga in maschera non costituiscono inlier. La riga rappresenta lo stato di inlier o outlier. Fare riferimento a questo post [collegamento] (http://stackoverflow.com/questions/15815304/opencv-c-findhomography-mask-values-meaning) per ulteriori spiegazioni. –
Sì, è corretto e questo è ciò che intendevo, ma ora che rileggo questa frase vedo come può essere male interpretato. Lo cambierò. – rbaleksandar
Ma la riga rappresenta lo stato di inlier o valori anomali ma non vi è alcun punto chiave su ogni stato di inlier o di valori anomali. i punti chiave sono memorizzati nel vettore. quindi, come possiamo ottenere il corrispondente punto chiave di inlier nella maschera? – Abc