# 使用HOGDescriptor类计算HOG特征 descriptor = cv2.HOGDescriptor() hog = descriptor.compute(gray)
时间: 2024-05-27 10:07:53 浏览: 128
这段代码使用了OpenCV中的HOGDescriptor类来计算图像的HOG特征。具体来说,它首先创建了一个HOGDescriptor对象,然后使用该对象的compute()方法计算输入图像gray的HOG特征。最终结果保存在hog变量中。请注意,使用HOGDescriptor类需要先安装OpenCV库。
相关问题
import cv2 import numpy as np def hog(img): hog = cv2.HOGDescriptor((20,20),(8,8), (4,4),(8,8),9,1,-1,0,0.2,1,64,True) hog_descriptor=hog.compute(img) hog_descriptor=np.squeeze(hog_descriptor) return hog_descriptor img = cv2.imread((r'C:\Users\Administrator\Pictures\Camera Roll\8.png',0) digits=[np.hsplit(row,100) for row in np.vsplit(img,50)] labels = np.repeat(np.arange(10),500)[:,np.newaxis] hogdata = [list(map(hog,row)) for row in digits] trainData = np.float32(hogdata).reshape(-1,144) svm = cv2.ml.SVM_create() #设置相关参数 svm.setKernel(cv2.ml.SVM_LINEAR) svm.setType(cv2.ml.SVM_C_SVC) svm.setC(2.67) svm.setGamma(5.383) svm.train(trainData, cv2.ml.ROW_SAMPLE, labels) #训练模型 #用绘图工具创建的手写数字5图像(大小为20*20)进行测试 test= cv2.imread(r'C:\Users\Administrator\Pictures\Camera Roll\6.png') #打开图像test_data=hog(test) test_data=test_data.reshape(1,144).astype(np.float32) result = svm.predict(test_data)[1] print('识别结果:',np.squeeze(result)) #用绘图工具创建的手写数字8图像(大小为20*20)进行测试 test= cv2.imread('d8.jpg',0) test_data=hog(test) test_data=test_data.reshape(1,144).astype(np.float32) #转换为测试数据 result = svm.predict(test_data)[1] print('识别结果:',np.squeeze(result))纠正代码
在您提供的代码中,有以下几处需要纠正的错误:
1. 第一行 `import cv2 import numpy as np` 应该改为两行代码:
```
import cv2
import numpy as np
```
2. 第二行 `def hog(img):` 后面应该加上缩进。
3. 第三行 `hog = cv2.HOGDescriptor((20,20),(8,8), (4,4),(8,8),9,1,-1,0,0.2,1,64,True)`,其中参数的数量和顺序不对,应该改为:
```
hog = cv2.HOGDescriptor((20,20),(8,8),(4,4),(8,8),9,1,-1,0,0.2,True,64)
```
4. 第四行 `hog_descriptor=hog.compute(img)`,缺少一个括号,应该改为:
```
hog_descriptor=hog.compute(img)
```
5. 第五行 `hog_descriptor=np.squeeze(hog_descriptor)`,该行代码不需要缩进。
6. 第七行 `img = cv2.imread((r'C:\Users\Administrator\Pictures\Camera Roll\8.png',0)`,`cv2.imread` 函数中的路径需要加上一个括号,应该改为:
```
img = cv2.imread(r'C:\Users\Administrator\Pictures\Camera Roll\8.png',0)
```
7. 第八行 `digits=[np.hsplit(row,100) for row in np.vsplit(img,50)]`,该行代码不需要缩进。
8. 第九行 `labels = np.repeat(np.arange(10),500)[:,np.newaxis]`,该行代码不需要缩进。
9. 第十行 `hogdata = [list(map(hog,row)) for row in digits]`,该行代码不需要缩进。
10. 第十一行 `trainData = np.float32(hogdata).reshape(-1,144)`,该行代码不需要缩进。
11. 第十二行 `svm = cv2.ml.SVM_create() #设置相关参数`,该行代码不需要缩进。
12. 第十三行 `svm.setKernel(cv2.ml.SVM_LINEAR) svm.setType(cv2.ml.SVM_C_SVC) svm.setC(2.67) svm.setGamma(5.383) svm.train(trainData, cv2.ml.ROW_SAMPLE, labels)`,该行代码中的多个函数调用应该分别放在一行,且需要缩进。
13. 第十五行 `test= cv2.imread(r'C:\Users\Administrator\Pictures\Camera Roll\6.png')`,该行代码不需要缩进。
14. 第十六行 `test_data=hog(test) test_data=test_data.reshape(1,144).astype(np.float32)`,该行代码中的两个函数调用应该分别放在一行,且需要缩进。
15. 第十七行 `result = svm.predict(test_data)[1]`,该行代码不需要缩进。
16. 第十八行 `print('识别结果:',np.squeeze(result))`,该行代码不需要缩进。
17. 第二十行 `test= cv2.imread('d8.jpg',0)`,该行代码不需要缩进。
18. 第二十一行 `test_data=hog(test) test_data=test_data.reshape(1,144).astype(np.float32)`,该行代码中的两个函数调用应该分别放在一行,且需要缩进。
19. 第二十二行 `result = svm.predict(test_data)[1]`,该行代码不需要缩进。
20. 第二十三行 `print('识别结果:',np.squeeze(result))`,该行代码不需要缩进。
纠正后的代码如下所示:
```
import cv2
import numpy as np
def hog(img):
hog = cv2.HOGDescriptor((20,20),(8,8),(4,4),(8,8),9,1,-1,0,0.2,True,64)
hog_descriptor=hog.compute(img)
hog_descriptor=np.squeeze(hog_descriptor)
return hog_descriptor
img = cv2.imread(r'C:\Users\Administrator\Pictures\Camera Roll\8.png',0)
digits=[np.hsplit(row,100) for row in np.vsplit(img,50)]
labels = np.repeat(np.arange(10),500)[:,np.newaxis]
hogdata = [list(map(hog,row)) for row in digits]
trainData = np.float32(hogdata).reshape(-1,144)
svm = cv2.ml.SVM_create()
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setType(cv2.ml.SVM_C_SVC)
svm.setC(2.67)
svm.setGamma(5.383)
svm.train(trainData, cv2.ml.ROW_SAMPLE, labels)
test= cv2.imread(r'C:\Users\Administrator\Pictures\Camera Roll\6.png',0)
test_data=hog(test)
test_data=test_data.reshape(1,144).astype(np.float32)
result = svm.predict(test_data)[1]
print('识别结果:',np.squeeze(result))
test= cv2.imread('d8.jpg',0)
test_data=hog(test)
test_data=test_data.reshape(1,144).astype(np.float32)
result = svm.predict(test_data)[1]
print('识别结果:',np.squeeze(result))
```
c++将hog.compute函数所得到的hog特征展示在原图
要将HOG特征展示在原图上,可以按以下步骤操作:
1. 调用hog.compute函数计算HOG特征向量。
2. 使用cv::Mat类型的原始图像和HOG特征向量作为参数调用cv::HOGDescriptor::getDescriptorSize()函数,以获取HOG描述符的大小。
3. 将HOG特征向量转换为cv::Mat类型的特征向量。
4. 将原始图像和HOG特征向量用cv::Mat类型的变量存储。
5. 调用cv::resize()函数,将HOG特征向量的大小与原始图像的大小匹配。
6. 将HOG特征向量绘制到原始图像上。
下面是一个示例代码,展示了如何将HOG特征展示在原图上:
```c++
cv::Mat image = cv::imread("image.jpg");
cv::HOGDescriptor hog;
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
std::vector<float> descriptors;
cv::Mat gray_image;
cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);
cv::resize(gray_image, gray_image, cv::Size(64,128));
hog.compute(gray_image, descriptors);
cv::Mat hog_image;
hog_image.create(200, 200, CV_8UC3);
hog_image.setTo(cv::Scalar(0, 0, 0));
int descriptor_size = hog.getDescriptorSize();
int width = hog_image.cols / 8;
int height = hog_image.rows / 8;
for (int i = 0; i < descriptor_size; i++) {
float value = descriptors[i];
int row = i / width;
int col = i % width;
cv::rectangle(hog_image, cv::Point(col * 8, row * 8),
cv::Point((col + 1) * 8, (row + 1) * 8),
cv::Scalar(value, value, value),
-1);
}
cv::imshow("HOG Image", hog_image);
cv::waitKey(0);
```
在此示例中,我们使用OpenCV库中的cv::HOGDescriptor类来计算HOG特征向量,并使用cv::Mat类来存储原始图像和HOG特征向量。然后,我们使用cv::resize()函数将HOG特征向量的大小与原始图像的大小匹配,并使用cv::rectangle()函数将HOG特征绘制到原始图像上。最后,我们使用cv::imshow()函数显示HOG图像,并使用cv::waitKey()函数等待用户按下任意键。
阅读全文