OpenCV HOGDescriptor报错vector<T> too long问题咨询及解决办法
解决OpenCV提取HOG描述符时的"vector too long"错误
错误原因在于你使用的默认HOG参数是为行人检测(64×128窗口)设计的,和你的193×16 ROI尺寸不兼容:默认窗口大小(64,128)远大于ROI的高度16,且ROI宽度193无法被默认块步长(8,8)整除,导致HOG计算时无法正确划分块和细胞,最终触发向量过长的异常。
解决办法
1. 自定义HOG参数适配ROI尺寸
首先确保ROI尺寸满足HOG参数的整除要求:
- 细胞大小(cellSize)通常选8×8(常用值)
- 块大小(blockSize)需为细胞大小的整数倍,比如16×16(2×2细胞)
- 块步长(blockStride)一般设为和细胞大小一致(8×8)
- 窗口大小(winSize)需等于ROI尺寸,且满足
(winSize.width - blockSize.width) % blockStride.width == 0和(winSize.height - blockSize.height) % blockStride.height == 0
由于193无法被8整除,建议将ROI宽度调整为192(8的倍数),以下是适配192×16 ROI的代码:
import cv2 as cv # 自定义HOG参数,适配192×16的ROI winSize = (192, 16) blockSize = (16, 16) blockStride = (8, 8) cellSize = (8, 8) nbins = 9 # 默认方向箱数量 # 初始化HOG描述符 hog = cv.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nbins) # 读取图像并调整为目标尺寸 img = cv.imread("<path to image>", cv.IMREAD_GRAYSCALE) img_roi = cv.resize(img, winSize) # 统一调整为192×16 # 计算HOG描述符 desc = hog.compute(img_roi) print(f"HOG描述符维度: {desc.shape}")
2. 统一正负样本尺寸
训练SVM时,所有正负样本必须保持相同尺寸,因此需要将正负样本都调整为192×16(或其他符合HOG参数要求的尺寸),保证HOG描述符的维度一致,才能用于SVM训练。
关键注意事项
- 若坚持使用193×16的ROI,需调整块步长或细胞大小使其满足整除要求(比如将细胞宽度设为1,但这会大幅增加描述符维度,不推荐)
- 训练SVM前,务必验证所有样本的HOG描述符长度一致,否则无法正常训练
内容的提问来源于stack exchange,提问作者tintin98
相关产品推荐
相关产品推荐

