OpenCV:圖像檢索。

圖片


OpenCV能夠檢測圖像的主要特徵,而後提取圖像的特徵,使其成爲圖像描述符。html


這些圖像特徵,也就是圖像描述符,能夠做爲圖像搜索的數據庫。算法


我的感受就是,和「以圖搜圖」有點像。數據庫


image.png


看了下面這個視頻,或許你就可以明白了。app


https://v.qq.com/x/page/y0880pe6kdc.htmlide


也是一個很搞笑的片斷...spa



/ 01 / 特徵檢測算法視頻


這裏簡單介紹一下OpenCV經常使用的幾種特徵檢測和提取算法。htm


Harris、FAST:用於檢測角點的。對象


SIFT、SURF、BRIEF:用於檢測斑點的。blog


ORBFAST算法和BRIEF算法的結合體


檢測和提取的工做作完了,就是特徵匹配。


主要是「暴力匹配法」和「FLANN匹配法」。


提了好幾回特徵了,那麼什麼是圖像的特徵呢?


圖像特徵就是指有意義的圖像區域,具備獨特性或易於識別性,好比角點、斑點以及高密度區


角點能夠經過OpenCV的cornerHarris來識別。


「SIFT」則是一種與圖像比例無關的角點檢測方法,尺度不變特徵變換


採用DoG和SIFT來檢測關鍵點並提取關鍵點周圍的特徵。


「SURF」特徵檢測算法,則是採用Hessian算法檢測關鍵點,使用SURF提取特徵。


剩下的太難了,之後慢慢了解~



/ 02 / 圖像檢索


採用FLANN匹配,近似最近鄰的快速庫。


原始圖片以下,爲微博的Logo。


image.png


目標圖片以下,包含新浪微博的名稱。


image.png


代碼以下。


 
 

import cv2

good = []
# 原始圖片
queryImage = cv2.imread('wb1.jpg'0)
# 目標圖片
trainingImage = cv2.imread('wb2.jpg'0)

# 建立SIFT對象(特徵檢測器),並計算灰度圖像(描述符)
sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(queryImage, None)
kp2, des2 = sift.detectAndCompute(trainingImage, None)

# 設置FLANN匹配器參數
FLANN_INDEX_KDTREE = 0
indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
searchParams = dict(checks=50)

# FLANN匹配器
flann = cv2.FlannBasedMatcher(indexParams, searchParams)

# K-最近鄰匹配
matches = flann.knnMatch(des1, des2, k=2)

# 繪製一個空白圖片
matchesMask = [[00for i in range(len(matches))]

# 繪製圖像
for i, (m, n) in enumerate(matches):
    if m.distance < 0.7*n.distance:
        matchesMask[i] = [10]
        good.append(m)


# 圖像參數
drawParams = dict(matchColor=(02550),
                  singlePointColor=(25500),
                  matchesMask=matchesMask,
                  flags=0)

# 最終結果
resultImage = cv2.drawMatchesKnn(queryImage, kp1, trainingImage, kp2, matches, None, **drawParams)

# 檢測是否匹配
if len(good) > 10:
    print('It is a match!')

# 設置顯示窗口
cv2.namedWindow('img'0)
cv2.resizeWindow('img'840480)
cv2.imshow('img', resultImage)
while True:
    if cv2.waitKey(0) & 0xff == ord('q'):
        break
cv2.destroyAllWindows()


輸出下圖。


image.png


能夠看到原始圖片上的logo和目標圖片上的logo匹配上了。


也就意味着,咱們可以利用原始圖片(微博logo)從一個包含目標圖片的圖片庫裏檢索到目標圖片(包含微博logo)。


以圖搜圖,這仍是很類似的。


固然,我並不知道以圖搜圖究竟是經過何種辦法實現的。


畢竟弱雞~



/ 03 / 總結


最開頭放的視頻是今年過年時的一部電影——瘋狂的外星人。


記得當時仍是和一個好友一塊兒去看的,認識十幾年了,還一直保持聯繫。


算是爲數很少我一直聯繫的朋友了。


正值高考來臨,不免感慨一番,畢竟有些朋友真的是走着走着就散了。


萬水千山老是情,點個「在看」行不行。





···  END  ···


image.png

相關文章
相關標籤/搜索