OpenCV rgb value for cv::Point in cv::Mat

前端 未结 2 1259
南方客
南方客 2020-12-09 23:56

I\'ve looked at different questions already here on StackOverflow, but none seems to helps. What I want to do is quite simple: I have a cv::Point and I need to

相关标签:
2条回答
  • It depends on the type of the image/Mat. If the image is just a normal 1 byte for each rgb per pixel, then this is one way to access it. It's pretty efficient, but not the safest way:

    // The RGB values are stored in reverse order (i don't know why)
    struct RGB { unsigned char b, g, r; };
    
    // Assumes 1 byte for r,g,b
    RGB& GetRGB(cv::Mat &mat, cv::Point p)
    {
      assert((mat.step/mat.cols) == sizeof(RGB));
      RGB *data = (RGB*)mat.data;
      data += p.y * mat.cols + p.x;
      return *data;
    }
    

    If the Mat is of different type, then you will just need to change the structure of RGB to match what you need.

    Try changing the type of the image you read in to a normal RGB image with this code:

    Mat in, out;
    cvtColor(in, out, CV_8UC3);
    
    0 讨论(0)
  • 2020-12-10 00:29

    That's really easy. However the documentation of OpenCV is good at hiding the simple answers.

    Here is example code:

    cv::Mat3b image = imread(filename);
    cv::Point point(23, 42);
    cv::Vec3b template;
    template[0] = 128; template[1] = 12; template[2] = 64;
    
    const cv::Vec3b& bgr = image(point);
    if (bgr[0] == template[0] && bgr[1] == template[1] && bgr[2] == template[2])
       std::cout << "Colors match!" << std::endl;
    

    There are probable better ways of dealing with the cv::Vec, but I forgot. See also the OpenCV Cheat Sheet.

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