hog = cv2.HOGDescriptor()效果不好
时间: 2024-04-03 19:36:29 浏览: 110
如果你觉得 `cv2.HOGDescriptor()` 的效果不好,可以尝试以下几种方法:
1. 调整参数:HOG 算法的效果与参数的设置有很大关系。你可以调整参数来尝试提高算法的效果,例如 `winSize`、`blockSize`、`cellSize`、`nbins` 等等。
2. 使用其他特征提取算法:除了 HOG 算法之外,还有很多其他的特征提取算法可以使用,例如 SIFT、SURF、ORB 等等。你可以尝试使用这些算法来提取图像特征。
3. 使用深度学习算法:深度学习算法在图像处理领域取得了很多成功的应用。你可以尝试使用一些深度学习算法来进行对象识别,例如卷积神经网络(CNN)等等。
4. 使用其他库:除了 OpenCV 之外,还有很多其他的计算机视觉库可以使用,例如 TensorFlow、PyTorch、Caffe 等等。你可以尝试使用这些库来进行对象识别。
相关问题
import cv2 import numpy as np # 提取图像的HOG特征 def get_hog_features(image): hog = cv2.HOGDescriptor() hog_features = hog.compute(image) return hog_features # 加载训练数据集 train_data = [r"I:\18Breakageratecalculation\SVM run\detection_cut\whole\train128"] train_labels = [r"I:\18Breakageratecalculation\SVM run\detection_cut\whole\train128\labels.txt"] for i in range(num_samples): image = cv2.imread('image_'+str(i)+'.jpg', 0) hog_features = get_hog_features(image) hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) color_hist = cv2.calcHist([hsv_image], [0, 1], None, [180, 256], [0, 180, 0, 256]) color_features = cv2.normalize(color_hist, color_hist).flatten() train_data.append(hog_features) train_labels.append(labels[i]) # 训练SVM模型 svm = cv2.ml.SVM_create() svm.setType(cv2.ml.SVM_C_SVC) svm.setKernel(cv2.ml.SVM_LINEAR) svm.train(np.array(train_data), cv2.ml.ROW_SAMPLE, np.array(train_labels)) # 对测试图像进行分类 test_image = cv2.imread('I:\18Breakageratecalculation\mask-slic use\maskSLIC-master\result\split\result2\maskslic2_roi.png', 0) test_features = get_hog_features(test_image) result = svm.predict(test_features.reshape(1,-1)) # 显示分割结果 result_image = np.zeros(test_image.shape, np.uint8) for i in range(test_image.shape[0]): for j in range(test_image.shape[1]): if result[i,j] == 1: result_image[i,j] = 255 cv2.imshow('I:\18Breakageratecalculation\mask-slic use\maskSLIC-master\result\split\result2\Result.png', result_image) cv2.waitKey(0) cv2.destroyAllWindows()
这段代码中也没有定义`num_samples`这个变量,所以在执行`for i in range(num_samples):`这个循环时,会报错`NameError: name 'num_samples' is not defined`。你需要在代码中定义并赋值`num_samples`这个变量,例如:`num_samples = 10`。然后你需要检查循环的范围是否正确,确保它不会超过你的数据集中的图像数量。
from future import print_function from imutils.object_detection import non_max_suppression from imutils import paths import numpy as np import argparse import imutils import cv2 ap = argparse.ArgumentParser() ap.add_argument("-i", "--images", required=True, help="path to images directory") args = vars(ap.parse_args()) winSize = (128, 128) blockSize = (16, 16) blockStride = (8, 8) cellSize = (8, 8) nbins = 9 hog = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nbins) defaultdetector = cv2.HOGDescriptor_getDefaultPeopleDetector() hog.setSVMDetector(defaultdetector) image_Path = args["images"] sig = 0 for imagePath in paths.list_images(image_Path): image = cv2.imread(imagePath) image = imutils.resize(image, (128, 128)) orig = image.copy() (rects, weights) = hog.detectMultiScale(image, winStride=(4, 4), padding=(8, 8), scale=1.05) for (x, y, w, h) in rects: cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255), 2) rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects]) pick = non_max_suppression(rects, probs=None, overlapThresh=0.65) for (xA, yA, xB, yB) in pick: cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2) # filename = imagePath[imagePath.rfind("/") + 1:] # print("[INFO] {}: {} original boxes, {} after suppression".format( # filename, len(rects), len(pick))) cv2.imwrite("./Saves/"+str(sig)+"orig.jpg", orig) cv2.imwrite("./Saves/"+str(sig)+"image.jpg", image) sig += 1以上代码的结果分析
这段代码实现了使用HOG特征进行行人检测。具体地,它遍历指定目录下的每张图片,对于每张图片,使用HOGDescriptor检测其中的行人,并使用非极大值抑制算法对检测结果进行筛选,最后输出检测结果。
具体地,代码分为以下几个步骤:
1. 导入必要的库和模块,包括numpy、argparse、imutils和opencv。
2. 解析命令行参数,获取图片目录的路径。
3. 定义HOGDescriptor,并设置其参数,包括窗口大小、块大小、块步长、细胞大小和直方图的bin数等。
4. 加载默认的SVM行人检测器,并设置到HOGDescriptor中。
5. 遍历图片目录下的所有图片,对于每张图片,读取并缩放到128x128的大小,然后使用HOGDescriptor进行行人检测,得到检测到的行人矩形框和对应的得分。
6. 对检测到的行人矩形框进行非极大值抑制,去除重复的矩形框,得到最终的行人检测结果。
7. 将原始图片和检测结果图片保存到指定目录下。
总体来说,这段代码实现了基于HOG特征的行人检测,并且使用了非极大值抑制算法对检测结果进行了筛选,使得最终输出的结果更加准确和可靠。
阅读全文