diff --git a/docs/assets/cam_calib1.png b/docs/assets/cam_calib1.png new file mode 100644 index 00000000..bb229a5b Binary files /dev/null and b/docs/assets/cam_calib1.png differ diff --git a/docs/assets/cam_calib2.png b/docs/assets/cam_calib2.png new file mode 100644 index 00000000..ede131bb Binary files /dev/null and b/docs/assets/cam_calib2.png differ diff --git a/docs/assets/cam_calib3.png b/docs/assets/cam_calib3.png new file mode 100644 index 00000000..49324c9c Binary files /dev/null and b/docs/assets/cam_calib3.png differ diff --git a/docs/assets/cam_calib4.png b/docs/assets/cam_calib4.png new file mode 100644 index 00000000..2aaef773 Binary files /dev/null and b/docs/assets/cam_calib4.png differ diff --git a/docs/ru/calibration.md b/docs/ru/calibration.md index 6415b01b..21192142 100644 --- a/docs/ru/calibration.md +++ b/docs/ru/calibration.md @@ -1,79 +1,99 @@ # Калибровка камеры -Компьютерное зрение получает все более широкое распространение. Зачастую, алгоритмы компьютерного зрения работают неточно, получая искаженное изображение с камеры, что особенно характерно для fisheye-камер. +Для точной работы систем компьютерного зрения (например, для навигации по ArUco-маркерам) используемая камера должна быть откалибрована. -![img](../assets/img1.jpg) +![distorted](../assets/img1.jpg) > Изображение "скруглено" ближе к краям. +Какой-либо алгоритм компьютерного зрения будет воспринимать информацию с этой картинки неправильно. -Какой-либо алгоритм компьютерного зрения будет воспринимать информацию с этой картинки неправильно. Для устранения подобных искажений камера, получающая изображения, должна быть откалибрована в соответствии со своими особенностями. - -## Установка скрипта +## Установка приложения Для начала, необходимо установить необходимые библиотеки: -``` -pip install numpy -pip install opencv-python -pip install glob -pip install pyyaml -pip install urllib.request +```bash +pip install numpy +pip install opencv-python +pip install pyyaml +pip install urllib2 +pip install flask, flask-wtf ``` -Затем скачиваем скрипт из репозитория: +Затем скачиваем исходный код из репозитория и проводим установку: ```bash -git clone https://github.com/tinderad/clever_cam_calibration.git -``` - -Переходим в скачанную папку и устанавливаем скрипт: - -```bash -cd clever_cam_calibration +git clone https://github.com/tinderad/calibration_web_2.7.git +cd calibration_web_2.7.git sudo python setup.py build sudo python setup.py install ``` -Если вы используете Windows, тогда скачайте архив из [репозитория](https://github.com/tinderad/clever_cam_calibration/archive/master.zip), распакуйте его и установите: - -```bash -cd path\to\archive\clever_cam_calibration\ -python setup.py build -python setup.py install -``` - -> path\to\archive - путь до распакованного архива. - ## Подготовка к калибровке -Вам необходимо подготовить калибровочную мишень. Она представляет собой «шахматную доску». Файл можно взять [отсюда](https://www.oreilly.com/library/view/learning-opencv-3/9781491937983/assets/lcv3_ac01.png). -Наклейте распечатанную мишень на любую твердую поверхность. Посчитайте количество пересечений в длину и в ширину доски, измерьте размер клетки (в мм). +Вам необходимо подготовить калибровочную мишень. Она представляет собой «шахматную доску». Файл можно взять [отсюда](https://www.oreilly.com/library/view/learning-opencv-3/9781491937983/assets/lcv3_ac01.png). +Наклейте распечатанную мишень на любую твердую поверхность. Посчитайте количество пересечений в длину и в ширину доски, измерьте размер клетки (в мм), как указано на изображении. -![img](../assets/chessboard.jpg) +![asd](../assets/chessboard.jpg) -Включите Клевер и подключитесь к его Wi-Fi. +Включите Клевер и подключитесь к его Wifi. -> Перейдите на 192.168.11.1:8080 и проверьте, получает ли компьютер изображения из топика image_raw. +> Перейдите на _192.168.11.1:8080_ и проверьте, получает ли компьютер изображения из топика _image_raw_. ## Калибровка -Запустите скрипт **_calibrate_cam_**: +Подключитесь к Клеверу по протоколу SSH (например, при помощи PuTTY). -**Windows:** +Запустите приложение: - ```bash ->path\to\python\Scripts\calibrate_cam.exe +```bash +>cd calibration_web_2.7/ccc_server +>python app.py ``` -> path\to\Python - путь до директории Python +Далее вам необходимо на компьютере открыть в браузере страницу по адресу _192.168.11.1:8081_ -**Linux:** +> Порт можно настроить в файле _ccc_server/config.py_. + +На открытой странице необходимо ввести параметры калибровочной мишени: количество перекрестий в длину и ширину, длину ребра квадрата. Для начала калибровки нажмите кнопку **_Start Calibration_**. + +![asd](../assets/cam_calib1.png) + +На следующей странице при помощи кнопки **_Catch photo_** можно делать фотографии калибровочной мишени. + +![asd](../assets/cam_calib2.png) + +Если программа нашла на изображении указанную мишень, откроется страница, на которой вам необходимо подтвердить корректность найденных перекрестий. + +![asd](../assets/cam_calib3.png) + +Если перекрестия были распознаныы правильно, нажмите на клавишу **_Add_**, и перейдите к получению новых фотографий. В противном же случае, ели перекристия были распознаны некорректно, пропустите данную фотографию при помощи клавиши **_Skip_**. + +>В большинстве случаев найденные углы будут подсвечиваться разными цветами, но иногда подсветка будет становиться красной. это происходит в том случае, если углы распознаны, но неточно. + +Чтобы откалибровать камеру, вам требуется сделать как минимум 25 фото шахматной доски с различных ракурсов. После преодоления данного порога появится кнопка **_Finish_**, по нажатию на которую начнется генерация калибровочного файла. + +>Это может занять некоторое время. + +На открывшейся странице выведется информация о результате калибровки: имя файла и re-projection error. +>re-projection error - отклонение от стандартной математической модели. Чем эта величина меньше, тем точнее проведена калибровка. + +![asd](../assets/cam_calib4.png) + +Программа обработает все полученные фотографии, и создаст **_.yaml_** файл в нынешней директории. При помощи этого файла можно будет выравнивать искажения на изображениях, полученных с этой камеры. + +> Если вы поменяете разрешение получаемого изображения, вам нужно будет снова калибровать камеру. + +## Предыдущая версия + +Также вы можете воспользоваться предыдущей версией программы, не имеющей web-интерфейса. + +Запустите скрипт **_calibrate_cam_**: ```bash >calibrate_cam ``` -Задайте параметры доски: +Задайте параметры мишени: ```bash >calibrate_cam @@ -95,8 +115,6 @@ help, catch (key: Enter), delete, restart, stop, finish Чтобы откалибровать камеру, вам требуется сделать как минимум 25 фото шахматной доски с различных ракурсов. -![img](../assets/calibration.jpg) - Чтобы сделать фото, введите команду **_catch_**. ```bash @@ -125,10 +143,10 @@ Calibration successful! **Калибровка по существующим изображениям:** -Если же у вас уже есть изображения, то вы можете откалибровать камеру по ним при помощи скрипта **_calibrate_cam_ex_**. +Если же у вас уже есть изображения, то вы можете откалибровать камеру по ним при помощи скрипта **_calibrate_from_dir_**. ```bash ->calibrate_cam_ex +>calibrate_from_dir ``` Указываем характеристики мишени, а так же путь до папки с изображениями: @@ -145,32 +163,31 @@ Path: # Путь до папки с изображениями Программа обработает все полученные фотографии, и создаст файл **_camera_info_****_._****_yaml_** в нынешней директории. При помощи этого файла можно будет выравнивать искажения на изображениях, полученных с этой камеры. -> Если вы поменяете разрешение получаемого изображения, вам нужно будет снова калибровать камеру. - ## Исправление искажений -За получение исправленного изображения отвечает функция **_get_undistorted_image(cv2_image, camera_info)_**: +За получение исправленного изображения отвечает функция +**clever_cam_calibration._get_undistorted_image(cv2_image, camera_info)_**: * **_cv2_image_**: Закодированное в массив cv2 изображение. * **_camera_****_­__****_info_**: Путь до файла калибровки. Функция возвращает массив cv2, в котором закодировано исправленное изображение. -> Если вы используете fisheye-камеру, поставляемую вместе с Клевером, то для обработки изображений разрешением 320x240 или 640x480 вы можете использовать уже существующие параметры калибровки. Для этого в качестве аргумента **_camera_info_** передайте параметры **_clever_cam_calibration.clevercamcalib.CLEVER_FISHEYE_CAM_320_** или **_clever_cam_calibration.clevercamcalib.CLEVER_FISHEYE_CAM_640_** соответственно. +> Если вы используете fisheye-камеру, поставляемую вместе с Клевером, то для обработки изображений разрешением 320x240 или 640x480 вы можете использовать уже существующие параметры калибровки. Для этого в качестве аргумента **_camera_info_** передайте параметры **_clever_cam_calibration.CLEVER_FISHEYE_CAM_320_** или **_clever_cam_calibration.CLEVER_FISHEYE_CAM_640_** соответственно. ## Примеры работы Изначальные изображения: -![img](../assets/img1.jpg) +![asd](../assets/img1.jpg) -![img](../assets/img2.jpg) +![asd](../assets/img2.jpg) Иcправленные изображения: -![img](../assets/calibresult.jpg) +![asd](../assets/calibresult.jpg) -![img](../assets/calibresult1.jpg) +![asd](../assets/calibresult1.jpg) ## Пример использования @@ -179,17 +196,17 @@ Path: # Путь до папки с изображениями Данная программа получает изображения с камеры Клевера и выводит их на экран в исправленном виде, используя существующий калибровочный файл. ```python -import clevercamcalib.clevercamcalib as ccc -import cv2 -import urllib.request -import numpy as np -while True: - req = urllib.request.urlopen('http://192.168.11.1:8080/snapshot?topic=/main_camera/image_raw') - arr = np.asarray(bytearray(req.read()), dtype=np.uint8) - image = cv2.imdecode(arr, -1) - undistorted_img = ccc.get_undistorted_image(image, ccc.CLEVER_FISHEYE_CAM_640) - cv2.imshow("undistort", undistorted_img) - cv2.waitKey(33) +import clever_cam_calibration as ccc +import cv2 +import urllib.request +import numpy as np +while True: + req = urllib.request.urlopen('http://192.168.11.1:8080/snapshot?topic=/main_camera/image_raw') + arr = np.asarray(bytearray(req.read()), dtype=np.uint8) + image = cv2.imdecode(arr, -1) + undistorted_img = ccc.get_undistorted_image(image, ccc.CLEVER_FISHEYE_CAM_640) + cv2.imshow("undistort", undistorted_img) + cv2.waitKey(33) cv2.destroyAllWindows() ``` @@ -198,13 +215,11 @@ cv2.destroyAllWindows() Чтобы применить параметры калибровки к системе ArUco-навигации, требуется перенести калибровочный .yaml файл на Raspberry Pi Клевера и инициализировать его. > Не забудьте подключиться к WiFI Клевера. - Для передачи файла используется протокол SFTP. В данном примере используется программа WinSCP. Подключимся к Raspberry Pi по SFTP: > Пароль: _**raspberry**_ - ![img](../assets/wcp1.png) Нажимаем “Войти”. Переходим в _**/home/pi/catkin_ws/src/clever/clever/camera_info/**_ и копируем туда калибровочный .yaml файл: @@ -225,4 +240,4 @@ cv2.destroyAllWindows() ![img](../assets/pty3.jpg) -> Не забудьте изменить разрешение камеры. +> Не забудьте изменить разрешение камеры в *main_camera.launch*.