Как сделать OpenCV IplImage для 16-битных данных серого цвета?

Этот код предназначен для 8-битных данных, чтобы сделать IplImage в оттенках серого.

    IplImage* img_gray_resize = NULL;
    img_gray_resize = cvCreateImage(cvSize(320, 256), IPL_DEPTH_8U, 1);
    DWORD   dwCount;
    LVDS_SetDataMode(0); // o for 8 bit mode and 1 for 16 bit mode
    dwCount = (LONG)320 * (LONG)256;
    unsigned char* m_pImage = NULL;
    m_pImage = new unsigned char[320 * 256]; 
    for (int i=0; i<320 * 256; i++) m_pImage[i] = NULL;
    LVDS_GetFrame(&dwCount, m_pImage);
    int width = 320;
    int height = 256;
    int nn = 0;
    int ii = 0;
    for (int y=0; y<height; y++) 
    {
        for (int x=0; x<width; x++)  
        {
            ii = y * width + x;
            if(nn < (height*width))
                img_gray_resize->imageData[ii] = m_pImage[nn++];
        }
    }
    delete [] m_pImage;

Мне нужно отобразить 16-битное серое изображение. Если я отображаю 8-битные данные, некоторая информация отсутствует на изображении. Однако LVDS_SetDataMode() может предоставить оба типа данных. Я использую библиотеку для устройства захвата кадра. Пожалуйста, помогите мне.

3 ответа

16-битные изображения должны храниться в IPL_DEPTH_16U (или же CV_16U) Режим. Это правильная схема памяти.

Однако их отображение зависит от вашего оборудования.
Большинство обычных API-интерфейсов отображения, например highgui в OpenCV, могут отображать только 8-битные изображения.
Чтобы на самом деле отобразить изображение, вам придется преобразовать его в 8-битные для отображения.

Вам нужно будет решить, как это сделать. Есть много способов сделать это, в зависимости от вашего приложения и сложности. Некоторые варианты:

  • Показать MSB = сдвиг вправо изображения на 8 пикселей.
  • Показать LSB = насыщать что-либо выше 255,
  • Фактически, сдвиг вправо на любое значение между 0-8 битами в сочетании с cv::saturate_cast, чтобы избежать обтекания значения.
  • HDR-> LDR = Применение алгоритмов сжатия динамического диапазона.

Как я знаю, могут отображаться только 8-битные данные, вам нужно найти лучший способ конвертировать 16-битные в 8-битные данные, чтобы минимизировать потерянную информацию. Для этого можно применить выравнивание гистограммы.

Наконец, я решил проблему следующим образом:

 dwCount = (LONG)320 * (LONG)256 * 2;
 LVDS_SetDataMode(1);
 img_gray_resize->imageData[ii] = m_pImage[nn++] >> 6;

Просто сдвиньте биты вправо (2, 3, 4, 5, 6, ...), чтобы получить хороший результат, используйте это значение.

Другие вопросы по тегам