Feature matching code

From FDHwiki
Revision as of 09:44, 26 October 2018 by Vbuntinx (talk | contribs) (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...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Video to frame

<nowiki>

import cv2

name='DroneSurvolParis' vidcap=cv2.VideoCapture(name+'.mp4') success,image=vidcap.read() count=0 success=True while success:

   if count>1399 and count<1800:
       if count%20==0:
           cv2.imwrite('frames/'+name+'_'+str(count)+'.jpg',image)
   success,image=vidcap.read()
   print('Read a new frame: ',count,success)
   count+=1

<nowiki>

Matches computing

<nowiki>

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]
   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')
   ordre=[]
   for fichier in fichiers:
       fichier_split=fichier.split('.')[0]
       nombre=int(fichier_split.split('_')[-1])
       ordre.append(nombre)
   ordre,fichiers=zip(*sorted(zip(ordre,fichiers)))
   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) <nowiki>