,,Python+OpenCV内置方法实现行人检测

,,Python+OpenCV内置方法实现行人检测

OpenCV附带一个预训练的猪线性SVM模型,可用于在图像和视频流中执行行人检测。本文我们将使用Opencv自带的模型实现对视频流中的行人检测。感兴趣的小伙伴可以跟随小编一起学习一下

您是否知道OpenCV具有执行行人检测的内置方法?

OpenCV附带一个预训练的猪线性SVM模型,可用于在图像和视频流中执行行人检测。

今天我们使用Opencv自带的模型实现对视频流中的行人检测,只需打开一个新文件,将其命名为detect.py,然后加入代码:

#导入必要的包

从__未来_ _导入打印_功能

将numpy作为铭牌导入

导入argparse

导入cv2

导入操作系统

导入需要的包,然后定义项目需要的方法。

定义NMS(box,probs=None,overlapThresh=0.3):

#如果没有框,则返回一个空列表

如果len(box)==0:

return []

#如果边界框是整数,将它们转换成浮点数-这

#很重要,因为我们将进行一系列的划分

if boxes.dtype.kind=='i ':

盒子=盒子。astype(' float ')

#初始化选取的索引列表

pick=[]

#获取边界框的坐标

x1=盒子[:0]

y1=框[:1]

x2=盒子[:2]

y2=盒子[:3]

#计算边界框的面积并抓取索引进行排序

#(在没有提供概率的情况下,只需按

#左下方y坐标)

面积=(x2 - x1 1) * (y2 - y1 1)

idxs=y2

#如果提供了概率,则按概率排序

如果问题不是无:

idxs=probs

#对索引进行排序

idxs=np.argsort(idxs)

#在某些索引仍保留在索引列表中时继续循环

而len(idxs) 0:

#获取索引列表中的最后一个索引,并添加索引值

#添加到挑选的索引列表中

last=len(idxs) - 1

i=idxs[last]

pick.append(i)

#找到边界起点的最大(x,y)坐标

#方框和边界终点的最小(x,y)坐标

#方框

xx1=np.maximum(x1[i],x1[idxs[:last]])

yy1=np.maximum(y1[i],y1[idxs[:last]])

xx2=np.minimum(x2[i],x2[idxs[:last]])

yy2=np.minimum(y2[i],y2[idxs[:last]])

#计算边界框的宽度和高度

w=np.maximum(0,xx2 - xx1 1)

h=np.maximum(0,yy2 - yy1 1)

#计算重叠率

overlap=(w * h)/area[idxs[:last]]

#从索引列表中删除重叠较大的所有索引

#超过提供的重叠阈值

idxs=np.delete(idxs,np.concatenate(([last],

NP。其中(overlap overlap thresh)[0])))

#仅返回已选取的边界框

退货箱[选择]。astype('int ')

image_types=(' .jpg ',' .jpeg ',' .png ',' .bmp ',' .' tif ',' .tiff’)

def list_images(basePath,contains=None):

#返回有效的文件集

返回list_files(basePath,validExts=image_types,contains=contains)

def list_files(basePath,validExts=None,contains=None):

#遍历目录结构

对于os.walk(基本路径)中的(根目录、目录名、文件名):

#遍历当前目录中的文件名

对于文件名中的文件名:

#如果包含字符串不为没有,并且文件名不包含

#提供的字符串,然后忽略该文件

如果包含不为没有人且filename.find(包含)==-1:

继续

#确定当前文件的文件扩展名

ext=filename[filename.rfind(' . '):].下部()

#检查文件是否是图像,是否应该进行处理

如果有效文本为没有人或ext.endswith(validExts):

#构建图像的路径并生成它

imagePath=os.path.join(根目录,文件名)

生成图像路径

def resize(image,width=None,height=None,inter=cv2 .区间_区域):

dim=无

(h,w)=image.shape[:2]

# 如果高和宽为没有人则直接返回

如果宽度为"无",高度为"无":

返回图像

# 检查宽是否是没有人

如果宽度为无:

# 计算高度的比例并并按照比例计算宽度

r=高度/浮动(h)

dim=(int(w * r),height)

# 高为没有人

否则:

# 计算宽度比例,并计算高度

r=宽度/浮动(w)

dim=(width,int(h * r))

resized=cv2.resize(image,dim,interpolation=inter)

#返回调整大小的图像

返回调整大小

新帕萨特函数:非极大值抑制。

列表_图像:读取图片。

调整大小:等比例改变大小。

#构造参数解析并解析参数

ap=argparse .ArgumentParser()

