2013-08-15 5 views
2

Я использую следующий код, чтобы попытаться обнаружить углы полилиний, чтобы «измерить» линии. Код основан на фрагменте кода я нашел где-то on SO и на основе cv2.cornerHarris():Определение и локализация угла в Harris в OpenCV с помощью Python

cornerimg = cv2.cornerHarris(gray, # src 
           2, # blockSize 
           3, # ksize/aperture 
           0.04 # k 
            # dst 
            # borderType 
          ) 

# ? 
cornerimg = cv2.normalize( cornerimg,  # src 
          None,    # dst 
          0,    # alpha 
          255,    # beta 
          cv2.NORM_MINMAX, # norm type 
          cv2.CV_32FC1,  # dtype 
          None    # mask 
          ) 

# ? 
cornerimg = cv2.convertScaleAbs(cornerimg) 

cornershow = cornerimg.copy() 

# iterate over pixels to get corner positions 
w, h = gray.shape 
for y in range(0, h): 
    for x in range (0, w): 
    #harris = cv2.cv.Get2D(cv2.cv.fromarray(cornerimg), y, x) 
    #if harris[0] > 10e-06: 
    if cornerimg[x,y] > 64: 
     print("corner at ", x, y) 
     cv2.circle(cornershow, # dest 
        (x,y),  # pos 
        4,   # radius 
        (115,0,25) # color 
       ) 

cv2.imshow('harris cornerimg', cornershow) 

Исходный код результатов в белых пятен на углу места и уровень, как представляется, является показателем «corneryness». Фрагмент (обновленный для использования cv2) итерации по результирующему изображению и по какой-то причине сканирует значения lager than 10e-06, я заменил это на сравнение того, что, по моему мнению, должно быть яркостью изображения.

Однако круги, нарисованные в этих местах, нигде не находятся вблизи фактических горячих точек, обнаруженных в нормализованном выходе из Харриса.

Что я делаю неправильно?

В качестве альтернативы, cv2.goodFeaturesToTrack() может быть настроен на использование Харрис (useHarrisDetector = True), но моя попытка использовать его не приводит в том, что появляется cornerHarris обнаружить правильно:

cv2.goodFeaturesToTrack( blurred,    # img 
           500,     # maxCorners 
           0.03,     # qualityLevel 
           10,      # minDistance 
           None,     # corners, 
           None,     # mask, 
           2,      # blockSize, 
           useHarrisDetector=True, # useHarrisDetector, 
           k=0.04     # k 
           ) 

Что бы вызов эквивалентен функция cv2.cornerHarris()?

+0

пожалуйста, попробуйте добавить свой результат изображения и объяснить, что это неправильно. –

ответ

2

Выход, как представляется, транспонирован, замена индексов x и y на квадратном изображении фиксирует его (круги находятся на максимальных углах).

+0

Просто, чтобы быть ясным, индексы 'numpy' должны быть' cornerimg [y, x] '(а также' .shape' возвращает 'h',' w'), поэтому то, что на самом деле заменено, - это способ доступа к «cornerimg» , – Trinidad

2

попробовать ниже:

cv2.circle(cornershow, # dest 
       (y,x),  # pos 
       4,   # radius 
       (115,0,25) # color 
      )