roboforum.ru

Технический форум по робототехнике.

Разработка RoboBrain: - модуль 3D реконструкции мира

Разработка универсальной программно-аппартной платформы роботов.

Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Виктор Казаринов » 02 дек 2009, 22:56

Этот модуль один из самых сложных и ответственных в "правом полушарии" мозга робота, т.к. отвечает за полноценное понимание роботом текущей обстановки, а также за основную часть образного мышления.

Основной функцией модуля является синтез и поддержание адекватной модели окружающего робота мира через анализ получаемой по сенсорным каналам перцептивной информации и на основе хранимой истории актов восприятия, а также на основе 3D моделирования и апробации полученных моделей, и синтез и анализ вымышленных логическим "левым полушарием" робота миров.

Обмен с другими модулями осуществляется в виде сообщений FIPA-ACL OWL-SUMO.
Данный модуль работает с количеством геометрических измерений не более трех и прямой последовательностью времени (четвертое измерение).

Добавлено спустя 1 час 4 минуты 31 секунду:
Первоначальное упрощенное описание модели мира.
В основе модели - онтологическое дерево, описывающее моделируемый мир. Т.к. мир незамкунут, т.е. чаще всего не может быть полностью контролируем и предсказуем, то модель представляет собой как бы черное поле, освещаемое фонариком понимания. Все, что распознано, добавляется в нее в виде фактов. Эта модель мира является частью единой большой онтологии. Поэтому каждый такой факт связан с ранее имеющимися в онтологии узлами. Это позволяет производить различные операции, в т.ч. и ассоциации. Подсеть фактов - это паттерн, ветвь, которую модуль "накладывает и примеряет" к другим частям онтологии. Т.е. производит сопоставление, с ранее известными подсетями, распознавание.
OWL совместимое описание удобно тем, что легко устанавливает соответствие между такими умозаключениями, например, как: "ножка является_частью стула" и "стул имеет_часть ножка". Ведь неизвестно, что первым попадет в поле внимания робота - часть или целое.
Проект Robosonic RS http://www.aigod.com
Аватара пользователя
Виктор Казаринов
 
Сообщения: 1387
Зарегистрирован: 21 июн 2006, 11:22
Откуда: г. Омск
Skype: victorkazarinov
прог. языки: почти все понемногу
ФИО: Казаринов Виктор Геннадьевич

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Aseris » 03 дек 2009, 02:57

На основе какого набора данных будет вестись реконструкция?? привязка к какой-то системе координат?

А на щет распознавания, может все в один блок не лепить?? Сперва строим 3Д модель мира что видим (Дальномеры/камера/камкры/усики), а потом это все отправляем в блок распознания, который разделяет уже обьекты.

ИМХО: ведь ребенок пока не исследует тот же стул непонимает что ножку стула можно распознавать как отдельное понятие :)
Аватара пользователя
Aseris
 
Сообщения: 1142
Зарегистрирован: 01 сен 2009, 14:58
Откуда: Чехия
прог. языки: C/С++, VHDL, Verilog, ASM, Python

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Виктор Казаринов » 03 дек 2009, 09:08

2Aseris: я хотел бы сделать так, чтобы ни к какой системе координат не привязываться, а сделать самообучение пространственным соотношениям. Тогда не потребуется калибровать систему, она будет самокалиброваться по ходу эксплуатации. Человеку когда одевают очки с линзами, не приходится показывать шашечное калибровочное поле. Поэтому будем предполагать, что весь сквозной канал связи от поверхности объектов до матрицы изображения имеет возможность плавно менять свою пространственную нелинейность, т.е искажать геометрию, цветность и т.д.
Aseris писал(а):А на щет распознавания, может все в один блок не лепить?? Сперва строим 3Д модель мира что видим (Дальномеры/камера/камкры/усики), а потом это все отправляем в блок распознания, который разделяет уже обьекты.
А зачем вообще на отдельные объекты разделять? Нужно сопоставлять то, что видим с тем, что в онтологии (ранее запомненных моделях). Если фрагменты видимого мира будут в чем-то похожи на хранимые, то это - повод для дальнейших умозаключений модулями логики. Но тут еще нужно тщательно все обмозговать.
Проект Robosonic RS http://www.aigod.com
Аватара пользователя
Виктор Казаринов
 
Сообщения: 1387
Зарегистрирован: 21 июн 2006, 11:22
Откуда: г. Омск
Skype: victorkazarinov
прог. языки: почти все понемногу
ФИО: Казаринов Виктор Геннадьевич

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Vorral » 03 дек 2009, 12:30

>я хотел бы сделать так, чтобы ни к какой системе координат не привязываться, а сделать самообучение пространственным соотношениям.
О как интересно :) По мне так эта фраза вообще не имеет смысла. Чтобы определить любое соотношение(а уж тем более пространственное) чего то к чему то, нужно обладать числовым значением этого "чего то", так же как и такое же значение должно быть у "чему то". Не понятно как не обладая картой глубины изображения, вы вообще думаете хоть как то продвигаться вперёд с подобным "модулем".
Vorral
 
Сообщения: 873
Зарегистрирован: 11 сен 2008, 17:18
Откуда: Москва
прог. языки: Delphi
ФИО: Владислав

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Виктор Казаринов » 03 дек 2009, 13:05

Подозреваю, что для того, чтобы часть робота, например, распознавание заработало, этой самой части будет явно недостаточно. Наверное, прав DeaD, что робот как и человек - это нечто единое и неделимое, а точнее он может стать субъектом только в результате слаженной работы многих модулей. Поэтому создать мало-мальскую систему распознавания в отрыве от других ключевых модулей невозможно. О чем конкретно я говорю? О том, что активная обратная связь включая исследовательскую и создает адекватную картину мира. А частью этой картины является геометрические и временнЫе характеристики этого мира.
Включаем робота, в кот. есть только предельно малое кол. "генетически" конструктивно и программно заложенных возможностей. Он видит, к примеру какие-то черточки, кружочки, пятнышки. Начинает хаотичные движения эффекторами, например, колесами. Главное, что должно в этот момент уже работать - ассоциативное мышление, нет, это слишком громко сказано, точнее, возможность создавать ассоциации. Если при определенном движении эти пятнышки куда-то перемещаются и так несколько раз, то можно установить такую простую ассоциацию. Добавим боли от столкновения бампера с препятствием и бульон для самообучения уже почти готов. Конечно, тут еще многого не учтено. Но нужно, наверное, двигаться в данном направлении.

Теперь приступаю к проработке дефолтной онтологии данного модуля.
В каком виде хранить и обрабатывать, например, сравнивать части мира, паттерны? Цвет пикселов входного изображения камеры наверняка совершенно не нужен. 2D и 3D контуры объектов? Можно ли и как сравнивать контуры, если их описать векторами? Если одну дугу разобьем на 5 векторов в 2D или 3D пространстве, а другую на 7, можно ли их сравнивать, находить подобие? Главное при этом - компактное представление паттернов при одновременной возможности быстрого сопоставления миллионов таких паттернов.
Наверное, хранилище должно обеспечивать и компактное хранение огромного кол. информации и быстрое сопоставление.
Вот характерные запросы к такой БЗ на примере:
Робот видит желтый круг а внутри него синий квадрат. Желтый круг и синий квадрат - это я так назвал, а в БЗ запрос идет в виде векторного представления геометрии и числовых значений цвета заливки. Все это в виде онтологии.
Запрос 1 - есть ли в БЗ синий квадрат?
Если есть, то внутри каких фигур он ранее встречался?
Запрос 2 - есть ли в БЗ похожий желтый круг?
Если есть, то попадались ли внутри него квадраты?
Если попадались квадраты, то есть ли среди них синие?
Проект Robosonic RS http://www.aigod.com
Аватара пользователя
Виктор Казаринов
 
