Arhn - архитектура программирования

как найти угловые точки формы на изображении в opencv?

Мне нужно найти углы фигур на изображении. Я использовал алгоритм определения углов Харриса, чтобы найти угол, но он дает общее количество углов, присутствующих на изображении, и для поиска углов для определенной формы на этом изображении это невозможно. предложите другой подход.  введите описание изображения здесь


  • вам следует попробовать findcontours 22.06.2018
  • Мне нужно вычислить координаты углов фигур. Но findcontours предоставляет края. не могли бы вы поделиться кодом или ссылкой. 22.06.2018
  • @r_ranjan Сначала найдите контуры и края, а затем найдите углы на этом изображении, это то, что пытался сказать EdChum. 22.06.2018

Ответы:


1

Вы можете использовать алгоритм обнаружения углов Харриса. Углы - это соединение двух краев, где край - это внезапное изменение яркости изображения. Этот алгоритм учитывает разницу угловой оценки напрямую относительно направления (Википедия). Функция cornerSubPix () уточняет расположение углов - она ​​выполняет итерацию, чтобы найти точное субпиксельное расположение углов или радиальных седловых точек (документация opencv).

Пример в коде:

import cv2
import numpy as np


img = cv2.imread('edges.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,5,3,0.04)
ret, dst = cv2.threshold(dst,0.1*dst.max(),255,0)
dst = np.uint8(dst)
ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
corners = cv2.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria)
for i in range(1, len(corners)):
    print(corners[i])
img[dst>0.1*dst.max()]=[0,0,255]
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows

введите описание изображения здесь

введите описание изображения здесь

чтобы проверить, являются ли они реальными значениями, вы можете добавить:

for i in range(1, len(corners)):
    print(corners[i,0])
    cv2.circle(img, (int(corners[i,0]), int(corners[i,1])), 7, (0,255,0), 2)

Результат:

введите описание изображения здесь

РЕДАКТИРОВАТЬ:

Если вы хотите извлекать углы отдельно для каждой формы, вы можете сначала найти контуры, а затем применить определение угла Харриса для каждого контура (вы можете нарисовать его на маске с помощью cv2.fillPolly ()). Вы даже можете определить их форму на основе их характеристик (например, угол поворота, количество углов и т. Д.). Я сделал пример кода, чтобы помочь понять, но обратите внимание, что есть другие формы, которые могут соответствовать критериям, которые я сформулировал, и вы должны были бы использовать другие критерии (трапеция, круг, ...). Это всего лишь простой пример:

import cv2
import numpy as np


img = cv2.imread('edges.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)
im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

for i in contours:
    img = cv2.imread('edges.png')
    size = cv2.contourArea(i)
    rect = cv2.minAreaRect(i)
    if size <10000:
        gray = np.float32(gray)
        mask = np.zeros(gray.shape, dtype="uint8")
        cv2.fillPoly(mask, [i], (255,255,255))
        dst = cv2.cornerHarris(mask,5,3,0.04)
        ret, dst = cv2.threshold(dst,0.1*dst.max(),255,0)
        dst = np.uint8(dst)
        ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)
        criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
        corners = cv2.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria)
        if rect[2] == 0 and len(corners) == 5:
            x,y,w,h = cv2.boundingRect(i)
            if w == h or w == h +3: #Just for the sake of example
                print('Square corners: ')
                for i in range(1, len(corners)):
                    print(corners[i])
            else:
                print('Rectangle corners: ')
                for i in range(1, len(corners)):
                    print(corners[i])
        if len(corners) == 5 and rect[2] != 0:
            print('Rombus corners: ')
            for i in range(1, len(corners)):
                print(corners[i])
        if len(corners) == 4:
            print('Triangle corners: ')
            for i in range(1, len(corners)):
                print(corners[i])
        if len(corners) == 6:
            print('Pentagon corners: ')
            for i in range(1, len(corners)):
                print(corners[i])
        img[dst>0.1*dst.max()]=[0,0,255]
        cv2.imshow('image', img)
        cv2.waitKey(0)
        cv2.destroyAllWindows

введите описание изображения здесь

Вывод (после обнаружения всех форм):

введите описание изображения здесь

22.06.2018
  • Этот ответ был бы идеальным, если бы вы могли кратко рассказать о том, что делают cv2.cornerSubPix() и cv2.cornerHarris(); учитывая, что кто-то наткнулся на этот ответ, чтобы быть неспециалистом. Хотя отличный ответ !! +1 !! 22.06.2018
  • Спасибо за ответ. Я стараюсь не писать много, потому что мой английский не очень хорош. Сделал попытку проинформировать об этих функциях. Ваше здоровье 22.06.2018
  • никогда не уклоняйся от попыток. Если будет какая-то ошибка, кто-нибудь поможет ее отредактировать !! Хорошее усилие ! 22.06.2018
  • Мне нужно найти углы для каждой формы отдельно. На изображении 6 форм. Итак, мне нужно найти 6 наборов углов, которые будут представлять все формы. В вашем случае это объединяет все углы, присутствующие на изображениях. Так как же углы разделить ?? 24.06.2018
  • Вы можете сделать маску для каждого контура и нарисовать ее на маске, а затем искать углы (для c в контурах, рисовать, обнаружение углов) 24.06.2018
  • @kavko: вы на самом деле не отвечаете на вопрос, просто выполняете обнаружение углов. 29.06.2018
  • Я отредактировал свой ответ, добавив пример того, как определять углы для каждой формы на изображении. 29.06.2018

  • 2

    Для каждой формы обведите контур, и для каждого пикселя контура проверьте, был ли найден ближайший угол (скажем, в районе 3x3 или 5x5).

    22.06.2018
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..