当前位置:网站首页>OpenCV编程:OpenCV3.X训练自己的分类器
OpenCV编程:OpenCV3.X训练自己的分类器
2022-07-17 13:12:00 【InfoQ】
一、环境介绍
二、下载安装OpenCV



三、测试OpenCV自带的分类器
3.1 自带的分类器文件介绍

3.2 QT的示例代码
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
dir="C:/";
ui->label_source->setAlignment(Qt::AlignVCenter);
ui->label_2->setAlignment(Qt::AlignVCenter);
}
Widget::~Widget()
{
delete ui;
}
QImage Widget::Mat2QImage(const Mat& mat)
{
// 8-bits unsigned, NO. OF CHANNELS = 1
if(mat.type() == CV_8UC1)
{
QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
// Set the color table (used to translate colour indexes to qRgb values)
image.setColorCount(256);
for(int i = 0; i < 256; i++)
{
image.setColor(i, qRgb(i, i, i));
}
// Copy input Mat
uchar *pSrc = mat.data;
for(int row = 0; row < mat.rows; row ++)
{
uchar *pDest = image.scanLine(row);
memcpy(pDest, pSrc, mat.cols);
pSrc += mat.step;
}
return image;
}
// 8-bits unsigned, NO. OF CHANNELS = 3
else if(mat.type() == CV_8UC3)
{
// Copy input Mat
const uchar *pSrc = (const uchar*)mat.data;
// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
return image.rgbSwapped();
}
else if(mat.type() == CV_8UC4)
{
// Copy input Mat
const uchar *pSrc = (const uchar*)mat.data;
// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);
return image.copy();
}
else
{
return QImage();
}
}
//打开本地图片
void Widget::on_pushButton_open_clicked()
{
filename=QFileDialog::getOpenFileName(this,"选择打开的文件",dir,tr("*.bmp *.jpg *.png"));
if(filename.isEmpty())return;
QFileInfo info(filename);
dir=info.path(); //保存当前路径
}
//人脸检测代码
void Widget::opencv_face(QImage qImage)
{
QTime time;
time.start();
//定义级联分类器
CascadeClassifier face_cascade;
//加载分类文件
//
if( !face_cascade.load("C:/OpenCV_3.4.7/OpenCV-MinGW-Build-OpenCV-3.4.7/etc/haarcascades/haarcascade_frontalcatface.xml") )
{
qDebug()<<"haarcascade_frontalface_alt.xml 分类器加载错误";
return;
}
Mat frame=QImage2cvMat(qImage);
cvtColor( frame, frame, COLOR_BGR2GRAY );//转换成灰度图像
std::vector<Rect> faces;
//正脸检测
face_cascade.detectMultiScale(frame,faces);
qDebug()<<tr("耗时:%1 ms 识别:%2 数量:%3\n").arg(time.elapsed()).arg(faces.size()).arg(faces.size());
for ( size_t i = 0; i < faces.size(); i++ )
{
#if 1
Point center(faces[i].x + faces[i].width/2, faces[i].y + faces[i].height/2);
ellipse(frame, center, Size( faces[i].width/2, faces[i].height/2 ), 0, 0, 360, Scalar( 255, 0, 255 ), 4 );
rectangle(frame,
cvPoint(cvRound(faces[i].x), cvRound(faces[i].y)),
cvPoint(cvRound((faces[i].x + faces[i].width-1)),
cvRound((faces[i].y + faces[i].height-1))),
Scalar(255, 255, 255), 3, 8, 0);
#endif
//提取识别结果
Mat frame1;
for(size_t i=0;i<faces.size();i++)
{
Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
frame1= frame(Rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height));
}
/*在控件上显示识别结果*/
ui->label_2->setPixmap(QPixmap::fromImage(Mat2QImage(frame1)));
}
/*在控件上显示*/
QImage display_image=Mat2QImage(frame);
ui->label_source->setPixmap(QPixmap::fromImage(display_image));
}
Mat Widget::QImage2cvMat(QImage image)
{
Mat mat;
switch(image.format())
{
case QImage::Format_ARGB32:
case QImage::Format_RGB32:
case QImage::Format_ARGB32_Premultiplied:
mat = Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
break;
case QImage::Format_RGB888:
mat = Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
cvtColor(mat, mat, CV_BGR2RGB);
break;
case QImage::Format_Indexed8:
mat = Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
break;
}
return mat;
}
void Widget::on_pushButton_start_clicked()
{
opencv_face(QImage(filename).scaled(ui->label_source->size(),Qt::KeepAspectRatio));
}
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "opencv2/core/core.hpp"
#include "opencv2/core/core_c.h"
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <QFileDialog>
#include <QTime>
#include <QDebug>
using namespace cv;
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
QImage Mat2QImage(const Mat& mat);
void opencv_face(QImage qImage);
Mat QImage2cvMat(QImage image);
QString dir;
QString filename;
private slots:
void on_pushButton_open_clicked();
void on_pushButton_start_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
widget.cpp
HEADERS += \
widget.h
FORMS += \
widget.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
#linu平台的路径设置
linux {
message('运行linu版本')
#添加opencv头文件的路径,需要根据自己的头文件路径进行修改
INCLUDEPATH+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/include\
/home/wbyq/work_pc/opencv-3.4.9/_install/install/include/opencv\
/home/wbyq/work_pc/opencv-3.4.9/_install/install/include/opencv2
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_*
}
win32
{
message('运行win32版本')
#添加opencv头文件的路径,需要根据自己的头文件路径进行修改
INCLUDEPATH+=C:/OpenCV_3.4.7/OpenCV-MinGW-Build-OpenCV-3.4.7/include \
C:/OpenCV_3.4.7/OpenCV-MinGW-Build-OpenCV-3.4.7/include/opencv \
C:/OpenCV_3.4.7/OpenCV-MinGW-Build-OpenCV-3.4.7/include/opencv2
LIBS+=C:/OpenCV_3.4.7/OpenCV-MinGW-Build-OpenCV-3.4.7/x86/mingw/bin/libopencv_*.dll
}

