
1.2. Програма „usb_Video_11s”
Програма „USB_Video_11s” призначена для зчитування та обробки зображень з USB-відеокамери (рис. 1.4). Програма взаємодіє з відеокамерою за допомогою драйверів, які повинні бути попередньо встановлені на ПК.
У роботі використовується відеокамера „G-Cube GWL-835B”, яка забезпечує максимальну роздільну здатність 640×480 пікселів, зчитування 30 кадрів у секунду, фокусування від 10 см до безкінечності. Окремі кадри (Frame) відеопотоку зчитуються з інтервалом, що встановлюється компонентом „Timer1_Video” (по замовчуванню 112 мс). Дозвіл за зчитування кадрів встановлюється командою „Старт”, а забороняється – командою „Стоп”. Зчитані або „захоплені” (capture) з відеопотоку кадри відображаються на зображенні „Image_Video”. Програма використовує роздільну здатність зображень 320×240 пікселів при максимальній роздільній здатності відеокамери 640×480 пікселів.
Захоплення відео у програмі виконується за допомогою функцій Windows API, які містять префікс cap (capture). Основна функція, яка використовується при захопленні відео, це „capCreateCaptureWindowA”. Вона використовує стандартний драйвер „AVICAP32.DLL” і створює графічне вікно, призначене для показу відеопотоку. Цьому вікну посилаються всі керуючі повідомлення (SendMessage). Роздільну здатність відео можна встановити командою „Video_Parameters” на формі „Опції” (рис. 1.5).
Окремі зображення з відеопотоку записуються у вхідне зображення „Image_Input” командою „Зчитати”. Такі зображення можуть записуватися у файл командою „Зберегти”. Зображення „Image_Input” також зчитується з файлу командою „Відкрити” (без використання відеокамери). На зображенні „Image_Input” користувач може вибрати певний об’єкт (наприклад, геометричну фігуру) за допомогою маркера (хрестик). Розпізнавання виділеного об’єкта, який сприймається програмою як один сегмент (зв’язна область зображення), виконується командою „Розпізнати” і процедурою „p_Rec_Image”. Обробка полягає у сегментації зображення, обчисленні параметрів сегменту та розпізнаванні виділеного об’єкта.
Процедура розпізнавання зображень „p_Rec_Image” містить наступні основні методи:
p_Read_Image – зчитування RGB складових кольору кожного пікселя зображення „Image_Input” у масив mI, при цьому розмір зображення за шириною у пікселях – qXi, за висотою – qYi.
p_Image_Segment – сегментація зображення „Image_Input”.
p_Image_Contour – виділення контуру сегментованого зображення.
p_Segment_Color – визначення кольору сегмента.
p_Segment_Geometr_Par – визначення геометричних параметрів сегмента.
Рис. 1.4. Головна форма програми „USB_Video_11s”
Рис. 1.5. Форма „Опції”
Сегментація зображення (процедура „p_Image_Segment”) полягає у виділенні зв’язної області приблизно однакового кольору з центром xc, yc (зображення „Image_Segment”). Координати центру сегменту встановлюються маркером на зображенні „Image_Input”. До сегменту відносяться всі пікселі, для яких різниця кольору відносно центру сегмента не перевищує значення Seg_Color_Dif (рис. 1.4).
Пікселі сегмента на зображенні „Image_Segment” показані сірим кольором (масив mS), а пікселі контуру – білим (масив mCont). На основі виділеного сегментом (наприклад, геометричної фігури „Квадрат”), визначаються його параметри.
Процедура „p_Segment_Color” визначає RGB складові кольору сегмента: Seg_Color_R, Seg_Color_G, Seg_Color_B.
Процедура „p_Segment_Geometr_Par” визначає геометричні параметри сегмента:
kcs – відношення кількості пікселів контуру до кількості пікселів сегмента.
rMin_Max – відношення мінімальної відстані контуру від центра сегмента до максимальної.
aMax – напрям на точку контуру, максимально віддалену від центра.
Розпізнавання виділеного сегмента (Результати розпізнавання) виконується за наступними параметрами:
Rec_Color – колір сегмента (наприклад, чорний)
Rec_Shape – розпізнавання форми (наприклад, еліпс)
Rec_Direct – розпізнавання орієнтації (наприклад, вертикальна)
Лістинг 1. Фрагмент процедури „p_Rec_Image”, який виконує розпізнавання зображення сегмента:
// Recogn. Color ----------------------------------------------------------------------
Re:=45; // Etalon Color R
Ge:=45;
Be:=45;
difCe:=abs(Re-cSeg1[1])+abs(Ge-cSeg1[2])+abs(Be-cSeg1[3]);
if DifCe<50 then // Color Difference Etalon-Segment
begin
L_Rec_Color.Caption:='Rec_Color= Black';
end else
begin
L_Rec_Color.Caption:='Rec_Color= Not Black';
end;
// Recogn. Shape -----------------------------------------------------------------------
bcs:=(kcs>0.086) and (kcs<0.101); // Pixels Contour/ Segment
brMin_Max:=(rMin_Max>0.4) and (rMin_Max<0.6); // rMin/ rMax
if (bcs and brMin_Max) then
begin
L_Rec_Shape.Caption:='Rec_Shape= Ellipse';
end else
begin
L_Rec_Shape.Caption:='Rec_Shape= Not Ellipse';
end;
// Recogn. Direction / Angle -------------------------------------------------------
ban1:=(aMax_g>0) and (aMax_g<30);
ban2:=(aMax_g>150) and (aMax_g<210);
ban3:=(aMax_g>330) and (aMax_g<360);
if (ban1 or ban2 or ban3) then
begin
L_Rec_Direct.Caption:=' Rec_Direct= Horizontal';
end else
begin
L_Rec_Direct.Caption:=' Rec_Direct= Vertical';
end;
В програмі використовуються наступні режими відео (рис. 1.4):
Show – показувати відео (звичайний режим).
Change – ввімкнути детектор змін (руху).
Track – відслідковувати траєкторію руху виділеного сегменту на зображенні.
При ввімкненні режиму детектора змін (рис. 1.6) програма для кожного кадру (Frame) відеопотоку визначає різницю Dif_Image поточного кадру з попереднім (як різницю RGB складових кольору всіх пікселів зображень). Інтервал часу між кадрами встановлюється через властивість компонента „Timer2_Change” (500 мс). Значення мінімальної зміни кадру, яка сприймається програмою як рух, встановлюється у полі вводу „Dif_Image_Max”. Максимальна кількість кадрів, різниця між якими показується на графіку, встановлюється значенням „q_Frame_Max”.
Рис. 1.6. Форма детектора змін (руху)
При відслідковуванні траєкторії руху виділеного сегменту на зображенні (рис. 1.4) програма спочатку виділяє сегмент, на якому знаходить маркер (хрестик). Далі при повільному зміщенні об’єкта, який відповідає сегменту, перед відеокамерою програма відслідковує зміщення сегменту на зображенні і відповідно зміщує маркер. Інтервал часу між кадрами встановлюється через властивість компонента „Timer3_Track” (500 мс).