opencv Python 특징 검사 및 K-최근 인접 일치

곧 여행 을 떠 날 것 을 감안 하여 먼저 간단 한 이미지 검색 소 개 를 올 리 고 여러분 과 함께 opencv 를 배 우 는 친구 들 과 격려 합 니 다.
특징 검사
그림 의 특징 은 주로 각 점,반점,변,척추 방향 등 으로 나 뉘 는데 모두 특징 검출 알고리즘 에서 검 측 된 이미지 특징 입 니 다.
1.Harris 각 점 검 측
먼저 그림 을 그 레이스 케 일 모드 로 변환 한 다음 에 다음 함수 로 그림 의 각 점 특징 을 검사 합 니 다.

dst=cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])
세 번 째 매개 변수 에 중점 을 두 었 습 니 다.여 기 는 Sobel 연산 자 를 사 용 했 습 니 다.쉽게 말 하면 3-31 간 의 홀수 로 각 점 검 측 의 민감 성 을 정 의 했 고 서로 다른 그림 은 디 버 깅 이 필요 합 니 다.
k 는 Harris 각 점 검 측 방정식 중의 자유 매개 변수 이 고 수치 파 라미 터 는[0,04,0.06]이다.
2.DoG 각 점 검 측 및 SIFT 특징 변환
Harris 각 점 검 사 는 이미지 의 척도 성에 변화 가 생 겼 을 때 이미지 디 테 일 을 잃 어 버 리 기 쉬 워 검 측 실 수 를 한다.따라서 이미지 특징 을 검사 할 때 우 리 는 척도 불변성 을 가 진 특징 검출 알고리즘 이 필요 하 다.
DoG 각 점 검 사 는 두 그림 이 서로 다른 매개 변수 에서 고 스 필터 결 과 를 상쇄 하여 DoG 그림 을 얻 을 것 입 니 다.단계:두 개의 서로 다른 5x5 고 스 로 이미 지 를 볼 륨 한 다음 에 상쇄 하 는 작업 을 한다.세 번 반복 해서 세 개의 차분 도 A,B,C 를 얻는다.계 산 된 A,B,C 세 개의 DOG 그림 에서 그림 B 를 구 하 는 것 은 극치 의 점 이다.그림 B 의 점 은 현재 A,B,C 총 27 개의 점 으로 구 성 된 block 에서 최대 치 또는 극소 치 인지 여부 입 니 다.이 조건 을 충족 시 키 면 각 점 이 라 고 생각 합 니 다.
SIFT 대상 은 DoG 를 사용 하여 관건 점 을 감지 하고 각 관건 점 주위 의 지역 에 대해 특징 벡터 를 계산한다.사실 그 는 검 측 과 계산 만 하고 그 반환 값 은 관건 적 인 정보(관건 점)와 설명자 이다.

#          SIFT  ,        
sift = cv2.xfeatures2d.SIFT_create()
keypoints, descriptor = sift.detectAndCompute(gray, None)

#sift     DoG     ,               ,     
주의해 야 할 것 은,되 돌아 오 는 것 은 관건 점 과 설명자 이다.
관건 은 점 의 목록 이다.
설명 자 는 검 측 된 특징 을 가 진 부분 영역 이미지 목록 입 니 다.
관건 점 의 속성 을 소개 합 니 다:pt:점 의 x y 좌표 size:특징 을 나타 내 는 지름 angle:특징 방향 response:관건 점 의 강도 octave:특징 이 있 는 피라미드 등급,알고리즘 을 교체 할 때 매개 변수 로 서 의 이미지 크기 와 인접 픽 셀 에 변화 가 생 길 수 있 습 니 다 octave 속성 은 관건 점 이 있 는 등급 ID 를 검출 합 니 다:관건 점 이 검출 된 ID
SIFT 특징 은 척도 불변성 뿐만 아니 라 회전 각 도 를 바 꾸 더 라 도 이미지 밝기 나 촬영 시각 은 좋 은 검 측 효 과 를 얻 을 수 있다.
3.SURF 추출 및 검 측 특징
SURF 는 SIFT 의 가속 판 알고리즘 으로 빠 른 Hessian 알고리즘 을 사용 하여 관건 점 을 검출 합 니 다.
다음 도 모 의 말 을 빌려:SURF 알고리즘 원리:
1.Hessian 매트릭스 구조 고 스 피라미드 척도 공간 구축
2.비 극 대 치 를 이용 하여 초보 적 으로 특징 점 을 확인한다.
3 정확 한 포 지 셔 닝 극치 점
4 특징 점 의 주요 방향 선택
5 구조 surf 특징 점 설명 연산 자
코드

