级联分类器的训练过程和训练方法参考:
OpenCV 级联分类器之样本处理、训练、测试_cv分类器训练_布施的博客-CSDN博客
OpenCV: Cascade Classifier Training
级联分类器的训练需要正样本和负样本的说明文件,这个python脚本目的在于简化这一流程,快速生成说明文件
以下是我的文件结构
negdata是处理前的负样本文件
neg是处理后的负样本文件
posdata是处理前的正样本文件
pos是处理后的正样本文件
脚本代码jpg.py
import cv2
import os
def convert_to_grayscale_and_generate_txt(input_root_folder, output_folder, txt_filename):
# 确保输出文件夹存在
count=0#计数
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 打开 txt 文件以写入数据
with open(os.path.join(output_folder, txt_filename), 'w') as txt_file:
# 遍历输入根文件夹中的所有文件夹
for subfolder in os.listdir(input_root_folder):
subfolder_path = os.path.join(input_root_folder, subfolder)
# 检查当前路径是否为文件夹
if os.path.isdir(subfolder_path):
# 遍历文件夹中的所有文件
for filename in os.listdir(subfolder_path):
# 检查文件扩展名是否为.jpg或.png
if filename.lower().endswith('.jpg') or filename.lower().endswith('.png'):
# 构建输入和输出文件的完整路径
input_path = os.path.join(subfolder_path, filename)
# 构建灰度图的输出路径
output_filename = f'{subfolder}_{filename}' # 可以根据需要修改输出文件名
output_path = os.path.join(output_folder, output_filename)
# 读取图像
img = cv2.imread(input_path)
if img is not None:
# 将图像转换为灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 保存灰度图
cv2.imwrite(output_path, gray_img)
count=count+1
# 获取图像的大小
# h, w = gray_img.shape[:2]
# 写入 txt 文件,保存生成的灰度图文件的路径
# txt_file.write(f'{output_path} 1 0 0 {w} {h}\n')
txt_file.write(f'{output_path}\n')
print(f'{filename} 已转换为灰度图并保存到 {output_folder}')
else:
print(f"错误:无法从路径 {input_path} 加载图像")
print(f'共计{count}张图像\n')
print(f'{txt_filename} 文件已生成')
# 指定输入根文件夹和输出文件夹路径以及 txt 文件名
input_folder_path = 'C:/Users/13281/Desktop/py.face-haar/negdata'
output_folder_path = 'C:/Users/13281/Desktop/py.face-haar/neg'
txt_filename = 'neg.txt'
# 调用函数进行转换和生成自定义的 txt 文件
convert_to_grayscale_and_generate_txt(input_folder_path, output_folder_path, txt_filename)
txt数据说明文件会自动生成在neg或pos文件夹内
要生成pos数据说明文件,将部分代码解除注释即可
# 获取图像的大小
# h, w = gray_img.shape[:2]
# 写入 txt 文件,保存生成的灰度图文件的路径
# txt_file.write(f'{output_path} 1 0 0 {w} {h}\n')