Vision.CascadeObjectDetector-VJ算法学习

本文介绍MATLAB中的Vision.CascadeObjectDetector类,使用Viola-Jones算法检测图像中的面部、鼻子、眼睛等特征。文章详细解释了如何创建检测器、设置属性如分类模型、最小和最大检测对象大小等,以及如何使用该类检测图像中的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vision.CascadeObjectDetector

1.描述

级联对象检测器使用Viola-Jones算法来检测人的面部,鼻子,眼睛,嘴巴或上半身。还可以使用Image Labeler训练自定义分类器以与此System对象一起使用。
要检测图像中的面部特征或上半身:

  1. 创建vision.CascadeObjectDetector对象并设置其属性。
  2. 使用参数调用对象,就好像它是一个函数一样。

2.创建

2.1 句法&描述

detector = vision.CascadeobjecDectector
使用Viola-Jones算法创建一个检测器来检测对象。
detector = vision.CascadeObjectDetector(model)
创建一个检测器,配置为检测由输入字符向量定义的对象 model。
detector = vision.CascadeObjectDetector(XMLFILE)
创建一个检测器并将其配置为使用XMLFILE输入指定的自定义分类模型。
detector = vision.CascadeObjectDetector(Name,Value)
使用一个或多个名称 - 值对设置属性。将每个属性名称括在引号中。

2.2 Properties

除非另有说明,否则属性是不可用的,这意味着在调用对象后无法更改其值。当您调用它们时,对象会锁定,并且该 release功能会解锁它们。

2.2.1 Classification Model-训练级联分类模型

训练的级联分类模型,指定为字符向量。该ClassificationModel属性控制要检测的对象类型。默认情况下,检测器配置为检测面。
可以将此字符向量设置为包含自定义分类模型的XML文件,或者下面列出的有效模型字符向量之一。
可以使用该trainCascadeObjectDetector功能训练自定义分类模型。
该函数可以使用类Haar特征,定向梯度直方图(HOG)或局部二元模式(LBP)来训练模型。

分类模型用于训练模型的图像尺寸型号说明
‘FrontalFaceCART’(默认)[20 20]检测直立和前向的面部。该模型由弱分类器组成,基于分类和回归树分析(CART)。这些分类器使用Haar功能来编码面部特征。基于CART的分类器提供了模拟面部特征之间的高阶依赖性的能力。
‘FrontalFaceLBP’[24 24]检测直立和前向的面部。该模型由弱分类器组成,基于决策树桩。这些分类器使用局部二进制模式(LBP)来编码面部特征。LBP功能可以提供抵抗照明变化的稳健性。
‘UpperBody’[18 22]检测上身区域,定义为头肩区域。该模型使用Haar特征来编码头部和肩部区域的细节。因为它在头部周围使用了更多的特征,所以该模型对于姿势变化(例如头部旋转/倾斜)更加鲁棒。
‘EyePairBig’ ‘EyePairSmall’[11 45] [5 22]检测一双眼睛。该’EyePairSmall’模型是使用较小的图像训练。这使模型能够检测到比’EyePairBig’模型检测到的更小的眼睛。
‘LeftEye’ ‘RightEye’[12月18日]分别检测左眼和右眼。这些模型由弱分类器组成,基于决策树桩。这些分类器使用Haar功能来编码细节。
‘LeftEyeCART’ ‘RightEyeCART’[20 20]分别检测左眼和右眼。构成这些模型的弱分类器是CART树。与决策树桩相比,基于CART树的分类器能够更好地模拟高阶依赖性。
‘ProfileFace’[20 20]检测直立面部轮廓。该模型由弱分类器组成,基于决策树桩。这些分类器使用Haar功能对面部细节进行编码。
‘Mouth’[15 25]检测嘴巴。该模型由弱分类器组成,基于决策树桩,使用Haar功能对嘴部细节进行编码。
‘Nose’[15 18]该模型由弱分类器组成,基于决策树桩,使用Haar功能对鼻子细节进行编码。
2.22 MinSize-最小可检测对象的大小 | [ ] 双元素向量