3.3 测试人脸分类器效果


3.4 测试猫脸分类器效果

3.5 测试行人检测分类器效果

四、训练自己的分类器
4.1 前言
4.1 准备训练的正负样本素材说明
4.2 正样本图片示例

4.3 负样本图片示例

4.4 创建工作目录

3.2 创建正样本描述文件


命令1-进入到正样本目录下:cd /d D:\linux-share-dir\OpenCV_TrainingData\PositiveSample
命令2-将目录下所有图片名字和路径输出到pos.txt文件:dir /b/s/p/w *.jpg > pos.txt


3.3 创建负样本描述文件
命令1:cd /d D:\linux-share-dir\OpenCV_TrainingData\NegativeSample
命令2:dir /b/s/p/w *.jpg > neg.txt

3.4 生成正样本的.vec文件

命令1:cd /d D:\linux-share-dir\OpenCV_TrainingData
命令2:C:\OpenCV_3.4.7\opencv-vc-3.4.7\build\x64\vc15\bin\opencv_createsamples.exe -vec pos.vec -info pos.txt -num 54 -w 40 -h 40

3.5 开始训练样本
命令1:cd /d D:\linux-share-dir\OpenCV_TrainingData
命令2:C:\OpenCV_3.4.7\opencv-vc-3.4.7\build\x64\vc15\bin\opencv_traincascade.exe -data XML -vec pos.vec -bg neg.txt -numPos 50 -numNeg 133 -numStages 20 -w 40 -h 40 -mode ALL

边栏推荐
- yarn(cdh)中的虚拟cpu和内存
- [LeetCode周赛复盘] 第 302 场周赛20220717
- Virtual CPU and memory in yarn (CDH)
- 华为机试:报文解压缩
- [PostgreSQL] PostgreSQL 15 optimizes distinct
- 「百度一面」怒喷面试官!不就是树遍历时增加一个行号?
- C# SerialPort配置和属性了解
- 关于hping打流测试工具
- R language uses LM function to build linear regression model, and uses subset function to specify the subset of data set to build regression model (uses subset function to filter the data subset that
- MFC | self drawn CEdit control under the framework
猜你喜欢

王者荣耀商城异地多活架构设计

Know what it is, and know why, JS object creation and inheritance

Lvi-sam: laser IMU camera tight coupling mapping

电商销售数据分析与预测(日期数据统计、按天统计、按月统计)

知其然,而知其所以然,JS 对象创建与继承

C serialport configuration and attribute understanding

HCIA rip experiment 7.11

unity3d如何利用asset store下载一些有用的资源包

C # treeview tree structure recursive processing (enterprise group type hierarchical tree display)

「百度一面」怒喷面试官!不就是树遍历时增加一个行号?
随机推荐
Leetcode丑数题解
关于hping打流测试工具
Domestic flagship mobile phones have a serious price foam, and second-hand phones are more cost-effective than new ones, or buy iPhones
因果学习将开启下一代AI浪潮?九章云极DataCanvas正式发布YLearn因果学习开源项目
内核态和用户态
自动化之图形界面库pyautogui
B. Accuratelee [double pointer] [substr function]
The new energy track has high risks, so please pay attention to safety
Develop the first Flink app
新增、修改操作时自定义复杂逻辑校验-2022新项目
R language uses LM function to build linear regression model, and uses subset function to specify the subset of data set to build regression model (uses subset function to filter the data subset that
连通图(并查集)
查找——平衡二叉树
[csp-j 2021] summary
破案了卧槽---从MQ消费的逻辑怎么改代码都不生效
The use and Simulation of stack and queue in STL
LeetCode 2249. 统计圆内格点数目
LeetCode 2319. 判断矩阵是否是一个 X 矩阵
How to use SVG to make text effects arranged along any path
IP SAN拥有独立的文件系统,应用服务器通过网络共享协议访问到IP SAN后,可以对文件系统中的文件进行读写操作