Сообщения: 1387
Зарегистрирован: 21 июн 2006, 11:22
Откуда: г. Омск
Skype: victorkazarinov
прог. языки: почти все понемногу
ФИО: Казаринов Виктор Геннадьевич

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Aseris » 03 дек 2009, 14:52

Виктор, ты сперва говориш про разпознание, про то что не привязыватся к чемуто, а потом наводиш пример что идет сопоставление
Запрос 1 - есть ли в БЗ синий квадрат?
Если есть, то внутри каких фигур он ранее встречался?
Запрос 2 - есть ли в БЗ похожий желтый круг?



НАводящий вопрос, робота первый раз включили, откуда ему знать что образ который он получил например с камеры, одной (не лезхем пока в 3Д), в виде двумерного масива даных нада поделтить на 2!, отдельных обьекта?
да еще и с определенной класификацией?

А модульность она упрощает понимание и ведение проекта, а чтобы оно было целосное нужна обратная связь между блокми.

З.Ы. Нащет целосности у мня когдато была идея сделать бааальшую многошаровую нейронную сеть, к ней вцепить камеру, манипулятор, колеса, и всему етому скормить какойто масив обучающих данных, и глянуть что из етого выйдет, но потом ручками потрогал что такое нейронная сеть и понял что не с нашими вычислительными способностями и стабильностью общедоступных ОС.

Добавлено спустя 3 минуты 41 секунду:
А нащет системы координат, незнаю как ты, но я в своих проектах ограничен чисельной математикой с конечной разрядностью представления даных, значит нужно заранее учитывать что и как в системе представлять.
Аватара пользователя
Aseris
 
Сообщения: 1142
Зарегистрирован: 01 сен 2009, 14:58
Откуда: Чехия
прог. языки: C/С++, VHDL, Verilog, ASM, Python

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Виктор Казаринов » 04 дек 2009, 22:51

2Aseris: сопоставление я привел в примере для уже наполненной базы знаний. Конечно, когда БЗ почти пуста, то и сопоставлять будет почти не с чем.
Vorral писал(а):НАводящий вопрос, робота первый раз включили, откуда ему знать что образ который он получил например с камеры, одной (не лезхем пока в 3Д), в виде двумерного масива даных нада поделтить на 2!, отдельных обьекта? да еще и с определенной класификацией?
Ему делить не надо. Я так представляю самообучающегося робота. Вначале весь мир ему кажется чем-то одним большим и непонятным. Затем он начинает выявлять закономерности в т.ч. и зрительные.по мере выявления закономерностей робот улучшает свои знания о мире и может еще лучше делить мир на части. Так, щенок кусает протянутую ладонь с пищей, не отличая ее от пищи. Затем, после наказаний, он начинает постепенно такое разделение делать. Да и мы, когда попадаем в новую обстановку, обычно запоминаем что-то самое общее, а затем научаемся выделять частности. Этот механизм улучшающейся селекции, фильтрации - важнейший.
Проект Robosonic RS http://www.aigod.com
Аватара пользователя
Виктор Казаринов
 
Сообщения: 1387
Зарегистрирован: 21 июн 2006, 11:22
Откуда: г. Омск
Skype: victorkazarinov
прог. языки: почти все понемногу
ФИО: Казаринов Виктор Геннадьевич

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Виктор Казаринов » 23 дек 2009, 09:07

Продолжу работу над данным модулем. Все последующее обсуждение - пока лишь идеи, кот. я постепенно хочу воплотить в реальный программный код.
Модуль 3D реконструкции мира - это иерархическая эгоцентрическая 3D карта мира, частью кот. является и сам робот. Эгоцентрическая - это когда нулевой точкой отсчета являются гипотетические видеокамеры робота. На рисунке слева показаны созданные модулем синтеза 3D модели мира объекты. А т.к. они созданы с пом. команд, то известно о них все, что на данный момент роботу о них известно. Это все и есть иерархическое описание. Например, что куб - это шкатулка с закрытой крышкой, что шар - это мяч на полу рядом со шкатулкой, что этот синтез - результат анализа текущего наблюдения визуальной сцены. Справа плоское поле зрения - проекция на виртуальную видеокамеру результатов наблюдения этой синтезированной сцены. Центр этого правого поля зрения и есть центр текущих эгоцентрических координат. Это правое поле зрения можно совмещать с полем, реально наблюдаемым в видеокамеру и находить расхождения. Но это совмещение должны делать другие модули -монокулярного и стереозрения.
Модуль 3D реконструкции мира должен уметь создавать такую модель не только на основе видимого изображения, но и по результатам анализа всех видов сенсоров. Тогда он сможет работать и в полной темноте без визуальной обратной связи или без реальной видеокамеры вообще.
Вложения
Screen1.PNG
Screen1.PNG (5.71 КиБ) Просмотров: 6719
Проект Robosonic RS http://www.aigod.com
Аватара пользователя
Виктор Казаринов
 
Сообщения: 1387
Зарегистрирован: 21 июн 2006, 11:22
Откуда: г. Омск
Skype: victorkazarinov
прог. языки: почти все понемногу
ФИО: Казаринов Виктор Геннадьевич

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Сергей » 23 дек 2009, 10:45

Пустые слова. То, что было сформулировано - ясно даже начинающему робототехнику, точно такие же идеи посещают всех, когда собирают роботов.
ИМХО никакого подхода здесь нет, обычные идеи сформулированы более по научному.

Каким образом это все будет описано на машинном языке?
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Виктор Казаринов » 23 дек 2009, 10:53

2Сергей: В любом проекте есть определенные этапы. Для данного модуля сейчас этап предварительного описания функционирования. Наивно полагать, что сначала должен появиться код, а затем уже его описание и предназначение. Мне неизвестно, какие мысли посещают каждого юного роботостроителя. Я и свои то мысли не все запоминаю.
Пустые или не пустые слова, время все расставит по своим местам. Я не совсем понял вашего упрека. Что именно вам не нравится в моих суждениях?
Код я сейчас пишу, а общие принципы описываю здесь. Можете при желании мне помочь. Я сейчас занят конвертацией онтологии SUMO в систему объектов COOL в программе AIAssistant. Эта онтология должна стать основой описания мира для данного модуля в частности.
Проект Robosonic RS http://www.aigod.com
Аватара пользователя
Виктор Казаринов
 
Сообщения: 1387
Зарегистрирован: 21 июн 2006, 11:22
Откуда: г. Омск
Skype: victorkazarinov
прог. языки: почти все понемногу
ФИО: Казаринов Виктор Геннадьевич

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Виктор Казаринов » 22 апр 2010, 11:49