最小可检测对象的大小,指定为双元素向量[高度 宽度]。为包含对象的最小大小区域设置此属性(以像素为单位)。该值必须大于或等于用于训练模型的图像大小。在处理图像之前知道最小对象大小时,使用此属性可缩短计算时间。如果未指定此属性的值,则检测器会将其设置为用于训练分类模型的图像的大小。

2.23 MaxSize-最大可检测对象的大小 | [ ] 双元素向量

最大可检测对象的大小,指定为双元素向量[ 高度 宽度 ]。指定要检测的最大对象的大小(以像素为单位)。在处理图像之前知道最大对象大小时,使用此属性可缩短计算时间。如果未指定此属性的值,则检测器会将其设置为size(I)。

2.24 ScaleFactor-缩放多尺度对象检测 | 1.1 纯量

缩放多尺度对象检测,指定为大于的值 1.0001。比例因子递增地缩放MinSize和之间的检测分辨率MaxSize。可以使用以下方法将比例因子设置为理想值:
size(I)/(size(I)-0.5)
检测器以两者之间的增量缩放搜索区域,MinSize并MaxSize使用以下关系:
搜索区域 = round((trainingsize)*(ScaleFactor^N))
N是当前增量,大于零的整数,训练大小是用于训练分类模型的图像大小。

2.25MergeThreshold-检测阈值 | 4 整数

检测阈值,指定为整数。阈值定义了在对象周围存在多个检测的区域中声明最终检测所需的标准。合并满足阈值的共同定位检测的组被合并以在目标对象周围产生一个边界框。增加该阈值可以通过要求在多尺度检测阶段期间多次检测目标对象来帮助抑制错误检测。将此属性设置为时 0,将返回所有检测,而不执行阈值处理或合并操作。此属性是可调的。
###UseRoI-使用感兴趣的区域 | false (default)
使用感兴趣的区域,指定为false或 false。将此属性设置true为检测输入图像中感兴趣的矩形区域内的对象。

3.用法

3.1句法

bbox=detector(I)返回M -by-4矩阵,bbox定义 包含检测到的对象的M个边界框。检测器对输入图像执行多尺度物体检测I。
bbox=detector(I,roi)检测由指定的矩形搜索区域内的对象 roi。将’UseROI’属性设置 true为使用此语法。

3.2输入参数

3.2.1 I-输入图像 | 灰度/真彩色(RGB)
3.2.2 model-分类模型 | FrontalFaceCART/character string

分类模型,指定为字符向量。的 model输入描述对象的检测的类型。有几个有效的model字符向量,例如’ FrontalFaceCART’,’ UpperBody’和’ ProfileFace’。

3.2.3 XMLFILE-自定义分类模型

自定义分类模型,指定为XML文件。在 XMLFILE可以使用创建trainCascadeObjectDetector函数或OpenCV的(开源计算机视觉)的训练功能。

3.2.4 ROI-矩形感兴趣区域 |四元素向量

图像中的矩形感兴趣区域I,指定为四元素矢量,[ x y width height ]。

3.3 输出参数

3.3.1 bbox-检测 | M-by-4矩阵

检测,作为M -by-4元素矩阵返回。输出矩阵的每一行包含一个四元素向量,[ x y width height ],以像素为单位指定边界框的左上角和大小。

3.3.2对象功能

要使用对象函数,请将System对象指定为第一个输入参数。

step运行System对象算法
release释放资源并允许更改System对象属性值和输入特征
reset重置System对象的内部状态

4. Example

