请使用opencv4.6 基于训练好的SVM模型做图片行人检测
时间: 2023-05-29 12:04:47 浏览: 159
这里提供一个基于OpenCV 4.6的行人检测示例代码,使用训练好的SVM模型。
首先,需要下载并解压行人检测训练数据集,例如INRIA Person Dataset,将其中的正样本图片存放在一个文件夹中,将负样本图片存放在另一个文件夹中。
然后,需要使用opencv_traincascade工具训练SVM模型。具体步骤如下:
1. 在正负样本图片所在的文件夹中创建一个文件夹,用于存放生成的样本描述文件和训练结果文件。例如,创建一个名为"cascade"的文件夹。
2. 在命令行中运行以下命令,生成正负样本的描述文件:
```
opencv_createsamples -info positive.txt -vec positive.vec -num 1000 -w 48 -h 96
```
其中,positive.txt是正样本图片的描述文件,num表示生成的样本数量,w和h表示生成的样本图片的宽度和高度。
3. 运行以下命令,训练SVM模型:
```
opencv_traincascade -data cascade -vec positive.vec -bg negative.txt -numPos 800 -numNeg 400 -numStages 10 -w 48 -h 96
```
其中,negative.txt是负样本图片的描述文件,numPos和numNeg分别表示正样本和负样本的数量,numStages表示训练的阶段数,w和h表示样本图片的宽度和高度。
4. 训练完成后,在cascade文件夹中可以找到生成的SVM模型文件,例如cascade/cascade.xml。
下面是使用训练好的SVM模型进行行人检测的示例代码:
```python
import cv2
# 加载SVM模型
svm = cv2.ml.SVM_load("cascade/cascade.xml")
# 加载测试图片
img = cv2.imread("test.jpg")
# 缩放图片
scale = 2
img = cv2.resize(img, (int(img.shape[1]/scale), int(img.shape[0]/scale)))
# 行人检测
hog = cv2.HOGDescriptor()
hog.setSVMDetector(svm.getSupportVectors())
rects, weights = hog.detectMultiScale(img)
# 绘制检测结果
for i, (x, y, w, h) in enumerate(rects):
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
# 显示结果
cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这段代码将SVM模型加载到svm变量中,使用cv2.HOGDescriptor()创建一个HOG描述子对象,然后使用setSVMDetector()方法将SVM模型设置为检测器。最后,使用detectMultiScale()方法进行行人检测,并使用cv2.rectangle()绘制检测结果。