python opencv图像匹配_关于python:OpenCV功能匹配多个图像
如何使用FLANN優化許多圖片的SIFT功能匹配?
我有一個從Python OpenCV文檔中獲取的工作示例。然而,這是將一個圖像與另一個圖像進行比較而且速度很慢。我需要它來搜索一系列圖像(幾千個)中匹配的特征,我需要它更快。
我目前的想法:
瀏覽所有圖像并保存功能。怎么樣?
將相機的圖像與上面的基礎進行比較,找到正確的圖像。怎么樣?
給我結果,匹配圖像或其他東西。
http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_feature_homography/py_feature_homography.html
import sys # For debugging only
import numpy as np
import cv2
from matplotlib import pyplot as plt
MIN_MATCH_COUNT = 10
img1 = cv2.imread('image.jpg',0) # queryImage
img2 = cv2.imread('target.jpg',0) # trainImage
# Initiate SIFT detector
sift = cv2.SIFT()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1,des2,k=2)
# store all the good matches as per Lowe's ratio test.
good = []
for m,n in matches:
if m.distance MIN_MATCH_COUNT:
src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).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)
img2 = cv2.polylines(img2,[np.int32(dst)],True,255,3, cv2.LINE_AA)
else:
print"Not enough matches are found - %d/%d" % (len(good),MIN_MATCH_COUNT)
matchesMask = None
draw_params = dict(matchColor = (0,255,0), # draw matches in green color
singlePointColor = None,
matchesMask = matchesMask, # draw only inliers
flags = 2)
img3 = cv2.drawMatches(img1,kp1,img2,kp2,good,None,**draw_params)
plt.imshow(img3, 'gray'),plt.show()
UPDATE
在嘗試了很多東西后,我現在可能已經接近解決方案了。我希望有可能構建索引,然后在其中搜索如下:
flann_params = dict(algorithm=1, trees=4)
flann = cv2.flann_Index(npArray, flann_params)
idx, dist = flann.knnSearch(queryDes, 1, params={})
但是我仍然沒有設法為flann_Index參數構建一個接受的npArray。
loop through all images as image:
npArray.append(sift.detectAndCompute(image, None))
npArray = np.array(npArray)
我從來沒有在Python中解決這個問題,但是我將環境轉換為C ++,你可以獲得更多的OpenCV示例,而不必使用包含較少文檔的包裝器。
關于我在多個文件中匹配的問題的示例可以在這里找到:https://github.com/Itseez/opencv/blob/2.4/samples/cpp/matching_to_many_images.cpp
您的鏈接提供錯誤404.您應該編輯您的答案,以便人們可以導航到您的參考并查看代碼:)
最新的網址是:github.com/Itseez/opencv/blob/2.4/samples/cpp/…
實際上,OpenCV-Python是OpenCV-C ++的完整端口。因此,除了一些性能問題之外,您在C ++中可以執行的所有操作都可以在Python中完成。由于opencv-py 2.4.x文檔記錄不完整,您很難在文檔中找到所需的任何內容。可以肯定的是沒有DescriptorMatcher類,但是在python中有類似FlannBasedMatcher的類,它繼承自DescriptorMatcher并且具有add / train / match方法。你可以試試這個。
如果你需要,你可以利用C ++教程并將它們翻譯成Python,如果你的代碼很精通...... Python太漂亮了,不能留下......
隨著@ stanleyxu2005的回復,我想添加一些關于如何進行整個匹配的提示,因為我目前正在處理這樣的事情。
我強烈建議創建一些包裝cv :: Mat的自定義類,但也存儲各種其他必要的數據。在我的情況下,我有一個ImageContainer存儲原始圖像(我將用于最終拼接),處理過的(灰度,未失真等),它的關鍵點和那些描述符。通過這樣做,您可以在組織良好的井中訪問所有匹配相關的信息。您可以在其中實現關鍵點提取和描述符生成,也可以在類外執行,只將結果存儲在該容器中。
將所有圖像容器存儲在某種結構中(矢量通常是一個不錯的選擇),以便于訪問。
我還創建了一個名為ImageMultiMatchContainer的類,它存儲指向給定查詢圖像的指針(所有圖像都是查詢圖像),一個帶有指向所有火車圖像的指針(對于圖像集的單個查詢圖像,所有其他圖像都是火車圖像)與它匹配,并且還匹配每個匹配的匹配向量的向量。在這里我偶然發現了存儲問題 - 首先你必須跳過圖像與自身的匹配,因為它沒有意義,其次你有兩次比較兩個圖像的問題,因此如果你有很多圖像就會產生相當大的開銷。第二個問題是由于我們遍歷所有圖像(查詢圖像)并將它們與集合中的其余圖像(火車圖像)進行比較。在某些時候,我們有圖像X(查詢)與圖像Y(火車)匹配,但后來我們也有圖像Y(現在查詢)與圖像X(現在火車)匹配。正如你所看到的,這也是毫無意義的,因為它基本上匹配了同一對圖像兩次。這可以通過創建一個類(MatchContainer)來解決(目前正在進行此操作),該類存儲指向匹配對中的兩個圖像中的每一個的指針以及匹配向量。您將其存儲在一個中心位置(在我的情況下,這是我的匹配器類),并將每個圖像存儲為查詢圖像,您可以檢查列車圖像的匹配圖像列表。如果它為空,則創建一個新的MatchContainer并將其添加到MatchContainers的其余部分。如果不是那么你查看它并查看當前查詢圖像是否不存在(比較指針是一個快速操作)。如果是,那么你只需將指針傳遞給MatchContainer的矢量項,該矢量項存儲這兩個圖像的匹配項。如果不是這樣的話,你就好像它是空的并創建一個新的MatchContainer等.MatchingContainers應該存儲在一個訪問時間很短的數據結構中,因為你會看到它們很多,并且從頭到尾迭代費用也是如此很多時間。我正在考慮使用地圖,但也許某種樹也可以提供一些優勢。
單應性估計是一個非常棘手的部分。在這里,我建議您查看捆綁塊調整。我看到OpenCV中的stitcher類有一個BundleBase類,但還沒有測試它看看它里面有什么。
一般建議是在OpenCV中查看拼接過程并閱讀源代碼。拼接管道是一組直接的過程,您只需要了解如何實現單個步驟。
以下是我的一些建議:
您應該使用適當的技術減少點數據的數量。
反復計算參考圖像是一種浪費。你應該堅持所有計算參考。
不要將計算放在移動設備上。您最好將計算出的捕獲圖像的參考上傳到功能強大的服務器并在那里進行搜索。
這是一個非常有趣的話題。我的耳朵也開了。
謝謝@ stanleyxu2005。由于您提到的限制,我不會在任何手機上進行匹配。如上所述,我希望盡可能多地保存以供將來進行比較,所以我們也同意這里。我只需要了解如何以最有效的方式完成這項工作。
總結
以上是生活随笔為你收集整理的python opencv图像匹配_关于python:OpenCV功能匹配多个图像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 03-motifs 图机器学习之moti
- 下一篇: python下载邮箱附件_基于Pytho