Начну постепенную разработку данного модуля от простого к сложному. Но т.к. теоретические изыскания мне нравятся меньше, чем что-то реальное и полезное, то сформулирую такую задачу, кот. попробую решить:
Создать обучаемый плагин-робот для программы AIAssistant по управлению чужими программами в компьютере.
Это должно выглядеть примерно так: В режиме обучения мы показываем роботу то, что видим на экране, какую программу запускаем и что хотели бы от робота по управлению этой программы. Робот делает скриншоты экрана, а также получает координаты мыши, которой может управлять. Он должен управлять и с пом. виртуальной клавиатуры, а также с пом. других устройств. На экране он должен распознавать нужные участки программных форм, даже частично закрытых другими окнами, идентифицировать их с теми, кот. находятся в его памяти и осуществлять разумное поведение, требуемое пользователю в отношении заданных программ.
В данной задаче геометрический мир будет двумерным и робот будет его видеть "одним глазом", поэтому и реконструкция м.б. значительно упрощена на основе онтологии.
Проект Robosonic RS http://www.aigod.com
Аватара пользователя
Виктор Казаринов
 
Сообщения: 1387
Зарегистрирован: 21 июн 2006, 11:22
Откуда: г. Омск
Skype: victorkazarinov
прог. языки: почти все понемногу
ФИО: Казаринов Виктор Геннадьевич

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Виктор Казаринов » 24 дек 2010, 22:25

Сейчас продолжаю работать над модулем 3D реконструкции мира. Для этого на языке ECLIPS с использованием OpenCV пишу небольшой плагин - лабораторию по исследованию стереозрения. На скриншоте вы видите текущее положение дел. Нижнее изображение - карта дальностей наблюдаемых поверхностей от видеокамеры (16 бит на каждый пиксел). Полутоновое изображение немного замутил фильтром для выдачи лучших результатов. Думаю, что нужно сделать одновременно несколько каналов обработки стереоизображения - по разным цветам и по размеру зоны внимания. Затем нужно свести все полученные данные в единую картину видимой части мира. Но для этого придется преобразовать полученные результаты в понятийный граф - ветвь дерева онтологии SUMO, которую я сейчас переделываю.

А вот если кому интересно, текущий код этого плагина на языке ECLIPS. Есть еще, несколько второстепенных файликов, которые я во избежание засорения мозгов не публикую.
Код: Выделить всёРазвернуть
;=======================================================
;Дата начала разработки 2010.12.05.
;Версия: V1.0.0. 20101205.
;Автор Казаринов В.Г.
;Модуль первичного анализа изображения на основе OpenCV.
;Описание:
;Совместимость: AIAssistant версии 1.1.0.40. и выше
;=======================================================
(defglobal
?*srcimageref* = -1
?*imageLref* = -1
?*imageRref* = -1
?*imageGLref* = -1
?*imageGRref* = -1
?*matrixDLref* = -1
?*matrixDRref* = -1
?*resimageref* = -1
?*imagewidth* = 320
?*imageheight* = 240
?*oldtimer0_0* = 0
?*oldtimer1_0* = 0
?*oldtimer2_0* = 0
?*oldtimer3_0* = 0
?*oldtimer4_0* = 0
?*oldtimer5_0* = 0
)

(deffacts init-data
   (phase start))

(definstances formtest1
([FORM1] of GUIFORM
  (x 0) (y 20) (width 800) (height 900) (caption ?*Test1FormCaption*) (onclose 0) (borderstyle 2) (bordericons 1 1 1 0 ))

([BUTTON0] of GUIBUTTON
  (caption ?*y2*) (x 70) (y 10) (width 50) (height 30) (enable 1) (onclick 0) (onmousedown 0) (onmouseup 0) (parentinstance (instance-address [FORM1]))) ;<
([BUTTON1] of GUIBUTTON
  (caption ?*y1*) (x 10) (y 10) (width 50) (height 30) (enable 1) (onclick 0) (onmousedown 0) (onmouseup 0) (parentinstance (instance-address [FORM1]))) ;>
([BUTTON2] of GUIBUTTON
  (caption ?*y3*) (x 150) (y 10) (width 50) (height 30) (enable 1) (onclick 0) (onmousedown 0) (onmouseup 0) (parentinstance (instance-address [FORM1]))) ;<
([BUTTON3] of GUIBUTTON
  (caption ?*y4*) (x 220) (y 10) (width 50) (height 30) (enable 1) (onclick 0) (onmousedown 0) (onmouseup 0) (parentinstance (instance-address [FORM1]))) ;>
([BUTTON4] of GUIBUTTON
  (caption ?*y5*) (x 350) (y 10) (width 50) (height 30) (enable 1) (onclick 0) (onmousedown 0) (onmouseup 0) (parentinstance (instance-address [FORM1]))) ;>
([BUTTON5] of GUIBUTTON
  (caption ?*y6*) (x 410) (y 10) (width 50) (height 30) (enable 1) (onclick 0) (onmousedown 0) (onmouseup 0) (parentinstance (instance-address [FORM1]))) ;>
([BUTTON6] of GUIBUTTON
  (caption ?*y7*) (x 470) (y 10) (width 100) (height 30) (enable 1) (onclick 0) (onmousedown 0) (onmouseup 0) (parentinstance (instance-address [FORM1])))
([BUTTON7] of GUIBUTTON
  (caption ?*y8*) (x 680) (y 10) (width 100) (height 30) (enable 1) (onclick 0) (onmousedown 0) (onmouseup 0) (parentinstance (instance-address [FORM1])))
([BUTTON11] of GUIBUTTON
  (caption ?*y21*) (x 680) (y 50) (width 100) (height 30) (enable 1) (onclick 0) (onmousedown 0) (onmouseup 0) (parentinstance (instance-address [FORM1])))
([BUTTON8] of GUIBUTTON
  (caption ?*y11*) (x 680) (y 100) (width 100) (height 30) (enable 1) (onclick 0) (parentinstance (instance-address [FORM1])))
([BUTTON9] of GUIBUTTON
  (caption ?*y12*) (x 680) (y 140) (width 100) (height 30) (enable 1) (onclick 0) (parentinstance (instance-address [FORM1])))
([BUTTON10] of GUIBUTTON
  (caption ?*y9*) (x 680) (y 180) (width 100) (height 30) (enable 1) (onclick 0) (parentinstance (instance-address [FORM1])))

([IMAGEL] of GUIIMAGE
  (x 10) (y 60) (width 320) (height 240) (stretch 1) (prop 1) (onload 0) (parentinstance (instance-address [FORM1])))
([IMAGER] of GUIIMAGE
  (x 340) (y 60) (width 320) (height 240) (stretch 1) (prop 1) (onload 0) (parentinstance (instance-address [FORM1])))
([IMAGEGL] of GUIIMAGE
  (x 10) (y 310) (width 320) (height 240) (stretch 1) (prop 1) (onload 0) (parentinstance (instance-address [FORM1])))
([IMAGEGR] of GUIIMAGE
  (x 340) (y 310) (width 320) (height 240) (stretch 1) (prop 1) (onload 0) (parentinstance (instance-address [FORM1])))
([IMAGED] of GUIIMAGE
  (x 10) (y 560) (width 320) (height 240) (stretch 1) (prop 1) (onload 0) (parentinstance (instance-address [FORM1])))
 
([TIMER0_0] of GUITIMER
  (interval 500) (enable 0) (parentinstance (instance-address [FORM1]))) ;таймер подсчета длительности нажатия BUTTON0
([TIMER0_1] of GUITIMER
  (interval 20) (enable 0) (parentinstance (instance-address [FORM1]))) ;таймер повторов нажатия BUTTON0
 
([TIMER1_0] of GUITIMER
  (interval 500) (enable 0) (parentinstance (instance-address [FORM1]))) ;таймер подсчета длительности нажатия BUTTON1
([TIMER1_1] of GUITIMER
  (interval 20) (enable 0) (parentinstance (instance-address [FORM1]))) ;таймер повторов нажатия BUTTON1
 
([TIMER2_0] of GUITIMER
  (interval 500) (enable 0) (parentinstance (instance-address [FORM1]))) ;таймер подсчета длительности нажатия BUTTON2
([TIMER2_1] of GUITIMER
  (interval 20) (enable 0) (parentinstance (instance-address [FORM1]))) ;таймер повторов нажатия BUTTON2
 
([TIMER3_0] of GUITIMER
  (interval 500) (enable 0) (parentinstance (instance-address [FORM1]))) ;таймер подсчета длительности нажатия BUTTON3
([TIMER3_1] of GUITIMER
  (interval 20) (enable 0) (parentinstance (instance-address [FORM1]))) ;таймер повторов нажатия BUTTON3
 
([TIMER4_0] of GUITIMER
  (interval 500) (enable 0) (parentinstance (instance-address [FORM1]))) ;таймер подсчета длительности нажатия BUTTON4
([TIMER4_1] of GUITIMER
  (interval 20) (enable 0) (parentinstance (instance-address [FORM1]))) ;таймер повторов нажатия BUTTON4
 
([TIMER5_0] of GUITIMER
  (interval 500) (enable 0) (parentinstance (instance-address [FORM1]))) ;таймер подсчета длительности нажатия BUTTON5
([TIMER5_1] of GUITIMER
  (interval 20) (enable 0) (parentinstance (instance-address [FORM1]))) ;таймер повторов нажатия BUTTON5
 
([CVCAMERAL] of CVCAMERA
  (numcam 0)) ;Подключиться к первой попавшейся веб-камере
([CVCAMERAR] of CVCAMERA
  (numcam 1)) ;Подключиться ко второй попавшейся веб-камере
)


