计算机视觉项目实战-图像特征检测harris、sift、特征匹配

计算机视觉项目实战-图像特征检测harris、sift、特征匹配对于图像特征检测的应用场景有很多 比如目标检测 物体识别 三维重建 图像配准 图像理解 我们可以识别出来一些特定的关键点来让计算机认识图像的某些特征 该应用也应用于目前较为火热的人脸识别技术当中 后续我们我介绍一下有关于人脸识别的项目实战 这节课先跟着我 做一下这个图像特征如何检测的 它是基于什么原理 原理图 这里第一个图表示的就是平面灰度值没有明显变化 第二个图就是要给边界灰度值水平方向变化明显垂直方向灰度值变化并不明显 第三个图表示的就是一个角点 无论水平还是垂直方向都很明显 主要看灰度级的变化结果

???欢迎来到本博客???
本次博客内容将继续讲解关于OpenCV的相关知识
?作者简介⭐️⭐️⭐️目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉python网页爬虫、机器学习、计算机视觉(OpenCV)、群智能算法。然后正在学习深度学习的相关内容。以后可能会涉及到网络安全相关领域,毕竟这是每一个学习计算机的梦想嘛!
?目前更新???目前已经更新了关于网络爬虫的相关知识、机器学习的相关知识、目前正在更新计算机视觉-OpenCV的相关内容。






???本文摘要???

本次博客我们介绍一下关于图像特征检测的全部过程

在这里插入图片描述




⭐️项目前言

⭐️图像特征检测Harris原理

  • 角点:在图像的角度来看,无论是沿着水平方向还是竖直方向进行移动时候,灰度级会发生变化,而且这个变化是非常迅速的,我们称这个图像就是一个角点。
  • 边界:在图像的角度上来看,指把图像按照水平或者垂直方向移动的时候,只有一个一个方向变化的比较明显,另一个方向变化就比较微弱,这样的我们就称之为边界。
  • 平面:平面就是说无论向垂直方向还是水平方向移动,图像的灰度值都不会发生迅速的变化,这个就是平面。

在这里插入图片描述
原理图,这里第一个图表示的就是平面灰度值没有明显变化,第二个图就是要给边界灰度值水平方向变化明显垂直方向灰度值变化并不明显,第三个图表示的就是一个角点,无论水平还是垂直方向都很明显。主要看灰度级的变化结果:
在这里插入图片描述
对于图像l(x,y),当在点(x,y)处平移(▲x,▲y)后的图像灰度级的相似性是:
在这里插入图片描述
这里就是w(u,v)表示权重矩阵,而I就表示图像的灰度级后面表示图像灰度值的差值,变化程度。假设图像l(x,y)为3*3,那么就有9个像素点x1-x9,当移动之后,那么我们就得到了一个新的像素点集合z1-z9,我们要对其进行一个像素值的减法操作。其中W(u,v)表示权重矩阵项,他是一个以(x,y)为中心的一个窗口,可以是常数也可以是高斯加权函数。
在这里插入图片描述












在OpenCV当中我们使用,cv2.cornerHarris()来进行角点检测。
其中参数都有:

  • img: 数据类型为 float32 的入图像
  • blockSize: 角点检测中指定区域的大小
  • ksize: Sobel求导中使用的窗口大小
  • k: 取值参数为 [0,04,0.06]
    我们使用几个小图像去做一下角点检测:
    在这里插入图片描述




import cv2 import numpy as np img = cv2.imread('white-black.webp') print ('img.shape:',img.shape) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # gray = np.float32(gray) dst = cv2.cornerHarris(gray, 2, 3, 0.04) print ('dst.shape:',dst.shape) img[dst>0.01*dst.max()]=[0,0,255] cv2.imshow('dst',img) cv2.waitKey(0) cv2.destroyAllWindows() 

在这里插入图片描述
在这里插入图片描述

⭐️图像特征检测SIFT原理

import cv2 import numpy as np img = cv2.imread('test_1.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.__version__ sift = cv2.SIFT_create() kp = sift.detect(gray, None) img = cv2.drawKeypoints(gray, kp, img) cv2.imshow('drawKeypoints', img) cv2.waitKey(0) cv2.destroyAllWindows() kp, des = sift.compute(gray, kp) print (np.array(kp).shape) des.shape des[0] 

⭐️图像特征匹配实战

在这里插入图片描述

import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inline img1 = cv2.imread('box.png', 0) img2 = cv2.imread('box_in_scene.png', 0) def cv_show(name,img): cv2.imshow(name, img) cv2.waitKey(0) cv2.destroyAllWindows() cv_show('img1',img1) cv_show('img2',img2) sift = cv2.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) bf = cv2.BFMatcher(crossCheck=True) 

