使用Harris角点和KNN把一张照片与文件夹里的照片做比对并输出照片的名字
时间: 2024-03-23 21:37:33 浏览: 103
这里提供一个Python的示例代码,用于使用Harris角点和KNN比对一张照片和一个文件夹中的照片,并输出匹配照片的文件名。
```python
import cv2
import os
# Harris角点检测参数设置
harris_block_size = 2
harris_ksize = 3
harris_k = 0.04
# KNN匹配器参数设置
knn_matcher = cv2.DescriptorMatcher_create(cv2.DescriptorMatcher_FLANNBASED)
# 读取待比对的照片
img1 = cv2.imread('path/to/photo.jpg', cv2.IMREAD_GRAYSCALE)
# 计算照片中的Harris角点
harris_corners = cv2.cornerHarris(img1, harris_block_size, harris_ksize, harris_k)
harris_corners_norm = cv2.normalize(harris_corners, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8UC1)
harris_corners_norm_scaled = cv2.convertScaleAbs(harris_corners_norm)
# 遍历文件夹中的照片
folder_path = 'path/to/folder'
for filename in os.listdir(folder_path):
if filename.endswith('.jpg') or filename.endswith('.jpeg') or filename.endswith('.png'):
img2 = cv2.imread(os.path.join(folder_path, filename), cv2.IMREAD_GRAYSCALE)
# 计算照片中的Harris角点
harris_corners2 = cv2.cornerHarris(img2, harris_block_size, harris_ksize, harris_k)
harris_corners_norm2 = cv2.normalize(harris_corners2, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8UC1)
harris_corners_norm_scaled2 = cv2.convertScaleAbs(harris_corners_norm2)
# 使用KNN匹配器进行角点匹配
keypoints1 = []
keypoints2 = []
for i in range(img1.shape[0]):
for j in range(img1.shape[1]):
if harris_corners_norm_scaled[i][j] > 0:
keypoints1.append(cv2.KeyPoint(j, i, 1))
for i in range(img2.shape[0]):
for j in range(img2.shape[1]):
if harris_corners_norm_scaled2[i][j] > 0:
keypoints2.append(cv2.KeyPoint(j, i, 1))
descriptors1, descriptors2 = None, None
matches = []
if len(keypoints1) > 0 and len(keypoints2) > 0:
descriptors1, descriptors2 = cv2.xfeatures2d.SIFT_create().compute(img1, keypoints1), cv2.xfeatures2d.SIFT_create().compute(img2, keypoints2)
matches = knn_matcher.knnMatch(descriptors1[1], descriptors2[1], k=2)
# 输出匹配照片的文件名
good_matches = []
if len(matches) > 0:
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append(m)
if len(good_matches) > 10:
print(filename)
```
这段代码使用OpenCV库中的Harris角点检测和KNN匹配器进行特征点匹配,并筛选出好的匹配结果。如果匹配结果中好的匹配点数大于10个,则认为这两张照片是匹配的,输出文件名。注意,这里的输出是通过控制台输出的,如果需要保存到文件中,可以使用Python的文件操作函数。
阅读全文