2017-03-29 17 views
0

정상적인 ORB 애플리케이션이 있습니다. 내 동성의 정확성을 찾는 방법이 없으므로 성냥의 정확성을 찾으려고 노력하고 있습니다. 올바른 방법은 무엇입니까? 내 코드에서 분명히 특이 값을 제거한 후에는 raw_matches에 있습니다. 나는 비율 테스트를 한 후에 좋은 경기를 얻고 그 경기의 정확성을 찾기를 원합니다.일치 항목의 등록 정확도 얻기

코드 : (오류가 두 이미지에 존재한다는 가정 아래) 호모 그래피의 품질에 대한

detector = cv2.ORB_create(FEATURESCOUNT) 
kp1, desc1 = detector.detectAndCompute(img1, None) 
kp2, desc2 = detector.detectAndCompute(img2, None) 

flann_params= dict(algorithm = FLANN_INDEX_LSH, table_number = 6, key_size = 12, bmulti_probe_level = 1) 
matcher = cv2.FlannBasedMatcher(flann_params, {}) 
raw_matches = matcher.knnMatch(desc1, trainDescriptors = desc2, k = 2) 

ratio = 0.9 
mkp1, mkp2 = [], [] 

for m in raw_matches: 
    if len(m) == 2 and m[0].distance < m[1].distance * ratio: 
     m = m[0] 
     mkp1.append(kp1[m.queryIdx]) 
     mkp2.append(kp2[m.trainIdx]) 

print max(distmax) 
distall = sum(i for i in distmax) 
print distall/len(distmax) 


p1 = np.float32([kp.pt for kp in mkp1]) 
p2 = np.float32([kp.pt for kp in mkp2]) 

comps =[] 
res = [] 

kp_pairs = zip(mkp1, mkp2) 

if len(p1) >= 4: 
    H, status = cv2.findHomography(p1, p2, cv2.RANSAC, 5.0) 
    comps = getComponents(H) 
    print (comps) 
    print('%d/%d inliers/matched' % (np.sum(status), len(status))) 
else: 
    H, status = None, None 
    print('%d matches found, not enough for homography estimation' % len(p1)) 

답변

0

하나 개의 일반적인 측정은 재 투영 오류입니다. 각 포인트 일치의 오류가 가우스 인 경우 최소 재 투영 오류는 최대 우도 추정과 같습니다. follows으로 계산됩니다. 여기서 (x_i, x_i ')는 대응이고, H는 호모 그래피이고 d는 이미지의 기하학적 거리입니다. 즉, 비균질 이미지 포인트를 의미합니다.

findHomography는 내부적으로 이미 재 투영 오류를 최적화하려고합니다. 동조가 발견되지 않으면 (전달 된 최대 재 투영 오류를 기반으로) 함수는 없음을 반환해야합니다.

결과가 잘못되면 ORB를 AKAZE 기능으로 변경하고 RANSAC 체계의 inlier 분류에 대한 최대 재 투영 오류를 줄입니다. 동질성이 더 최적화 된 좋은 대략적인 추정치 인 경우 동그라미를 사용하여 각 포인트를 매핑하고 해당 지역에서 가장 가까운 관심 지점을 찾음으로써 모든 관심 지점에서 더 많은 일치 항목을 찾을 수 있습니다. 그 후에 findHomography를 다시 계산할 수 있습니다.