OpenCV с RGB 16 бит - PullRequest
       11

OpenCV с RGB 16 бит

1 голос
/ 31 декабря 2011

У меня есть данные (символ без знака *) в формате RGB 16 бит R: 5 G: 6 B: 5
Как я могу установить эти данные в формате IplImage?
Я могу начать с:

unsigned char* data = ...data...;
IplImage *img = cvCreateImage(cvSize(800,480), IPL_DEPTH_8U, 3); // Should it be 16?
cvSetData(img,data,800*2); // Here is where I am not sure

1 Ответ

2 голосов
/ 01 января 2012

Вам нужно будет преобразовать IPL_DEPTH_16U (одноканальный) в IPL_DEPTH_8U (трехканальный).

Ниже приведен код, который я написал быстро (это должно сработать, но у меня нет изображения 565, пригодного для его тестирования, поэтому сначала я попробую это сделать на нескольких тестовых изображениях ...)

#include <opencv2/core/core.hpp>
#include <iostream>

using namespace std;
using namespace cv;

#define RED_MASK 0xF800
#define GREEN_MASK 0x07E0
#define BLUE_MASK 0x001F


int main(int argc, char* argv[])
{
    IplImage *rgb565Image = cvCreateImage(cvSize(800, 480), IPL_DEPTH_16U, 1);
    IplImage *rgb888Image = cvCreateImage(cvSize(800, 480), IPL_DEPTH_8U, 3);

    unsigned short* rgb565Data = (unsigned short*)rgb565Image->imageData;
    int rgb565Step = rgb565Image->widthStep / sizeof(unsigned short);

    uchar* rgb888Data = (uchar*)rgb888Image->imageData;

    float factor5Bit = 255.0 / 31.0;
    float factor6Bit = 255.0 / 63.0;

    for(int i = 0; i < rgb565Image->height; i++)
    {
        for(int j = 0; j < rgb565Image->width; j++)
        {
            unsigned short rgb565 = rgb565Data[i*rgb565Step + j];
            uchar r5 = (rgb565 & RED_MASK)   >> 11;
            uchar g6 = (rgb565 & GREEN_MASK) >> 5;
            uchar b5 = (rgb565 & BLUE_MASK);

            // round answer to closest intensity in 8-bit space...
            uchar r8 = floor((r5 * factor5Bit) + 0.5);
            uchar g8 = floor((g6 * factor6Bit) + 0.5);
            uchar b8 = floor((b5 * factor5Bit) + 0.5);

            rgb888Data[i*rgb888Image->widthStep + j]       = r8;
            rgb888Data[i*rgb888Image->widthStep + (j + 1)] = g8;
            rgb888Data[i*rgb888Image->widthStep + (j + 2)] = b8;
        }
    }

    return 0;
}

Вероятно, вы можете сделать это быстрее, используя справочную таблицу для преобразования, но то, что у меня есть, должно быть хорошо для поучительного использования.

Кроме того, посмотрите этот ТАК пост для дальнейшего обсуждения этой темы.

...