Преобразование контура OpenCV в линии и кривые

#python #opencv #computational-geometry

#python #opencv #вычислительная геометрия

Вопрос:

Есть ли способ преобразовать контуры, извлеченные с помощью OpenCV, для преобразования / аппроксимации их в линии и кривые, возможно, формируя фигуру?

Я не настолько хорош в математике, любое предложение будет высоко оценено

Комментарии:

1. Возможно, этот пример может помочь

2.То, что вам, вероятно, нужно, называется векторизацией. Для получения линий используется алгоритм Дугласа-Пекера. Его можно обобщить на дуги окружности, но я знаю несколько ссылок на это. en.wikipedia.org/wiki/…hal.inria.fr/inria-00580123/document

3. @YvesDaoust спасибо за ссылку, это очень полезно. Я должен изучить его подробно, хотя для реализации в моем проекте. Просто из любопытства, существует ли какая-либо программная реализация этого алгоритма «Разложения кривой на дуги и отрезки на основе определения доминирующей точки»?

4. Понятия не имею.

5. Известные мне реализации для извлечения линий и кривых из контуров являются собственностью и используются в качестве основы для некоторых алгоритмов сопоставления с образцом. Если @YvesDaoust не знает об алгоритме, то это хороший признак того, что вы его нелегко найдете. TechAgnostic, я бы настоятельно рекомендовал вам выбрать очень конкретное приложение, предоставить один или два образца изображения, а затем работать оттуда. Решение подобных проблем в общем случае очень сложно, но применение нескольких технических ограничений может сделать его относительно простым. Возможно, вам не нужен полностью обобщенный код. Удачи!

Ответ №1:

Кривая Базье для 3 точек

 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 точек

Вы могли бы применить формулу кривой Базье, используя 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. ОП сказал , что он может извлекать контуры. Я никогда не слышал ни о каком «Базире».