【问题标题】:Using Mat::at(i,j) in opencv for a 2-D Mat object在 opencv 中使用 Mat::at(i,j) 获取二维 Mat 对象
【发布时间】:2012-12-27 12:08:00
【问题描述】:

我使用的是 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*/ 
}

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

【问题讨论】:

    标签: c++ opencv image-processing


    【解决方案1】:

    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);
    

    等等……

    【讨论】:

      【解决方案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
      }
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-10
          • 1970-01-01
          • 1970-01-01
          • 2016-08-31
          • 2012-04-27
          • 2014-02-02
          • 2012-01-01
          相关资源
          最近更新 更多