2013-08-15 2 views
2

다음 코드를 사용하여 선을 '측정'하기 위해 폴리 라인 모서리를 감지하려고합니다. 코너 위치에 흰색 반점에서OpenCV에서 해리스 코너 감지 및 로컬라이제이션

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"의 지표가 될 것 같다 : 코드는 어디 선가 on SO 발견 cv2.cornerHarris() 기반으로하는 조각을 기반으로합니다. (cv2를 사용하도록 업데이트 된) 스 니펫은 결과 이미지를 반복하고 어떤 이유로 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 
      ) 
관련 문제