Как сделать 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, ...), чтобы получить хороший результат, используйте это значение.