您现在的位置是:首页 >技术杂谈 >计算机视觉-角点检测网站首页技术杂谈

计算机视觉-角点检测

Ice-冰鸽 2023-05-21 16:00:02
简介计算机视觉-角点检测

1.分别实现Harris角点检测与SIFT特征提取,对比两者的区别

1.1代码实现

Harris角点检测

import cv2
import numpy as np
img = cv2.imread(r'C:Usersice-bgDesktopa
ight.jpg')
gray = np.float32(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
dst = cv2.dilate(dst, None)
img[dst > 0.01 * dst.max()] = [0, 0, 255]
cv2.imshow('dst', img)
cv2.waitKey(0) & 0xff == 27 and cv2.destroyAllWindows()

运行结果
在这里插入图片描述
SIFT特征提取

# Import necessary libraries
import cv2
import numpy as np

# Load the image
img = cv2.imread('left.jpg')

# Convert the image to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# SIFT feature extraction
# Define the SIFT object
sift = cv2.SIFT_create()

# Detect and compute SIFT features
kp, des = sift.detectAndCompute(gray, None)

# Draw SIFT keypoints on the image
img_sift = cv2.drawKeypoints(img, kp, None)

# Display the image with SIFT keypoints
cv2.imshow('SIFT Keypoints', img_sift)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果
在这里插入图片描述

1.2两者区别

Harris角点检测和SIFT特征提取都是计算机视觉领域中常用的特征检测与描述算法。它们的主要区别在于:Harris角点检测是一种基于角点的检测方法,而SIFT特征提取是一种基于局部特征的描述方法。Harris角点检测适用于具有明显边缘的图像,而SIFT特征提取能够提取出更加稳定和鲁棒的特征点,但计算时间较长,不适用于实时性要求较高的场景。

2.利用SIFT算法实现两幅相近图像的特征匹配

2.1代码实现

import cv2

# 读取左右两张图片
left_img = cv2.imread('left.jpg')
right_img = cv2.imread('right.jpg')

# 创建SIFT对象
sift = cv2.SIFT_create()

# 检测关键点和计算描述符
left_kp, left_des = sift.detectAndCompute(left_img, None)
right_kp, right_des = sift.detectAndCompute(right_img, None)

# 创建BFMatcher对象
bf = cv2.BFMatcher()

# 匹配描述符
matches = bf.knnMatch(left_des, right_des, k=2)

# 应用比率测试
good_matches = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good_matches.append([m])

# 绘制匹配结果
result = cv2.drawMatchesKnn(left_img, left_kp, right_img, right_kp, good_matches, None, flags=2)

# 显示结果
cv2.imshow('SIFT Matches', result)
cv2.waitKey(0)

运行结果
在这里插入图片描述

3.实现匹配地理标记图像

3.1代码实现

# -*- coding=utf-8 -*-
from pylab import *
from PIL import Image
from PCV.localdescriptors import sift
from PCV.tools import imtools
import pydot
from tqdm import tqdm

download_path = "C:\Users\ice-bg\Desktop\a\img\"
path = "C:\Users\ice-bg\Desktop\a\img\"

imlist = imtools.get_imlist(download_path)
featlist = [imname[:-3] + 'sift' for imname in imlist]

for i, imname in enumerate(imlist):
    sift.process_image(imname, featlist[i])

matchscores = zeros((len(imlist), len(imlist)))

for i in tqdm(range(len(imlist))):
    for j in range(i, len(imlist)):
        l1, d1 = sift.read_features_from_file(featlist[i])
        l2, d2 = sift.read_features_from_file(featlist[j])
        nbr_matches = sum(sift.match_twosided(d1, d2) > 0)
        matchscores[i, j] = nbr_matches

for i in range(len(imlist)):
    for j in range(i + 1, len(imlist)):
        matchscores[j, i] = matchscores[i, j]

threshold = 2
g = pydot.Dot(graph_type='graph')

for i in tqdm(range(len(imlist))):
    for j in range(i + 1, len(imlist)):
        if matchscores[i, j] > threshold:
            for k in range(2):
                im = Image.open(imlist[i if k == 0 else j])
                im.thumbnail((100, 100))
                filename = path + str(i if k == 0 else j) + '.png'
                im.save(filename)
                g.add_node(pydot.Node(str(i if k == 0 else j), fontcolor='transparent', shape='rectangle', image=filename))

            g.add_edge(pydot.Edge(str(i), str(j)))

g.write_png('jmu.png')

运行结果
在这里插入图片描述

4.实验注意事项

4.1实验需要安装的库和应用

  • GraphViz
    在安装时最好勾选自动添加环境变量,就不用手动配置环境变量。如若忘记勾选还要找到安装路径文件夹,找到dot文件,将它的路径添加到系统环境变量path中。成功安装后在命令行输入dot -version,查看graphviz是否安装成功。
    在这里插入图片描述

  • 安装python库
    直接在命令行使用pip安装相应工具包。

pip install graphviz
pip install pydot

4.2报错内容

  1. sift‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
    参考该博客:sift‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
    PS:如果是conda或其他虚拟环境建议用ctrl点击调用的函数(process_image)去到对应的函数里修改。否则你可能会出现明明和他一样的修改却没有用。
  2. IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed
    参考该博客:vlfeat0.9.21提取sift特征为空
  3. vlfeat0.9.21提取sift特征为空
    这个和上一个解决方式一样。
    参考该博客:vlfeat0.9.21提取sift特征为空

5.小结

本次实验实现了Harris角点检测与SIFT特征提取,并对比了两者的区别。利用SIFT算法实现了两幅相近图像的特征匹配,并成功实现了匹配地理标记图像。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。