2014-01-13 1 views
0

Этот код предназначен для 8-битных данных, чтобы сделать IplImage с серой шкалой.Как сделать OpenCV IplImage для 16-битных серых данных?

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() может предоставлять оба типа данных. Я использую библиотеку для устройства захвата кадров. Пожалуйста, помогите мне.

ответ

0

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

+0

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

+0

1. вычислить егограмму с учетом 16-битного изображения 2. нормировать его на запрос и преобразовать в cdf 3. сопоставить индекс со значением cdf до 256 * cdf – michaeltang

2

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

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

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

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

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

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

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

+0

Да, сдвиг в любом месте от 0 до 8 бит покажет другую полосу интенсивностей. Тем не менее, вы должны убедиться, что вы на самом деле * насыщаете * свои 8-битные значения, в противном случае ваше значение интенсивности обернется вокруг мода (1 << 8). См. Мой ответ. –

Смежные вопросы