计算机视觉-角点检测

news2024/11/15 6:45:11

角点检测

  • 1.分别实现Harris角点检测与SIFT特征提取,对比两者的区别
    • 1.1代码实现
    • 1.2两者区别
  • 2.利用SIFT算法实现两幅相近图像的特征匹配
    • 2.1代码实现
  • 3.实现匹配地理标记图像
    • 3.1代码实现
  • 4.实验注意事项
    • 4.1实验需要安装的库和应用
    • 4.2报错内容
  • 5.小结

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

1.1代码实现

Harris角点检测

import cv2
import numpy as np
img = cv2.imread(r'C:\Users\ice-bg\Desktop\a\right.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算法实现了两幅相近图像的特征匹配,并成功实现了匹配地理标记图像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cdr文件怎么转化成ai文件 CDR文件转AI文件大小会变化吗

cdr与AI软件都可以用于制作矢量图形。基于不同的打印与使用需求&#xff0c;可能需要将cdr文件保存为ai文件使用。那么&#xff0c;cdr文件怎么转化成ai文件&#xff0c;CDR文件转AI文件大小会变化吗&#xff1f;下面让我们来详细解读一下吧。 一、cdr文件怎么转化成ai文件 c…

实验7 回归问题

1. 实验目的 ①掌握一元线性回归模型的实现方法&#xff1b; ②掌握多元线性回归模型的实现方法&#xff1b; ③掌握三维数据可视化方法。 2. 实验内容 ①使用TensorFlow建立一元线性回归模型&#xff0c;使用商品房销售数据训练模型&#xff0c;并使用训练好的模型预测房价…

【C++】17.map和set的模拟实现

1.红黑树中的迭代器 operator是关键 迭代需要走中序 如何走中序? _node从左子树的最左结点开始遍历走中序 分两类情况: 如果右树不为空 那么中序的下一个就是右子树的最左结点 如果右树为空 那么表示_node所在的子树已经完成 在一个结点的祖先去找 沿着路径往上孩子是它的…

【Linux】网络基础(网络层与链路层)

网络层与链路层典型协议网络层IP 地址地址管理网络号的划分&#xff08;五种&#xff09;特殊的网络以及IP地址路由选择链路层MAC 地址ARP 协议MTU 最大传输单元其他典型协议&#xff1a;ICMP、DNS 、NAT技术ICMP协议DNS 协议NAT & NAPT 技术代理网络层 功能&#xff1a;负…

算法设计与分析阶段考总结

前言&#xff1a;基本是为了我自己看的一些我容易忘记的东西&#xff0c;为考试作准备把 第一章 算法中的基本概念 程序设计数据结构算法 算法特性 1.有穷性 2.确定性 3.可行性 4.输出 5.输入 算法复杂性分析 算法复杂性依赖于&#xff1a;问题规模N&#xff0c;输入I&#xff…

TCP 的可靠传输

目录 可靠传输有啥用确认应答超时重传总结 可靠传输有啥用 我们知道相比于 UDP, TCP 的传输是可靠的, 啥意思呢? 就是 UDP 发送的数据, 它自己不知道发送的数据对方是否接收到. 而 TCP 发送的数据, 它知道对方是否接收到, 也就是说对方会给个应答. 假设一个场景 : 甲要付款给…

全网最详细,Jmeter性能测试-性能基础详解,接口关联与编写Java脚本(三)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 接口关联 接口关联…

Vector - CAPL - CAN x 总线信息获取(续1)

继续.... 目录 OverLoadFrameCount -- 过载帧数量 代码示例 OverLoadFrameRate -- 过载帧速率 代码示例 StandardFrameCount -- 标准帧数量 代码示例 StandardFrameRate -- 标准帧速率 代码示例 StandardRemoteFrameCount -- 标准远程帧数量 代码示例 StandardRemote…

Java注解编译期处理AbstractProcessor详解

文章目录概述注解处理器注解处理流程AbstractProcessorgetSupportedOptions()getSupportedAnnotationTypesgetSupportedSourceVersioninit初始化process 处理方法如何注册注解处理器如何调试编译期代码Maven相关配置(指定生效的Processor)注意事项自定义注解处理器范例范例一&a…

多线程小知识

多线程 多线程环境使用哈希表HashMapHashtableConcurrentHashMap 死锁死锁是什么两者之间的死锁多人之间的死锁 死锁产生的四个必要条件:互斥使用不可抢占请求和保持循环等待 不同的锁ReentrantLockSynchronized和ReentrantLock之间的区别:具体选择Synchronized加锁工作过程偏向…

using namespace std 是什么意思——C++命名空间

目录 namespace命名空间局部域和全局域namespace展开命名空间指定命名空间 命名空间的嵌套不同文件中的同名命名空间 using namespace std 是什么意思 我们先看一段C代码&#xff1a; #include <stdio.h> #include <stdlib.h>int rand 0;int main() {printf(&quo…

6.2 统计量与抽样分布

学习目标&#xff1a; 我的理解: 统计量是从一个样本中计算得到的数值&#xff0c;用于描述样本的某种特征或性质。统计量可以用来推断总体的特征或性质&#xff0c;因为样本是总体的一部分。 通常&#xff0c;统计量是通过对样本中的数据进行计算得到的&#xff0c;例如平均…

3年轻人20万开店日营业额79.2元,年轻人开店还能赚到钱吗?

最近&#xff0c;河南郑州的蔡先生和2个朋友合伙开一家汉堡店&#xff0c;生意很惨淡&#xff0c;日营业额79.2元。 蔡先生表示&#xff0c;他们开店失败的最大原因就是没有做好前期准备工作&#xff0c;产品没有吸引人的特色&#xff0c;导致正式营业后吸引不到客户。 蔡先生用…

Python 实现海康机器人工业相机 MV-CU060-10GM 的实时显示视频流及拍照功能

一、背景介绍 1、最近项目中需要给客户对接海康机器人工业相机 MV-CU060-10GM&#xff1b; 2、客户要求通过部署的管理平台&#xff0c;可以在页面上实现如下功能&#xff1a; 1&#xff09;相机视频流开始预览&#xff1b; 2&#xff09;相机视频流停止预览&#xff1b; 3&am…

三月份跳槽了,历经阿里测开岗4轮面试,不出意外,被刷了...

大多数情况下&#xff0c;测试员的个人技能成长速度&#xff0c;远远大于公司规模或业务的成长速度。所以&#xff0c;跳槽成为了这个行业里最常见的一个词汇。 前几天&#xff0c;我看到有朋友留言说&#xff0c;他在面试阿里的测试开发工程师的时候&#xff0c;灵魂拷问三小…

NIO非阻塞式网络通信实例

一、概述 1、NIO有三大核心部分&#xff1a;Channel(通道)&#xff0c;Buufer(缓存区)&#xff0c;Selector(选择器) Buffer缓存区 缓冲区本质上是一块可以写入数据&#xff0c;然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象&#xff0c;并提供了 一组方法&am…

❤Linux文件、目录与磁盘格式总结❤

文章目录 Linux文件、目录与磁盘格式总结Linux文件权限chgrpchmodchown文件种类Linux文件扩展名 Linux文件与目录管理常用的目录解释目录树绝对路径与相对路径cd(切换目录)pwd(显示当前目录)mkdir(建立一个新目录)rmdir(删除空目录)执行文件路径变量$PATHls(文件与目录的查看)c…

青藤首提“业安融合”理念,正式发布先进云安全方案CNAPP

4月18日&#xff0c;以“云时代&#xff0c;安全变了”为主题的2023年云安全高峰论坛在北京举行。会上&#xff0c;青藤首次提出“业安融合”理念&#xff0c;正式发布先进云安全方案CNAPP。 中国全面进入云和数字化时代 当前&#xff0c;全球已进入数字经济时代&#xff0c;…

物联感知产品如何助力企业实现智能化转型?

如果您的企业想要实现设备全生命周期管理、设备信息管理、设备监控和数据处理等功能&#xff0c;想要进行智能化数字转型&#xff0c;不妨了解一下物联感知。 物联感知产品是利用物联网技术&#xff0c;实现对物理世界的感知、联接和智能化。物联感知产品一般由四个部分组成&a…

python中的pyc文件了解一下?

基本说明 pyc 文件是 Python 编译过的字节码文件。当你运行一个 Python 程序时&#xff0c;Python 解释器首先将源代码&#xff08;通常是 .py 文件&#xff09;编译成字节码。这个字节码是一种低级的、与平台无关的代码&#xff0c;它可以被 Python 虚拟机&#xff08;Python…