2013-01-13 11 views
7

używam Ubuntu 12.04 i OpenCV 2Korzystanie Mat :: w (i, j) w OpenCV dla obiektu 2-D Mat

mam napisane następujący kod:

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*/ 
} 

Problem otrzymuję wartości ujemne i bardzo duże wartości w zmiennej danych. Chyba popełniłem jakiś błąd. Czy możesz to wskazać. Przeczytałem dokumentację (nie skończyłem jej w pełni ... jest dość duża). Z tego, co przeczytałem, powinno to zadziałać. Ale tak nie jest. Co tu jest nie tak?

Odpowiedz

11

Img_mat to obraz 3-kanałowy. Każdy kanał składa się z wartości pikseli uchar w typie danych. Tak więc z split(Img_mat, BGR)Img_mat jest podzielony na 3 płaszczyzny niebieskiego, zielonego i czerwonego, które są zbiorczo przechowywane w wektorze BGR. Więc BGR[0] to pierwszy (niebieski) samolot z uchar typu danych pikseli ... stąd będzie

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

tak dalej ...

@bsdnoobz Chyba chciałeś napisać

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

tak na ...

+0

hej dzięki bro :) rozwiązał mój problem. – Chani

1

Dlaczego ładujesz najpierw IplImage? Miksujesz interfejsy C i C++. Ładowanie cv :: Mata z imreadem bezpośrednio będzie bardziej prosta.

W ten sposób możesz również określić typ i użyć odpowiedniego typu w swoim abonamencie.

+0

Twoja odpowiedź nie rozwiąże problemu. – Chani

+0

@RitwikG ale jest dobra rada –

+0

@NenadBulatovic true – Chani

2

Musisz podać poprawny typ dla cv::Mat::at(i,j). Uzyskujesz dostęp do piksela jako int, a powinien on być wektorem uchar. Twój kod powinien wyglądać mniej więcej tak:

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 
}