(deffunction stereocorrespondencebmget ()
;/////////////////////////////////
(bind ?stereobmstateref (cv-stereobmstate-create 16 0))

; (bind $?stereobmstate (cv-stereobmstate-get ?stereobmstateref))
; (loop-for-count (?i 1 19) do
;  (printout t "$?stereobmstate: " ?i " " (nth$ ?i $?stereobmstate) crlf)
; )

;(cv-stereobmstate-set ?stereobmstateref (replace$ $?stereobmstate 2 2 5))
; (cv-stereobmstate-set ?stereobmstateref (create$ 1 9 31 15 0 16 10 15 0 0 0 0 0 0 0 0 0 0 -1))
;(cv-stereobmstate-set ?stereobmstateref (create$ 1 41 31 41 0 128 10 15 0 0 0 0 0 0 0 0 0 0 -1))
;(cv-stereobmstate-set ?stereobmstateref (create$ 1 27 31 9 0 16 10 15 0 0 0 0 0 0 0 0 0 0 -1))


; (bind $?stereobmstate (cv-stereobmstate-get ?stereobmstateref))
;  (loop-for-count (?i 1 19) do
;  (printout t "$?stereobmstate: " ?i " " (nth$ ?i $?stereobmstate) crlf)
; )

(cv-stereocorrespondencebm-get ?*imageGLref* ?*imageGRref* ?*matrixDLref* ?stereobmstateref)
(cv-stereobmstate-destroy ?stereobmstateref)

(bind ?disparity_left_visual (cv-matrix-create  ?*imagewidth* ?*imageheight* 0)) ; 0- CV_8U
; (cv-array-convertscale ?*matrixDLref* ?disparity_left_visual -16.0 0.0)
(cv-array-normalize ?*matrixDLref* ?disparity_left_visual 0. 256. 32 0)

;(cv-image-save ?disparity_left_visual "C:\\a.bmp")
   
(cv-array-color-convert ?disparity_left_visual ?*resimageref* 8)
(gui-image-cvimageload (instance-address [IMAGED]) ?*resimageref*)
;/////////////////////////////////
)

;--------------------------------------------------------------------------------------------------------------------
;Функция вывода двух изображений ?*imageLref* и ?*imageRref* в [IMAGEL] и [IMAGER] на форму из одного стереоизображения ?*srcimageref*
;Вх парам:
;Вых: ---.
(deffunction stereoin (?roisetX ?roisetY  ?roisetWidth ?roisetHeight ?parallax)
(cv-image-roi-set ?roisetX ?roisetY ?roisetWidth ?roisetHeight ?*srcimageref*)
(cv-array-copy ?*srcimageref* ?*imageRref* 0)
(gui-image-cvimageload (instance-address [IMAGER]) ?*imageRref*)

(cv-image-roi-set (+ ?roisetX ?parallax) ?roisetY ?roisetWidth ?roisetHeight ?*srcimageref*)
(cv-array-copy ?*srcimageref* ?*imageLref* 0)
(gui-image-cvimageload (instance-address [IMAGEL]) ?*imageLref*)

(cv-array-color-convert ?*imageRref* ?*imageGRref* 6)
(cv-array-color-convert ?*imageLref* ?*imageGLref* 6)
;//////////////////
;Гуд
(cv-array-smooth ?*imageGRref* ?*imageGRref* 1 3. 5. 0. 0.)
(cv-array-smooth ?*imageGLref* ?*imageGLref* 1 3. 5. 0. 0.)

;(cv-array-smooth ?*imageGRref* ?*imageGRref* 2 19.2 19.2 0. 0.)
;(cv-array-smooth ?*imageGLref* ?*imageGLref* 2 19.2 19.2 0. 0.)

;(cv-array-dilate ?*imageGRref* ?*imageGRref* 0 1) ;// Утолщаем контуры
;(cv-array-canny ?*imageGRref* ?*imageGRref* 2000. 0. 5) ;// Нах. границы

;(cv-array-dilate ?*imageGLref* ?*imageGLref* 0 1) ;// Утолщаем контуры
;(cv-array-canny ?*imageGLref* ?*imageGLref* 2000. 0. 5) ;// Нах. границы
;//////////////////
(cv-array-color-convert ?*imageGRref* ?*resimageref* 8)
(gui-image-cvimageload (instance-address [IMAGEGR]) ?*resimageref*)

(cv-array-color-convert ?*imageGLref* ?*resimageref* 8)
(gui-image-cvimageload (instance-address [IMAGEGL]) ?*resimageref*)
(stereocorrespondencebmget)
)

