美食网站设计规划书,徐州 商城网站设计,怎样在建设厅网站里查开发商,建企业网站 硬件本文介绍如何使用 SIFT 算法跟踪对象 在当今世界#xff0c;当涉及到对象检测和跟踪时#xff0c;深度学习模型是最常用的#xff0c;但有时传统的计算机视觉技术也可能有效。在本文中#xff0c;我将尝试使用 SIFT 算法创建一个对象跟踪器。 为什么人们会选择使用传统的计…本文介绍如何使用 SIFT 算法跟踪对象 在当今世界当涉及到对象检测和跟踪时深度学习模型是最常用的但有时传统的计算机视觉技术也可能有效。在本文中我将尝试使用 SIFT 算法创建一个对象跟踪器。 为什么人们会选择使用传统的计算机视觉技术而不是深度学习
深度学习确实很强大但它也有一些要求。首先必须有可用的数据。有时为您的特定目的找到合适的数据集可能具有挑战性。获取数据后需要对模型进行训练这既消耗时间又消耗计算资源。
当谈到使用传统的计算机视觉技术时您不需要数据集或模型训练。此外在许多情况下不需要GPU 。这些技术甚至可以在计算能力有限的小型设备上高效运行。
因此如果您不想花时间在数据集收集和模型训练上或者您缺乏训练资源或者您根本无法访问足够的数据那么您可以在深入研究之前考虑使用计算机视觉技术学习
在开始编码之前我将简要解释一下SIFT 算法是什么。 什么是 SIFT 算法
尺度不变特征变换SIFT是一种强大的计算机视觉算法。
SIFT 旨在检测、描述和匹配图像中的局部特征。它通过识别不随比例、旋转和照明变化而变化的独特关键点兴趣点来进行操作。这些关键点可以作为识别对象和模式的强大描述符。SIFT 的应用对象识别、图像拼接、3D 建模、视频跟踪……。
SIFT 的应用对象识别、图像拼接、3D 建模、视频跟踪……。 现在我将开始使用 OpenCV 使用 SIFT 算法创建一个对象跟踪器. 使用 SIFT 进行对象跟踪
该程序将非常简单。首先用户将在视频的第一帧上绘制一个矩形目标图像将放置在该矩形内。之后SIFT算法将从该矩形中提取特征并保存。
然后视频将显示在屏幕上SIFT 算法将应用于每一帧。对于每一帧将比较第一帧的特征和从当前帧提取的特征如果匹配程序将在该公共点处画一个圆。此过程将应用于每一帧。
因此当用户观看视频时他们会看到每一帧中的目标对象上出现圆圈。所以它将是一个简单且相对强大的对象跟踪器 1. 创建用于跟踪的目标图像
要在目标对象周围绘制矩形请单击鼠标右键。将被跟踪的图像。您可以修改代码以允许从任何帧中选择对象而不仅仅是从第一帧中。我只是重用了以前项目中的代码不想对其进行更改。
# 导入必要的库
import cv2
import numpy as np
import matplotlib.pyplot as plt# 视频路径
video_path resources/plane (1).mp4 video cv2.VideoCapture(video_path) # 只读第一帧以绘制所需对象的矩形
ret,frame video.read() # 我给出大随机数x_min 和 y_min 的数字因为如果将它们初始化为零则无论最小坐标都将为零
x_min,y_min,x_max,y_max 36000 , 36000 , 0 , 0 def coordinat_chooser ( event,x,y,flags,param ): global go , x_min , y_min, x_max , y_max # 当你点击右键时它将提供变量的坐标if eventcv2.EVENT_RBUTTONDOWN: # 如果 x 的当前坐标低于 x_min 它将是新的 x_min 同样的规则适用for y_minx_min min (x,x_min) y_min min (y,y_min) # 如果 x 的当前坐标高于 x_max 则为新的 x_max 同样的规则适用于 y_maxx_max max (x,x_max) y_max max (y,y_max) # 绘制矩形cv2.rectangle(frame,(x_min,y_min),(x_max,y_max),( 0 , 255 , 0 ), 1 ) 如果你不喜欢你的矩形也许你喜欢一些misscliks用鼠标中键重置坐标如果您按下鼠标中键您的鼠标坐标将重置您可以为矩形“””提供新的2点对if eventcv2.EVENT_MBUTTONDOWN: print ( 重置坐标data ) x_min,y_min,x_max,y_max 36000 , 36000 , 0 , 0cv2.namedWindow( coefficient_screen )
# 设置指定窗口的鼠标处理程序在本例中为“coefficient_screen”窗口
cv2.setMouseCallback( coefficient_screen , coordinat_chooser) while True : cv2.imshow( coefficient_screen ,frame) # 仅显示第一帧k cv2.waitKey( 5 ) 0xFF # 绘制矩形后按 esc if k 27 : cv2.destroyAllWindows() break
下面我用鼠标右键为目标对象绘制了一个矩形 # 获取感兴趣区域取矩形内部roi_imageframe[y_min:y_max,x_min:x_max] # 将 roi 转换为灰度SIFT 算法适用于灰度图像
roi_graycv2.cvtColor(roi_image,cv2.COLOR_BGR2GRAY)
roi_image简单来说就是在其周围画一个矩形得到的目标图像。
2. 寻找ROI目标图像的关键点 # 创建 SIFT 算法对象
sift cv2.SIFT_create() # 查找 roi 的关键点和描述符
keypoints_1,descriptors_1 sift.detectAndCompute(roi_gray, None ) roi_keypoint_imagecv2.drawKeypoints(roi_gray,keypoints_1,roi_gray)# 可视化关键点
plt.subplot( 121 )
plt.imshow(roi_gray,cmap gray ) plt.subplot( 122 )
plt.imshow(roi_keypoint_image,cmap gray ) 3. 跟踪视频中的目标物体
# 视频路径
video_path resources/plane (1).mp4 video cv2.VideoCapture(video_path) # 匹配器对象
bf cv2.BFMatcher() while True : # 读取视频ret,framevideo.read() #将帧转换为灰度frame_graycv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) # 查找当前帧关键点和描述符keypoints_2,descriptors_2 sift.detectAndCompute(frame_gray, None ) 比较从 第一帧提取的关键点/描述符(
来自目标对象与从当前帧中提取的内容。“””匹配 bf。match (descriptors_1,descriptors_2) for match in matches: # .queryIdx 和 .trainIdx 给出关键点的索引# .queryIdx 给出目标图像的关键点索引 query_idx match .queryIdx # .trainIdx 给出当前帧的关键点索引 train_idx match .trainIdx #取匹配的坐标pt1 keypoints_1[query_idx].pt # 当前帧关键点坐标pt2 keypoints_2[train_idx].pt # 将圆绘制到 pt2 坐标因为 pt2 给出当前帧坐标cv2.circle(frame,( int (pt2[ 0 ]), int (pt2[ 1 ])), 2 ,( 255 , 0 , 0 ), 2 ) # 将帧显示到屏幕cv2.imshow( coordinate_screen ,frame) k cv2.waitKey( 5 ) 0xFF #绘制矩形后按 esc if k 27 : cv2.destroyAllWindows() breakcv2.destroyAllWindows()