2013-05-16 2 views
0

Я пытаюсь обработать изображение YUY2 (Y, Cb, Cr). Мне нужно отфильтровать изображение и устранить все цвета, кроме красной раскраски. Я использовал Image Processing Lab, чтобы найти значения элементов Y, Cb, Cr. Я нашел значения (вы можете увидеть изображение с фильтрацией): Image Processing LabОшибка изображения процесса YUY2

Отредактировано: пытается выяснить, почему изображения не отображаются - в любом случае изображение имеет некоторые значения элемента YUY для фильтрации по запросу.

Я написал код для чтения видео с камеры с фильтром, используя эти значения, но он не фильтрует хорошее. Это изображение фильтрованного изображения:

result of running the filter Edited: изображение некоторых из синего цвета в изображении фильтруется, в то время как остальная часть изображения не меняется (имеет белый, синий, серый цвета) - 1-е изображение отфильтровывало все цвета, но красным.

Это мой код:

#define _WIDTH 640 
#define _HEIGHT 480 

#define _MinY .173 
#define _MaxY .737 
#define _MinB -.189 
#define _MaxB .106 
#define _MinR .084 
#define _MaxR .324 

typedef struct YUY2_struct 
{ 
    UINT8 y0, b, y1, r; 
}YUY2; 

HRESULT SampleGrabberCallback::LineDetection(YUY2 *pD ,float arr[]) 
{ 
int LineCount = 0; 
int LineSum = 0; 
YUY2 *tempLocation = pD; 

UINT8 MinY = (UINT8)(255 * _MinY); 
UINT8 MaxY = (UINT8)(255 * _MaxY); 
UINT8 MinR = (UINT8)((_MinR + 0.5) * 255); 
UINT8 MaxR = (UINT8)((_MaxR + 0.5) * 255); 
UINT8 MinB = (UINT8)((_MinB + 0.5) * 255); 
UINT8 MaxB = (UINT8)((_MaxB + 0.5) * 255); 

for (int i = 0; i < _WIDTH * _HEIGHT/2; ++i) 
{ 
    if ((tempLocation->b > MinB) && (tempLocation->b < MaxB) && (tempLocation->r > MinR) && (tempLocation->r < MaxR)) 
    { 
     //for 1st pixel 
     if ((tempLocation->y0 < MaxY) && (tempLocation->y0 > MinY)) 
     { 
      tempLocation->b = 128; 
      tempLocation->r = 128; 
      tempLocation->y0 = 0; 
     } 

     //for 2nd pixel 
     if ((tempLocation->y1 < MaxY) && (tempLocation->y1 > MinY)) 
     { 
      tempLocation->b = 128; 
      tempLocation->r = 128; 
      tempLocation->y1 = 0; 
     } 
    } 

    tempLocation += 1; 
} 
return NOERROR; 
} 

Любые советы почему он не фильтрует мне изображение как изображение в Image Processing Lab?

ответ

2

Слишком долго, чтобы поместить в комментарии ...

Это как YUY2 упакован

YUY2 packing

  • Y является яркостной
  • Cb или U является синий компонент
  • Cr или V - красный компонент

Я не вижу, что вы правильно индексировать хромовых самолетов над ...

Этот цикл в C (и SDL) устанавливает все пиксели Cb дорожить 0x80:

for (Uint32 i = 1; i < W * H * 2; i += 4) { 
    *(my_overlay->pixels[0] + i) = 0x80; 
} 

Допустимый диапазон пикселя -значения являются целыми числами 0-255 (намного более сложная в реальности мысль). Программа, как представляется, использует нормированные значения между 0-1. Как вы выполняете нормализацию?

Надеюсь, что это поможет, если нет, напишите мне.

+0

Я определил структуру YUY2 с 4 элементами Uint8 (произошла ошибка. Я переключил Cb на Cr, но он тоже не работает). С помощью этой структуры я читаю значение каждого элемента. Перед циклом «for» я написал 6 строк: «UINT8 MinY = (UINT8) (255 * _MinY)» до «ненормированного» значения, которое должно быть 0 - 255. – user2004403

+0

Теперь этот код работает нормально. Проблема заключалась в том, что я ошибочно переключился между Cr и Cb. – user2004403

+1

Рад, что вы решили свою проблему! Возможно, вас заинтересует YCbCr-viewer, который я написал @ https://github.com/figgis/yuv-viewer. Отличный инструмент, чтобы узнать, поменяли ли вы цветные плоскости :-) –

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