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执行命令文件)
2.在pos和neg文件夹中双击get.route.bat文件,生成对应的.txt文件。打开txt文件,点击编辑,替换。将neg替换为neg\neg,pos.txt文件还需要将jpg替换为jpg 1 0 0 40 40
3.将处理好的.txt文件移出来,双击create_positive_samples.bat文件,产生pos.vec文件。
4.双击traincascade.bat开始训练
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下载