2011-11-15 14 views
6

Come accedere ai singoli pixel in OpenCV 2.3 usando C++?
per la mia immagine U8C3 ho provato questo:Accesso ai valori dei pixel OpenCV 2.3 - C++

Scalar col = I.at<Scalar>(i, j); 

e

p = I.ptr<uchar>(i); 

primo è un'eccezione, il secondo sta tornando alcuni dati non correlati. Inoltre, tutti gli esempi che sono riuscito a trovare sono per IIPimage precedente (?) Per la versione C di OpenCV.

Tutto ciò di cui ho bisogno è ottenere il colore del pixel a coordinate date.

risposta

9

Il tipo che si chiama cv::Mat::at con deve corrispondere al tipo dei singoli pixel. Poiché cv::Scalar è fondamentalmente un cv::Vec<double,4>, questo non funzionerà per un'immagine U8C3 (funzionerebbe per un'immagine F64C4, ovviamente).

Nel tuo caso è necessario un cv::Vec3b, che è un typedef per cv::Vec<uchar,3>:

Vec3b col = I.at<Vec3b>(i, j); 

È quindi possibile convertire questo in un cv::Scalar se si ha realmente bisogno, ma il tipo di cv::Mat::at esemplificazione necessario far corrispondere la tipo della tua immagine, dato che getta solo i dati dell'immagine senza alcuna conversione.

Il tuo secondo snippet di codice restituisce un puntatore alla riga di ith dell'immagine. Non sono dati non correlati, ma solo un puntatore ai singoli valori uchar. Quindi, nel caso di un'immagine U8C3, ogni 3 elementi consecutivi nei dati restituiti a p dovrebbe rappresentare un pixel. Di nuovo, per ottenere ogni pixel come un unico elemento utilizzare

Vec3b *p = I.ptr<Vec3b>(i); 

che non fa altro che ancora un cast appropriato del puntatore di riga prima di restituirla.

MODIFICA: Se si desidera eseguire molti pixel di accesso all'immagine, è anche possibile utilizzare il tipo di convenienza cv::Mat_. Questo non è altro che un involucro sottile digitato intorno ai dati di immagine, in modo che tutti gli accessi ai pixel dell'immagine sono adeguatamente scelto:

Mat_<Vec3b> &U = reinterpret_cast<Mat_<Vec3b>&>(I); 

È quindi possibile utilizzare liberamente U(i, j) e sempre si porta sul 3-tuple di caratteri non firmati e quindi pixel, sempre senza copiare, basta digitare cast (e quindi con le stesse prestazioni di I.at<Vec3b>(i, j)).

+0

Grazie per la risposta rapida. Sono stato davvero confuso con più canali e come sono memorizzati. – jnovacho

Problemi correlati