import cv2
import numpy as np
img = cv2.imread('/home/yc/Pictures/jianbin.jpg')
#   hessian     
surf = cv2.xfeatures2d.SURF_create(4000)
#         
surf.setUpright(True)
#     
print(surf.getUpright())
#         
key_query,desc_query = surf.detectAndCompute(img,None)
img=cv2.drawKeypoints(img,key_query,img)
#        
print(surf.descriptorSize())
cv2.namedWindow("jianbin",cv2.WINDOW_NORMAL)
cv2.imshow('jianbin',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
이것 은 검 측 효과 입 니 다.그림 에 특징 점 이 표시 되 어 있 습 니 다.왜 이런 귀 축 견본 을 선 택 했 는 지 묻 지 마 세 요.아마도 감정 때 문 일 것 입 니 다(익살 스 럽 습 니 다)

견본
주의해 야 할 것 은 이전 버 전의 opencv-contrib 라 이브 러 리 를 설치 해 야 사용 할 수 있 으 며,surf 및 sift 는 모두 특허 보 호 를 받 습 니 다.
4.orb 특징 추출
ORB 알고리즘 은 FAST 알고리즘 을 사용 하여 관건 점 을 찾 은 다음 Harris 각 점 을 사용 하여 이 점 중 가장 좋 은 N 점 을 찾 고 BRIEF 설명자 의 특성 을 사용 합 니 다.ORB 알고리즘 은 걸음 마 단계 에 있 고 속도 가 앞의 두 가지 알고리즘 보다 좋 으 며 장점 도 흡수 하 는 동시에 그 는 오픈 소스 이다.

#   ORB         
orb = cv2.ORB_create()
kp = orb.detect(img,None)
 #            
kp, des = orb.compute(img, kp)
#  kp           ,des               ,        >         
특징 일치
1.BF 폭력 매 칭
폭력 적 으로 일치 하 는 알고리즘 은 최적화 하기 어렵 고 설명자 일치 방법 입 니 다.모든 설명자 의 특징 을 비교 하고 매번 비교 할 때마다 거리 값 을 제시 하 며 가장 좋 은 결 과 는 도둑 이 일치 하 는 것 으로 여 겨 집 니 다.

#     BFMatcher,     ,         ,           
# BFMatcher    :
# normType:NORM_L1, NORM_L2, NORM_HAMMING, NORM_HAMMING2。
# NORM_L1 NORM_L2 SIFT SURF        ,NORM_HAMMING NORM_HAMMING2   ORB  
bf = cv2.BFMatcher(normType=cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1,des2)
matches = sorted(matches, key = lambda x:x.distance)
# matches DMatch  ,      :
# DMatch.distance -         。     。
# DMatch.trainIdx -             
# DMatch.queryIdx -             
# DMatch.imgIdx -        。
2.K-최근 이웃 일치
KNN 알고리즘 은 가장 간단 한 기계 학습 알고리즘 일 수 있 습 니 다.즉,훈련 된 데이터 세트 를 지정 하고 새로운 입력 인 스 턴 스 를 훈련 데이터 에서 이 인 스 턴 스 와 가장 가 까 운 K 인 스 턴 스 를 집중 적 으로 찾 습 니 다.이 K 인 스 턴 스 의 대부분 은 특정한 클래스 에 속 하 며 이 입력 인 스 턴 스 가 같은 것 으로 판단 합 니 다.
개념 이 비교적 지루 하 다.대체적으로 한 견본 이 특징 공간 에서 k 개가 가장 비슷 하 다(즉 특징 공간 에서 가장 가깝다)는 견본 중 대부분이 특정한 유형 에 속 하면 이 견본 도 이 유형 에 속한다.저 는 개인 적 으로 간단 한 이 해 를 이유 로 가장 가 까 운 K 개 점 에서 분류 할 데 이 터 를 어떤 유형 으로 분류 할 지 투표 로 결정 합 니 다.
여기 서 우 리 는 opencv 라 이브 러 리 의 KNN 함 수 를 직접 호출 하여 사용 하 는 것 이 비교적 간단 하 다.이 KNN 매 칭 은 BF 매 칭 후의 데 이 터 를 이용 하여 매 칭 합 니 다.
전체 코드:

# coding:utf-8
 
 import cv2

#             
img1 = cv2.imread("/home/yc/Pictures/cat.jpg", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("/home/yc/Pictures/cat2.jpg", cv2.IMREAD_GRAYSCALE)
 
#          
orb = cv2.ORB_create()
#           
keypoint1, desc1 = orb.detectAndCompute(img1, None)
keypoint2, desc2 = orb.detectAndCompute(img2, None)
"""
keypoint        
desc              
"""
#   knn   
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.knnMatch(desc1, desc2, k=1)

"""
knn       k       
bf        
"""
#       
img3 = cv2.drawMatchesKnn(img1, keypoint1, img2, keypoint2, matches, img2, flags=2)
cv2.imshow("cat", img3)
cv2.waitKey()
cv2.destroyAllWindows()
아마도 여기 서 얻 은 결 과 는 match 함수 가 얻 은 결과 와 차이 가 크 지 않 을 것 입 니 다.그러나 두 가지 주요 차이 점 은 KnnMatch 가 돌아 온 것 은 K 개의 일치 값 입 니 다.우리 가 계속 처리 할 수 있 고 match 가 가장 좋 은 일치 로 돌아 갈 수 있 습 니 다.
다음은 견본 이다.

cat
간단 한 이미지 검색 기능 을 실현 할 때 이런 특징 매 칭 알고리즘 은 하드웨어 에 대한 요구 가 비교적 낮 고 효율 이 높 지만 정확 도 는 고려 해 야 한다.
opencv 를 함께 공부 하 는 친구 들 과 함께 격려 하고 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기