在OpenCV中使用Mat::at(i,j)处理2D Mat对象

8

我正在使用Ubuntu 12.04和OpenCV 2

我编写了以下代码:

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

问题在于我的数据变量中出现了负值和非常大的值。我想我可能犯了一些错误,请您指出来。
我一直在阅读文档(还没有完全阅读完...它很大)。但是根据我所读的内容,这应该可以工作。但它没有。这里出了什么问题?

3个回答

13

Img_mat是一张三通道的图像。每个通道由数据类型为uchar的像素值组成。通过split(Img_mat, BGR),将Img_mat拆分成蓝色、绿色和红色三个平面,并将它们共同存储在向量BGR中。因此,BGR[0]是第一个(蓝色)平面,其像素为数据类型为uchar...因此它将是

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

等等...


2

您需要为cv::Mat::at(i,j)指定正确的类型。您正在将像素作为int访问,而实际上它应该是一个uchar向量。您的代码应该类似于以下内容:

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
}

1
为什么你首先加载了一个IplImage?你混合使用了C和C++接口。直接使用imread加载cv::Mat会更加简单明了。
这样你还可以指定类型并在at调用中使用相应的类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接