#python #opencv #computational-geometry
#python #opencv #вычислительная геометрия
Вопрос:
Есть ли способ преобразовать контуры, извлеченные с помощью OpenCV, для преобразования / аппроксимации их в линии и кривые, возможно, формируя фигуру?
Я не настолько хорош в математике, любое предложение будет высоко оценено
Комментарии:
1. Возможно, этот пример может помочь
2.То, что вам, вероятно, нужно, называется векторизацией. Для получения линий используется алгоритм Дугласа-Пекера. Его можно обобщить на дуги окружности, но я знаю несколько ссылок на это. en.wikipedia.org/wiki/…hal.inria.fr/inria-00580123/document
4. Понятия не имею.
5. Известные мне реализации для извлечения линий и кривых из контуров являются собственностью и используются в качестве основы для некоторых алгоритмов сопоставления с образцом. Если @YvesDaoust не знает об алгоритме, то это хороший признак того, что вы его нелегко найдете. TechAgnostic, я бы настоятельно рекомендовал вам выбрать очень конкретное приложение, предоставить один или два образца изображения, а затем работать оттуда. Решение подобных проблем в общем случае очень сложно, но применение нескольких технических ограничений может сделать его относительно простым. Возможно, вам не нужен полностью обобщенный код. Удачи!
Ответ №1:
import cv2
import numpy as np
im = np.zeros((480,640,3),dtype="uint8")
x1=100
y1=100
x2=300
y2=250
x3=200
y3=400
cv2.circle(im,(x1,y1),13,(0,255,0),3)
cv2.circle(im,(x2,y2),13,(0,255,0),3)
cv2.circle(im,(x3,y3),13,(0,255,0),3)
lx,ly=x1,y1
for tt in range(0,10,1):
t=tt/10
x = int((1-t)** 2 * x1 2 * (1-t) * t * x2 t**2 * x3)
y = int((1-t)** 2 * y1 2 * (1-t) * t * y2 t**2 * y3)
cv2.circle(im,(x,y),3,(0,0,255),3)
cv2.line(im,(x,y),(lx,ly),(255,0,255),3)
lx,ly = x,y
cv2.imshow('im',im)
cv2.waitKey(0)

Вы могли бы применить формулу кривой Базье, используя 3 точки за раз из подсчета очков
import numpy as np
import cv2 as cv
im = cv.imread('test.jpg')
imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
Подробная информация:
https://docs.opencv.org/master/d4/d73/tutorial_py_contours_begin.html
Рисование контуров
image = cv2.drawContours(image,contours,-1,(0,0,255),3)
Или вы можете рисовать полилинии из точек контуров
for contour in contours:
image = cv2.polylines(image, [contour],
isClosed, (0,255,0), 3)
дополнительная информация здесь: https://docs.opencv.org/master/dc/da5/tutorial_py_drawing_functions.html
Комментарии:
1. Я не думаю, что этот ответ уместен. Операционная система это знает.
2. Я не знаю OP. Надеюсь, кривая Базье может вас заинтересовать
3. ОП сказал , что он может извлекать контуры. Я никогда не слышал ни о каком «Базире».