Traceback (most recent call last): File "D:\hog_pedestran_detect_python-master\pedestran_detect.py", line 178, in <module> test_hog_and_hist_detect(test, svm_detector, logger) File "D:\hog_pedestran_detect_python-master\pedestran_detect.py", line 144, in test_hog_and_hist_detect hog.setSVMDetector(svm_detector) # 使用训练得到的检测器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cv2.error: OpenCV(4.11.0) D:\bld\libopencv_1742095982358\work\modules\objdetect\src\hog.cpp:120: error: (-215:Assertion failed) checkDetectorSize() in function 'cv::HOGDescriptor::setSVMDetector'
时间: 2025-05-15 08:03:09 浏览: 14
### 解决方案分析
在使用 OpenCV 的 `HOGDescriptor` 和 SVM 进行目标检测时,可能会遇到断言失败的错误。以下是针对该问题的具体分析和解决方案。
#### 错误解析
1. **图像未成功加载**
如果图像未能正确加载,则会触发 `!img.empty()` 断言失败[^2]。这通常是因为文件路径不正确或者图像本身损坏。可以通过打印图像对象来验证其是否为 `None`[^5]。
2. **矩阵维度或数据类型不符合要求**
在调用 `setSVMDetector` 方法之前,需确保输入的数据满足特定条件。例如,SVM 训练样本的列数应等于特征向量长度,并且数据类型必须为 `CV_32F`[^4]。如果这些条件未被满足,可能导致断言失败。
3. **模型参数配置不当**
使用预训练好的 SVM 模型作为检测器时,可能由于模型权重与当前使用的 HOG 配置不符而导致错误。因此,在设置检测器前,务必确认两者的一致性。
#### 实现代码修正建议
下面提供一段经过优化后的代码片段用于处理上述潜在问题:
```python
import cv2
import numpy as np
# 初始化HOG描述符
win_size = (64, 128)
block_size = (16, 16)
block_stride = (8, 8)
cell_size = (8, 8)
nbins = 9
deriv_aperture = 1
win_sigma = -1.
histogram_norm_type = 0
l2_hys_threshold = 0.2
gamma_correction = True
nlevels = 64
signed_gradient = False
hog = cv2.HOGDescriptor(win_size, block_size, block_stride,
cell_size, nbins, deriv_aperture,
win_sigma, histogram_norm_type,
l2_hys_threshold, gamma_correction,
nlevels, signed_gradient)
# 加载自定义SVM模型或默认的人体检测器
svm_model_path = r'my_svm.xml'
if svm_model_path is not None and os.path.exists(svm_model_path):
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
else:
hog.setSVMDetector(cv2.HOGDescriptor_getDaimlerPeopleDetector())
# 图像读取并检查有效性
image_path = 'path_to_image.jpg'
image = cv2.imread(image_path)
if image is None:
raise ValueError(f"无法加载图片 {image_path}")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 执行行人检测
found_locations, found_weights = hog.detectMultiScale(gray, hitThreshold=0.,
winStride=(4, 4),
padding=(8, 8),
scale=1.05,
finalThreshold=2.)
for rect in found_locations:
pt1 = (rect[0], rect[1])
pt2 = (rect[0]+rect[2], rect[1]+rect[3])
cv2.rectangle(image, pt1, pt2, color=(0, 255, 0), thickness=2)
cv2.imshow('Detected People', image)
cv2.waitKey()
```
此代码实现了以下几个改进措施:
- 明确指定了 HOG 描述符的各项初始化参数;
- 对于 SVM 检测器的选择提供了灵活性,默认采用人体检测器;
- 增加了对图像加载状态的有效性判断逻辑;
- 调整了多尺度滑动窗口策略中的步幅大小以及缩放因子等超参设定;
#### 注意事项
当尝试应用自己的分类器代替内置选项时,请注意以下几点:
- 确认所选支持向量机已基于相同尺寸及方向直方图统计特性构建而成;
- 数据集类别标签分布均衡与否亦会影响最终效果表现;
- 若仍存在异常情况发生,则可考虑重新审视原始素材质量及其标注准确性等方面因素加以排查解决。
阅读全文
相关推荐



















