Самый быстрый способ извлечь отдельные данные пикселей? - PullRequest
4 голосов
/ 22 января 2012

Мне нужно получить информацию о скалярном значении множества пикселей на полутоновом изображении с помощью OpenCV. Он будет пересекать сотни тысяч пикселей, поэтому мне нужен самый быстрый из возможных методов. Любой другой источник, который я нашел в Интернете, был очень загадочным и трудным для понимания. Есть ли простая строка кода, которая должна просто передать простое целочисленное значение, представляющее скалярное значение первого канала (яркости) изображения?

Ответы [ 2 ]

4 голосов
/ 22 января 2012
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-битной границе в начале каждой строки

3 голосов
/ 16 января 2013

Что касается публикации Мартина, вы можете фактически проверить, выделяется ли память непрерывно, используя метод isContinuous () в объекте Mat OpenCV. Ниже приводится общая идиома для обеспечения того, чтобы внешний цикл выполнялся только один раз, если это возможно:

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...