在这里插入图片描述
在这里插入图片描述

首先我们导入一个具体图像和一个整体图像,用于做特征匹配。原理就是使用sift分别识别处关键点,然后对关键点进行一个匹配。我们具体看一下实战结果。kp1, des1 = sift.detectAndCompute(img1, None)这里我们得到关键点和向量信息,得到特征向量。然后使用特征向量进行匹配。bf = cv2.BFMatcher(crossCheck=True)crossCheck表示两个特征点要互相匹,例如A中的第i个特征点与B中的第j个特征点最近的,并且B中的第j个特征点到A中的第i个特征点也是
NORM_L2: 归一化数组的(欧几里德距离),如果其他特征计算方法需要考虑不同的匹配计算方式。

matches = bf.match(des1, des2) matches = sorted(matches, key=lambda x: x.distance) 

对关键点进行一一匹配。一对一匹配。

img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None,flags=2) cv_show('img3',img3) 

在这里插入图片描述
然后一对多进行匹配。

bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) good = [] for m, n in matches: if m.distance < 0.75 * n.distance: good.append([m]) img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2) cv_show('img3',img3) 

在这里插入图片描述
一个点对应最近的两个点。
然后我们又做了一个图像的特征匹配。一对一的。
在这里插入图片描述
然后我们做了我的特征匹配。
在这里插入图片描述
最终的结果是:
在这里插入图片描述
多匹配的结果是
在这里插入图片描述


















?支持???如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦!这就是给予我最大的支持!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217725.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午8:54
下一篇 2026年3月18日 上午8:55


相关推荐

  • socket传输中文出现乱码的解决[通俗易懂]

    socket传输中文出现乱码的解决[通俗易懂]socket传输中文出现乱码的解决 (2013-04-1114:57:03)转载▼ 分类: 技术知识socket服务端和客户端编码方式不一致将有可出现中文乱码问题,因此两边设成一样的就可以了socket服务端发送数据时设置编码方式PrintWriteroutput=newPrintWriter(new

    2022年7月8日
    216
  • 同相放大器

    同相放大器如图所示是同相电压放大器 注意输入电压 Vi 加在同相输入端 因为输入端电压几乎是零 Vi 实际上也就是反相输入端电压 因此 反相输入端的 KCL 方程是 Vi Ra Vi Vo Rf 0 导出 Vo 1 Rf Ra Vi 这种类型的放大器不反相 而且 对于同样的电阻 此种放大器的电压增益要比反相放大器稍微大些 和反相放大器相比 这种电路的一大优点是输入电阻特别高 因此 如果信号

    2026年3月20日
    2
  • DNS服务器fe80_无法访问dns域名服务器

    DNS服务器fe80_无法访问dns域名服务器服务器dns地址fec0内容精选换一换Atlas200DK开发者板支持通过USB端口或者网线与Ubuntu服务器进行连接,连接示例图如图1所示。Atlas200DK连接Ubuntu服务器有以下场景:使用USB连接线通过USB端口与Ubuntu服务器直连,请参考通过USB端口直连Ubuntu服务器。此种场景下,Atlas200DK不方便接入网络,仅适用于与Ubunt创建子网。您可以在A…

    2022年8月11日
    20
  • 关于 strlen 与 sizeof 的区别

    关于 strlen 与 sizeof 的区别关于 strlen 与 sizeof 的区别 我相信很多人都有所了解 以下我总结了几点关于 strlen 与 sizeof 的区别和注意事项 1 strlen 是函数 sizeof 是运算符 2 strlen 测量的是字符的实际长度 以 0 结束 而 sizeof 测量的是字符的分配大小 比如 charstr 20 hello printf strlen

    2026年3月17日
    2
  • 科大讯飞联合华为发布讯飞星火AIPC

    科大讯飞联合华为发布讯飞星火AIPC

    2026年3月14日
    2
  • 浪潮NF5280M5刷写新的FRU

    浪潮NF5280M5刷写新的FRUflashboot 2 3a setup zip 烧写 DOSU 盘的工具 NF5280M5 amp SA5212M5 fru zip 待烧写 FRU 文件微云盘 链接 https share weiyun com 5p4f8gS 密码 inspur 烧写要求 请根据实际服务器配置进行烧写操作步骤 1 下载微云盘文件 解压压缩包 2 安装 f

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号