(deffunction cameral-queryimage ()
(bind ?cvcameraref (send [CVCAMERAL] get-cvcameraref))
(if (= (cv-camera-queryimage ?cvcameraref) -1) ;попытка запроса у камеры следующего кадра.
then
  ;не удалось получить снимок
  (printout t ?*y15* crlf)
else
  ;удалось получить снимок
  (printout t ?*y16* crlf)
 
;  (if (and (= (send [CVCAMERAL] get-imagewidth) ?*imagewidth*) (= (send [CVCAMERAL] get-imageheight) ?*imageheight*))
;  then
;  (bind ?*imageLref* (send [CVCAMERAL] get-imageref))
;  else
  (bind ?tmpimageref (send [CVCAMERAL] get-imageref))
  (cv-array-resize ?tmpimageref ?*imageLref* 1)
;  )

  (if (= (cv-image-origin-get ?*imageLref*) 0)
   then
    (cv-array-flip ?*imageLref* 0 0)
   )
  (gui-image-cvimageload (instance-address [IMAGEL]) ?*imageLref*)
  (cv-array-color-convert ?*imageLref* ?*imageGLref* 6)
  (cv-array-color-convert ?*imageGLref* ?*resimageref* 8)
  (gui-image-cvimageload (instance-address [IMAGEGL]) ?*resimageref*)
)
)

(deffunction camerar-queryimage ()
(bind ?cvcameraref (send [CVCAMERAR] get-cvcameraref))
(if (= (cv-camera-queryimage ?cvcameraref) -1) ;попытка запроса у камеры следующего кадра.
then
  ;не удалось получить снимок
  (printout t ?*y15* crlf)
else
  ;удалось получить снимок
  (printout t ?*y16* crlf)
  ;(bind ?*imageRref* (send [CVCAMERAR] get-imageref))
  (bind ?tmpimageref (send [CVCAMERAR] get-imageref))
  (cv-array-resize ?tmpimageref ?*imageRref* 1)
 
  (if (= (cv-image-origin-get ?*imageRref*) 0)
   then
    (cv-array-flip ?*imageRref* 0 0)
   )
  (gui-image-cvimageload (instance-address [IMAGER]) ?*imageRref*)
  (cv-array-color-convert ?*imageRref* ?*imageGRref* 6)
  (cv-array-color-convert ?*imageGRref* ?*resimageref* 8)
  (gui-image-cvimageload (instance-address [IMAGEGR]) ?*resimageref*)
)
)

(defrule rule-createform1
?num <- (phase start)
=>
(retract ?num)
(mainform-position-set (+ (send [FORM1] get-x) (send [FORM1] get-width)) (send [FORM1] get-y))
(send [FORM1] guiallobjectcreate)

(bind ?*imageRref* (cv-image-create  ?*imagewidth* ?*imageheight* 8 3))
(bind ?*imageLref* (cv-image-create  ?*imagewidth* ?*imageheight* 8 3))

(bind ?*imageGRref* (cv-image-create  ?*imagewidth* ?*imageheight* 8 1))
(bind ?*imageGLref* (cv-image-create  ?*imagewidth* ?*imageheight* 8 1))

(bind ?*resimageref* (cv-image-create  ?*imagewidth* ?*imageheight* 8 3))

(bind ?*matrixDLref* (cv-matrix-create  ?*imagewidth* ?*imageheight* 3)) ; 3- CV_16S
(bind ?*matrixDRref* (cv-matrix-create  ?*imagewidth* ?*imageheight* 3))
)

;Правило обработки события кнопки BUTTON11 - Загр.фото
(defrule rule-button11event
(declare (salience 99))
(object (name [BUTTON11]) (onclick ?xx&:(> ?xx 0)))
=>
(send [BUTTON11] put-onclick 0)

(bind ?filename (str-cat (system-currentdir-get) "\\dop\\666.jpg")) ; "\\dop\\555.jpg")) ;"\\dop\\left_right.jpg")) ;"\\dop\\1.jpg")) ;"\\dop\\left_right.jpg"))
(bind ?*srcimageref* (cv-image-load -1 ?filename))
(if (> ?*srcimageref* 0)
then
  (if (= (cv-image-origin-get ?*srcimageref*) 0)
  then
   (cv-array-flip ?*srcimageref* 0 0)
  )
)
(stereoin ?*X* ?*Y* ?*imagewidth* ?*imageheight* ?*parallax*)
)

;Правило обработки события клика кнопки BUTTON0 - >>
(defrule rule-button0event
(declare (salience 99))
(object (name [BUTTON0]) (onclick ?xx&:(> ?xx 0)))
=>
(send [BUTTON0] put-onclick 0)
(bind ?*X* (- ?*X* 1))
(if (>= ?*X* 0)
then
  (stereoin ?*X* ?*Y* ?*imagewidth* ?*imageheight* ?*parallax*)
else
(bind ?*X* 0)
)
)

;Правило обработки события нажатия кнопки BUTTON0 - Включить таймер
(defrule rule-button0downevent
(declare (salience 99))
(object (name [BUTTON0]) (onmousedown ?xx&:(> ?xx 0)))
=>
(send [BUTTON0] put-onmousedown 0)

(bind ?*oldtimer0_0* (send [TIMER0_0] get-ontimer))
  ;Включить таймер
(send [TIMER0_0] put-enable 1)
(send [TIMER0_0] guiobjectmodify)
)

;Правило обработки события отжатия кнопки BUTTON0 - Выключить таймер
(defrule rule-button0upevent
(declare (salience 99))
(object (name [BUTTON0]) (onmouseup ?xx&:(> ?xx 0)))
=>
(send [BUTTON0] put-onmouseup 0)
  ;Выключить таймер
(send [TIMER0_0] put-enable 0)
(send [TIMER0_0] guiobjectmodify)

;Выключить таймер
(send [TIMER0_1] put-enable 0)
(send [TIMER0_1] guiobjectmodify)
)

;Правило обработки события таймера TIMER0_0
(defrule rule-timer0_0event
(declare (salience 9))
(object (name [TIMER0_0]) (ontimer ?aa) (enable 1))
=>
(if (> ?aa ?*oldtimer0_0*)
then
  (bind ?*oldtimer0_0* ?aa)
  ;Выключить таймер
  (send [TIMER0_0] put-enable 0)
  (send [TIMER0_0] guiobjectmodify)

  ;Включить таймер
  (send [TIMER0_1] put-enable 1)
  (send [TIMER0_1] guiobjectmodify)
)
)

;Правило обработки события таймера TIMER0_1
(defrule rule-timer0_1event
(declare (salience 9))
(object (name [TIMER0_1]) (ontimer ?aa) (enable 1))
=>
(bind ?*X* (- ?*X* 1))
(if (>= ?*X* 0)
then
  (stereoin ?*X* ?*Y* ?*imagewidth* ?*imageheight* ?*parallax*)
else
(bind ?*X* 0)
)
)

