网站建设提成,网站开发与设计实训报告摘要,上海周边网站建设,wordpress后台添加自定义输入框使用Python#xff0c;Opencv检测图像#xff0c;视频中的猫#x1f431;
这篇博客将介绍如何使用Python#xff0c;OpenCV库附带的默认Haar级联检测器来检测图像中的猫。同样的技术也可以应用于视频流。这些哈尔级联由约瑟夫豪斯#xff08;Joseph Howse#xff09;训练…使用PythonOpencv检测图像视频中的猫
这篇博客将介绍如何使用PythonOpenCV库附带的默认Haar级联检测器来检测图像中的猫。同样的技术也可以应用于视频流。这些哈尔级联由约瑟夫·豪斯Joseph Howse训练并贡献给OpenCV项目。
虽然哈尔级联非常有用但通常使用HOG线性SVM因为它更容易调整检测器参数更重要的是可以享受更低的假阳性检测率。
在haarcscades目录中OpenCV存储所有经过预训练的Haar分类器以检测各种对象、身体部位等模型
haarcascade_frontalcatface.xmlhaarcascade_frontalcatface_extended.xml 这俩个模型用来检测图像中的“猫脸”
1. 效果图
单猫检测图效果图如下
多猫检测效果图如下: 可以看到有的并没有检测出来优化可以用HOGSVG检测模型
2. 原理
2.1 opecv预置的模型
使用OpenCVHaar级联检测器进行面部、眼睛、嘴部检测 传奇人物约瑟夫·豪斯Joseph Howse对级联进行了培训并将其贡献给了OpenCV存储库他撰写了大量关于计算机视觉的教程、书籍和演讲。
2.2 cv2.CascadeClassifer detector.detectMultiScale
cv2.CascadeClassifer从磁盘加载预先训练好的Haar级联检测器
detector cv2.CascadeClassifier(path)detectMultiScale对其进行预测
# gray 灰度图
# scaleFactor 检测猫脸时使用的图像金字塔的scaleFactor。更大的比例因子将提高检测器的速度但可能会损害阳性检测精度。相反较小的规模将减缓检测过程但会增加阳性检测。然而这种较小的尺度也会增加假阳性检测率。
# minNeighbors参数控制给定区域中检测到的边界框的最小数量以将该区域视为“猫脸”。此参数在修剪假阳性检测时非常有用。
# minSize参数非常简单。该值确保每个检测到的边界框至少为宽度x高度像素在本例中为75 x 75。
# 返回值矩形框列表每一个是包含4个点的tuple
results detector.detectMultiScale(gray, scaleFactor1.05, minNeighbors5,minSize(30, 30), flagscv2.CASCADE_SCALE_IMAGE)注意Haar级联按照您可能不喜欢的顺序返回边界框。 在这种情况下中间的猫实际上被标记为第三只猫。可以通过根据边界框的xy坐标对边界框进行排序来解决这个“问题”以实现一致的排序。 关于准确性的简要说明在.xml文件的注释部分Joseph Howe详细介绍了猫检测器Haar cascades可以在有人脸的地方报告猫的脸。在这种情况下他建议同时执行面部检测和猫检测然后丢弃与面部边界框重叠的任何猫边界框。
2.3 haar级联模型详解
保罗·维奥拉Paul Viola和迈克尔·琼斯Michael Jones于2001年首次发表了 《使用简单特征的增强级联快速目标检测》Rapid Object Detection using a Boosted Cascade of Simple Features这部原创作品已成为计算机视觉领域被引用最多的论文之一。 该算法能够检测图像中的对象而不管它们的位置和大小。该探测器可以在现代硬件上实时运行。 维奥拉和琼斯专注于训练人脸检测器然而该框架也可用于训练检测器以识别任意“物体”如汽车、香蕉、路标等。 Haar级联的最大问题是正确获取detectMultiScale参数特别是scaleFactor和minNeighbors。很多情况需要逐个图像调整这两个参数的情况这在使用对象检测器时远远不够理想。 scaleFactor变量控制用于检测图像不同比例对象的图像金字塔。如果scaleFactor太大那么将只评估图像金字塔的几个层这可能会导致丢失位于金字塔层之间的比例的对象。 如果将scaleFactor设置得太低则会计算许多金字塔层。这将有助于检测图像中的更多对象但它1使检测过程变慢2大大提高了假阳性检测率这是哈尔级联的著名之处。 为了优化它的问题通常使用定向梯度直方图线性SVM检测。 HOG线性SVM框架参数通常更容易调整最重要的是HOG线型SVM具有更小的假阳性检测率。唯一的缺点是很难让HOG线性SVM实时运行。
3. 源码
# 使用PythonOpenCV库中的猫脸检测器对图片进行猫脸检测
# USAGE
# python cat_detector.py --image images/cat_01.jpg# 导入必要的包
import argparse
import cv2
import imutils# 构建命令行参数及解析
# -image 猫脸照片
# -cascade 模型文件路径
ap argparse.ArgumentParser()
ap.add_argument(-i, --image, requiredTrue,helppath to the input image)
ap.add_argument(-c, --cascade,defaulthaarcascade_frontalcatface_extended.xml,helppath to cat detector haar cascade)
args vars(ap.parse_args())# 加载图片转化为灰度图
image cv2.imread(args[image])
gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 加载猫脸级联检测器然后检测猫脸
detector cv2.CascadeClassifier(args[cascade])
# gray 灰度图
# scaleFactor 检测猫脸时使用的图像金字塔的scaleFactor。更大的比例因子将提高检测器的速度但可能会损害阳性检测精度。
# 相反较小的规模将减缓检测过程但会增加阳性检测。然而这种较小的尺度也会增加假阳性检测率。
# minNeighbors参数控制给定区域中检测到的边界框的最小数量以将该区域视为“猫脸”。此参数在修剪假阳性检测时非常有用。
# minSize参数非常简单。该值确保每个检测到的边界框至少为宽度x高度像素在本例中为75 x 75。
rects detector.detectMultiScale(gray, scaleFactor1.3,minNeighbors10, minSize(75, 75))
print(len(rects))# 遍历猫脸并绘制矩形框
for (i, (x, y, w, h)) in enumerate(rects):cv2.rectangle(image, (x, y), (x w, y h), (0, 0, 255), 2)cv2.putText(image, Cat #{}.format(i 1), (x, y - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.55, (0, 0, 255), 2)# 展示检测到的猫脸
cv2.imshow(Cat Faces, imutils.resize(image,width600))
cv2.waitKey(0)参考
https://pyimagesearch.com/2016/06/20/detecting-cats-in-images-with-opencv/