OpenCV HOG特征计算 winStride 参数导致 'vector<T> too long' 错误解决方法
OpenCV HOG特征计算 'vector too long' 错误解决方法
在使用 OpenCV 的 HOGDescriptor 进行特征计算时,你可能会遇到 cv2.error: vector<T> too long 的错误信息,类似于以下 traceback:pythonTraceback (most recent call last): File 'D:/Opencv/c7_1/c7_1/test001.py', line 49, in
问题原因:
这个错误通常是由于 winStride 参数设置导致的。winStride 控制 HOG 计算过程中滑动窗口的步长。较小的步长会生成更密集的特征,从而导致特征向量过大,超出 OpenCV 内部向量类型的最大容量限制。
解决方法:
OpenCV 的 HOGDescriptor 并没有直接控制特征维度大小的参数。一种有效的解决方法是在计算 HOG 特征之前,将图像的大小调整为较小的尺寸。这样可以减小每个窗口的图像尺寸,从而间接控制特征向量的长度,避免超出限制。
代码示例:
以下 Python 代码示例展示了如何在计算 HOG 特征之前调整图像大小:pythonimport cv2import osimport numpy as np
def extract_hog_features(image): resized_image = cv2.resize(image, (64, 128)) # 调整图像尺寸为较小的大小 hog = cv2.HOGDescriptor() features = hog.compute(resized_image) features = features.flatten() return features
... 其他代码 ...
完整示例:
以下是一个完整的汽车检测代码示例,其中包含了调整图像大小的步骤:pythonimport cv2import osimport numpy as np
def extract_hog_features(image): resized_image = cv2.resize(image, (64, 128)) hog = cv2.HOGDescriptor() features = hog.compute(resized_image) features = features.flatten() return features
def train_svm(train_data, train_labels): svm = cv2.ml.SVM_create() svm.setType(cv2.ml.SVM_C_SVC) svm.setKernel(cv2.ml.SVM_LINEAR) svm.train(train_data, cv2.ml.ROW_SAMPLE, train_labels) return svm
def detect_cars(image, svm_model): win_size = (64, 128) stride = 8 hog = cv2.HOGDescriptor()
image_height, image_width = image.shape[:2] car_boxes = []
for y in range(0, image_height - win_size[1], stride): for x in range(0, image_width - win_size[0], stride): window = image[y : y + win_size[1], x : x + win_size[0]] features = extract_hog_features(window).reshape(1, -1) _, result = svm_model.predict(features) if result[0][0] == 1: car_boxes.append((x, y, x + win_size[0], y + win_size[1]))
return car_boxes
... 加载训练数据并训练SVM模型 ...
image_path = 'car.jpg'image = cv2.imread(image_path)
car_boxes = detect_cars(image, svm_model)
for (x1, y1, x2, y2) in car_boxes: cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imshow('Car Detection', image)cv2.waitKey(0)cv2.destroyAllWindows()
注意:
- 将正例图像放在 'CarData/TrainImage/pos' 文件夹中,将负例图像放在 'CarData/TrainImage/neg' 文件夹中。* 将要检测的图像命名为 'car.jpg'。
如果调整图像大小后问题仍然存在,请提供更详细的代码和错误信息,以便我能够帮助您进一步解决问题。
原文地址: http://www.cveoy.top/t/topic/cn0Z 著作权归作者所有。请勿转载和采集!