7

我正在使用 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*/ 
}

问题是我在数据变量中得到负值和非常大的值。我想我在某个地方犯了一些错误。你能指出来吗?
我一直在阅读文档(我还没有完全完成它。它很大。)但是从我所读的内容来看,这应该可以工作。但它不是。这里出了什么问题?

4

3 回答 3

11

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

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

很快...

于 2013-01-13T13:36:00.850 回答
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
}
于 2013-01-13T12:33:14.997 回答
1

为什么要先加载 IplImage?您正在混合 C 和 C++ 接口。直接用 imread 加载 cv::Mat 会更直接。

这样,您还可以指定类型并在您的通话中使用相应的类型。

于 2013-01-13T12:08:57.940 回答