2024-09-01 21:51:50 +01:00

111 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : qr_orb.py
@Contact : zpyovo@hotmail.com
@License : (C)Copyright 2018-2019, Lab501-TransferLearning-SCUT
@Description :
@Modify Time @Author @Version @Desciption
------------ ------- -------- -----------
2023/8/26 18:58 Pengyu Zhang 1.0 None
'''
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import cv2
import numpy as np
def preprocess_image(image):
# 将图像调整为固定大小
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
resized_image = cv2.resize(image, (275, 275), interpolation=cv2.INTER_NEAREST)
return resized_image
def FAST_corner_detection(image, threshold):
keypoints = []
for i in range(3, image.shape[0] - 3):
for j in range(3, image.shape[1] - 3):
center_pixel = image[i, j]
pixel_difference = [abs(image[i + dx, j + dy] - center_pixel) for dx, dy in
[(0, -3), (0, 3), (-3, 0), (3, 0)]]
if all(diff > threshold for diff in pixel_difference):
keypoints.append(cv2.KeyPoint(j, i, 7))
return keypoints
def BRIEF_descriptor(keypoints, image):
patch_size = 31
descriptors = []
for kp in keypoints:
x, y = int(kp.pt[0]), int(kp.pt[1])
patch = image[y - patch_size // 2:y + patch_size // 2 + 1, x - patch_size // 2:x + patch_size // 2 + 1]
descriptor = ""
for i in range(patch_size * patch_size):
x1, y1 = np.random.randint(0, patch_size, size=2)
x2, y2 = np.random.randint(0, patch_size, size=2)
if patch[y1, x1] < patch[y2, x2]:
descriptor += "0"
else:
descriptor += "1"
descriptors.append(descriptor)
return descriptors
def ORB(image, nfeatures=500, fastThreshold=20):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
keypoints = FAST_corner_detection(gray, fastThreshold)
keypoints = sorted(keypoints, key=lambda x: -x.response)[:nfeatures]
descriptors = BRIEF_descriptor(keypoints, gray)
return keypoints, descriptors
def ORB_detect(img,nfeatures=800,fastThreshold=20):
img = preprocess_image(img)
# 初始化opencv原生ORB检测器
orb = cv2.ORB_create(nfeatures=nfeatures, scaleFactor=1.2, edgeThreshold=31, patchSize=31, fastThreshold=fastThreshold)
kp, des = orb.detectAndCompute(img, None)
return des
'''
必要传参:
std_roi_feature: 服务器备案特征数据
ter_roi_feature: 手机终端特征数据
threshold: 相似度对比阈值
预留传参:
distance: 距离筛选度量默认值100
'''
def roi_siml(std_roi_feature,ter_roi_feature,distance=100, threshold = None):
std_roi_feature = std_roi_feature.astype('uint8')
ter_roi_feature = ter_roi_feature.astype('uint8')
threshold = float(threshold)
# 使用汉明距离对特侦点距离进行计算
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=False)
# 使用knn算法进行匹配
matches = bf.knnMatch(std_roi_feature, trainDescriptors=ter_roi_feature, k=2)
# 去除无效和模糊的匹配
good = []
for match in matches:
if len(match) >= 2:
good = [(m, n) for (m, n) in matches if m.distance < 0.95 * n.distance and m.distance < distance]
similarity = len(good) / len(matches) *100
if similarity >=threshold:
return 'passed',similarity
else:
return 'failed ',similarity