提取单个像素数据的最快方法?

时间:2012-01-22 18:46:06

标签: c++ image-processing opencv computer-vision

我必须使用OpenCV获取有关灰度图像上许多像素的标量值的信息。它将遍历数十万像素,因此我需要尽可能快的方法。我在网上发现的每一个其他来源都非常神秘,难以理解。有一个简单的代码行应该只提交一个表示图像第一个通道(亮度)的标量值的简单整数值吗?

2 个答案:

答案 0 :(得分:4)

for (int row=0;row<image.height;row++) {
    unsigned char *data = image.ptr(row);
    for (int col=0;col<image.width;col++) {
       // then use *data for the pixel value, assuming you know the order, RGB etc           
       // Note 'rgb' is actually stored B,G,R
       blue= *data++;
       green = *data++;
       red = *data++;
    }
}

您需要在每个新行上获取数据指针,因为opencv会将数据填充到每行开头的32位边界

答案 1 :(得分:3)

关于Martin的帖子,您实际上可以使用OpenCV的Mat对象中的isContinuous()方法来检查是否连续分配了内存。以下是一个常见的习惯用法,用于确保外环仅在可能的情况下循环一次:

#include <opencv2/core/core.hpp>

using namespace cv;

int main(void)
{

    Mat img = imread("test.jpg");
    int rows = img.rows;
    int cols = img.cols;

    if (img.isContinuous())
    {
        cols = rows * cols; // Loop over all pixels as 1D array.
        rows = 1;
    }

    for (int i = 0; i < rows; i++)
    {
        Vec3b *ptr = img.ptr<Vec3b>(i);
        for (int j = 0; j < cols; j++)
        {
            Vec3b pixel = ptr[j];
        }
    }

    return 0;
}