Feature matching code: Difference between revisions
Jump to navigation
Jump to search
(Created page with "==Video to frame== <nowiki> import cv2 name='DroneSurvolParis' vidcap=cv2.VideoCapture(name+'.mp4') success,image=vidcap.read() count=0 success=True while success: if co...") |
|||
| (3 intermediate revisions by the same user not shown) | |||
| Line 9: | Line 9: | ||
success=True | success=True | ||
while success: | while success: | ||
cv2.imwrite('frames/'+name+'_'+str(count)+'.jpg',image) | |||
success,image=vidcap.read() | success,image=vidcap.read() | ||
print('Read a new frame: ',count,success) | print('Read a new frame: ',count,success) | ||
count+=1 | count+=1 | ||
<nowiki> | </nowiki> | ||
==Matches computing== | ==Matches computing== | ||
| Line 52: | Line 50: | ||
des2,kp2=algo.detectAndCompute(img2,None) | des2,kp2=algo.detectAndCompute(img2,None) | ||
dim=img1.shape[:2] | dim=img1.shape[:2] | ||
dim=(dim[1],dim[0]) | |||
if method=='gms': | if method=='gms': | ||
bf=cv2.BFMatcher(cv2.NORM_HAMMING,crossCheck=True) | bf=cv2.BFMatcher(cv2.NORM_HAMMING,crossCheck=True) | ||
| Line 70: | Line 69: | ||
os.mkdir(name) | os.mkdir(name) | ||
fichiers=os.listdir('frames') | fichiers=os.listdir('frames') | ||
nb_images=len(fichiers) | nb_images=len(fichiers) | ||
for i in range(nb_images-1): | for i in range(nb_images-1): | ||
| Line 92: | Line 85: | ||
go('orb','orb_best',50) | go('orb','orb_best',50) | ||
go('gms','gms_best',50) | go('gms','gms_best',50) | ||
<nowiki> | </nowiki> | ||
Latest revision as of 08:24, 16 November 2018
Video to frame
import cv2
name='DroneSurvolParis'
vidcap=cv2.VideoCapture(name+'.mp4')
success,image=vidcap.read()
count=0
success=True
while success:
cv2.imwrite('frames/'+name+'_'+str(count)+'.jpg',image)
success,image=vidcap.read()
print('Read a new frame: ',count,success)
count+=1
Matches computing
import os
import cv2
import numpy as np
from datetime import datetime
def drawmatches(name_1,name_2,matches,name):
img1=cv2.imread('frames/'+name_1)
img2=cv2.imread('frames/'+name_2)
dim=img1.shape[:2]
b=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
g=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
r=np.zeros((dim[0],dim[1],1),dtype="uint8")
for matche in matches:
coord1=(int(matche[0][0]),int(matche[0][1]))
coord2=(int(matche[1][0]),int(matche[1][1]))
cv2.line(r,coord1,coord2,255,4)
img=cv2.merge((b,g,r))
cv2.imwrite(name+'.jpg',img)
def find_matches_couple(name_1,name_2,method,num):
if method=='sift':
algo=cv2.xfeatures2d.SIFT_create()
if method=='surf':
algo=cv2.xfeatures2d.SURF_create()
if method=='orb':
algo=cv2.ORB_create()
if method=='gms':
algo=cv2.ORB_create(10000,fastThreshold=0)
img1=cv2.imread('frames/'+name_1)
img2=cv2.imread('frames/'+name_2)
des1,kp1=algo.detectAndCompute(img1,None)
des2,kp2=algo.detectAndCompute(img2,None)
dim=img1.shape[:2]
dim=(dim[1],dim[0])
if method=='gms':
bf=cv2.BFMatcher(cv2.NORM_HAMMING,crossCheck=True)
else:
bf=cv2.BFMatcher()
matches=bf.match(kp1,kp2)
if method=='gms':
matches=cv2.xfeatures2d.matchGMS(dim,dim,des1,des2,matches,withRotation=True,withScale=True)
matches=sorted(matches,key=lambda x:x.distance)
long=min(num,len(matches))
matches_list=[]
for matche in matches[:long]:
matches_list.append([des1[matche.queryIdx].pt,des2[matche.trainIdx].pt])
return matches_list
def go(method,name,num):
deb=datetime.now()
os.mkdir(name)
fichiers=os.listdir('frames')
nb_images=len(fichiers)
for i in range(nb_images-1):
matches=find_matches_couple(fichiers[i],fichiers[i+1],method,num)
drawmatches(fichiers[i],fichiers[i+1],matches,name+'/'+name+'_'+str(i+1)+'_'+str(i+2))
fin=datetime.now()
print(method+' done => '+str(fin-deb))
go('sift','sift',500)
go('surf','surf',500)
go('orb','orb',500)
go('gms','gms',500)
go('sift','sift_best',50)
go('surf','surf_best',50)
go('orb','orb_best',50)
go('gms','gms_best',50)