7

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

// 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 ;
    }
}
4

3 回答 3

2

第二个是正确的,Mat里面的rows和cols代表像素的个数,而channel跟rows和cols的个数无关。而CV默认使用BGR,所以假设Mat没有转换为RGB那么代码是正确的

参考,个人经验,OpenCV 文档

于 2013-10-20T11:25:04.747 回答
1

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

例如,如果您知道您的图像是每像素 1 个字节的 3 通道图像,并且其格式为 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)])
于 2013-04-16T11:14:56.333 回答
0

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

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

于 2013-04-16T10:21:25.783 回答