;-------------------------------------------------------
;Правило обработки события кнопки BUTTON1 - <<
(defrule rule-button1event
(declare (salience 99))
(object (name [BUTTON1]) (onclick ?xx&:(> ?xx 0)))
=>
(send [BUTTON1] put-onclick 0)
(bind ?*X* (+ ?*X* 1))
(bind ?a (- (cv-image-width-get ?*srcimageref*) ?*imagewidth* ?*parallax*))
(if (<= ?*X* ?a)
then
  (stereoin ?*X* ?*Y* ?*imagewidth* ?*imageheight* ?*parallax*)
else
(bind ?*X* ?a)
)
)

;Правило обработки события нажатия кнопки BUTTON1 - Включить таймер
(defrule rule-button1downevent
(declare (salience 99))
(object (name [BUTTON1]) (onmousedown ?xx&:(> ?xx 0)))
=>
(send [BUTTON1] put-onmousedown 0)

(bind ?*oldtimer1_0* (send [TIMER1_0] get-ontimer))
  ;Включить таймер
(send [TIMER1_0] put-enable 1)
(send [TIMER1_0] guiobjectmodify)
)

;Правило обработки события отжатия кнопки BUTTON1 - Выключить таймер
(defrule rule-button1upevent
(declare (salience 99))
(object (name [BUTTON1]) (onmouseup ?xx&:(> ?xx 0)))
=>
(send [BUTTON1] put-onmouseup 0)
  ;Выключить таймер
(send [TIMER1_0] put-enable 0)
(send [TIMER1_0] guiobjectmodify)

;Выключить таймер
(send [TIMER1_1] put-enable 0)
(send [TIMER1_1] guiobjectmodify)
)

;Правило обработки события таймера TIMER1_0
(defrule rule-timer1_0event
(declare (salience 9))
(object (name [TIMER1_0]) (ontimer ?aa) (enable 1))
=>
(if (> ?aa ?*oldtimer1_0*)
then
  (bind ?*oldtimer1_0* ?aa)
  ;Выключить таймер
  (send [TIMER1_0] put-enable 0)
  (send [TIMER1_0] guiobjectmodify)

  ;Включить таймер
  (send [TIMER1_1] put-enable 1)
  (send [TIMER1_1] guiobjectmodify)
)
)

;Правило обработки события таймера TIMER1_1
(defrule rule-timer1_1event
(declare (salience 9))
(object (name [TIMER1_1]) (ontimer ?aa) (enable 1))
=>
(bind ?*X* (+ ?*X* 1))
(bind ?a (- (cv-image-width-get ?*srcimageref*) ?*imagewidth* ?*parallax*))
(if (<= ?*X* ?a)
then
  (stereoin ?*X* ?*Y* ?*imagewidth* ?*imageheight* ?*parallax*)
else
(bind ?*X* ?a)
)
)

;-------------------------------------------------------
;Правило обработки события кнопки BUTTON2 - <
(defrule rule-button2event
(declare (salience 99))
(object (name [BUTTON2]) (onclick ?xx&:(> ?xx 0)))
=>
(send [BUTTON2] put-onclick 0)

(bind ?*parallax* (+ ?*parallax* 1))
(bind ?a (- (cv-image-width-get ?*srcimageref*) ?*imagewidth* ?*X*))
(if (<= ?*parallax* ?a)
then
  (stereoin ?*X* ?*Y* ?*imagewidth* ?*imageheight* ?*parallax*)
else
(bind ?*parallax* ?a)
)
)

;Правило обработки события нажатия кнопки BUTTON2 - Включить таймер
(defrule rule-button2downevent
(declare (salience 99))
(object (name [BUTTON2]) (onmousedown ?xx&:(> ?xx 0)))
=>
(send [BUTTON2] put-onmousedown 0)

(bind ?*oldtimer2_0* (send [TIMER2_0] get-ontimer))
  ;Включить таймер
(send [TIMER2_0] put-enable 1)
(send [TIMER2_0] guiobjectmodify)
)

;Правило обработки события отжатия кнопки BUTTON2 - Выключить таймер
(defrule rule-button2upevent
(declare (salience 99))
(object (name [BUTTON2]) (onmouseup ?xx&:(> ?xx 0)))
=>
(send [BUTTON2] put-onmouseup 0)
  ;Выключить таймер
(send [TIMER2_0] put-enable 0)
(send [TIMER2_0] guiobjectmodify)

;Выключить таймер
(send [TIMER2_1] put-enable 0)
(send [TIMER2_1] guiobjectmodify)
)

;Правило обработки события таймера TIMER2_0
(defrule rule-timer2_0event
(declare (salience 9))
(object (name [TIMER2_0]) (ontimer ?aa) (enable 1))
=>
(if (> ?aa ?*oldtimer2_0*)
then
  (bind ?*oldtimer2_0* ?aa)
  ;Выключить таймер
  (send [TIMER2_0] put-enable 0)
  (send [TIMER2_0] guiobjectmodify)

  ;Включить таймер
  (send [TIMER2_1] put-enable 1)
  (send [TIMER2_1] guiobjectmodify)
)
)

;Правило обработки события таймера TIMER2_1
(defrule rule-timer2_1event
(declare (salience 9))
(object (name [TIMER2_1]) (ontimer ?aa) (enable 1))
=>
(bind ?*parallax* (+ ?*parallax* 1))
(bind ?a (- (cv-image-width-get ?*srcimageref*) ?*imagewidth* ?*X*))
(if (<= ?*parallax* ?a)
then
  (stereoin ?*X* ?*Y* ?*imagewidth* ?*imageheight* ?*parallax*)
else
(bind ?*parallax* ?a)
)
)

;-------------------------------------------------------
;Правило обработки события кнопки BUTTON3 - >
(defrule rule-button3event
(declare (salience 99))
(object (name [BUTTON3]) (onclick ?xx&:(> ?xx 0)))
=>
(send [BUTTON3] put-onclick 0)
(bind ?*parallax* (- ?*parallax* 1))
(if (>= ?*parallax* 0)
then
  (stereoin ?*X* ?*Y* ?*imagewidth* ?*imageheight* ?*parallax*)
else
(bind ?*parallax* 0)
)
)

;Правило обработки события нажатия кнопки BUTTON3 - Включить таймер
(defrule rule-button3downevent
(declare (salience 99))
(object (name [BUTTON3]) (onmousedown ?xx&:(> ?xx 0)))
=>
(send [BUTTON3] put-onmousedown 0)

(bind ?*oldtimer3_0* (send [TIMER3_0] get-ontimer))
  ;Включить таймер
(send [TIMER3_0] put-enable 1)
(send [TIMER3_0] guiobjectmodify)
)

;Правило обработки события отжатия кнопки BUTTON3 - Выключить таймер
(defrule rule-button3upevent
(declare (salience 99))
(object (name [BUTTON3]) (onmouseup ?xx&:(> ?xx 0)))
=>
(send [BUTTON3] put-onmouseup 0)
  ;Выключить таймер
(send [TIMER3_0] put-enable 0)
(send [TIMER3_0] guiobjectmodify)

;Выключить таймер
(send [TIMER3_1] put-enable 0)
(send [TIMER3_1] guiobjectmodify)
)

