如何在Opencv中访问RGB值?

时间:2012-11-26 14:54:31

标签: c++ opencv

我对使用多个频道感到困惑。 以下哪一项是正确的?

// roi is the image matrix

for(int i = 0; i < roi.rows; i++)
{
    for(int j = 0; j < roi.cols; j+=roi.channels())
    {
        int b = roi.at<cv::Vec3b>(i,j)[0];
        int g = roi.at<cv::Vec3b>(i,j)[1];
        int r = roi.at<cv::Vec3b>(i,j)[2];
        cout << r << " " << g << " " << b << endl ;
    }
}

或者,

for(int i = 0; i < roi.rows; i++)
{
    for(int j = 0; j < roi.cols; j++)
    {
        int b = roi.at<cv::Vec3b>(i,j)[0];
        int g = roi.at<cv::Vec3b>(i,j)[1];
        int r = roi.at<cv::Vec3b>(i,j)[2];
        cout << r << " " << g << " " << b << endl ;
    }
}

3 个答案:

答案 0 :(得分:2)

第二个是正确的, Mat内的行和列表示像素数, 而通道与行和列号无关。 和CV默认使用BGR,所以假设Mat没有转换为RGB,那么代码是正确的

参考,个人经历,OpenCV docs

答案 1 :(得分:1)

从图像中获取颜色分量的一种更快捷的方法是将图像表示为IplImage结构,然后使用像素大小和通道数来使用指针算法迭代它。

例如,如果您知道图像是3通道图像,每个像素1个字节且格式为BGR(OpenCV中的默认值),则以下代码将可以访问其组件:

(在以下代码中,img的类型为IplImage。)

for (int y = 0; y < img->height; y++) {
    for(int x = 0; x < img->width; x++) {
        uchar *blue = ((uchar*)(img->imageData + img->widthStep*y))[x*3];
        uchar *green = ((uchar*)(img->imageData + img->widthStep*y))[x*3+1];
        uchar *red = ((uchar*)(img->imageData + img->widthStep*y))[x*3+2];
    }
}

要获得更灵活的方法,您可以使用CV_IMAGE_ELEM中定义的types_c.h宏:

/* get reference to pixel at (col,row),
   for multi-channel images (col) should be multiplied by number of channels */
#define CV_IMAGE_ELEM( image, elemtype, row, col )       \
    (((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])

答案 2 :(得分:0)

我猜第二个是正确的,然而获取这样的数据是非常耗时的。

更快的方法是使用IplImage *数据结构并增加指向roi中包含的数据大小的地址...