HAAR级联分类器从图片处理到训练及测试

先利用画图软件将图片裁剪到合适的大小

一、用MATLAB进行图像处理

1.图像处理
经过图像处理,将图像灰度化,对图像添加噪声或者线性变换增加图像数量。

clear;clc;close all;
Files=dir('F:\train\train\train5600\1852\pos\*.jpg');%读取图像路径
N=length(Files);
Names={};
for k=1:N
        Names{k}=Files(k).name;
        B = imread(['F:\train\train\train5600\1852\pos\' Names{k}]);%读取图像 
%        n = unidrnd(180);%n个整数中以相同的概率抽样的离散均匀分布的整数随机数
%        PSF = fspecial('motion',4,n);	%运动模糊函数,运动位移是15像素,角度是n
%        B=imfilter(B,PSF,'conv','circular');%对图像运动模糊处理
%        B = imnoise(B, 'salt & pepper', 0.1);%椒盐噪声
%        B = imnoise(B, 'speckle', 0.01);%斑点噪声
%         B = imnoise(B, 'gaussian', 0.01);%高斯噪声
         B = rgb2gray(B);%灰度处理
%         B = imresize(B,[20,20]);%将图像缩放为20*20的大小
%        B1 = imadjust(B,[0.3,1],[0.3,1]);%图像线性变换
%         B2 = imadjust(B,[0,1],[0,0.7]);
%         B3 = imadjust(B,[0,1],[0.3,1]);
%         B4 = imadjust(B,[0,1],[0.2,0.8]);
%         B5 = imadjust(B,[0,0.7],[0,1]);
%         B6 = imadjust(B,[0.3,1],[0,1]);
%         B7 = imadjust(B,[0.3,0.7],[0,1]);
%         B8 = imadjust(B,[0,0.7],[0,0.7]);
%         B9 = imadjust(B,[0.2,0.8],[0.2,0.8]);
        path='F:\train\piture\尺寸30\20变48_64\'; %图像处理后的保存路径
        file=Files(k).name; 
        pathfile=fullfile(path,file); 
        imwrite(B,pathfile,'jpg');%保存图像
end

2.图像重命名
从各处得到的图像名称比较混乱无序,手动重命名费时费力,注意,图像超过5000张matlab处理速度将会大大降低。

clc;clear;
dir1='F:\train\train\train5600\17364\2009-2010灰度6220';%图像处理前的路径
dir2='F:\train\train\train5600\17364\2009-2010灰度6220\';%图像处理后的路径
file_dat=dir([dir1 '\*.jpg']);
num_file=length(file_dat);

for i=1:num_file
    file_name=file_dat(i,1).name;
    filename1=strcat(dir2,file_name);
%    disp(file_name);
    temp_str = int2str(i);
    temp_length = length(temp_str);
    k=4-temp_length;
    a=char('0');
    temp_str=repmat(a,1,k);

    new_file=num2str(temp_str);
%    disp(new_file);
    c=int2str(i);
    b=strcat(new_file,c);
%    disp(b);
    d=strcat(b,'.jpg');
%    disp(d);
    d1=strcat('02019_01',d);
%    disp(d1);
    e=strcat(dir2,d1);
    disp(e);
%    disp(filename1);
movefile(filename1,e);
end

二、训练

1.训练的文件夹中应该有以下文件(pos.txt,neg.txt,pos.vec是之后生成的文件,opencv的两个文件在F:\opencv-3.4.6\opencv-3.4.6-vc14_vc15\opencv\build\x64\vc15\bin路径可以找到,其他三个是cmd执行命令文件)
HAAR级联分类器从图片处理到训练及测试_第1张图片
HAAR级联分类器从图片处理到训练及测试_第2张图片
HAAR级联分类器从图片处理到训练及测试_第3张图片
2.在pos和neg文件夹中双击get.route.bat文件,生成对应的.txt文件。打开txt文件,点击编辑,替换。将neg替换为neg\neg,pos.txt文件还需要将jpg替换为jpg 1 0 0 40 40
HAAR级联分类器从图片处理到训练及测试_第4张图片
3.将处理好的.txt文件移出来,双击create_positive_samples.bat文件,产生pos.vec文件。
HAAR级联分类器从图片处理到训练及测试_第5张图片
4.双击traincascade.bat开始训练
HAAR级联分类器从图片处理到训练及测试_第6张图片
5.生成完成后在xml文件夹中可以看到cascade.xml文件。在http://www.openioe.net/xml2cascade.html网站上OpenCV XML 转 CASCADE。

三、测试

在python中测试需要有python-opencv模块
1.python加载图像测试

# -*- coding: utf-8 -*-
import cv2

def detect(filename):
    #face_cascade = cv2.CascadeClassifier(
    #        r'C:\Users\lenovo\AppData\Local\Programs\Python\Python37\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
    
    face_cascade = cv2.CascadeClassifier(
            r'F:\train\train_over_xml\out_17364\0.9995\cascade_17364_9_0.9995.xml')    
    img = cv2.imread(filename)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    faces = face_cascade.detectMultiScale(gray,1.3,5)
    
    for (x,y,w,h) in faces:
        img = cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0),2)
    
    cv2.namedWindow('Person Detected!')
    cv2.imshow('Person Detected!',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    #detect(r'C:\Users\lenovo\Desktop\piture\6.jpg')
    detect(r'F:\train\test\17.jpg')

2.python加载视频测试

import cv2
def detect():
    # 加载Haar级联数据文件,用于检测人面
    face_cascade = cv2.CascadeClassifier('F:/train/train_over_xml/out_6804/0.9995/cascade_6804_12_0.9995.xml')
    #eye_cascade = cv2.CascadeClassifier('cascades/haarcascade_eye.xml')
    camera = cv2.VideoCapture('F:/train/0.5.mp4')
    while True:
        ret, frame = camera.read()
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 人面识别。detectMultiScale参数说明:
        # gray: 进行检测的图像, 这里是转换后的。
        # scaleFactor: 官网文档说是每次图片缩小的比例, 其实可以这么理解, 距离相机不同的距离, 物体大小是不一样的,
        # 在物体大小不一致的情况下识别一个东西是不方便的, 这就需要进行多次的缩放, 这就是这个参数的作用。
        # minNeighbors: 可以理解为每次检测时, 对检测点(Scale)周边多少有效点同时检测, 因为可能选取的检测点大小不足而导致遗漏。
        # minSize: 检测点的最小值, 或者说就是检测点的最终值。
        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(5,5))
        # 画出面部位置
        for (x, y, w, h) in faces:
            img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
            # 画出眼部位置
            #eyes = eye_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(5, 5))
            #for (ex, ey, ew, eh) in eyes:
            #    cv2.rectangle(img, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
            # 显示图像
            cv2.imshow('pic', frame)
        # 停止程序
        if cv2.waitKey(120) & 0xff == ord('q'):
            break
    camera.release()
    cv2.destroyAllWindows()

detect()

完整羽毛球训练例子工程文件请到https://download.csdn.net/download/qasxc78563/11329583下载

你可能感兴趣的:(HAAR级联分类器训练及测试,图像处理)