在openCV中访问特定图像中所有像素的RGB值

时间:2017-01-12 13:21:35

标签: c++ opencv rgb pixel

我已经彻底搜索了互联网和stackoverflow,但我没找到我到底想要的东西!

如何在OpenCV中获取特定图像(图像的所有像素)的RGB(BGR实际值)值?我正在使用C ++,图像存储在cv :: Mat变量中。

到目前为止,我正在展示我的一些努力:我尝试了另一个stackoverflow链接中的代码。但是每次重新运行代码时,十六进制中的值都会改变!例如,一旦它的00CD5D7C,在下一次运行中它是00C09D7C。

cv::Mat img_rgb = cv::imread("img6.jpg");
Point3_<uchar>* p = img_rgb.ptr<Point3_<uchar> >(10,10);
p->x; //B
p->y; //G
p->z; //R
std::cout<<p;

在另一次尝试中,我使用了另一个答案的代码。这里的输出总是-858993460。

img_rgb.at<cv::Vec3b>(10,10);
img_rgb.at<cv::Vec3b>(10,10)[0] = newval[0];
img_rgb.at<cv::Vec3b>(10,10)[1] = newval[1];
img_rgb.at<cv::Vec3b>(10,10)[2] = newval[2];

cout<<newval[0]; //For cout<<newval[1]; cout<<newval[2]; the result is still same

注意:我使用(10,10)作为测试来获取RGB,我的目标是获取整个图像的RGB值!

1 个答案:

答案 0 :(得分:0)

由于您要加载彩色图像(类型为CV_8UC3),因此需要使用.at<Vec3b>(row, col)访问其元素。元素采用BGR顺序:

Mat img_bgr = imread("path_to_img");

for(int r = 0; r < img_bgr.rows; ++r) {
    for(int c = 0; c < img_bgr.cols; ++c) {
        std::cout << "Pixel at position (x, y) : (" << c << ", " << r << ") =" <<
             img_bgr.at<Vec3b>(r,c) << std::endl;
    }
}

您还可以简化使用Mat3b(又名Mat_<Vec3b>),因此您不需要使用.at函数,而是直接使用括号:

Mat3b img_bgr = imread("path_to_img");

for(int r = 0; r < img_bgr.rows; ++r) {
    for(int c = 0; c < img_bgr.cols; ++c) {
        std::cout << "Pixel at position (x, y) : (" << c << ", " << r << ") =" <<
             img_bgr(r,c) << std::endl;
    }
}

要获得每个频道,您可以轻松完成:

 Vec3b pixel = img_bgr(r,c); // or img_bgr.at<Vec3b>(r,c)
 uchar blue = pixel[0];
 uchar green = pixel[1];
 uchar red = pixel[2];