Определение угла поворота между шаблоном и изображениемPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Определение угла поворота между шаблоном и изображением

Сообщение Anonymous »


В целом моя цель — чтобы УФ-принтер печатал изображения на бейджах. Есть некое входное изображение со значками, мне нужно определить положение объектов, поворот относительно шаблона, а затем применить распечатанное изображение к полученному месту и повернуть его на нужный угол. Первый этап по определению местонахождения икон прошел успешно. Для этого я использовал цветовую схему HSV и слой насыщенности, затем детектор краев Canny, вызвал функцию для поиска контуров и получил ограничивающую рамку для значков. Вот код Python, использующий библиотеку OpenCV:

импортировать numpy как np из matplotlib импортировать pyplot как plt импортировать импроклиб импортировать cv2 как cv импортировать случайное число как rng из z_final_lib импортировать getOrientation # загружаем изображение, преобразуем его в оттенки серого и слегка размываем изображение = cv.imread('b2.jpg') серый = cv.cvtColor(изображение, cv.COLOR_BGR2GRAY) toCanny = изображение toCanny = improclib.select_colorsp(toCanny, Colorsp='sat') cv.imshow("Оригинал", изображение) canny_output = cv.Canny(toCanny, 30, 250) canny_output = improclib.morph_op(canny_output, 'закрыть', 3) cv.imshow("canny_output", canny_output) контуры, иерархия = cv.findContours(canny_output, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) print('контуры len = ', len(контуры)) sorted_cnt = отсортировано (контуры, ключ = cv.contourArea, обратный = True) bx, by, w, h = cv.boundingRect(sorted_cnt[0]) max_area = ш * ч печать('max_area') печать (max_area) external_contours = [] min_area_ratio = 0,05 # Область изображения. im_area = image.shape[0] * image.shape[1] для cnt в sorted_cnt: bx, by, w, h = cv.boundingRect(cnt) cnt_area = ш * ч печать (cnt_area) # Удалите очень мелкие дефекты. если (1 - cnt_area / max_area) < 0,6: external_contours.append(cnt) контуры = external_contours print('контуры len = ', len(контуры)) fill_image = np.zeros_like(canny_output) для c в контурах: cv.drawContours(filled_image, [c], 0, (255, 255, 255), -1) fill_image = improclib.morph_op(filled_image, 'open', 3) cv.imshow('+++', fill_image) rng.seed(12345) контуры_поли = [Нет] * len(контуры) boundRect = [Нет] * len(контуры) центры = [Нет] * len(контуры) радиус = [Нет] * длина (контуры) для i, c в перечислении (контуры): контуры_поли = cv.approxPolyDP(c, 3, True) boundRect = cv.boundingRect(contours_poly) центры, радиус = cv.minEnclosingCircle(contours_poly) рисунок = изображение.копия() для меня в диапазоне (len (контуры)): цвет = (rng.randint(0, 256), rng.randint(0, 256), rng.randint(0, 256)) cv.drawContours(рисунок, контуры_поли, я, цвет) cv.rectangle(рисование, (int(boundRect[0]), int(boundRect[1])), (int(boundRect[0] +boundRect[2]), int(boundRect[i][1] +boundRect[i][3])), цвет, 2) cv.imshow('Контуры', рисунок) cv.waitKey() cv.destroyAllWindows() Получил весьма хороший результат:


Изображение
Но дальше мне нужно определить угол поворота иконок относительно шаблона. Но это тупик. Значки не совсем одинаковые и имеют некоторые дефекты. Я пробовал методы Feature Detection, но они не дают желаемого результата. Иконки считаются разными. Вот код

sift = cv.SIFT_create() kp = sift.detect(серый, нет) img = cv.drawKeypoints(серый, кп, img) cv.imshow('sift_keypoints.jpg', img) И результат:


Изображение

Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»