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 features = extract_hog_features(image) File 'D:/Opencv/c7_1/c7_1/test001.py', line 12, in extract_hog_features features = hog.compute(image, winStride=(8, 8)) # 调整为较小的 winStridecv2.error: vector too long

问题原因:

这个错误通常是由于 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'。

如果调整图像大小后问题仍然存在,请提供更详细的代码和错误信息,以便我能够帮助您进一步解决问题。

OpenCV HOG特征计算 winStride 参数导致 'vector<T> too long' 错误解决方法

原文地址: http://www.cveoy.top/t/topic/cn0Z 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录