Файл: Техническое зрение для системы управления сортировочного робота.pdf
Добавлен: 25.10.2023
Просмотров: 998
Скачиваний: 17
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
49
Для того чтобы корректно производить измерения эти искажения необходимо сначала скорректировать. Чтобы найти все эти параметры, нужно предоставить несколько образцовых изображений четко определенного шаблона (например, шахматной доски).
Как упомянуто выше, нам нужно как минимум несколько тестовых шаблонов для калибровки камеры. Для достижения лучших результатов, как советует сайт разработчиков библиотеки OpenCV необходимо cделать 10 тестовых шаблонов.В результате для камеры№1 было сделано пятнадцать шаблонов (рисунок 3.12), а для камеры №2 десять (рисунок 3.13).
Рисунок 3.12 – Тестовые шаблоны для камеры №1
Рисунок 3.13 – Тестовые шаблоны для камеры №2
Важными входными данными, необходимыми для калибровки камеры, являются набор трехмерных точек реального мира и соответствующие им
50 точки 2D-изображения. 3D-точки называются объектными точками, а точки
2D-изображения называются точками изображения.
Итак, чтобы найти шаблон на шахматной доске, мы используем функцию cv2.findChessboardCorners (). Нам также нужно задать, какой тип шахматной сетки используется, в данной работе используется сетка размерностью 6x9. (обычно шахматная доска имеет 8x8 квадратов и 7x7 внутренних углов). Данная функция возвращает угловые точки, если шаблон был успешно найден. Эти углы будут размещены в порядке (слева направо, сверху вниз).
Эта функция может оказаться не в состоянии найти требуемый шаблон во всех изображениях. Поэтому необходимо поочередно проверять каждый шаблон.
Как только углы найдены, можно повысить точность их отображения, используя cv2.cornerSubPix (). После этого можем нарисовать их на шаблоне, используя cv2.drawChessboardCorners (). Все эти шаги включены в код ниже:
1 2 3 4 5 6 7 8 9
importnumpyasnpimportcv2importglob# критерий завершенияcriteria = (cv2TERM_CRITERIA_EPS + cv2TERM_CRITERIA_MAX_ITER, 30, 0.001) # подготаввка точек объекта, к примеру (0,0,0), (1,0,0), (2,0,0) ..., (6,5,0) objp = np zeros((6*7,3), np float32) objp[:,:2] = np mgrid[0:7,0:6]Treshape(-1,2) # Массивы для хранения точек объектов и точек изображения со всех изображений.objpoints = [] # 3d-точки в пространстве реального мираimgpoints = [] # 2d точки в плоскости изображения.images = glob glob('*.jpg') for fname in images: img = cv2imread(fname) gray = cv2cvtColor(img,cv2COLOR_BGR2GRAY) # нахождение углово шахматной доски ret, corners = cv2findChessboardCorners(gray, (6,9),None) # добавление точек объектов и изображений (после их уточнения)if ret ==True: objpoints append(objp) cv2cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) imgpoints append(corners) # отрисовка и отображени угов
51 cv2
drawChessboardCorners(img, (
6
,
9
), corners2,ret) cv2
imshow(
'img'
,img) cv2
waitKey(
500
) cv2
destroyAllWindows()
Один из используемых шаблонов, с успешно найденными углами показан на рисунке 3.14
Рисунок 3.14 – Калибровочный шаблон с найденными углами
Итак, теперь у нас есть точки объекта и точки изображения, которые были необходимы для калибровки камеры. В библиотеке OpenCV для калибровки используется функция cv2.calibrateCamera (). Она возвращает матрицу камеры, коэффициенты искажения, векторы вращения и трансляции и т. д. ret, mtx, dist, rvecs, tvecs
=
cv2
calibrateCamera(objpoints, imgpoints, gray shape[::
-
1
],
None
,
None
)
После получение параметров калибровки, можно получить неискаженное изображение. Но до этого сначала нужно уточнить матрицу камеры на основе свободного параметра масштабирования, используя cv2.getOptimalNewCameraMatrix ().
Функция вычисляет и возвращает оптимальную новую матрицу камеры на основе параметра свободного масштабирования(alpha). Изменяя этот параметр, можно получить только чувствительные пиксели alpha = 0, сохранить все исходные пиксели изображения, если есть ценная информация
52 в углах alpha = 1 или получить что-то среднее между ними. Когда α> 0, неискаженный результат, вероятно, будет иметь некоторые черные пиксели, соответствующие «виртуальным» пикселям за пределами захваченного искаженного изображения.
Для примера возьмем одно изображение калибровочного шаблона. img
=
cv2
imread(
'left12.jpg'
) h, w
=
img shape[:
2
] newcameramtx, roi
=
cv2
getOptimalNewCameraMatrix(mtx,dist,(w,h),
1
,(w,h))
В дальнейшем можно получить неискаженное изображение двумя способами, с использованием двух разных функций:
cv2.undistort() и remapping. Первый способ более короткий, так как не требует никаких предварительных подготовок. Во втором случае сначала находится функция отображения из искаженного изображения в неискаженное. Поэтому воспользуемся первым способом.
# undistort
dst
=
cv2
undistort(img, mtx, dist,
None
, newcameramtx)
# crop the image
x,y,w,h
=
roi dst
=
dst[y:y
+
h, x:x
+
w] cv2
imwrite(
'calibresult.png'
,dst)
Сравнение искаженного и неискаженного изображение представлено на рисунке 3.15.
Рисунок 3.15 – Сравнение искаженного(слева) и неискаженного изображений(справа)
53
На рисунке выше можно заметить, что изображение слегка выровнялось.
Точность измерения параметров камеры (коэффициенты дисторсии, матрица камеры) определяется средней величиной ошибки перепроэцирования (ReEr, Reprojection Error). [20] Она изображена на рисунке
3.16 и представляет собой расстояние (в пикселях) между проекцией P' на плоскость изображения точки P на поверхности объекта, и проекцией P'' этой же точки P, построенной после устранения дисторсии с использованием параметров камеры.
Данная ошибка должно быть как можно ближе к нулю. Учитывая матрицы внутреннего, искажения, вращения и трансляции, сначала нужно преобразовать точку объекта в точку изображения, используя cv2.projectPoints
(). Затем мы вычисляем абсолютную норму между тем, что мы получили с нашим преобразованием и алгоритмом поиска углов.
Рисунок 3.16 – Наглядное изображение ошибки перепроэцирования
Чтобы найти среднюю ошибку, мы вычисляем среднее арифметическое ошибок для всех калибровочных изображений. mean_error
=
0
for
i
in
xrange
(
len
(objpoints)): imgpoints2, _
=
cv2
projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist) error
=
cv2
norm(imgpoints[i],imgpoints2, cv2
NORM_L2)
/
len
(imgpoints2) tot_error
+=
error
"total error: "
, mean_error
/
len
(objpoints)
54
Теперь можно хранить матрицу камеры и коэффициенты искажения, используя функции записи в Numpy (np.savez, np.savetxt и т. Д.) Для использования их в дальнейшем. Это означает что внутренние параметры камеры не нужно каждый раз заново пересчитывать, для определенной модели они постоянны.
55
4.ПРАКТИЧЕСКАЯ
РЕАЛИЗАЦИЯ
СИСТЕМЫ
ТЕХНИЧЕСКОГО ЗРЕНИЯ
4.1 Цветовые пространства
Цветовое пространство – модель представления цвета, основанная на использовании цветовых координат. Цветовое пространство строится таким образом, чтобы любой цвет был представлен точкой, имеющей определённые координаты. [21]
Чаще всего для хранения цифровых изображений используется цветовое пространство RGB. В нем каждой из трех осей (каналов) присваивается свой цвет: красный, зеленый и синий. На каждый канал выделяется по 8 бит информации, соответственно, интенсивность цвета на каждой оси может принимать значения в диапазоне от 0 до 255. Все цвета в цифровом пространстве RGB получаются путем смешивания трех основных цветов.
К сожалению, RGB не всегда хорошо подходит для анализа информации. Эксперименты показывают, что геометрическая близость цветов достаточно далека от того, как человек воспринимает близость тех или иных цветов друг к другу.
Но существуют и другие цветовые пространства. Весьма интересно в нашем контексте пространство HSV.
В нем присутствует:
ось Value, обозначающая количество света. На него выделен отдельный канал, в отличие от RGB, где это значение нужно вычислять каждый раз. Фактически, это черно-белая версия изображения, с которой уже можно работать;
ось Hue представляется в виде угла и отвечает за основной тон;
ось Saturation (расстояние от центра к краю) зависит насыщенность цвета.
HSV гораздо ближе к тому, как мы представляем себе цвета. Если показать человеку в темноте красный и зеленый объект, он не сможет
56 различить цвета. В HSV происходит то же самое. Чем ниже по оси V мы продвигаемся, тем меньше становится разница между оттенками, так как снижается диапазон значений насыщенности. На схеме это выглядит как конус, на вершине которого предельно черная точка, как показано на рисунке
4.1.
Рисунок 4.1 – Коническое представление модели HSV
Формулы перевода из RGB в HSV представлена на рисунке 4.2
Рисунок 4.2 – Формулы перевода в HSV
4.2 Поиск объекта по цвету
Самый распространённый способ выделить объект — это цвет.
Цвет — это свойство тел отражать или испускать видимое излучение определенного спектрального состава и интенсивности. [22] Везде и всюду нас окружают цветовые индикаторы. Светофоры, белые и жёлтые линии дорожной разметки, корпоративные цвета продуктов, дорожные указатели и
57 различные индикаторы. Например, для слабовидящих людей приклеивают жёлтые круги на дверях магазинов (жёлтый – последний цвет, которые они видят), чтобы не перепутать, например, стеклянную витрину со стеклянной дверью.
Так же появляются жёлтые полосы на ступеньках пешеходных переходов. Покрываются жёлтой краской бордюры. Этот цвет один из самых ярких и людям с плохим зрением становится легче ориентироваться в городе.
Одной из важных проблем поиска по цвету — это влияние множества факторов. Например, освещённость. Нельзя также забывать, что видимый цвет
— это результат взаимодействия спектра излучаемого света и поверхности.
Т.е. если белый лист освещать светом красной лампочки, то и лист будет казаться красным.
Выбор цвета для последующего поиска объекта с таким цветом сводится к задаче выделения некоторой целевой области в цветовом пространстве. Предполагается, что искомый объект должен обладать цветами, соответствующими точкам из этой целевой области. Здесь возможны две ситуации:
целевая область заранее выделяется в цветовом пространстве;
целевая область определяется указаниями пользователя, например, описывается цветовыми терминами естественного языка человека: “Синий”,
“Красный”, “Ярко-желтый”, “Темно-зеленый” и т.п.
Первая ситуация реализуется в случае поиска объектов заранее известных цветов, например, в задачах следования за дорогой, слежения за жестами людей и т.д. Вторая ситуация возникает при взаимодействии с человеком, когда он, например, дает команду роботу в виде фразы «принеси красную кружку». Другой пример – это поиск по базе изображений с указанием цвета объекта или особенностей его цветовой композиции.
Задача построения соответствий между цветовыми терминами естественного языка и областями цветового пространства известна давно.
Существует множество методик решения этой задачи.
58
Одна точка на шкале H определяет двухмерную область с разными значениями S и V (насыщенность и значение). Но подходят не все точки этой области. Например, если выбрано значение H для красного тона, то при S = 0 и любом V получаем оттенки, относящиеся к градациям серого, а при малых V
и любых S мы получаем очень темные оттенки, близкие к черному цвету.
Поэтому для заданного H целевую область в этой двухмерной области определяем условием: V > V
min и S > S
min
, где V
min
, S
min
– некоторые константы.
Если ограничиваться только одним значением H, то целевая область будет двухмерной областью, и любые, даже незначительные изменения цветового тона выводят за пределы этой области. Поэтому в общем случае человек выбирает целевой диапазон на шкале H, указывая два значения: H
min и
H
max
При этом для каждого H из диапазона [H
min
, H
max
] формируется двухмерная область, подобная вышеупомянутой. Таким образом, в качестве целевой области формируется трехмерная область в пространстве HSV. И эта область однозначно определяется выбором только двух значений по шкале H, а именно H
min и H
max
Рисунок 4.3 – Шкала цветовых тонов H модели HSV
Почему было решено выбирать два значения H
min и H
max
, а не одно значение H, автоматически определяющее некоторый диапазон допустимых отклонений от этого значения? Глядя на шкалу цветовых тонов (H) модели
HSV (рисунок 4.3), становится понятным, что величина такого диапазона допустимых отклонений должна быть переменной в зависимости от значения
H. Например, диапазон тонов, воспринимаемых в качестве зеленого цвета, шире диапазона тонов, воспринимаемых, как желтый цвет. Кроме того, для разных людей длины этих диапазонов будут отличаться из-за индивидуальных особенностей понимания цветовых терминов.
59
Для определения данных параметров была написана программа, помогающая выделить определенный цвет в кадре. import cv2 import numpy as np if __name__ == '__main__': def nothing(*arg): pass cv2.namedWindow( "result" ) # создаем главное окно cv2.namedWindow( "settings" ) # создаем окно настроек cap = cv2.VideoCapture(1)
# создаем 6 бегунков для настройки начального и конечного цвета фильтра cv2.createTrackbar('h1', 'settings', 0, 255, nothing) cv2.createTrackbar('s1', 'settings', 0, 255, nothing) cv2.createTrackbar('v1', 'settings', 0, 255, nothing) cv2.createTrackbar('h2', 'settings', 255, 255, nothing) cv2.createTrackbar('s2', 'settings', 255, 255, nothing) cv2.createTrackbar('v2', 'settings', 255, 255, nothing) crange = [0,0,0, 0,0,0] while True: flag, image = cap.read() img=image[320:450, 0:640]
#боковая камера
#img=image[120:290, 70:590]
#img=image[0:480,0:640] hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV )
# считываем значения бегунков h1 = cv2.getTrackbarPos('h1', 'settings') s1 = cv2.getTrackbarPos('s1', 'settings') v1 = cv2.getTrackbarPos('v1', 'settings') h2 = cv2.getTrackbarPos('h2', 'settings') s2 = cv2.getTrackbarPos('s2', 'settings') v2 = cv2.getTrackbarPos('v2', 'settings')
# формируем начальный и конечный цвет фильтра h_min = np.array((h1, s1, v1), np.uint8) h_max = np.array((h2, s2, v2), np.uint8)
# накладываем фильтр на кадр в модели HSV thresh = cv2.inRange(hsv, h_min, h_max)
#edges = cv2.Canny(thresh,100,200) cv2.imshow('result',thresh) cv2.imshow('original',image) cv2.imshow('result1', img) ch = cv2.waitKey(5) if ch == 27: break