您好,歡迎來到三六零分類信息網!老站,搜索引擎當天收錄,歡迎發信息
免費發信息

新浪竞彩比分直播即时比分:OpenCV系列之特征匹配+單應性查找對象 | 四十五

2019-12-31 16:24:17發布29次查看
目標在本章節中,
我們將把calib3d??櫓械奶卣髕ヅ浜蚮indhomography混合在一起,以在復雜圖像中找到已知對象
基礎
那么我們在上一環節上做了什么?我們使用了queryimage,找到了其中的一些特征點,我們使用了另一個trainimage,也找到了該圖像中的特征,并且找到了其中的最佳匹配。簡而言之,我們在另一個混亂的圖像中找到了對象某些部分的位置。此信息足以在trainimage上準確找到對象。
為此,我們可以使用calib3d??櫓械暮?,即cv.findhomography()。如果我們從兩個圖像中傳遞點集,它將找到該對象的透視變換。然后,我們可以使用cv.perspectivetransform()查找對象。找到轉換至少需要四個正確的點。
我們已經看到,匹配時可能會出現一些可能影響結果的錯誤。為了解決這個問題,算法使用ransac或least_median(可以由標志決定)。因此,提供正確估計的良好匹配稱為“內部點”,其余的稱為“外部點”。cv.findhomography()返回指定內部和外部點的掩碼。
讓我們開始吧?。?!
代碼
首先,像往常一樣,讓我們在圖像中找到sift功能并應用比例測試以找到最佳匹配。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
min_match_count = 10
img1 = cv.imread('box.png',0)          # 索引圖像
img2 = cv.imread('box_in_scene.png',0) # 訓練圖像
# 初始化sift檢測器
sift = cv.xfeatures2d.sift_create()
# 用sift找到關鍵點和描述符
kp1, des1 = sift.detectandcompute(img1,none)
kp2, des2 = sift.detectandcompute(img2,none)
flann_index_kdtree = 1
index_params = dict(algorithm = flann_index_kdtree, trees = 5)
search_params = dict(checks = 50)
flann = cv.flannbasedmatcher(index_params, search_params)
matches = flann.knnmatch(des1,des2,k=2)
# #根據lowe的比率測試存儲所有符合條件的匹配項。
good = []
for m,n in matches:
   if m.distance < 0.7*n.distance:
       good.append(m)
現在我們設置一個條件,即至少有10個匹配項(由min_match_count定義)可以找到對象。否則,只需顯示一條消息,說明沒有足夠的匹配項。
如果找到足夠的匹配項,我們將在兩個圖像中提取匹配的關鍵點的位置。他們被傳遞以尋找預期的轉變。一旦獲得了這個3x3轉換矩陣,就可以使用它將索引圖像的角轉換為訓練圖像中的相應點。然后我們畫出來。
if len(good)>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 = cv.findhomography(src_pts, dst_pts, cv.ransac,5.0)
   matchesmask = mask.ravel().tolist()
   h,w,d = img1.shape
   pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)
   dst = cv.perspectivetransform(pts,m)
   img2 = cv.polylines(img2,[np.int32(dst)],true,255,3, cv.line_aa)
else:
   print( "not enough matches are found - {}/{}".format(len(good), min_match_count) )
   matchesmask = none
最后,我們繪制內部線(如果成功找到對象)或匹配關鍵點(如果失敗)。
draw_params = dict(matchcolor = (0,255,0), # 用綠色繪制匹配
                  singlepointcolor = none,
                  matchesmask = matchesmask, # 只繪制內部點
                  flags = 2)
img3 = cv.drawmatches(img1,kp1,img2,kp2,good,none,**draw_params)
plt.imshow(img3, 'gray'),plt.show()
請參閱下面的結果。對象在混亂的圖像中標記為白色:
☆☆☆為方便大家查閱,小編已將opencv-python專欄文章統一整理到公眾號底部菜單欄,同步更新中,關注公眾號,點擊左下方“文章”,如圖:或點擊下方“閱讀原文”,進入opencv-python專欄,即可查看系列文章。
   不斷更新資源
   獲取更多精彩
長按二維碼掃碼關注

該用戶其它信息

VIP推薦

免費發布信息,免費發布B2B信息網站平臺 - 三六零分類信息網 滬ICP備09012988號-2
{ganrao}