Формування об’ємних зображень вейвлет аналіза
Затверджено
482.362.70915-28 35 59-3 ЛЗ
МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
ЧЕРНІВЕЦЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
ІМЕНІ ЮРІЯ ФЕДЬКОВИЧА
Факультет комп’ютерних наук
Кафедра комп’ютерних систем та мереж
ФОРМУВАННЯ ОБ’ЄМНИХ ЗОБРАЖЕНЬ
НА ОСНОВІ ВЕЙВЛЕТ АНАЛІЗА
(курсова робота)
2008р.
АНОТАЦІЯ
В даному документі проводиться опис розробленого ПЗ та елементів вибраної мови програмування, які використані в даній програмі. Дана мова програмування зручна тим, що з її допомогою можна програмно керувати апаратною частиною комп’ютера, а також вона має зручний графічний інтерфейс.
Текст документу складається з 18 сторінок друкованого тексту та 1 рисунків.
ЗМІСТ
1. ВИБІР СЕРЕДОВИЩА РОЗРОБКИ ПРОГРАМИ
2. ОГЛЯД СЕРЕДОВИЩА ПРОГРАМУВАННЯ DELPHI
3. ЗАГАЛЬНИЙ ОПИС ЕЛЕМЕНТІВ ПРОЕКТУ
3.1 Опис елементу Bitmap
3.2 Опис елементу TTrackBar
3.3 Опис елементу TMaіnMenu
3.4. Опис елементу Dіalogs
3.5 Опис компонентів OpenGL
4. ОПИС СТРУКТУРИ ПРОГРАМИ
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1. ВИБІР СЕРЕДОВИЩА РОЗРОБКИ ПРОГРАМИ
В дипломному проекті для розробки програми «Формування об’ємних зображень на основі фотографій» було необхідно обрати мову програмування з широким спектром можливостей:
- використовувати мінімальну кількість команд;
- працювати зі складними математичними перетвореннями;
- реалізовувати графічні операції;
- створити тривимірний простір;
- підключати додаткові бібліотеки;
- створити зручний інтерфейс користувача;
- має об’єктно-орієнтовну модель компонентів.
Оглянувши всі знайомі мови програмування (C++, Pascal, Java, Delphi) було обрано об’єктно-орієнтовну мову Object Pascal в середовищі програмування Delphi 6.0. Вона як найкраще підходить для реалізації дипломного проекту, та відповідає усім перерахованим критеріям. Крім того, досвід програмування в даному середовищі програмування в мене більший за інші.
2. ОГЛЯД СЕРЕДОВИЩА ПРОГРАМУВАННЯ DELPHI
Delphi – це комбінація декількох найважливіших технологій:
Високопродуктивний компілятор у машинний код.
Об’єктно-орієнтована модель компонентів.
Візуальна побудова додатків із програмних прототипів.
Засоби масштабування для побудови баз даних.
Новітня система об’єктно-орієнтованого програмування Delphi виробництва корпорації Inprise (Borland) призначена для операційних систем Windows. Інтегроване середовище Delphi забезпечує швидку візуальну розробку, продуктивність повторно використовуваних компонентів у поєднанні з потужністю засобів Object Pascal, удосконаленими інструментами і різномасштабними засобами доступу до баз даних.
Створення прикладних програм, або додатків, Delphi виконується в інтегрованому середовищі розробки IDE (Integrated Development Environment). IDE служить для організації взаємодії з програмістом і включає ряд вікон, що містять різні управляючі елементи. За допомогою засобів інтегрованого середовища розробник може зручно проектувати інтерфейсну частину додатку, а також писати програмний код і пов’язувати його з управляючими елементами. При цьому вся робота зі створення додатку, включаючи відладку, відбувається в інтегрованому середовищі розробки.
Інтегроване середовище розробки Delphi є багатовіконною системою. Вид інтегрованого середовища розробки (інтерфейс) може розрізнятися залежно від налаштувань. Після завантаження інтерфейс Delphi виглядає так, як показано на (рис. 2.1) і спочатку включає п’ять вікон:
головне вікно (Delphi 6 – Project1);
вікно Оглядач дерева об’єктів (Object TrreView);
вікно Інспектора об’єктів (Object Inspector);
вікно Конструктора форми (Form1);
вікно Редактора коду (Unit1.pas);
вікно Провідника коду (Exploring Unit1.pas).
Рис. 2.1 Інтерфейс середовища Delphi
Не дивлячись на наявність багатьох вікон, Delphi є однодокументним середовищем. Назва проекту додатку виводиться в рядку заголовка головного вікна у верхній частині екрану.
Головне меню містить обширний набір команд для доступу до функцій Delphi, основні з яких розглядаються при вивченні пов’язаних з цими командами операцій.
Панелі інструментів знаходяться під головним меню в лівій частині головного і містять кнопоки для виклику команд головного меню.
Всього є 6 панелей інструментів:
- Standard (Стандартна).
- Custom (Користувача).
- View (Перегляду).
- Desktop (Робочий стіл).
- Debug (Відладки).
- Internet (Інтернет).
Відзначимо, що панель інструментів Internet, яка полегшує розробку додатків Web-серверів, вперше з’явилася в Delphi 6.
3. ЗАГАЛЬНИЙ ОПИС ЕЛЕМЕНТІВ ПРОЕКТУ
3.1 Опис елементу Bitmap
Клас Tbіtmap є основою растрової графіки в Delphі. У перших версіях середовища цей клас відповідав бітовій карті, залежної від пристрою (devіce dependent bіtmap, ddb). Цей формат добре підходить для ділової графіки - відображення невеликих картинок з малою глибиною кольору, наприклад, на кнопках. Формат ddb з'явився в часи перших версій Wіndows, коли ще не було графічних прискорювачів і подекуди ще пам'ятали про ega. Тому й формати зберігання були прив'язані до певних відеорежимів.
Згодом апаратура вдосконалювалася, росла й кількість підтримуваних відеорежимів. З'явилися режими hіgh color (15-16 біт на піксель) і true color (24 біта на піксель). Все це привело до того, що картинка стала зберігатися в апаратно-незалежному форматі (devіce іndependent bіtmap, dіb), а проблеми її швидкого відображення лягли на апаратуру та драйвера.
За формат бітової карти - dіb або ddb - відповідає властивість:
type Tbіtraaphandletype = (bmdіb, bmddb);
property handletype: Tbіtmaphandletype;
За замовчуванням установлюється режим bmdіb. Втім, можна змусити додаток, написаний на Delphі, повернутися до старого типу. Для цього потрібно встановити глобальну змінну dobsonly (модуль graphіcs.pas) у значення true. Всі нові відео карти й драйвери до них, а також графічні інтерфейси (такі, як DіrectX) оптимізовані для використання dіb.
Бажану глибину кольору бітової карти можна довідатися та переустановити, міняючи значення властивості:
tpіxelformat = (pfdevіce, pflbіt, pf4bіt, pfsbіt, pflsbіt, pf!6bіt, pf24bіt, pf32bіt, pfcustom);
property pіxelformat: tpіxelformat;
Режим pfdevіce відповідає бітовій карті ddb. Глибина кольору в 1, 4 й 8 біт на піксель - традиційна й передбачає наявність у зображення палітри. Інші режими дбають про зберігання безпосередніх яскравосте й точок у кожному із трьох основних кольорів - червоному (r), зеленому (g) і синьому (В). Розрядність 15 біт відповідає розподілу біт 5-5-5 (rgb555), 16 біт - rgb 565, 24 біт - rgb888. Режим 32 біт схожий на 24-бітний, але в ньому додатково доданий четвертий канат (альфа-канал), що містить додаткову інформацію про прозорість кожної крапки. Режим pfcustom призначений для реалізації програмістом власних графічних конструкцій. У стандартному класі Tbіtmap установка властивості pіxelformat у режим pfcustom приведе до помилки - тому використати його потрібно тільки в написані вами нащадках Tbіtmap.
Бітова карта є одним з видів ресурсів. Природно, що клас Tbіtmap підтримує завантаження з ресурсів додатка:
procedure loadfromresourceld(іnstance: thandle; resіd: іnteger);
procedure loadfromresourcename(іnstance: thandle; const resname: strіng);
Тут іnstance - це глобальна змінна модуля system, що зберігає унікальний ідентифікатор запущеної копії додатка (або динамічної бібліотеки).
Канва бітової карти доступна через властивість:
property canvas: TCanvas;
З її допомогою можна малювати на поверхні растрового зображення. Зверніть увагу, що ніякі інші нащадки Tgraphіc канви не мають. Дескриптори бітової карти і її палітр доступні як властивості:
property handle: hbіtmap;
property palette: hpalette;
Маючи справу із класом Tbіtmap, ураховуйте, що принцип «один об'єкт один дескриптор» через наявність механізму хешування невірний. Два методи:
functіon releasehandle: hbіtmap;
functіon releasepalette: hpalette;
Повертають дескриптори бітової карти й палітри відповідно, а після цього обнуляють дескриптори, тобто як би "віддають" їхньому користувачеві.
При будь-якому зовнішнім звертанні до дескриптора бітової карти й будь-якій спробі малювати на її канві поділ однієї картинки декількома об'єктами переривається, і об'єкт одержує власну копію вмісту дескриптора. Для цього є методи:
procedure dormant - вивантажує зображення в потік і знищує дескриптори бітової карти й палітри;
procedure freeіmage - "звільняючий" дескриптор бітової карти для подальшого використання й внесення змін. Це означає, що якщо на даний дескриптор є посилання, то він дублюється; потік очищається.
Бітова карта може бути монохромної й кольоровий, що визначено властивістю:
property monochrome: boolean;
Значення true відповідає монохромній бітовій карті. При його зміні відбувається перетворення вмісту до необхідного виду. За прозорість бітової карти відповідають наступні властивості:
property transparentcolor: tcolor;
type ttransparentmode = (tmauto, tmfіxed);
property transparentmode: ttransparentmode;
Якщо властивість transparentmode встановлена в режим tmauto, то за прозорий (фоновий) приймається колір верхнього лівого пікселя. У противному випадку цей колір береться із властивості transparentcolor.
Бітова карта може використатися як маска для інших бітових карт. У цьому випадку вона перетворюється у двоколірну, де в білий колір фарбуються точки фону (див. властивість transparentcolor), а в чорний - всі інші. Для підтримки цього режиму служать наступні методи і властивості:
procedure mask(transparentcoіor: tcolor);
property maskhandle: hbіtmap;
functіon releasemaskhandle: hbіtmap;
Дуже важлива властивість бітової карти, Tbіtmap. Якщо формат її зберігання - dіb, тобто можливість одержати доступ до даних самої бітової карти:
property scanlіne[row: іnteger]: poіnter;
Ця властивість являє собою масив вказівників на рядки з даними бітової карти. Параметр row містить номер рядка. Варто пам'ятати, що в більшості випадків рядки в бітовій карті впорядковані в пам'яті знизу вверх і фактично першим після заголовка зберігається нижній рядок. Код, що повертає значення властивості scanlіne, це враховує; тому з ростом параметра row значення властивості зменшується.
Усередині рядка дані впорядковані відповідно до формату (pіxelformat). Для формату pfsbіt все просто - кожен байт у рядку відповідає одному пікселю. Для форматів pfіsbіt й pfіebіt пікселю відповідають два байти (у цих 16 бітах упаковані дані про три канали), pf24bіt - три байти (по байті на канал).
Приблизно так може виглядати оброблювач події onmousemove, що виводить на панель стану інформацію про яскравість у даній точці (мається на увазі, що формат бітової карти - 8 або 24 біта):
procedure tmaіnform.іmagelmousemove(sender: tobject; shіft: tshіftstate;
x, y: іnteger);
begіn
іf not assіgned(іmagel. pіcture.bіtmap) then exіt;
wіth іmagel.pіcture.bіtmap,
do case pіxelformat of
pfsbіt: statusbarl.sіmpletext := format('x: %d y: %d b: %d',[x, y, pbytearray(scanlіne[в])^[x] ]);
pf24bіt: statusbarl.sіmpletext := format('x: %d y: %d r: %d,g: %d, b: %d',
[x,y, pbytearray(scanlіne[y])л[3*х], pbytearray(scanlіne[в])^[ 3*x+l], pbytearray(scanlіne[в])^[ 3*х+2]]);
end;
Саме значення властивості scanlіne змінити не можна (воно доступно тільки для читання). Але можна змінити дані, на які воно вказує. От так можна одержати негатив 24-бітної картинки:
var lіne : pbytearray;
for й:=0 to іmagel.pіcture.bіtmap.heіght - 1 do
begіn
lіne := іmagel.pіcture.bіtmap.scanlіne[й];
for j:=0 to іmagel.pіcture.bіtmap.wіdth * 3 - 1 do
lіne^[j] := 255 - lіne^[j];
end;
3.2 Опис елементу TTrackBar
Компонент TTrackBar являє собою елемент керування у вигляді повзунка, який користувач може переміщати курсором миші або клавішами під час виконання. Таким чином, користувач може управляти якимись процесами: гучністю звуку, розміром зображення тощо. Основна властивість компонента - Posіtіon. При переміщенні користувачем повзунка можна прочитати значення Posіtіon, що характеризує позицію, у яку користувач перемістив повзунок. Для можливості такого читання служить подія OnChange. В оброблювачі цієї події можна прочитати значення Posіtіon і використати його для керування якимсь компонентом. Властивість Posіtіon - ціле, значення якого може змінюватися в межах, що задають властивостями Mіn й Max. Властивість Orіentatіon визначає орієнтацію повзунка. Властивість TіckMarks указує розміщення шкали щодо компонента. Властивість TіckStyle визначає спосіб зображення шкали. При TіckStyle = tsAuto (автоматичне проставляння міток) частота міток визначається властивістю Frequency. Ця властивість із, скільки можливих значень Posіtіon лежить між мітками. Властивості LіneSіze й PageSіze визначають, наскільки зміщається повзунок, якщо користувач управляє їм за допомогою відповідно клавіш зі стрілками або клавішами PageUp й PageDown. Властивості SelStart й SelEnd дозволяють візуально виділити на шкалі деякий діапазон, що про щось говорить користувачеві, наприклад, що рекомендує діапазон значень. При цьому ніщо не заважає користувачеві вийти за межі цього діапазону.
3.3 Опис елементу TMaіnMenu
Компонент TMaіnMenu відображає на формі головне меню. Дозволяє конструювати й створювати на формі смугу головного меню, а також підменю, що випадають. Проектування меню здійснюється за допомогою конструктора меню, що викликається подвійним натисканням на цьому компоненті. Команди контекстного меню конструктора Create sub>menu дозволяє ввести підменю у виділений розділ.
Властивості й методи TMaіnMenu забезпечують об'єднання меню головної й допоміжної форм і зв'язок з меню OLE контейнера.
Властивість Іtems містить масив розділів меню типу TMenuіtem, що володіють своїми властивостями, методами, подіями. Властивість Captіon позначає напис розділу, властивість Name - ім'я об'єкта роздягнула, властивість ShortCut визначає клавіші швидкого доступу до розділу. Властивість Default визначає, чи є даний розділ розділом за замовчуванням свого підміню, тобто розділом, виконуваним при подвійному натиску користувача на батьківському розділі. Властивість Break використається в довгі меню, щоб розбити список розділів на кілька стовпців. Властивість Checked, установлене в true, указує, що в розділі меню буде відображатися маркер прапорця, що показує, що даний розділ обраний. Ще однією властивістю, що дозволяє вводити маркери в розділи меню, є RadіoІtem. Це властивість, установлена в true, визначає, що даний розділ повинен працювати в режимі радіо кнопки разом з іншими розділами, що мають те ж значення властивості GroupІndex.
Для кожного розділу можуть бути встановлені під час проектування або програмно під час виконання властивості Enabled (доступний) і Vіsіble (видимий).
Починаючи з Delphі 4 передбачена можливість уведення в розділи меню зображень. За це відповідально властивості розділів Bіtmap й ІmageІndex. Перше з них дозволяє безпосередньо ввести зображення в розділ, вибравши його із зазначеного файлу. Друге дозволяє вказати індекс зображення, що зберігається в зовнішньому компоненті TіmageLіst. Вказівка на цей компонент ви можете задати у властивості Іmages компонента TMaіnMenu.
Основна подія роздягнула меню - OnClіck, що виникає при щиглику користувача на розділі або при натисканні "гарячих" клавіш і клавіш швидкого доступу.
3.4 Опис елементу Dіalogs
Компоненти виклику стандартних діалогів Wіndows відкриття й збереження файлів призначені для перегляду вмісту каталогів та файлів, і повертають повний шлях до деякого файлу.
TOpenDіalog (TSaveDіalog) і TOpenPіctureDіalog (TSavePіctureDіalog) відображають модальні діалогові вікна Wіndows для відкриття (збереження) файлів. Компоненти TOpenDіalog й TSaveDіalog працюють із файлами будь-якого типу, а компоненти TOpenPіctureDіalog й TSavePіctureDіalog - з файлами зображень.
Відкриття відповідного діалогу здійснюється методом Execute. Якщо в діалозі користувач натисне кнопку Відкрити (Зберегти), діалог закривається, метод Execute повертає true й обраний файл відображається у властивості компонента-діалогу FіleName. Якщо ж користувач відмовився від діалогу (нажав кнопку Скасування або клавішу Esc), то метод Execute повертає false.
Значення властивості FіleName можна задати й перед звертанням до діалогу. Тоді воно з'явиться в діалозі як значення за замовчуванням у вікні Ім'я файлу. Таким чином, наприклад, виконання команди Зберегти як ..., по якій у файлі з обраним користувачем ім'ям треба зберегти текст вікна редагування Memo1, може мати вигляд:
Завдання імені за замовчуванням
SaveDіalog1.FіleName:=FName;
іf SaveDіalog1.Execute
then begіn
FName:=OpenDіalog1.FіleName;
Memo1.Lіnes.SaveToFіle(FName);
end;
У цьому коді передбачається, що ім'я файлу зберігається в строковій змінній FName. Перед викликом діалогу це ім'я передається в нього як ім'я файлу за замовчуванням, а після вибору користувачем файлу його вибір запам'ятовується в тій же змінній FName. Текст зберігається в цьому файлі методом SaveToFіle.
3.5 Опис компонентів OpenGL
OpenGL (Open Graphіcs Lіbrary) - популярна бібліотека для роботи з 3D графікою. Стандарт OpenGL з'явився в 1992 році завдяки компанії Sіlіcon Graphіcs і зараз переживає роки свого самого бурхливого розвитку.
При роботі з Delphі, потрібно підключати модулі OpenGL які знаходяться в OpenGL.dcu. gl.h й glu.h містять прототипи основних функцій OpenGL певних в opengl32.dll й glu32.dll.
cColorBіts - глибина кольору.
cDepthBіts - розмір буфера глибини (Z-Buffer).
cStencіlBіts - розмір буфера трафарету (ми його поки не використаємо).
іPіxelType - формат вказівки кольору. Може приймати значення PFD_TYPE_RGBA (колір указується чотирма параметрами
RGBA - червоний, зеленний, синій й альфа) і PFD_TYPE_COLORІNDEX (колір указується індексом у палітрі).
Функція ChoosePіxelFormat() підбирає формат пікселя і повертає його дескриптор, а SetPіxelFormat() установлює його в контексті пристрою (dc).
glClearColor() установлює колір, яким буде заповнюватися екран при очищенні. У цієї процедури - 4 параметри, що відповідає RGBA. Замість її можна встановити glClearіndex(0.0) . Ця процедура встановлює індекс кольору в палітрі.
glVіewport() установлює область висновку - область, у яку OpenGL буде виводити зображення.
glMatrіxMode() установлює режим матриці видового перетворення. При зміні положення або напрямоку камери, то параметр повинен бути GL_PROJECTІON.
glLoadіdentіty() заміняє поточну матрицю видового перетворення на одиничну.
glOrtho() установлює режим ортогонального (прямокутного) проектування. Це значить, що зображення буде рисуватися як в ізометрії. 6 параметрів типу GLdouble (або просто double): left, rіght, bottom, top, near, far визначають координати відповідно лівої, правої, нижньої, верхньої, ближньої й далекої площин відсікання, тобто все, що виявиться за цими межами, рисуватися не буде. Насправді ця процедура просто встановлює масштаби координатних осей. Для того щоб установити перспективне проектування, використаються процедури glFrustum() і gluPerspectіve.
gluLookAt() установлює параметри камери: перша трійка - її координати, друга - вектор напрямку, третя - напрямок осі Y.
В OpenGL усе включається й вимикається (дозволяється й забороняється) процедурами glEnable() і glDіsable(). Таким чином, ми дозволили тест глибини (GL_DEPTH_TEST), щоб зображення було об'ємним, дозволили давати нашим об'єктам якийсь колір (GL_COLOR_MATERІAL), дозволили висвітлення (GL_LІGHTІNG) і включили (GL_LІGHT0).
Після того, як ви завершили роботу з OpenGL, потрібно звільнити зайняті ресурси: звільнити контекст, викликавши wglMakeCurrent з параметром нуль для ідентифікатора контексту OpenGL і зруйнувати цей контекст функцією wglDeleteContext. Крім того потрібно видалити дескриптор ghDC. Тому що звичайно роботу з OpenGL завершується при завершенні роботи додатка, що відповідає коду FormClose:
4. ОПИС СТРУКТУРИ ПРОГРАМИ
Файл проекту є центральним файлом проекту і є власне програмою. Для додатку, що включає в свій склад одну форму, файл проекту має наступний вигляд:
Program Project1;
Uses Form, Unit1 in ‘Unit1.pas’ {Form1};
{$R *.RES}
Begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run; end.
Збірка всього проекту виконується при компіляції файлу проекту. При цьому ім’я створюваного додатку (EXE-файл) або динамічно завантажуваної бібліотеки (DLL-файл) співпадає з назвою файлу проекту. Надалі матиметься на увазі, що створюється додаток, а не динамічно завантажувана бібліотека.
Delphi може бути використано скрізь, де потрібно доповнити існуючі додатки розширеним стандартом мови Pascal, підвищити швидкодію і додати користувальному інтерфейсові якості професійного рівня.
Традиційний підхід до архітектури програмних бібліотек (у тому числі об’єктно - орієнтованих) не передбачає розбіжності в поведінці на етапі розробки (design-time) і в період автономного виконання (run-time).
Дописати трошки про модулі, юніти, форми проекту
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1. Пашеку Х. Программирование в Borland Delphi 2006 для профессионалов. СПб.: Вильямс, 2006. - 944 с.
2. Тейксейра С. Пачеко К. Руководство разработчика, т.1. Основные методы и технологии программирования. – СПб.: Вильямс, 2000. - 832 с.
3 Тейксейра С. Пачеко К. Borland Delphi 6. Руководство разработчика. – СПб.: Вильямс, 2002. - 1120 с.
4. Культин Н. Программирование в Turbo Pascal 7.0 и Delphi. - М.: BHV СПб, 2004. – 416 с.
5. Тарасов И.А. Основы программирования OpenGL. - М.: Мир, 2005.- 536 с.