4.1 使用正面人脸分类模型检测图像中的人脸
% Create a face detector object.
`faceDetector = vision.CascadeObjectDetector;`
% Read the input image.
I = imread('visionteam.jpg');
%Detect faces.
bboxes = faceDetector(I);
%Annotate detected faces.
IFaces = insertObjectAnnotation(I,'rectangle',bboxes,'Face');   
figure
imshow(IFaces)
title('Detected faces');
4.2 利用上体分类模型检测图像中的上体
%Create a body detector object and set properties.
bodyDetector = vision.CascadeObjectDetector('UpperBody'); 
bodyDetector.MinSize = [60 60];
bodyDetector.MergeThreshold = 10;
%Read input image and detect upper body.
I2 = imread('visionteam.jpg');
bboxBody = bodyDetector(I2);
Annotate detected upper bodies.
IBody = insertObjectAnnotation(I2,'rectangle',bboxBody,'Upper Body');
figure
imshow(IBody)
title('Detected upper bodies');
<think>我们正在处理一个关于Spring Boot应用程序启动时出现的两个问题: 1. 找不到名为'encryptablePropertyResolver'和'encryptablePropertyDetector'的bean的错误 2. 日志中提示'engine-monitor.address'配置项为空 根据经验,第一个问题通常与Spring Cloud Config的加密功能相关,而第二个问题则是应用程序配置缺失。 让我们逐步分析并解决这两个问题。 ### 问题1: encryptablePropertyResolver和encryptablePropertyDetector bean未找到 这个错误通常发生在使用`jasypt-spring-boot`库进行属性加密时,但缺少必要的配置或依赖。 **原因分析:** - 应用程序可能使用了加密的属性(如`ENC(加密字符串)`),但未正确配置解密所需的bean。 - 项目中可能缺少`jasypt-spring-boot-starter`依赖,或者版本不兼容。 - 如果确实没有使用加密属性,可能是某个依赖库自动配置了加密功能,但找不到相关bean。 **解决方案:** **方案A:如果确实需要使用属性加密** 1. 添加依赖(以Maven为例): ```xml <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.5</version> <!-- 使用最新版本 --> </dependency> ``` 2. 配置加密密码: 在`application.properties`中设置: ```properties jasypt.encryptor.password=your_secret_password ``` 注意:密码可以通过环境变量传入,避免硬编码。 3. 确保主类或配置类上添加了`@EnableEncryptableProperties`注解(如果使用`jasypt-spring-boot-starter`,通常不需要,因为会自动配置,但根据版本可能需要)。 **方案B:如果不需要属性加密** - 检查是否有属性被意外加密(即属性值以`ENC(`开头)。如果有,将其改为明文。 - 如果确定不需要加密功能,可以排除相关自动配置: ```java @SpringBootApplication(exclude = { org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration.class, org.springframework.cloud.bootstrap.encrypt.EncryptionAutoConfiguration.class }) ``` 或者,在`application.properties`中禁用加密: ```properties spring.cloud.config.enabled=false ``` 注意:排除配置需要根据实际引入的库调整。 ### 问题2: engine-monitor.address配置为空 这个错误表明应用程序在启动时尝试读取`engine-monitor.address`配置项,但未找到值。 **原因分析:** - `application.properties`或`application.yml`中确实没有配置该属性。 - 配置了但未生效,可能是由于配置文件未加载,或者配置在激活的profile中不存在。 - 配置属性名拼写错误(注意大小写和分隔符)。 **解决方案:** 1. 在`src/main/resources/application.properties`中添加配置: ```properties engine-monitor.address=http://your-engine-monitor-service-url ``` 或者在`application.yml`中: ```yaml engine-monitor: address: http://your-engine-monitor-service-url ``` 2. 检查配置生效的环境: - 如果使用profile,确保配置在激活的profile对应的配置文件中(如`application-prod.properties`)。 - 启动时可以通过`--spring.profiles.active=prod`指定profile。 3. 验证配置加载: 可以在启动后通过`Environment`对象查看所有属性,或者添加一个测试端点来输出该属性值。 ### 综合解决步骤 1. **检查依赖**:确保`jasypt-spring-boot-starter`依赖是否存在。如果不需要,尝试排除自动配置。 2. **检查加密属性**:搜索整个项目,查看是否有属性值以`ENC(`开头,这表示加密属性。如果有,则需要配置解密;如果没有,则可能是误开启了加密配置。 3. **添加缺失配置**:在`application.properties`中补充`engine-monitor.address`配置。 4. **清理并重启**:执行`mvn clean`(或Gradle的clean)然后重新启动应用。 ### 示例配置结构 ```properties # application.properties # 如果使用加密,设置密码(建议通过环境变量传入) jasypt.encryptor.password=${JASYPT_PASSWORD:} # 默认空,但实际通过环境变量设置 # 必须配置的地址 engine-monitor.address=http://monitor.example.com:8080 ``` ### 相关问题 §§相关问题§§ 1. 如何在Spring Boot中安全地管理加密密码? 2. Spring Boot多环境配置文件如何设置? 3. 如何排除Spring Boot中的自动配置类? 4. 如何查看Spring Boot加载的所有配置属性? 5. 在Spring Boot中,如何通过环境变量传入敏感配置?</think>### Java应用启动问题:encryptablePropertyResolver/encryptablePropertyDetector未找到及engine-monitor.address为空的解决方案 #### 问题1:encryptablePropertyResolver/encryptablePropertyDetector bean未找到错误 **原因分析**: 1. **依赖缺失**:未引入`jasypt-spring-boot`库或其版本不兼容 2. **配置遗漏**:缺少加密相关的自动配置注解 3. **Bean冲突**:多个加密库冲突或自定义Bean未正确注册 4. **属性未加密**:使用了`ENC()`包裹加密值但未启用解密功能 **解决方案**: 1. **添加必要依赖**(Maven示例): ```xml <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency> ``` 2. **启用自动配置**: 在启动类添加注解: ```java @SpringBootApplication @EnableEncryptableProperties // 关键注解 public class Application { ... } ``` 3. **配置加密密码**(application.properties): ```properties # 设置加密密码(生产环境建议使用环境变量) jasypt.encryptor.password=your_secret_key jasypt.encryptor.algorithm=PBEWithMD5AndDES ``` 4. **检查加密属性格式**: 确保加密值使用`ENC()`包裹: ```properties datasource.password=ENC(密文字符串) ``` #### 问题2:engine-monitor.address为空的日志警告 **原因分析**: 1. **配置缺失**:`application.properties`中未定义该属性 2. **Profile未激活**:配置写在`application-{profile}.properties`但未激活对应Profile 3. **属性名错误**:大小写不一致或拼写错误 4. **加载顺序问题**:后加载的配置文件覆盖了该值 **解决方案**: 1. **添加必要配置**: ```properties # application.properties engine-monitor.address=http://your-monitor-service:8080 ``` 2. **检查Profile配置**: 启动时指定Profile: ```bash java -jar app.jar --spring.profiles.active=prod ``` 3. **验证属性加载**: 创建测试Bean检查属性注入: ```java @Component public class ConfigChecker { @Value("${engine-monitor.address}") private String monitorAddress; @PostConstruct public void init() { System.out.println("Monitor address: " + monitorAddress); } } ``` 4. **排查覆盖问题**: 检查以下位置是否重复定义: - `application.yml` - `bootstrap.properties` - 环境变量(如`SPRING_APPLICATION_JSON`) - 命令行参数 #### 完整排查流程 ```mermaid graph TD A[启动报错] --> B{检查依赖} B -->|缺少jasypt| C[添加starter依赖] B -->|已存在| D[检查@EnableEncryptableProperties] D --> E[验证加密格式] E --> F[检查jasypt.encryptor.password] A --> G{engine-monitor.address空值} G --> H[检查application.properties] H -->|存在| I[验证属性名大小写] H -->|不存在| J[添加配置] I --> K[检查Profile配置] K --> L[启动时指定--spring.profiles.active] ``` #### 常见错误示例及修复 **错误配置**: ```properties # 错误1:缺少ENC()包裹 db.password=cGwQZ2WtX2Vj # 错误2:密码未设置 jasypt.encryptor.password= ``` **正确配置**: ```properties # application-prod.properties engine-monitor.address=https://prod-monitor.example.com # 加密属性 db.password=ENC(B64加密字符串) jasypt.encryptor.password=${JASYPT_PASSWORD:fallback_secret} ``` > **重要提示**:生产环境应通过环境变量注入密码: > ```bash > export JASYPT_PASSWORD="your_strong_password" > java -jar app.jar > ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪山飞狐W

如果觉的有帮助,加个鸡腿恰!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值