2013-01-13 26 views
7

Tôi đang sử dụng Ubuntu 12.04 và opencv 2Sử dụng Mat :: (i, j) trong OpenCV cho một đối tượng 2-D Mat

Tôi đã viết đoạn mã sau:

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

Vấn đề là tôi nhận được các giá trị âm và các giá trị rất lớn trong biến dữ liệu. Tôi nghĩ rằng tôi đã phạm sai lầm ở đâu đó. Bạn có thể vui lòng chỉ nó ra. Tôi đã đọc tài liệu (tôi chưa hoàn thành nó đầy đủ .. nó khá lớn.) Nhưng từ những gì tôi đã đọc, điều này sẽ làm việc. Nhưng nó không phải. Điều gì đang xảy ra ở đây?

Trả lời

11

Img_mat là hình ảnh 3 kênh. Mỗi kênh bao gồm các giá trị pixel uchar trong loại dữ liệu. Vì vậy, với split(Img_mat, BGR), Img_mat được chia thành 3 mặt phẳng màu xanh, lục và đỏ được lưu trữ chung trong một vector BGR. Vì vậy, BGR[0] là lần đầu tiên (màu xanh) máy bay với uchar kiểu dữ liệu pixel ... do đó nó sẽ được

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

vv ...

@bsdnoobz Tôi nghĩ rằng bạn muốn viết

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

như vậy ...

+0

hey cảm ơn bro :) đã giải quyết được vấn đề của tôi. – Chani

1

Tại sao bạn tải IplImage trước? Bạn đang trộn các giao diện C và C++. Tải một cv :: Mat với imread trực tiếp sẽ được thẳng hơn về phía trước.

Bằng cách này bạn cũng có thể chỉ định loại và sử dụng loại theo trong cuộc gọi của bạn.

+0

câu trả lời của bạn không giải quyết được vấn đề. – Chani

+0

@RitwikG nhưng đó là lời khuyên tốt –

+0

@NenadBulatovic đúng – Chani

2

Bạn phải chỉ định loại chính xác cho cv::Mat::at(i,j). Bạn đang truy cập pixel như int, trong khi đó phải là một vectơ của uchar. Mã của bạn sẽ trông giống như sau:

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 
} 
Các vấn đề liên quan