2013-01-13 15 views
7

Sto usando Ubuntu 12.04 e OpenCV 2Utilizzando Mat :: a (i, j) in OpenCV per un oggetto 2-D Mat

Ho scritto il seguente codice:

IplImage* img =0; 
    img = cvLoadImage("nature.jpg"); 
    if(img != 0) 
    { 
     Mat Img_mat(img); 
     std::vector<Mat> RGB; 
     split(Img_mat, RGB); 

     int data = (RGB[0]).at<int>(i,j)); /*Where i, j are inside the bounds of the matrix size .. i have checked this*/ 
} 

Il problema sto ricevendo valori negativi e valori molto grandi nella variabile dei dati. Penso di aver fatto qualche errore da qualche parte. Puoi per favore segnalarlo. Ho letto la documentazione (non l'ho terminata completamente .. è abbastanza grande). Ma da quello che ho letto, questo dovrebbe funzionare. Ma non lo è. Cosa sta andando storto qui?

risposta

11

Img_mat è un'immagine a 3 canali. Ogni canale è costituito da valori di pixel uchar nel tipo di dati. Quindi con split(Img_mat, BGR) il Img_mat è diviso in 3 piani di blu, verde e rosso che sono collettivamente memorizzati in un vettore BGR. Così BGR[0] è la prima (blu) aereo con uchar tipo di dati pixel ... da qui sarà

int dataB = (int)BGR[0].at<uchar>(i,j); 
int dataG = (int)BGR[1].at<uchar>(i,j); 

così via ...

@bsdnoobz penso che si voleva scrivere

Vec3b data = Img_mat.at<Vec3b>(i,j); 
data[0] = // blue pixel 
data[1] = // green pixel 

così via ...

+0

hey grazie fratello :) risolto il mio problema. – Chani

1

Perché caricare prima un IplImage? Stai mescolando le interfacce C e C++. Caricare un cv :: Mat con imread direttamente sarebbe più diretto.

In questo modo è anche possibile specificare il tipo e utilizzare il tipo corrispondente nella chiamata.

+0

la risposta non risolve il problema. – Chani

+0

@RitwikG ma è un buon consiglio –

+0

@NenadBulatovic true – Chani

2

È necessario specificare il tipo corretto per cv::Mat::at(i,j). Stai accedendo al pixel come int, mentre dovrebbe essere un vettore di uchar. Il tuo codice dovrebbe apparire in questo modo:

IplImage* img = 0; 
img = cvLoadImage("nature.jpg"); 
if(img != 0) 
{ 
    Mat Img_mat(img); 
    std::vector<Mat> BGR; 
    split(Img_mat, BGR); 

    Vec3b data = BGR[0].at<Vec3b>(i,j); 
    // data[0] -> blue 
    // data[1] -> green 
    // data[2] -> red 
}