Using Mat::at(i,j) in opencv for a 2-D Mat object

后端 未结 3 760
说谎
说谎 2020-12-10 07:39

I am using Ubuntu 12.04 and OpenCV 2

I have written the following code :

IplImage* img =0;
img = cvLoadImage(\"nature.jpg\");
if(img != 0)
{
    Mat         


        
相关标签:
3条回答
  • 2020-12-10 08:00

    Why are you loading an IplImage first? You are mixing the C and C++ interfaces. Loading a cv::Mat with imread directly would be more straight-forward.

    This way you can also specify the type and use the according type in your at call.

    0 讨论(0)
  • 2020-12-10 08:08

    You have to specify the correct type for cv::Mat::at(i,j). You are accessing the pixel as int, while it should be a vector of uchar. Your code should look something like this:

    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
    }
    
    0 讨论(0)
  • 2020-12-10 08:11

    Img_mat is a 3 channeled image. Each channel consists of pixel values uchar in data type. So with split(Img_mat, BGR) the Img_mat is split into 3 planes of blue, green and red which are collectively stored in a vector BGR. So BGR[0] is the first (blue) plane with uchar data type pixels...hence it will be

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

    so on...

    0 讨论(0)
提交回复
热议问题