タトゥーフォレンジックに基づくopencv3コンピュータービジョン6.1.9アプリケーション

1.画像記述子を抽出し、ファイルに保存します

新しいコードgenerate_descriptors.py

import os
import cv2
import numpy as np
from os import walk
from os.path import join
import sys

def create_descriptors(folder):
	files = []
	for (dirpath, dirnames, filenames) in walk(folder):
		files.extend(filenames)
	for f in files:
		save_descriptor(folder, f, cv2.xfeatures2d.SIFT_create())
		
def save_descriptor(folder, image_path, feature_detector):
	print( "读取中... %s" % image_path)
	if image_path.endswith("npy"):
		return
	img = cv2.imread(join(folder, image_path), 0)
	keypoints, descriptors = feature_detector.detectAndCompute(img, None)
	descriptor_file = image_path.replace("jpg", "npy")
	np.save(join(folder, descriptor_file), descriptors)
	
dir = sys.argv[1]
create_descriptors(dir)

データセットは100枚のパンダの写真を使用しています。データセットはBaiduCloudに配置されています。

リンク:https 
://pan.baidu.com/s/1M3EQ0-44h1S2eoNhTs5qSg抽出コード:po73 

スクリプトの実行時にパンダの画像フォルダーを渡す必要があります。

私のパンダフォルダとコードは同じパスにあります:

python generate_descriptors.py panda​​​​​​​

結果は次の図のようになり、フィーチャは抽出後にフォルダーに保存されます。

 SIFTアルゴリズムのバージョンで問題が発生した場合は、opencv-python == 3.4.2.16; opencv-contrib-python == 3.4.2.16の2つのバージョンを再インストールする必要があります。

インストールプロセスについては、前の記事を参照してください。https://mp.csdn.net/postedit/95511133

2.スキャンして一致させる

テスト画像test.jpgとトレーニング画像を同じフォルダに入れます(パンダ)

新しいscan_for_matches.py

from os.path import join
from os import walk
import numpy as np
import cv2
from sys import argv
from matplotlib import pyplot as plt

# create an array of filenames 
folder = argv[1]
query = cv2.imread(join(folder, "test.jpg"), 0)

# create files, images, descriptors globals
files = []
images = []
descriptors = []
for (dirpath, dirnames, filenames) in walk(folder):
	files.extend(filenames)
	for f in files:
		if f.endswith("npy") and f != "test.npy":
			descriptors.append(f)
	print (descriptors)

# create the sift detector
sift = cv2.xfeatures2d.SIFT_create()
query_kp, query_ds = sift.detectAndCompute(query, None)

# create FLANN matcher
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)

# minimum number of matches
MIN_MATCH_COUNT = 10

potential_culprits = {}
print (">> 初始化扫描图片...")
for d in descriptors:
	print( "--------- 分析 %s 匹配 ------------" % d)
	matches = flann.knnMatch(query_ds, np.load(join(folder, d)), k =2)
	good = []
	for m,n in matches:
		if m.distance < 0.7*n.distance:
			good.append(m)
	if len(good) > MIN_MATCH_COUNT:
		print ("%s 可匹配! (%d)" % (d, len(good)))
	else:
		print ("%s 不匹配" % d)
	potential_culprits[d] = len(good)

max_matches = None
potential_suspect = None
for culprit, matches in potential_culprits.items():
	if max_matches == None or matches > max_matches:
		max_matches = matches
		potential_suspect = culprit
print ("可能匹配的是 %s" % potential_suspect.replace("npy", "").upper())

#与测试图片匹配的图片culprit_image
culprit_image = potential_suspect.replace("npy", "jpg")
target = cv2.imread(join(folder, culprit_image), 0)
target_kp, target_ds = sift.detectAndCompute(target, None)

#添加文字说明
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(target,'pipeijieguo.jpg ',(10,30), font, 1,(255,0,0),2,cv2.LINE_AA)
cv2.putText(query,'test.jpg',(10,30), font, 1,(255,0,0),2,cv2.LINE_AA)
cv2.imshow('pipeijieguo',target)

'''#01暴力匹配BFMatcher
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(query_ds, target_ds)
matches = sorted(matches, key=lambda x: x.distance)
resultImage = cv2.drawMatches(query, query_kp, target, target_kp, matches[:80], target, flags=2)
'''
#03 获取flann匹配器
matches_o = flann.knnMatch(query_ds, target_ds, k =2)
well= []
for k,l in matches_o:
	if k.distance<0.7*l.distance:
		well.append(k)	
if len(well)>MIN_MATCH_COUNT:
	src_pts = np.float32([ query_kp[k.queryIdx].pt for k in well ]).reshape(-1,1,2)
	dst_pts = np.float32([ target_kp[k.trainIdx].pt for k in well ]).reshape(-1,1,2)
	M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
	matchesMask = mask.ravel().tolist()
	h,w = query.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)
	image = cv2.polylines(target,[np.int32(dst)],True,255,3,cv2.LINE_AA)
else:
	print( "匹配数量不足 - %d/%d" % (len(well),MIN_MATCH_COUNT))
	
	matchesMask = None

drawParams=dict(matchColor=(0,255,0),singlePointColor=None,matchesMask=matchesMask,flags=2)
resultImage=cv2.drawMatches(query,query_kp,target,target_kp,well,None,**drawParams)

plt.imshow(resultImage)
plt.show()

 スクリプトを実行する

python scan_for_matches.py panda

test.jpgを使用してデータセットを照合した結果は次のとおりです。

おすすめ

転載: blog.csdn.net/sinat_38685910/article/details/95620052