Вращение бинарного изображения вокруг своей оси на произвольный угол. Освоение предметной области ВИСУ на примере практической задачи работы с визуальными сценами, страница 8

Так же в вышеприведенном алгоритме присутствует ошибка вычисления угла свыше 86 градусов, если функция начального угла – tg, и до 12 градусов, если ctg, из-за того, что табличные значения этих функций в данных углах не перечислены полностью. Это факт отражается в том, что все точки, попадающие в перечисленный диапазон, будут перемещены с большой погрешностью (из 170 возможных значений правильно переместятся только 12). В связи с этим было предложено следующее решение:

Ввести таблицы значений sin и cos. Далее

Синус угла находим по косинусу (таблично)


9.  Выводы

Данную программу можно использовать для поворота на произвольный угол любого изображения, полученного на лабораторной установке с помощью камеры С3088. Для этого необходимо выделить еще один массив, равный по размеру массиву фрейма, куда будут записываться перерассчитанные данной программой точки, и, кроме этого, необходимо в программу добавить блок, определяющий начальную координату любой точки, лежащей в массиве(фрейме) изображения, и организовать цикл, позволяющий обработать всю область памяти, в которой находится исходное изображение.

Преимущество данного метода в том, что на расчет координаты новой точки уходит меньше времени, чем если бы нам пришлось рассчитывать каждый раз значения тригонометрических функций, тогда как памяти на хранение констант этих функций мы используем сравнительно мало (720 байт при том, что размер нашей программы без массивов с константами функций составляет около 700 байт). Т.е. у нас еще остается достаточно памяти, чтобы организовать массив-маску, о котором говорилось выше.

Недостатком вышеприведенного алгоритма является ошибка вычисления угла свыше 86 градусов, если функция начального угла – tg, и менее 12 градусов, если функция начального угла – ctg, из-за того, что табличные значения этих функций в данных углах не заданы полностью(90 значений вместо 255).


Приложение

Общий текст программного обеспечения нижнего уровня.

org 8100h

lcall init                      ;инициализация камеры

ret

org 8110h

lcall tune                    ;настройка камеры

ret

org 8120h

lcall capture    ;захват кадра

ret

org 8130h

lcall upload     ;передача кадра в ЭВМ

ret

INCLUDE ASMS\v_cam\init_inc.asm

INCLUDE ASMS\v_cam\tune_inc.asm

INCLUDE ASMS\v_cam\upl_inc.asm

INCLUDE ASMS\v_cam\cap_inc.asm

;Диапазон адресов памяти 8100h  -  8300h задействован!

;Диапазон адресов памяти 9C00h - FFFFh задействован!

org 9C00h

frame:       файл init_inc.asm

init:           clr p3.4                       ; снимаем RST

clr p3.5                       ; снимаем PWDN

ret

файл tune_inc.asm

reg_adr:    equ 50h           ; адрес регистра настроек камеры

reg_val:    equ 51h           ; значение регистра настроек камеры

tune:         lcall set_up     ; инициализация камеры

; эта последовательность записей регистров настройки

;  - установка минимальной частоты PCLK   

mov reg_adr,#13h      ; авто подстройка

mov reg_val,#00h      ; auto adjust on/off, 0=off

lcall wr_proc              ; трехфазная запись и чтение

lcall rd_proc              

mov reg_adr,#12h      ; AWB&AGC on/off

mov reg_val,#24h      ; on

lcall wr_proc

lcall rd_proc

mov reg_adr,#29h      ;AEC(автоэкспозиция) disable

mov reg_val,#80h

lcall wr_proc

lcall rd_proc

mov reg_adr,#10h      ;AEC value

mov reg_val,#06h

lcall wr_proc

lcall rd_proc

mov reg_adr,#39h      ;gate PCLK(синхронизация пикселей) with HREF

mov reg_val,#40h

lcall wr_proc

lcall rd_proc

mov reg_adr,#3eh      ;PCLK /2

mov reg_val,#0h

lcall wr_proc

lcall rd_proc

mov reg_adr,#11h      ;PCLK /64

mov reg_val,#3fh

lcall wr_proc

lcall rd_proc

mov reg_adr,#14h      ;QCIF (176 x 144)

mov reg_val,#20h

lcall wr_proc

lcall rd_proc

ret

; процедура записи в регистр камеры значения

wr_proc:

lcall start                    ; начало обмена по шине

; посылка адреса устройства

mov a,#c0h     ; c0h - назначенный камере по умолчанию