Чумаченко А.А., Воробьев В.В. Сервер пятна SpotServer Рабочий отчет RWR-2014-06-01.1 Москва, 2014 г. RWR-2014-06-01.1 1 Аннотация Программа предназначена для распознавания цветовых пятен, а именно определения координат центра пятна, его цвета и радиуса. Принцип работы Программа SpotServer была написана под ОС Kubuntu при помощи Qt Creator версии 5.0. SpotServer запускается под ROS. Распознавание пятен сервером пятна производится с помощью библиотеки OpenCV, которая обеспечивает работу с камерой, обработку изображения и данных поступающих с камеры. SpotServer является узлом ROS и он передает данные в определенном формате в топик SpotMsg, откуда можно получить данные о центре пятна, его цвете и радиусе другими узлами. Входные и выходные данные Входные данные 1. Видеопоток с камеры. 2. Файл конфигурации Spotserver_node.ini: 0 - номер камеры 640 480 - разрешение камеры 3 - количество распознаваемых цветов(Color num) 5 - минимальный радиус цветового пятна (пикс.)(Spot radius min) 60 - маскисмальный радиус цветового пятна (пикс.)(Spot radius max) 0 - флаг для програмного отключения консольного вывода(Flag output console) 3 2 1 0 - количество процедур для размывки изображения(Eval proc num) Id цвета(color id). Каналы каждого цвета описываются отдельно друг за другом! H: 125 (минимальное значение) 255 (максимальное значение) S: 151 (минимальное значение) 255 (максимальное значение) V: 0 (минимальное значение) 255 (максимальное значение) Выходные данные: Массив SpotArray типа Spot. Структура Spot: Int32 center.x; - координата центра пятна по оси Х; Int32 center.y; - координата центра пятна по оси Y; Int32 radius; - радиус пятна; Int32 cColor; - номер цвета пятна. Программа отсылает в топик массив структур Spot. Пример работы с программой Для работы с сервером пятна необходима ОС Kubuntu версии 12.04, установленная библиотека компьютерной графики OpenCV версии 2.3.1 и система ROS с созданным рабочим окружением. Инструкция по установке и настройке ROS можно найти в DropBox'е. RWR-2014-06-01.1 2 После создания рабочей среды ROS скопируйте в папку src проект spotserver и каталог spot_msg. Затем: 1. Подключаем камеру. 2. Запускаем консоль и вводим команду roscore. 3. Не закрывая (!!!) предыдущую консоль открываем новую и вводим команду rosrun spotserver spotserver _node. 4. Открываются 3 окна Control, frmrez и hsv_and: Control frmrez hsv_and Control - окно управления RWR-2014-06-01.1 3 В программе используются алгоритмы сглаживания изображения. cvErode Radius - параметр указывает радиус сглаживания. cvErode Iterations - параметр регулирует количество итерации производимых для сглаживания. min spot radius - параметр регулирует минимальный радиус контура для нахождения пятна. max spot radius - регулирует максимальный радиус контура для нахождения пятна. ColorNum - параметр показывает цвета, которые ищет программа в окне hsv_and. В зависимости от того какую позицию показывает параметр такой цвет и показывается окно hsv_and Hmin Hmax - регулирует диапазон H модели HSV для выбранного цвета. Smin Smax - регулирует диапазон S модели HSV для выбранного цвета. Vmin Vmax - регулирует диапазон V модели HSV для выбранного цвета. frmrez - показывает изображение с камеры. Показывает изображение с камеры с найденными на нем цветами (выделены голубой окружностью). hsv_and - показывает окно настройки цвета. Программа переводит изображение в формат hsv а потом делит полученное изображение на 3 канала (H, S, V), где оператор, регулируя каждый из них, выделяет необходимые цвета. RWR-2014-06-01.1 4 В итоге, выделенный таким образом цвет можно наблюдать в окне HSV. (Белый цвет). Программные функции Пользовательские функции 1. 2. 3. 4. 5. 6. 7. 8. void ReadConfig(char *fname) — Чтение из файла конфигурации void error(const char *fmt, …) - Функция обработки ошибок void WriteConfig(char *fname) — Запись в файл конфигурации void myTrackbarH(S,V)min(max)(int pos) — Функции-обработчики ползунков для каналов HSV. void myTrackbarRadius (int pos) — Радиус размывания void myTrackbarColorNum (int pos) — Перезагрузка ползунков цветов void myTrackbarIterations(int pos) — Обработчик ползунка количества итераций размывания void myTrackbarSpotRadiusMin(Max)(int pos) — Функции-обработчики размера пятна Стандартные функции библиотеки OpenCV 1. cvCreateCameraCapture(CV_CAP_ANY) — Подключение камеры. В качестве параметра указано подключение любой камеры, которая присоединена к компьютеру. 2. assert(cap); - привязка камеры к переменной cap. 3. cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH(HEIGHT), WIDTH(HEIGHT)); - Установка разрешения. 4. cvQueryFrame(cap) — Получение кадра с камеры. 5. cvCreateImage( cvGetSize(frmrez), IPL_DEPTH_8U, 3 ); - создание пустых изображений. В качестве параметров указан размер, глубина цвета (бит), количество цветовых каналов. 6. сvNamedWindow ("Control", CV_WINDOW_AUTOSIZE) — устанавливает название окна 7. cvCreateTrackbar — создание ползунков 8. cvCreateStructuringElementEx — ядро для процедуры размывания 9. cvErode(frmrez, frmrez, Kern, erode_iterations); - функция размывания изображения 10. cvSmooth(frmrez, frmrez, CV_GAUSSIAN(CV_MEDIAN), 3, 3); - функция сглаживания (Гаусс/медиана) 11. cvCvtColor( frmrez, hsv, CV_BGR2HSV ); - конвертирования изображения из RGB в HSV 12. cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 ); - разбитие изображения на отдельные каналы H,S и V. 13. cvInRangeS(h_plane, cvScalar(Cols[cColor].Hmin(Vmin,Smin)), cvScalar(Cols[cColor].Hmax(Vmax,Smax)), h_range); выборка внутри канала.(Например, если пиксель по каналу H находится между Hmin и Hmax — то программа его отрисует) 14. cvAnd(h_range, s_range, hsv_and,0); - складывание изображений h_range и s_range в hsv_and 15. cvShowImage("hsv_and",hsv_and); - вывод изображения 16. cvFindContours( hsv_and, storage, &contours, sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0)) — поиск контуров, удовлетворяющих показателям H,S и V в hsv_and 17. cvMinEnclosingCircle - находит окружность минимальной площади, которая содержит данный набор 2D-точек. 18. CvCircle — отрисовка круга в заданных координатах. RWR-2014-06-01.1 5 19. cvClearMemStorage(storage); - очистка памяти с найденными контурами. 20. cvReleaseStructuringElement(&Kern); - отключения ядра для размытия изображения. 21. cvReleaseMemStorage( &storage); - удаление памяти, выделенной для хранения найденных контуров. 22. сvReleaseImage — удаление памяти, выделенной для хранения изображений 23. cvReleaseCapture(&cap); - отключение от камеры. 24.CvDestroyAllWindows(); - удаление всех созданных окон. Глобальные переменные Для сохранения исходного изображения с камеры IplImage* frmrez Для сохранения переведенного в ysv формат изображения IplImage* hsv Послойное сохранение изображения IplImage* h_plane IplImage* s_plane IplImage* v_plane Здесь сохраняется изображение в котром выделен нужный пользователю цвет по слоям и обратно сложено. IplImage* hsv_and Здесь выделен цвет, но изображение сохранено по разным слоям. IplImage* h_range IplImage* s_range IplImage* v_range CvMemStorage* storage – для выделения памяти. char ConfigFile[512] – имя файла конфигурационного файла тип массива. Для сохранения min и max значений 3 слоев искомых цветов typedef struct { int ColorID; int Hmin, Hmax; int Smin, Smax; int Vmin, Vmax; } TColDef; TColDef Cols[MAX_COLORS] int ColorNum - количество определяемых цветов int CurrentColor – положение ползунка int SPOT_RADIUS_MIN -min радиус контура пятна int SPOT_RADIUS_MAX – max радиус контура пятна int FLAG_OUTPUT_CONSOLE – флаг (выводить данные в консоль или нет) int const channelmax RWR-2014-06-01.1 6 int EvalProcNum – количество функции сглаживания изображения int EvalProc[MAX_EVAL_PROC] – значение для функций сглаживания Чумаченко А.А., Воробьев В.В. Сервер пятна SpotServer // Рабочий отчет RWR-2014-0601.1, -М.: Robofob Lab, 2014 RWR-2014-06-01.1 7