ap.add_argument('-i ','- images ',默认值='test1 ',帮助=' images目录的路径)

args=vars(ap.parse_args())

# 初始化猪描述符/人物检测器

hog=cv2 .全息描述符()

hog.setSVMDetector(cv2 .hog descriptor _ getdefaultpeopleconnect())

定义输入图片的文件夹路径。

初始化猪检测器。

#在图像路径上循环

对于list_images(参数['images'])中的图像路径:

# 加载图像并调整其大小以

# (1)减少检测时间

# (2)提高检测精度

image=cv2.imread(imagePath)

image=resize(image,width=min(400,image.shape[1]))

orig=image.copy()

打印(图像)

#检测图像中的人物

(rects,weights)=猪。检测多尺度(image,winStride=(4,4),

填充=(8,8),比例=1.05)

#绘制原始边界框

打印(矩形)

对于矩形中的(x,y,w,h):

cv2.rectangle(orig,(x,y),(x w,y h),(0,0,255),2)

# 使用相当大的重叠阈值对边界框应用非极大值抑制,以尝试保持仍然是人的重叠框

rects=np.array([[x,y,x w,y h] for (x,y,w,h) in rects])

pick=nms(rects,probs=None,overlapThresh=0.65)

#绘制最终的边界框

对于挑选中的(xA,yA,xB,yB):

cv2.rectangle(image,(xA,yA),(xB,yB),(0,255,0),2)

#显示一些关于边界框数量的信息

filename=图像路径[图像路径。rfind('/')1:]

打印('[信息] {}: {}原始框,{}隐藏后。格式(

文件名,len(rects),len(pick))

#显示输出图像

cv2。im显示(' NMS之前,原文)

cv2。im显示(' NMS之后,图片)

cv2.waitKey(0)

遍历-图像目录中的图像。

然后,将图像调整为最大宽度为400 像素。尝试减少图像尺寸的原因有两个:

减小图像大小可确保需要评估图像金字塔中的滑动窗口更少(即从线性SVM中提取猪特征,然后将其传递给线性SVM),从而减少检测时间(并提高整体检测吞吐量)。

调整我们的图像大小也提高了我们行人检测的整体准确性(即更少的误报)。

通过调用猪描述符的检测多尺度方法,检测图像中的行人检测多尺度方法构造了一个比例为1.05 的图像金字塔,滑动窗口步长分别为x和y方向的(4, 4) 个像素。

滑动窗口的大小固定为64 x 128像素,正如开创性的达拉勒和特里格斯论文《用于人体检测的定向梯度直方图》 所建议的那样检测多尺度函数返回rects的2元组,或图像中每个人的边界框(x,y)坐标和重量,SVM为每次检测返回的置信度值。

较大的比例大小将评估影像金字塔中较少的图层,这可以使算法运行得更快。然而,如果比例太大(即图像金字塔中的层数太小),则不能检测到行人。同样,太小的比例会显著增加要评估的影像金字塔图层的数量。这不仅会造成计算的浪费,还会显著增加行人检测器检测到的虚警数量。也就是说,比例是进行行人检测时要调整的最重要的参数之一。我将在以后的博客文章中更彻底地检查每个参数,以检测多尺度。

获取初始边界框,并在图像上绘制它们。

然而,对于一些图像,你会注意到每个人都检测到多个重叠的边界框。

在这种情况下,我们有两个选择。我们可以检查一个边界框是否完全包含在另一个边界框中。或者我们可以应用非最大值抑制,并抑制与重要阈值重叠的边界框。

应用非最大值抑制后,得到最终的包围盒,然后输出图像。

运行结果:

nms之前:

在nms之后:

结论:

与目前的深度学习方法相比,机器学习的准确率要低很多。

以上就是本文关于Python OpenCV内置方法实现行人检测的内容。有关Python OpenCV行人检测的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • opencv图像识别数字,opencv 识别
  • opencv图像识别数字,opencv 识别,如何基于opencv实现简单的数字识别
  • opencv图像的旋转角度计算,opencv图像仿射变换
  • opencv图像的旋转角度计算,opencv图像仿射变换,OpenCV图像几何变换之透视变换
  • opencv图像的旋转角度计算,opencv 旋转任意角度
  • opencv图像的旋转角度计算,opencv 旋转任意角度,opencv图片的任意角度旋转实现示例
  • opencv图像处理函数,opencv图像轮廓合并
  • opencv图像处理函数,opencv图像轮廓合并,OpenCV图像处理之七种常用图像几何变换
  • opencv双线性插值函数,opencv 图像插值
  • LBPH人脸识别,基于opencv的人脸识别技术
  • LBPH人脸识别,基于opencv的人脸识别技术,Opencv LBPH人脸识别算法详解
  • ,,OpenCV黑帽运算(BLACKHAT)的使用
  • opencv双线性插值函数,opencv 图像插值,C++ OpenCV实现图像双三次插值算法详解
  • ,,C语言 OpenCV实现柱面投影
  • ,,C++ Opencv imfill孔洞填充函数的实现思路与代码
  • 留言与评论(共有 条评论)
       
    验证码: