OpenCV-기초(2주차)

Oak_Cassia·2022년 7월 22일
0

템플릿 매칭

다른 이미지에 같은 이미지가 포함되어 있을 때 매칭
cv2.TM_CCOEFF
cv2.TM_CCOEFF_NORMED
cv2.TM_CCORR
cv2.TM_CCORR_NORMED
cv2.TM_SQDIFF
cv2.TM_SQDIFF_NORMED

result = cv2.matchTemplate(img, t_img, cv2.TM_CCOEFF) #사진과 같은 부분을 찾고
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) # 위치를 가져와서 
#max_loc 이 사각형의 시작 정점이라 생각 SQDIFF는 min_loc을 사용해야 한다.
cv2.rectangle(img,max_loc, bot_right,255,5) #찾은 이미지에 사각형

모서리 검출

Harris Conner Detection

# 흑백 이미지를 실수 값으로 변환한다.
gray = np.float32(gray_img)

# 해리스 코너 검출 함수 사용
dst = cv2.cornerHarris(src=gray,blockSize=2,ksize=3,k=0.04)

# 이후 cv2.dilate 함수로 팽창 시켜도 된다.

# 원래 이미지의 특정(코너로 검출된) 화소 빨간색으로 표시
img[dst>0.01*dst.max()]=[255,0,0]

# 
plt.imshow(img)

Shi-Tomasi Corner Detector

### 흑백 이미지로 진행한다.
corners = cv2.goodFeaturesToTrack(gray_img,80,0.01,10)
corners = np.int0(corners) #intp와 같음

for i in corners:
    x,y = i.ravel() # 다차원을 1차원 배열로
    cv2.circle(img,(x,y),3,255,-1)

plt.imshow(img)

에지 검출

Canny Edge Detection

#블러 적용 후 캐니에지 검출을 사용하면 더 좋다.
#threshold 값은 중앙값의 0.7, 1.3 정도?
edges = cv2.Canny(image=img, threshold1=127, threshold2=127)

그리드 검출

found, corners = cv2.findChessboardCorners(flat_chess,(7,7))
cv2.drawChessboardCorners(img, (7, 7), corners, found)
found, corners = c cv2.findCirclesGrid(dots, (10,10), cv2.CALIB_CB_SYMMETRIC_GRID)
cv2.drawChessboardCorners(img, (10, 10), corners, found)

윤곽 검출

findContours
cv2.RETR_EXTERNAL
cv2.RETR_CCOMP
cv2.RETR_TREE
cv2.RETR_LIST

image, contours, hierarchy = cv2.findContours(img, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)


# 영행렬 만들기
bg_img = np.zeros(image.shape)

# For every entry in contours
for i in range(len(contours)):
    
    # 외부 윤곽에 해당하면 실행  == 대신 != 하면 내부 윤곽 
    if hierarchy[0][i][3] == -1:
        # We can now draw the external contours from the list of contours
        cv2.drawContours(bg_img, contours, i, 255, -1)

특징 매칭

#ORB를 쓸 때
orb = cv2.ORB_create()


kp1, ds1 = orb.detectAndCompute(target_img,None)
kp2, ds2 = orb.detectAndCompute(img,None)


bf_matcher = cv2.BFMatcher(cv2.NORM_MAMMING, corssCheck=True)

match = bf.match(ds1,ds2)

match = sorted(match, key = lambda x:x.distance)

result = cv2.draMatches(target_img, kp1,img, kp2,match[:30],None,flags=2)
#SIFT를 쓸 때
sift = cv2.xfeatures2d.SIFT_create()
kp1, ds1 = sift.detectAndCompute(target_img,None)
kp2, ds2 = sift.detectAndCompute(img,None)
bf_matcher = cv2.BFMatcher()
match = bf.knnMatch(ds1, ds2, k=2)

good_match=[]
for match1,match2 in match:
    if match1.distance < 0.75*match2.distance:
        good_match.append([match1])

result = cv2.drawMatchesKnn(target_img, kp1,img, kp2, good_match, None, flags=2)
#FLANN
sift = cv2.xfeatures2d.SIFT_create()

kp1, ds1 = sift.detectAndCompute(target_img,None)
kp2, ds2 = sift.detectAndCompute(img,None)


FLANN_INDEX_KDTREE = 0
index = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search = dict(checks=50)  

flann = cv2.FlannBasedMatcher(index,search)

match = flann.knnMatch(ds1,ds2,k=2)

good_match = []

# ratio test
for i,(match1,match2) in enumerate(match):
    if match1.distance < 0.7*match2.distance:
        
        good.append([match1])


flann_matches = cv2.drawMatchesKnn(target_img, kp1, img, kp2, good_match, None, flags=0)

display(flann_matches)


Watershed

markers = cv2.watershed(img,markers)

Haar Cascades

cv2.CascadeClassifier로 파일을 불러와 객체 생성 후 해당 객체로
detectMultiScale(img)로 얼굴 찾기 x, y, 너비, 높이 반환

profile
rust로 뭐할까

0개의 댓글