;Правило обработки события таймера TIMER3_0
(defrule rule-timer3_0event
(declare (salience 9))
(object (name [TIMER3_0]) (ontimer ?aa) (enable 1))
=>
(if (> ?aa ?*oldtimer3_0*)
then
  (bind ?*oldtimer3_0* ?aa)
  ;Выключить таймер
  (send [TIMER3_0] put-enable 0)
  (send [TIMER3_0] guiobjectmodify)

  ;Включить таймер
  (send [TIMER3_1] put-enable 1)
  (send [TIMER3_1] guiobjectmodify)
)
)

;Правило обработки события таймера TIMER1_1
(defrule rule-timer3_1event
(declare (salience 9))
(object (name [TIMER3_1]) (ontimer ?aa) (enable 1))
=>
(bind ?*parallax* (- ?*parallax* 1))
(if (>= ?*parallax* 0)
then
  (stereoin ?*X* ?*Y* ?*imagewidth* ?*imageheight* ?*parallax*)
else
(bind ?*parallax* 0)
)
)

;-------------------------------------------------------
;Правило обработки события клика кнопки BUTTON4 - /\
(defrule rule-button4event
(declare (salience 99))
(object (name [BUTTON4]) (onclick ?xx&:(> ?xx 0)))
=>
(send [BUTTON4] put-onclick 0)
(bind ?*Y* (- ?*Y* 1))
(if (>= ?*Y* 0)
then
  (stereoin ?*X* ?*Y* ?*imagewidth* ?*imageheight* ?*parallax*)
else
(bind ?*Y* 0)
)
)

;Правило обработки события нажатия кнопки BUTTON4 - Включить таймер
(defrule rule-button4downevent
(declare (salience 99))
(object (name [BUTTON4]) (onmousedown ?xx&:(> ?xx 0)))
=>
(send [BUTTON4] put-onmousedown 0)

(bind ?*oldtimer4_0* (send [TIMER4_0] get-ontimer))
  ;Включить таймер
(send [TIMER4_0] put-enable 1)
(send [TIMER4_0] guiobjectmodify)
)

;Правило обработки события отжатия кнопки BUTTON4 - Выключить таймер
(defrule rule-button4upevent
(declare (salience 99))
(object (name [BUTTON4]) (onmouseup ?xx&:(> ?xx 0)))
=>
(send [BUTTON4] put-onmouseup 0)
  ;Выключить таймер
(send [TIMER4_0] put-enable 0)
(send [TIMER4_0] guiobjectmodify)

;Выключить таймер
(send [TIMER4_1] put-enable 0)
(send [TIMER4_1] guiobjectmodify)
)

;Правило обработки события таймера TIMER4_0
(defrule rule-timer4_0event
(declare (salience 9))
(object (name [TIMER4_0]) (ontimer ?aa) (enable 1))
=>
(if (> ?aa ?*oldtimer4_0*)
then
  (bind ?*oldtimer4_0* ?aa)
  ;Выключить таймер
  (send [TIMER4_0] put-enable 0)
  (send [TIMER4_0] guiobjectmodify)

  ;Включить таймер
  (send [TIMER4_1] put-enable 1)
  (send [TIMER4_1] guiobjectmodify)
)
)

;Правило обработки события таймера TIMER4_1
(defrule rule-timer4_1event
(declare (salience 9))
(object (name [TIMER4_1]) (ontimer ?aa) (enable 1))
=>
(bind ?*Y* (- ?*Y* 1))
(if (>= ?*Y* 0)
then
  (stereoin ?*X* ?*Y* ?*imagewidth* ?*imageheight* ?*parallax*)
else
(bind ?*Y* 0)
)
)

;-------------------------------------------------------
;Правило обработки события кнопки BUTTON5 - \/
(defrule rule-button5event
(declare (salience 99))
(object (name [BUTTON5]) (onclick ?xx&:(> ?xx 0)))
=>
(send [BUTTON5] put-onclick 0)
(bind ?*Y* (+ ?*Y* 1))
(bind ?a (- (cv-image-height-get ?*srcimageref*) ?*imageheight*))
(if (<= ?*Y* ?a)
then
  (stereoin ?*X* ?*Y* ?*imagewidth* ?*imageheight* ?*parallax*)
else
(bind ?*Y* ?a)
)
)

;Правило обработки события нажатия кнопки BUTTON5 - Включить таймер
(defrule rule-button5downevent
(declare (salience 99))
(object (name [BUTTON5]) (onmousedown ?xx&:(> ?xx 0)))
=>
(send [BUTTON5] put-onmousedown 0)

(bind ?*oldtimer5_0* (send [TIMER5_0] get-ontimer))
  ;Включить таймер
(send [TIMER5_0] put-enable 1)
(send [TIMER5_0] guiobjectmodify)
)

;Правило обработки события отжатия кнопки BUTTON5 - Выключить таймер
(defrule rule-button5upevent
(declare (salience 99))
(object (name [BUTTON5]) (onmouseup ?xx&:(> ?xx 0)))
=>
(send [BUTTON5] put-onmouseup 0)
  ;Выключить таймер
(send [TIMER5_0] put-enable 0)
(send [TIMER5_0] guiobjectmodify)

;Выключить таймер
(send [TIMER5_1] put-enable 0)
(send [TIMER5_1] guiobjectmodify)
)

;Правило обработки события таймера TIMER5_0
(defrule rule-timer5_0event
(declare (salience 9))
(object (name [TIMER5_0]) (ontimer ?aa) (enable 1))
=>
(if (> ?aa ?*oldtimer5_0*)
then
  (bind ?*oldtimer5_0* ?aa)
  ;Выключить таймер
  (send [TIMER5_0] put-enable 0)
  (send [TIMER5_0] guiobjectmodify)

  ;Включить таймер
  (send [TIMER5_1] put-enable 1)
  (send [TIMER5_1] guiobjectmodify)
)
)

;Правило обработки события таймера TIMER5_1
(defrule rule-timer5_1event
(declare (salience 9))
(object (name [TIMER5_1]) (ontimer ?aa) (enable 1))
=>
(bind ?*Y* (+ ?*Y* 1))
(bind ?a (- (cv-image-height-get ?*srcimageref*) ?*imageheight*))
(if (<= ?*Y* ?a)
then
  (stereoin ?*X* ?*Y* ?*imagewidth* ?*imageheight* ?*parallax*)
else
(bind ?*Y* ?a)
)
)
;-------------------------------------------------------

