2015-06-08 39 views
9

Özellik eşleştiricisinin sağlanan kodda seçtiği piksellerin x ve y koordinatlarının listesini almam gerekir. Python ve OpenCV kullanıyorum. Biri bana yardım edebilir mi?OpenCV Python'daki Eşleştirme Eşleştirmesi'nden piksel koordinatları nasıl alınır?

img1=cv2.imread('DSC_0216.jpg',0) 
img2=cv2.imread('DSC_0217.jpg',0) 

orb=cv2.ORB(nfeatures=100000) 
kp1,des1=orb.detectAndCompute(img1,None) 
kp2,des2=orb.detectAndCompute(img2,None) 

img1kp=cv2.drawKeypoints(img1,kp1,color=(0,255,0),flags=0) 
img2kp=cv2.drawKeypoints(img2,kp2,color=(0,255,0),flags=0) 
cv2.imwrite('m_img1.jpg',img1kp) 
cv2.imwrite('m_img2.jpg',img2kp) 

bf=cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) 
matches=bf.match(des1,des2) 
matches=sorted(matches, key= lambda x:x.distance) 

cevap

13

Biz özellikleri sırasıyla birinci ve ikinci görüntü için maçları nerede olduğunuzu keypoints kp1 ve kp2 saklanır biliyoruz. cv2.ORB perspektifinde, her satırın ilk görüntüde, kp1 ve ikinci görüntüde (kp2) algılanan bir anahtar noktası olduğu 2B matrisleridir. - endeksi veya satır

  • queryIdx: Senin durumunda

    Eğer cv2.BFMatch kullandığından matches onları iki önemli üyeleridir arasında .... her nesnenin birçok üyelerini içeren cv2.DMatch nesnelerin listesini döndürür
  • maçları indeksi veya kp2 faiz noktası matrisinin sıranın-
  • trainIdx maçları kp1 faiz noktası matris

Dolayısıyla queryIdx ve trainIdxkp1 ve kp2 arasındaki maçı hangi özellikleri ORB söyleyecektir. Bu nedenle, bunları kp1 ve kp2 dizinlerine eklemek için kullanır ve eşleşmelerin gerçek mekansal koordinatlarını belirleyen (x,y) koordinatları olan pt üyesini edinin.

Eğer matches her cv2.DMatch nesne yineleyemezsiniz yapmanız gereken

, hem kp1 ve kp2 için koordinatların listesini eklenecek ve bitirdiniz. Böyle

şey: Sadece list_kp1.append(kp1[img1_idx].pt) yapılır ve list_kp2 için aynı ama mekansal koordinatları nasıl yorumlanacağı üzerinde çok net yapmak istediğini olabilirdi

# Initialize lists 
list_kp1 = [] 
list_kp2 = [] 

# For each match... 
for mat in matches: 

    # Get the matching keypoints for each of the images 
    img1_idx = mat.queryIdx 
    img2_idx = mat.trainIdx 

    # x - columns 
    # y - rows 
    # Get the coordinates 
    (x1,y1) = kp1[img1_idx].pt 
    (x2,y2) = kp2[img2_idx].pt 

    # Append to each list 
    list_kp1.append((x1, y1)) 
    list_kp2.append((x2, y2)) 

Not. Ayrıca bir adım daha ileri gidip bir liste anlama yapabilirdi:

list_kp1 = [kp1[mat.queryIdx].pt for mat in matches] 
list_kp2 = [kp2[mat.trainIdx].pt for mat in matches] 

list_kp1list_kp2 karşılık gelen pozisyon ile eşleşen bir özellik noktasının uzamsal koordinatlarını içerecektir. Başka bir deyişle, öğesininöğesinin uzaysal koordinatları,'daki ilgili özellik noktası ile eşleşerek, uzamsal koordinatları öğesi i öğesinde bulunmaktadır. Çünkü OpenCV 2.4.x için drawMatches için geçici bir çözüm yazdığında


küçük not olarak, ben bu kavramı kullanılır, C++ işlevine Python sarıcı yok, bu yüzden yukarıdaki kavram kullandı Kendi imzamı yazmak için iki görüntü arasındaki eşleşen özelliklerin mekansal koordinatlarını bulmak.

İsterseniz kontrol edin!

module' object has no attribute 'drawMatches' opencv python

+3

Bundan Çok Daha Fazlası! – kotopanda