我是靠谱客的博主 超帅可乐,最近开发中收集的这篇文章主要介绍使用Python,Opencv检测图像,视频中的猫使用Python,Opencv检测图像,视频中的猫????,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用Python,Opencv检测图像,视频中的猫????

这篇博客将介绍如何使用Python,OpenCV库附带的默认Haar级联检测器来检测图像中的猫。同样的技术也可以应用于视频流。这些哈尔级联由约瑟夫·豪斯(Joseph Howse)训练并贡献给OpenCV项目。

虽然哈尔级联非常有用,但通常使用HOG+线性SVM,因为它更容易调整检测器参数,更重要的是可以享受更低的假阳性检测率。

在haarcscades目录中(OpenCV存储所有经过预训练的Haar分类器以检测各种对象、身体部位等模型)

  • haarcascade_frontalcatface.xml
  • haarcascade_frontalcatface_extended.xml
    这俩个模型用来检测图像中的“猫脸”;

1. 效果图

单猫检测图效果图如下:
在这里插入图片描述

多猫检测效果图如下:
可以看到有的并没有检测出来,优化可以用HOG+SVG检测模型;
在这里插入图片描述

2. 原理

2.1 opecv预置的模型

使用OpenCV,Haar级联检测器进行面部、眼睛、嘴部检测

在这里插入图片描述

传奇人物约瑟夫·豪斯(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, scaleFactor=1.05, minNeighbors=5,
		   minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)
  • 注意,Haar级联按照您可能不喜欢的顺序返回边界框。 在这种情况下,中间的猫实际上被标记为第三只猫。可以通过根据边界框的(x,y)坐标对边界框进行排序来解决这个“问题”,以实现一致的排序。

  • 关于准确性的简要说明:在.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. 源码

# 使用Python,OpenCV库中的猫脸检测器对图片进行猫脸检测
# 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", required=True,
                help="path to the input image")
ap.add_argument("-c", "--cascade",
                default="haarcascade_frontalcatface_extended.xml",
                help="path 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, scaleFactor=1.3,
                                  minNeighbors=10, 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,width=600))
cv2.waitKey(0)

参考

  • https://pyimagesearch.com/2016/06/20/detecting-cats-in-images-with-opencv/

最后

以上就是超帅可乐为你收集整理的使用Python,Opencv检测图像,视频中的猫使用Python,Opencv检测图像,视频中的猫????的全部内容,希望文章能够帮你解决使用Python,Opencv检测图像,视频中的猫使用Python,Opencv检测图像,视频中的猫????所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部