OpenCV级联分类器识别车辆实践笔记

1. OpenCV 级联分类器的基本原理

基于Haar特征的级联分类器的目标检测是Paul Viola和Michael Jones在2001年的论文中提出的一种有效的目标检测方法。这是一种基于机器学习的方法,从大量的正面和负面图像中训练级联函数。然后用它来检测其他图像中的物体。

Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。它分为三类:边缘特征、线性特征、中心特征和对角线特征。就像卷积核一样。每个特征都是一个单独的值,由黑色矩形下的像素和减去白色矩形下的像素和得到。用黑白两种矩形框组合成特征模板,在特征模板内用 黑色矩形像素和减去白色矩形像素和来表示这个模版的特征值。
在这里插入图片描述
例如:脸部的一些特征能由矩形模块差值特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述在特定方向(水平、垂直、对角)上有明显像素模块梯度变化的图像结构。这样就可以进行区分人脸。

级联分类器(Cascade Classifier)是一种用于目标检测的机器学习模型,通常用于识别静态图像或视频流中的特定对象或物体。级联分类器的一个重要应用是人脸检测。

级联分类器基于强分类器的级联结构,其中每个强分类器都是由多个弱分类器组成的。弱分类器是一种简单而不太准确的分类器,但通过级联结构及其组合,可以达到高效且精确的目标检测效果。

2. 级联分类器CascadeClassifier检测的基本原理:

Haar特征分类器就是一个XML文件,用于存储检测特征,xml中存放的是训练后的特征池,特征size大小根据训练时的参数而定,检测的时候可以简单理解为就是将每个固定size特征(检测窗口)与输入图像的同样大小区域比较,如果匹配那么就记录这个矩形区域的位置,然后滑动窗口,检测图像的另一个区域,重复操作。由于输入的图像中特征大小不定,比如在输入图像中眼睛是50x50的区域,而训练时的是25x25,那么只有当输入图像缩小到一半的时候,才能匹配上,所以这里还有一个逐步缩小图像,也就是制作图像金字塔的流程。

利用Opencv自带的Haar特征分类器进行人脸检测,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。Haar特征分类器存放目录:OpenCV安装目录中的\data\ haarcascades目录下。

3. 静态图中车辆识别

from PIL import Image
import cv2
import numpy as npimage = Image.open('V1.png')
w,h = image.size
#image = image.resize((int(w/2),int(h/2)))
image_arr = np.array(image)
image

在这里插入图片描述

grey = cv2.cvtColor(image_arr,cv2.COLOR_BGR2GRAY)
dilated = cv2.dilate(blur,np.ones((3,3)))kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2, 2))
closing = cv2.morphologyEx(dilated, cv2.MORPH_CLOSE, kernel) 
Image.fromarray(closing)

在这里插入图片描述

car_cascade_src = 'haarcascade_car.xml'
car_cascade = cv2.CascadeClassifier(car_cascade_src)
cars = car_cascade.detectMultiScale(closing, 1.1, 1)
cnt = 0
for (x,y,w,h) in cars:cv2.rectangle(image_arr,(x,y),(x+w,y+h),(255,0,0),2)cnt += 1
print(cnt, " cars found")
Image.fromarray(image_arr)
21  cars found

在这里插入图片描述

4. 动态视频中车辆识别

import cv2
import numpy as npcar_classifier= cv2.CascadeClassifier('haarcascade_car.xml')
cap= cv2.VideoCapture('cars.avi')while True:    ret, frame= cap.read()if ret:#frame= cv2.resize(frame, None, fx= 0.5, fy= 0.5, interpolation= cv2.INTER_LINEAR)gray= cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cars= car_classifier.detectMultiScale(gray,1.2,3)for (x,y,w,h) in cars:cv2.rectangle(frame,(x,y),(x+w,y+h), (0,255,255),2)cv2.imshow('Cars', frame)else:print('warning: video is not load correctly or the video is finished')breakkey = cv2.waitKey(1)   #每一帧图像就显示一毫秒就可以,然后继续循环if key == 27:          #27是esc的ascall码break            cap.release()
cv2.destroyAllWindows()

在这里插入图片描述

5. 关键OpenCV函数说明

