ARToolkit с использованием неподвижного изображения

Я пытаюсь использовать ARtoolkit, но со статичным изображением вместо видеопотока. Мне нужно иметь возможность загружать изображение, идентифицировать маркеры и находить их. Я использую SDL для загрузки изображения. Я могу получить значения RGB для каждого пикселя из загруженного изображения, но не знаю, как отформатировать данные, чтобы ARToolkit мог с ними работать.

ARToolkit хранит свои изображения как тип ARUint8* (беззнаковый char*). Я смущен тем, как этот формат работает. Прямо сейчас у меня есть этот код внутри основного цикла, который работает непрерывно по мере выполнения программы. Этот код (должен) распечатывать значения RGB для каждого пикселя в кадре.

ARUint8* dataPtr;
dataPtr = arVideoGetImage(); // Get a new frame from the webcam

int width, height;  
if (arVideoInqSize(&width, &height) == 0) // if width and height could be obtained
{
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            printf("pixel %i, %i: %i, %i, %i\n", x, y, dataPtr[(y * 320) + x], dataPtr[(y * 320) + x + 1], dataPtr[(y * 320) + x + 2]);
        }
    }
}

Типичный вывод:

pixel 5, 100: 0, 0, 0
pixel 6, 100: 178, 3, 0
pixel 7, 100: 0, 0, 177
etc...

Кажется, что он правильно обращается к значениям RGB, но я не уверен, как скопировать данные изображения (из формата SDL) в этот новый формат.


person minimidge    schedule 14.05.2014    source источник
comment
Вы тестировали код? Каков текущий выход?   -  person rbatt    schedule 15.05.2014
comment
Добавлен образец вывода. Пересмотрел мой вопрос, так как он больше касается получения данных изображения в формате, который хочет ARToolkit.   -  person minimidge    schedule 15.05.2014


Ответы (1)


Догадаться. Публикация ответа на случай, если он кому-то еще понадобится.

В Windows ARToolkit по умолчанию использует BGRA для массива dataPtr. Следующая функция загрузит изображение (используя SDL) и вернет указатель на ARUint8 (который содержит данные изображения).

ARUint8* loadImage(char* filename, int* w, int* h)
{
    SDL_Surface* img = IMG_Load(filename);
    if (!img)
    {
        printf("Image '%s' failed to load. Error: %s\n", filename, IMG_GetError());
        return NULL;
    }
    *w = img->w; // Assign width and height to the given pointers
    *h = img->h;

    ARUint8* dataPtr = (ARUint8*)calloc(img->w * img->h * 4, sizeof(ARUint8)); // Allocate space for image data

    // Write image data to the dataPtr variable
    for (int y = 0; y < img->h; y++)
    {
        for (int x = 0; x < img->w; x++)
        {
            Uint8 r, g, b;
            SDL_GetRGB(getpixel(img, x, y), img->format, &r, &g, &b); // Get the RGB values
            int i = ((y * img->w) + x) * 4; // Figure out index in array
            dataPtr[i] = b;
            dataPtr[i + 1] = g;
            dataPtr[i + 2] = r;
            dataPtr[i + 3] = 0; // Alpha
        }
    }
    SDL_FreeSurface(img);
    return dataPtr;
}

Функция getpixel позаимствована отсюда: http://sdl.beuc.net/sdl.wiki/Pixel_Access

Эта функция позволила мне использовать фотографию вместо видеопотока с веб-камеры.

person minimidge    schedule 26.05.2014