OpenCV3.4.14训练自己的级联分类器的代码,用pycharm写代码
时间: 2024-05-06 17:17:08 浏览: 17
以下是使用Python和OpenCV 3.4.14训练自己的级联分类器的代码:
1. 准备训练数据
首先,您需要准备用于训练级联分类器的正面和负面图像。正面图像应该是你想要检测的对象,而负面图像则应该是与正面图像相似但不包含对象的图像。您可以从网络上下载数据集或创建自己的数据集。
2. 创建正面和负面图像列表
接下来,您需要创建包含正面和负面图像路径的文本文件。每个图像路径应该占用单独的一行。您可以将正面和负面图像列表保存到不同的文件中。
3. 训练级联分类器
使用以下代码,您可以训练级联分类器:
```python
import cv2
# 训练级联分类器
positive_images = 'positive.txt' # 正面图像列表文件路径
negative_images = 'negative.txt' # 负面图像列表文件路径
positive_images_dir = 'positive_images/' # 正面图像目录
negative_images_dir = 'negative_images/' # 负面图像目录
output_model = 'my_classifier.xml' # 输出模型文件路径
image_size = (50, 50) # 图像大小
# 读取正面图像列表
with open(positive_images, 'r') as f:
positive_files = f.readlines()
positive_files = [x.strip() for x in positive_files]
# 读取负面图像列表
with open(negative_images, 'r') as f:
negative_files = f.readlines()
negative_files = [x.strip() for x in negative_files]
# 准备训练数据
training_data = []
for file in positive_files:
img = cv2.imread(positive_images_dir + file, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, image_size)
training_data.append((img, 1))
for file in negative_files:
img = cv2.imread(negative_images_dir + file, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, image_size)
training_data.append((img, 0))
# 训练级联分类器
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setTermCriteria((cv2.TERM_CRITERIA_EPS, 100, 1e-6))
samples = np.array([x[0].flatten() for x in training_data], dtype=np.float32)
labels = np.array([x[1] for x in training_data])
svm.train(samples, cv2.ml.ROW_SAMPLE, labels)
svm.save(output_model)
print('Done!')
```
在上面的代码中,您需要设置以下变量:
- positive_images:包含正面图像路径的文本文件的路径。
- negative_images:包含负面图像路径的文本文件的路径。
- positive_images_dir:包含正面图像的目录路径。
- negative_images_dir:包含负面图像的目录路径。
- output_model:输出模型文件的路径。
- image_size:所需图像大小。
4. 测试级联分类器
使用以下代码,您可以测试级联分类器:
```python
import cv2
# 加载级联分类器
classifier_file = 'my_classifier.xml' # 分类器文件路径
classifier = cv2.CascadeClassifier(classifier_file)
# 加载测试图像
test_image = 'test_image.jpg' # 测试图像文件路径
img = cv2.imread(test_image)
# 检测对象
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
objects = classifier.detectMultiScale(gray)
# 显示结果
for (x, y, w, h) in objects:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上面的代码中,您需要设置以下变量:
- classifier_file:级联分类器文件的路径。
- test_image:要测试的图像文件的路径。
运行以上代码,将显示检测到的对象的矩形框。
总结:
在本文中,我们介绍了如何使用Python和OpenCV 3.4.14训练自己的级联分类器。您需要准备用于训练级联分类器的正面和负面图像。使用级联分类器训练数据并保存模型文件后,您可以使用模型文件检测图像中的对象。