cv2.CascadeClassifier.detectMultiScale() 函数介绍
在 OpenCV 中,人脸检测使用的是 cv2.CascadeClassifier.detectMultiScale()函数,它可以检
测出图片中所有的人脸。该函数由分类器对象调用,其语法格式为:

objects = cv2.CascadeClassifier.detectMultiScale( image[,
scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]] )

式中各个参数及返回值的含义为:

  • image:待检测图像,通常为灰度图像。
  • scaleFactor:表示在前后两次相继的扫描中,搜索窗口的缩放比例。
  • minNeighbors:表示构成检测目标的相邻矩形的最小个数。默认情况下,该值为 3,意味着有 3 个以上的检测标记存在时,才认为人脸存在。如果希望提高检测的准确率,可以将该值设置得更大,但同时可能会让一些人脸无法被检测到。
  • flags:该参数通常被省略。在使用低版本 OpenCV(OpenCV 1.X 版本)时,它可能会被设置为 CV_HAAR_DO_CANNY_PRUNING,表示使用 Canny 边缘检测器来拒绝一些区域。
  • minSize:目标的最小尺寸,小于这个尺寸的目标将被忽略。
  • maxSize:目标的最大尺寸,大于这个尺寸的目标将被忽略。
  • objects:返回值,目标对象的矩形框向量组。

代码中所涉及到的模型和视频等资源,详见OpenCV级联分类器识别车辆实践笔记中所涉及到的资源。

参考:

小海聊智造. opencv 进阶10-人脸识别原理说明及示例-cv2.CascadeClassifier.detectMultiScale(). CSDN博客. 2023.08
Stray_Lambs. 浅析cv2.CascadeClassifier()函数. CSDN博客. 2019.09
HAMED ETEZADI ·Haar cascade classifier-Car Detection. Kaggle. 2022.04
How to Detect Cars in a Video in Python using OpenCV. Learning about Electronics

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTF Misc(3)流量分析基础以及原理

前言 流量分析在ctf比赛中也是常见的题目,参赛者通常会收到一个网络数据包的数据集,这些数据包记录了网络通信的内容和细节。参赛者的任务是通过分析这些数据包,识别出有用的信息,例如登录凭据、加密算法、漏洞利用等等 工具安装…

共生与共享:线程与进程的关系

🌍前言 在计算机科学和操作系统领域,线程(Thread)和进程(Process)是两个关键概念。它们之间存在密切的关系,但又有着明显的区别。本文将深入探讨线程和进程之间的关系,以及它们在并…

使用Perl脚本编写爬虫程序的一些技术问题解答

网络爬虫是一种强大的工具,用于从互联网上收集和提取数据。Perl 作为一种功能强大的脚本语言,提供了丰富的工具和库,使得编写的爬虫程序变得简单而灵活。在使用的过程中大家会遇到一些问题,本文将通过问答方式,解答一些…

telnet 连接闪退

目录 问题查找问题解决参考 问题 在使用 telnet 连接板子时,出现了 telnet 界面一闪而逝的情况。正常板子开机,查看其存在 telnetd 进程,而使用 telnet 后,登录界面一闪而逝,板子上的 telnetd 进程消失。 查找问题 …

python psutil库之——获取网络信息(网络接口信息、网络配置信息、以太网接口、ip信息、ip地址信息)

文章目录 使用Python psutil库获取网络信息安装psutil库获取网络连接信息查看所有网络连接过滤特定状态的连接 获取网络接口信息获取网络IO统计信息实例1实例2 总结 使用Python psutil库获取网络信息 Python的psutil库是一个跨平台库,能够方便地获取系统使用情况和…

docker-compose Install hfish

前言hfish HFish是一款社区型免费蜜罐,侧重企业安全场景,从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发,为用户提供可独立操作且实用的功能,通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷感知和威胁情报领域的能力。 HFish具有超过40种蜜罐环境、提供免费…

PTA 7-5 令人抓狂的四则运算

题目 曾记否,我们小学时,遇到这种四则运算,心情是抓狂的: 那么当我们学会使用计算机,自然是要程序去完成这个工作啦~ 现在请对输入的四则运算求值。注意: 四则运算表达式必定包含运算数,还可能…

【MySQL入门到精通-黑马程序员】MySQL基础篇-DCL

