2017-11-26 6 views
1

私は検出器を取捨選択使用され、同様にここでは一例に、見つかった画像の周囲にバウンディングボックスを描画するためにオーブ検出器を使用することを望んでいる:SIFT Refrence画像ホモグラフィでオーブ検出器を使用するにはどうすればよいですか?

リンクされた例はFlannBasedMatcherを使用しています。私のコードはBFMatcherを使用します。私は使用されたMatcherに好みがありません。

 MIN_MATCH_COUNT = 10 

     img1 = cv2.imread('box.png',0) 
     img2 = cv2.imread('box_in_scene.png',0) 

     orb = cv2.ORB_create() 

     kp1, des1 = orb.detectAndCompute(img1,None) 
     kp2, des2 = orb.detectAndCompute(img2,None) 

     bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) 
     matches = bf.match(des1,des2) 

box_in_scene画像を描くためにホモグラフィを使用するにはどうすればよいですか?

EDIT:私は以下を試しましたが、期待どおりの出力がありませんでした。

src_pts = np.float32([ kp1[m.queryIdx].pt for m in matches[:50] ]).reshape(-1,1,2) 
dst_pts = np.float32([ kp2[m.trainIdx].pt for m in matches[:50] ]).reshape(-1,1,2) 
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0) 
matchesMask = mask.ravel().tolist() 
h,w = img1.shape 
pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2) 
dst = cv2.perspectiveTransform(pts,M) 
+0

マッチングが良好であれば、点(0,0)の変換;(img1.cols、 0);(0、img1.rows)と(img1.cols、img1.rows)をホモグラフィと線で描画します。 – Micka

+0

@Micka 'matches = sorted(マッチ、キー=ラムダx:x.distance) src_pts = np.float32(マッチ[:50]のmの場合はkp1 [m.queryIdx] .pt))reshape( - (-1,1,2) dst_pts = np.float32(マッチ[:50]のmの場合は[kp2 [m.trainIdx] .pt))reshape(-1,1,2) M、mask = cv2 .findHomography(src_pts、dst_pts、cv2.RANSAC、5.0) matchesMask = mask.ravel()。ToListメソッド() H、W = img1.shape PTS = np.float32([0,0] [0,1]、[w-1、h-1]、[w-1,0]])reshape(-1,1,2) dst = cv2.perspectiveTransform(pts、M) ' 私は試しましたしかし、それは正確に動作していないようです。 – tester

+0

これは私の結果です。 https://i.stack.imgur.com/0IS3w.png 'red'ボックスは' flann'、 'green'ボックスは' match'です。彼らはほとんど同じです。 – Silencer

答えて

4

この結果です。

enter image description here


コード(説明をコメントとして書いた):

#!/usr/bin/python3 
# 2017.11.26 23:27:12 CST 

## Find object by orb features matching 

import numpy as np 
import cv2 
imgname = "box.png"   # query image (small object) 
imgname2 = "box_in_scene.png" # train image (large scene) 

MIN_MATCH_COUNT = 4 

## Create ORB object and BF object(using HAMMING) 
orb = cv2.ORB_create() 
img1 = cv2.imread(imgname) 
img2 = cv2.imread(imgname2) 

gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) 
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) 

## Find the keypoints and descriptors with ORB 
kpts1, descs1 = orb.detectAndCompute(gray1,None) 
kpts2, descs2 = orb.detectAndCompute(gray2,None) 

## match descriptors and sort them in the order of their distance 
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) 
matches = bf.match(descs1, descs2) 
dmatches = sorted(matches, key = lambda x:x.distance) 

## extract the matched keypoints 
src_pts = np.float32([kpts1[m.queryIdx].pt for m in dmatches]).reshape(-1,1,2) 
dst_pts = np.float32([kpts2[m.trainIdx].pt for m in dmatches]).reshape(-1,1,2) 

## find homography matrix and do perspective transform 
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0) 
h,w = img1.shape[:2] 
pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2) 
dst = cv2.perspectiveTransform(pts,M) 

## draw found regions 
img2 = cv2.polylines(img2, [np.int32(dst)], True, (0,0,255), 1, cv2.LINE_AA) 
cv2.imshow("found", img2) 

## draw match lines 
res = cv2.drawMatches(img1, kpts1, img2, kpts2, dmatches[:20],None,flags=2) 

cv2.imshow("orb_match", res); 

cv2.waitKey();cv2.destroyAllWindows() 
関連する問題