Обнаружение и локализация углов Харриса в OpenCV с Python

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

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)

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

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

Что я делаю не так?

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

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()?


person handle    schedule 15.08.2013    source источник
comment
пожалуйста, попробуйте добавить изображение результата и объяснить, что не так.   -  person Abid Rahman K    schedule 15.08.2013


Ответы (2)


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

person PostingAsAGuest    schedule 16.08.2013
comment
Просто для ясности: в numpy индексы должны быть cornerimg[y, x] (а также .shape возвращает h, w), поэтому на самом деле меняется способ доступа к cornerimg. - person Trinidad; 24.08.2016

попробуйте ниже:

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