文章目录 前言一、DCL-介绍二、DCL-管理用户二、DCL-权限控制总结 前言 本专栏文章为观看黑马程序员《MySQL入门到精通》所做笔记,课程地址在这。如有侵权,立即删除。 一、DCL-介绍 DCL英文全称是Data Control Language(数据控制语言&#x…

基于FPGA的数字时钟系统设计

在FPGA的学习中,数字时钟是一个比较基础的实验案例,通过该实验可以更好的锻炼初学者的框架设计能力以及逻辑思维能力,从而打好坚实的基本功,接下来就开始我们的学习吧! 1.数码管介绍 数码管通俗理解就是将8个LED(包含…

使用 L293D 电机驱动器 IC 和 Arduino 控制直流电机

如果您打算组装新的机器人朋友,您最终会想要学习如何控制直流电机。控制直流电机最简单且经济的方法是将 L293D 电机驱动器 IC 与 Arduino 连接。它可以控制两个直流电机的速度和旋转方向。 此外,它还可以控制单极步进电机(如 28BYJ-48&#…

GLTF纹理贴图工具让模型更逼真

1、如何制作逼真的三维模型? 要使三维模型看起来更加逼真,可以考虑以下几个方面: 高质量纹理:使用高分辨率的纹理贴图可以增强模型的细节和真实感。选择适合模型的高质量纹理图像,并确保纹理映射到模型上的UV坐标正确…

栈的运行算法

一&#xff0c;顺序栈的静态分配 二&#xff0c;顺序栈的动态分配 #include<stdio.h> #include<stdlib.h> #define initsize 5 #define incresize 5typedef struct Sqstack{int *base;int *top;int stacksize; }Sqstack;void InitStack(Sqstack *s){(*s).base(int…

抖音小程序没人做了吗?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 咱说的严谨点&#xff0c;不是没人做了&#xff0c;而是做的人少了。利益驱使&#xff0c;越来越多的人开始思考新方向了&#xff0c;开发小程序的人少了&#xff0c;排名也没多少人做了&#xff…

URL because the SSL module is not available

Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host‘pypi.org’, port443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(“Can’t connect to HTT PS URL because the…

c++day5

#include <iostream>using namespace std;class Sofa { private:string sitting; public:Sofa(){cout << "沙发的无参构造函数" << endl;}Sofa(string s):sitting(s){cout << "沙发的有参构造函数" << endl;}void show(){co…

《UnityShader入门精要》学习1

读者可以在开源网站github&#xff08;https://github.com/candycat1992/Unity_Shaders_Book&#xff09;上下载本书的源代码。 第二章 渲染流水线 渲染流水线的最终目的在于生成或者说是渲染一张二维纹理&#xff0c;即我们在电脑屏幕上看到的所有效果&#xff0c;它的输入是…

【Java 进阶篇】HTML 语义化标签详解

HTML&#xff08;HyperText Markup Language&#xff09;是构建Web页面的标准语言。在HTML中&#xff0c;标签&#xff08;tag&#xff09;是用于定义页面结构和内容的关键元素。在构建网页时&#xff0c;了解如何正确使用HTML标签是非常重要的&#xff0c;因为它们不仅影响页面…

【AIGC】如何在使用stable-diffusion-webui生成图片时看到完整请求参数

文章目录 背景开搞使用遇到的问题 背景 通过代码调用Stable Diffusion的txt2img、img2img接口时&#xff0c;很多时候都不知道应该怎么传参&#xff0c;比如如何指定模型、如何开启并使用Controlnet、如何开启面部修复等等&#xff0c;在sd-webui上F12看到的请求也不是正式调用…

WEEX编译|加密市场三季度回顾及未来展望

作者&#xff1a;Greg Cipolaro&#xff0c;NYDIG 全球研究主管 编译&#xff1a;WEEX 唯客交易所 本文要点&#xff1a; ● 在充满挑战的第三季度&#xff0c;比特币价格下跌 11.1%&#xff0c;因为众多资产类别都在努力应对利率上升的影响和对经济衰退的担忧。 ● 比特币…

JavaWeb---Servlet

1.Srvlet概述 Servlet是运行在java服务器端的程序&#xff0c;用于接收和响应来着客户端基于HTTP协议的请求 如果想实现Servlet的功能&#xff0c;可以通过实现javax。servlet。Servlet接口或者继承它的实现类 核心方法&#xff1a;service&#xff08;&#xff09;&#xf…