Я нашел контуры и корпус, используя методы OpenCV (C ++) на изображении. И я хочу рисовать дефекты точек. Я нашел дефекты точек по телефону
vector<Vec4i> defects;
convexityDefects(contours, hull, defects);
Есть 4 целых числа каждого дефекта. Какой из них координата х? Я хочу получить координаты точек дефектов. Я нарисую начальные точки черных линий, которые находятся под рукой.
Документ о выпуклостиDefects ():
convexityDefects — Выходной вектор дефектов выпуклости. В C ++ и новом интерфейсе Python / Java каждый дефект выпуклости представлен в виде 4-элементного целочисленного вектора (a.k.a.
cv::Vec4i
): (start_index
,end_index
,farthest_pt_index
,fixpt_depth
), где индексы являются индексами, основанными на 0, в исходном контуре начала, конца и самой дальней точки дефекта выпуклости, иfixpt_depth
является приближением с фиксированной точкой (с 8 дробными долями) расстояния между самой дальней точкой контура и корпусом. То есть, чтобы получить значение с плавающей точкой глубины будетfixpt_depth/256.0
,
Таким образом, каждый дефект выпуклости состоит из нескольких точек, из start_index
в end_index
в countour
параметр convexityDefects()
,
Вы хотите что-то вроде: Point p = contours[defects[d][2]]
Я процитирую только значимую часть документации:
[…] 4-элементный целочисленный вектор: (start_index, end_index, farthest_pt_index, fixpt_depth), где индексы 0 основанные индексы в исходном контуре дефекта выпуклости […]
Таким образом, возвращаемые значения представляют собой индексы в исходном контуре.
defects[d]
представляет d
Контур Затем вы берете его третий член, farthest_pt_index
, который находится в defects[d][2]
, Это целое число является индексом точки в исходном контуре, который является самым дальним от корпуса, то есть нижней стрелкой на чертеже. Его координаты:
Point p = contours[defects[d][2]]
int x = p.x
int y = p.y
И если вы хотите узнать, как далеко эта точка от корпуса, вам придется разделить 4-й элемент на 256: float p_distance = defects[d][3] / 256.0