;Правило обработки события кнопки BUTTON6 - Вычислить GC
(defrule rule-button6event
(declare (salience 99))
(object (name [BUTTON6]) (onclick ?xx&:(> ?xx 0)))
=>
(send [BUTTON6] put-onclick 0)

;/////////////////////////////////
(bind ?stereogcstateref (cv-stereogcstate-create 16 2))

;(bind $?stereogcstate (cv-stereogcstate-get ?stereogcstateref))
;  (loop-for-count (?i 1 10) do
;  (printout t "$?stereogcstate: " ?i " " (nth$ ?i $?stereogcstate) crlf)
;)


; (cv-stereogcstate-set ?stereogcstateref (create$ 5 1 10000 0 16 1))

; (bind $?stereogcstate (cv-stereogcstate-get ?stereogcstateref))
;  (loop-for-count (?i 1 10) do
;  (printout t "$?stereogcstate: " ?i " " (nth$ ?i $?stereogcstate) crlf)
;)

(cv-stereocorrespondencegc-get ?*imageGLref* ?*imageGRref* ?*matrixDLref* ?*matrixDRref* ?stereogcstateref 0)
(cv-stereogcstate-destroy ?stereogcstateref)

(bind ?disparity_left_visual (cv-matrix-create  ?*imagewidth* ?*imageheight* 0)) ; 0- CV_8U
  (cv-array-convertscale ?*matrixDLref* ?disparity_left_visual -16.0 0.0)
;(cv-array-normalize ?*matrixDLref* ?disparity_left_visual 0. 256. 32 0)
(cv-array-color-convert ?disparity_left_visual ?*resimageref* 8)
(gui-image-cvimageload (instance-address [IMAGED]) ?*resimageref*)
;/////////////////////////////////
)
;-------------------------------------------------------

;Правило обработки события кнопки BUTTON7 - Вычислить BM
(defrule rule-button7event
(declare (salience 99))
(object (name [BUTTON7]) (onclick ?xx&:(> ?xx 0)))
=>
(send [BUTTON7] put-onclick 0)

stereocorrespondencebmget
)






;Правило обработки события нажатия кнопки BUTTON8 - Подключиться к камерам
(defrule rule-button8downevent
(declare (salience 99))
(object (name [BUTTON8]) (onclick ?xx&:(> ?xx 0)))
=>
(send [BUTTON8] put-onclick 0)

(if (= (cv-camera-new (instance-address [CVCAMERAL])) -1) ;попытка подключения к камере 0
then
  ;не удалось подключиться
  (printout t ?*y13* crlf)
else
  ;удалось подключиться
  (printout t ?*y14* crlf)
)

(if (= (cv-camera-new (instance-address [CVCAMERAR])) -1) ;попытка подключения к камере 1
then
  ;не удалось подключиться
  (printout t ?*y17* crlf)
else
  ;удалось подключиться
  (printout t ?*y18* crlf)
)
)

;Правило обработки события нажатия кнопки BUTTON9 - отключить камеры
(defrule rule-button9downevent
(declare (salience 99))
(object (name [BUTTON9]) (onclick ?xx&:(> ?xx 0)))
=>
(send [BUTTON9] put-onclick 0)

(if (= (cv-camera-destroy (instance-address [CVCAMERAL])) -1) ;попытка отключения от камеры
then
  ;не удалось отключиться
  (printout t ?*y19* crlf)
else
  ;удалось отключиться
  (printout t ?*y20* crlf)
)
(if (= (cv-camera-destroy (instance-address [CVCAMERAR])) -1) ;попытка отключения от камеры
then
  ;не удалось отключиться
  (printout t ?*y19* crlf)
else
  ;удалось отключиться
  (printout t ?*y20* crlf)
)
)

;Правило обработки события кнопки BUTTON10 - снимок
(defrule rule-button10event
(declare (salience 99))
(object (name [BUTTON10]) (onclick ?xx&:(> ?xx 0)))
=>
(send [BUTTON10] put-onclick 0)
(cameral-queryimage)
(camerar-queryimage)
)

;-------------------------------------------------------
;Правило обработки события закрытия формы [FORM1]
(defrule rule-form1closeevent
(declare (salience 99))
(object (name [FORM1]) (onclose 1))
=>
(open "Test1INI.ecl" datINI "w")
(printout datINI "(defglobal" crlf)
(printout datINI " ?*parallax* = " ?*parallax* crlf)
(printout datINI " ?*X* = " ?*X* crlf)
(printout datINI " ?*Y* = " ?*Y* crlf)
(printout datINI " )" crlf)
(close datINI)

(cv-camera-destroy (instance-address [CVCAMERAL]))
(cv-camera-destroy (instance-address [CVCAMERAR]))
(exit)
)
Вложения
RB_001.JPG
Проект Robosonic RS http://www.aigod.com
Аватара пользователя
Виктор Казаринов
 
Сообщения: 1387
Зарегистрирован: 21 июн 2006, 11:22
Откуда: г. Омск
Skype: victorkazarinov
прог. языки: почти все понемногу
ФИО: Казаринов Виктор Геннадьевич

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Виктор Казаринов » 11 янв 2011, 14:04

Я написал очередной библиотечный модуль на языке ECLIPS в свою систему AIAssistant. Этот модуль осуществляет синтаксический анализ (парсинг) входного сообщения на основе контекстно - независимых грамматик. Но т.к. для работы ИИ требуется обработка контекстно-зависимых грамматик, то я в настоящее время совершенствую этот модуль. Кроме того, я осуществляю соединение онтологий, имеющихся в программе с этим модулем. Это позволит все терминальные и нетерминальные символы а также правила их вывода брать из онтологий. Но что такое эти самые правила и символы? Это по сути есть онтологическое описание мира.
Появилась мысль о том, что этот анализ для входной одномерной последовательности слов на некотором ЕЯ можно распространить на двухмерный и трехмерный случаи. Тогда получим анализаторы письменной речи, звука, изображений и 3D пространства на едином принципе. Но для подтверждения такой идеи придется написать специальный плагин - тестовую лабораторию, что я уже и начал осуществлять.
Проект Robosonic RS http://www.aigod.com
Аватара пользователя
Виктор Казаринов
 
Сообщения: 1387
Зарегистрирован: 21 июн 2006, 11:22
Откуда: г. Омск
Skype: victorkazarinov
прог. языки: почти все понемногу
ФИО: Казаринов Виктор Геннадьевич

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Freeon » 01 мар 2013, 11:53

Добрый день, Виктор. Есть ли у вас успехи в данном проетке?
Freeon
 
Сообщения: 6
Зарегистрирован: 01 мар 2013, 08:26

Re: Разработка RoboBrain: - модуль 3D реконструкции мира

Сообщение Виктор Казаринов » 02 мар 2013, 10:29

2Freeon: Времени прошло немало. Много чего я исследовал, разработал, отверг за это время по данному направлению. Но основная идея осталась. Есть несколько фундаментальных проблем, которые приходится решать в зрении. Не буду вдаваться в не интересные для публики подробности. В настоящее время я пишу на ANSI C в стиле, приближенном к ассемблеру, онтологичемкий движок, который находится в основе 3D зрения и других модулей. Суть в том чтобы этот движок позволял не только реконструировать глубину поверхностей наблюдаемой сцены, но и идентифицировать то, что видит, и что особенно важно - классифицировать это, т.е. на наиболее возможном для него уровне абстрагировать наблюдаемую часть мира.
Работа сейчас в самам разгаре, но я могу уделять этому не очень много времени. Однако делаю все, что возможно. Тут ведь дело такое, нужно ждать, пока Муза посетит очередной раз.
Проект Robosonic RS http://www.aigod.com
Аватара пользователя
Виктор Казаринов
 
Сообщения: 1387
Зарегистрирован: 21 июн 2006, 11:22
Откуда: г. Омск
Skype: victorkazarinov
прог. языки: почти все понемногу
ФИО: Казаринов Виктор Геннадьевич

След.

Вернуться в Проект Robosonic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1