正样本数据 : 也就是我们需要检测的物体图片,可以自己用手机拍摄下你要检测的物体的图片,多拍摄一些不同角度的图片。
参数介绍
负样本数据:不包含我们要检测物体的图片,可以拍摄一些风景之类的图片,尽量多一些。
然后在image\negitive目录下新建一个bg.txt文件,在其中记录负样本图片信息
[-info ] # 记录样本数据的文件(就是我们刚才创建的info.data文件)
[-img ]
[-vec ] # 输出文件,内含用于训练的正样本。
[-bg ] # 背景图像的描述文件
[-num ] #样本数量(默认为1000)
[-bgcolor ] #指定背景颜色
[-w ]#输出样本的宽度(以像素为单位)
[-h ]#输出样本的高度(以像素为单位)
参考
D:\opencv3.4.12\opencv\build\x64\vc15\bin\opencv_createsamples.exe -info C:\Users\lng\Desktop\image\positive\info.dat -vec C:\Users\lng\Desktop\image\sample.vec -num 58 -bgcolor 0 -bgthresh 0 -w 24 -h 24
-data #目录名,如不存在训练程序会创建它,用于存放训练好的分类器
-vec #包含正样本的vec文件名
-bg #背景描述文件
[-numPos ] #每级分类器训练时所用的正样本数目
[-numNeg ] #每级分类器训练时所用的负样本数目
[-numStages ] #训练的分类器的级数
--cascadeParams--
[-featureType <{HAAR(default), LBP, HOG}>] # 特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征
[-w ] #训练样本的尺寸(单位为像素)
[-h ] #训练样本的尺寸(单位为像素)
--boostParams--
[-minHitRate = 0.995>] #分类器的每一级希望得到的最小检测率
[-maxFalseAlarmRate ] #分类器的每一级希望得到的最大误检率
参考
D:\opencv3.4.12\opencv\build\x64\vc15\bin\opencv_traincascade.exe -data C:\Users\lng\Desktop\image -vec C:\Users\lng\Desktop\image\sample.vec -bg bg.txt -numPos 50 -numNeg 500 -numStages 12 -feattureType HAAR -w 24 -h 24 -minHitRate 0.995 -maxFalseAlarmRate 0.5
PARAMETERS:
cascadeDirName: C:\Users\lng\Desktop\image
vecFileName: C:\Users\lng\Desktop\image\sample.vec
bgFileName: bg.txt
numPos: 50
numNeg: 500
numStages: 12
precalcValBufSize[Mb] : 1024
precalcIdxBufSize[Mb] : 1024
acceptanceRatioBreakValue : -1
stageType: BOOST
featureType: HAAR
sampleWidth: 24
sampleHeight: 24
boostType: GAB
minHitRate: 0.995
maxFalseAlarmRate: 0.5
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100
mode: BASIC
Number of unique features given windowSize [24,24] : 162336
===== TRAINING 0-stage =====
Training until now has taken 0 days 0 hours 0 minutes 1 seconds.
===== TRAINING 1-stage =====
Training until now has taken 0 days 0 hours 0 minutes 3 seconds.
===== TRAINING 2-stage =====
Training until now has taken 0 days 0 hours 0 minutes 5 seconds.
===== TRAINING 3-stage =====
Training until now has taken 0 days 0 hours 0 minutes 7 seconds.
===== TRAINING 4-stage =====
Training until now has taken 0 days 0 hours 0 minutes 11 seconds.
===== TRAINING 5-stage =====
Training until now has taken 0 days 0 hours 0 minutes 15 seconds.
===== TRAINING 6-stage =====
#include
#include
char* face_cascade_name = "C:\\Users\\lng\\Desktop\\image\\cascade.xml";
void faceRecongize(cv::CascadeClassifier faceCascade, cv::Mat frame);
int main(){
cv::VideoCapture *videoCap = new cv::VideoCapture;
cv::CascadeClassifier faceCascade;
// 加载苹果分类器文件
if (!faceCascade.load(face_cascade_name)) {
std::cout << "load face_cascade_name failed. " << std::endl;
return -1;
}
// 打开摄像机
videoCap->open(0);
if (!videoCap->isOpened()) {
videoCap->release();
std::cout << "open camera failed"<< std::endl;
return -1;
}
std::cout << "open camera success"<< std::endl;
while(1){
cv::Mat frame;
//读取视频帧
videoCap->read(frame);
if (frame.empty()) {
videoCap->release();
return -1;
}
//进行苹果识别
faceRecongize(faceCascade, frame);
//窗口进行展示
imshow("face", frame);
//等待回车键按下退出程序
if (cv::waitKey(30) == 13) {
cv::destroyAllWindows();
return 0;
}
}
system("pause");
return 0;
}
void faceRecongize(cv::CascadeClassifier faceCascade, cv::CascadeClassifier eyesCascade, cv::CascadeClassifier mouthCascade, cv::Mat frame) {
std::vector faces;
// 检测苹果
faceCascade.detectMultiScale(frame, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
for (int i = 0; i < faces.size(); i++) {
// 用椭圆画出苹果部分
cv::Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
ellipse(frame, center, cv::Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, cv::Scalar(255, 0, 255), 4, 8, 0);
cv::Mat faceROI = frame(faces[i]);
std::vector eyes;
// 苹果上方区域写字进行标识
cv::Point centerText(faces[i].x + faces[i].width / 2 - 40, faces[i].y - 20);
cv::putText(frame, "apple", centerText, cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 255), 2);
}
}
cmake_minimum_required (VERSION 3.5)
project (faceRecongize2015)
MESSAGE(STATUS "PROJECT_SOURCE_DIR " ${PROJECT_SOURCE_DIR})
SET(SRC_LISTS ${PROJECT_SOURCE_DIR}/src/main.cpp)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
#set(CMAKE_AUTOMOC ON)
#set(CMAKE_AUTOUIC ON)
#set(CMAKE_AUTORCC ON)
# 配置头文件目录
include_directories(${PROJECT_SOURCE_DIR}/src)
include_directories("D:\\opencv3.4.12\\opencv\\build\\include")
include_directories("D:\\opencv3.4.12\\opencv\\build\\include\\opencv2")
# 设置不显示命令框
if(MSVC)
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
endif()
# 添加库文件
set(PRO_OPENCV_LIB "D:\\opencv3.4.12\\opencv\\build\\x64\\vc15\\lib\\opencv_world3412.lib" "D:\\opencv3.4.12\\opencv\\build\\x64\\vc15\\lib\\opencv_world3412d.lib")
IF(WIN32)
# 生成可执行程序
ADD_EXECUTABLE(faceRecongize2015 ${SRC_LISTS})
# 链接库文件
TARGET_LINK_LIBRARIES(faceRecongize2015 ${PRO_OPENCV_LIB})
ENDIF()
- src
- mian.cpp
- build_x64
- CMakeLists
cmake -G "Visual Studio 14 2015 Win64" ..
cmake --build ./ --config Release