从IPLImage到Mat

6

我熟悉OpenCV 1.1中使用的IPL图像格式。然而,我现在正在使用最新的2.4版本并希望切换到OpenCV的C++接口。以下是我访问图像像素的方法:

int step = img->widthStep;
int height = img->height;
int width = img->width;
unsigned char* data = (unsigned char*) img->imageData;

for (int i=0; i<height; i++)
{
    for (int j=0; j<step; j+=3)          // 3 is the number of channels.
    {
        if (data[i*step + j] > 200)      // For blue
            data[i*step + j] = 255;

        if (data[i*step + j + 1] > 200)  // For green
            data[i*step + j + 1] = 255;

        if (data[i*step + j + 2] > 200)  // For red
            data[i*step + j + 2] = 255;
    }
} 

我需要帮助将这个包含 Mat 结构的代码块转换。虽然我找到了几个函数,但是如果能够整体得到上面几行的精确转换会非常有帮助。

2个回答

8
// Mat mat; // a bgr, CV_8UC3 mat

for (int i=0; i<mat.rows; i++)
{
    // get a new pointer per row. this replaces fumbling with widthstep, etc.
    // also a pointer to a Vec3b pixel, so no need for channel offset, either
    Vec3b *pix = mat.ptr<Vec3b>(i); 
    for (int j=0; j<mat.cols; j++)
    {
        Vec3b & p = pix[j];
        if ( p[0] > 200 ) p[0] = 255;
        if ( p[1] > 200 ) p[1] = 255;
        if ( p[2] > 200 ) p[2] = 255;
    }
}

3

首先,您可以对IPLImage执行相同的操作,并使用Mat的内置构造函数进行转换。

其次,您的代码似乎过于复杂,因为您正在针对所有3个维度执行相同的操作。以下是更简洁的方式(在Mat符号中):

unsigned char* data = (unsigned char*) img.data;

for (int i = 0; i < image.cols * image.rows * image.channels(); ++i) {
  if (*data > 200) *data = 255;
  ++data;
}

如果您希望通道的阈值不同,请按如下操作:

unsigned char* data = (unsigned char*) img.data;
assert(image.channels() == 3);

for (int i = 0; i < image.cols * image.rows; ++i) {
  if (*data > 200) *data = 255;
  ++data;
  if (*data > 201) *data = 255;
  ++data;
  if (*data > 202) *data = 255;
  ++data;
}

在IPL-image中完成所有操作,然后再转换回来——这样做速度够快吗?我不想让这个过程花费额外的处理时间。至于那个过于复杂的问题——这只是一个示例代码,假设我需要为红色、绿色和蓝色设置不同的阈值。你的方法还能行得通吗? - Soumyajit
1
当你在Mat和IplImage之间转换时,有选择复制数据或不复制的选项。如果不复制,则开销非常小。即使您复制,我怀疑开销也不会显著,因为整个处理时间都超过了1秒左右。增加了不同阈值的情况。 - guinny
如果矩阵具有步长,则您的代码将无法正常工作。例如,对于作为另一个矩阵ROI创建的矩阵标头就是这种情况。使用迭代器或行指针访问来避免此类错误! - ypnos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接