seetaface2+mysql+qt+opencv实现百万级人脸检索与分类

seetaface2+mysql+qt+opencv实现百万级人脸检索与分类

先来一段例子代码:
INCLUDEPATH += D:\SeetaFace2-master\install\include \
           D:\SeetaFace2-master\install\include\seeta \
           D:\opencv\build\include \
           D:\opencv\build\include\opencv2

LIBS += D:\opencv\build\x64\vc15\lib\opencv_world347d.lib
D:\SeetaFace2-master\install\lib\SeetaFaceDetector.lib
D:\SeetaFace2-master\install\lib\SeetaFaceDetector-d.lib
D:\SeetaFace2-master\install\lib\SeetaFaceLandmarker.lib
D:\SeetaFace2-master\install\lib\SeetaFaceLandmarker-d.lib
D:\SeetaFace2-master\install\lib\SeetaFaceRecognizer.lib
D:\SeetaFace2-master\install\lib\SeetaFaceRecognizer-d.lib
D:\SeetaFace2-master\install\lib\SeetaNet.lib
D:\SeetaFace2-master\install\lib\SeetaNet-d.lib

#include <seeta/FaceEngine.h>

#include <seeta/Struct_cv.h>
#include <seeta/Struct.h>

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include
#include
#include

int main()
{
seeta::ModelSetting::Device device = seeta::ModelSetting::CPU;
int id = 0;
seeta::ModelSetting FD_model( “./model/fd_2_00.dat”, device, id );
seeta::ModelSetting PD_model( “./model/pd_2_00_pts5.dat”, device, id );
seeta::ModelSetting FR_model( “./model/fr_2_10.dat”, device, id );
seeta::ModelSetting FD_model(
seeta::FaceEngine engine( FD_model, PD_model, FR_model, 2, 16 );

// recognization threshold
float threshold = 0.7f;

//set face detector's min face size
engine.FD.set( seeta::FaceDetector::PROPERTY_MIN_FACE_SIZE, 80 );

std::vector<std::string> GalleryImageFilename = { "demo.jpg" };
std::vector<int64_t> GalleryIndex( GalleryImageFilename.size() );
for( size_t i = 0; i < GalleryImageFilename.size(); ++i )
{
    //register face into facedatabase
    std::string &filename = GalleryImageFilename[i];
    int64_t &index = GalleryIndex[i];
    std::cerr << "Registering... " << filename << std::endl;
    seeta::cv::ImageData image = cv::imread( filename );
    auto id = engine.Register( image );
    index = id;
    std::cerr << "Registered id = " << id << std::endl;
}
std::map<int64_t, std::string> GalleryIndexMap;
for( size_t i = 0; i < GalleryIndex.size(); ++i )
{
    // save index and name pair
    if( GalleryIndex[i] < 0 ) continue;
    GalleryIndexMap.insert( std::make_pair( GalleryIndex[i], GalleryImageFilename[i] ) );
}

std::cout << "----open camera----" << std::endl;
// Open default USB camera
cv::VideoCapture capture;
capture.open( 0 );

cv::Mat frame;

while( capture.isOpened() )
{
    capture >> frame;
    if( frame.empty() ) continue;

    seeta::cv::ImageData image = frame;

    // Detect all faces
    std::vector<SeetaFaceInfo> faces = engine.DetectFaces( image );

    for( SeetaFaceInfo &face : faces )
    {
        // Query top 1
        int64_t index = -1;
        float similarity = 0;

        auto points = engine.DetectPoints(image, face);

        auto queried = engine.QueryTop( image, points.data(), 1, &index, &similarity );

        cv::rectangle( frame, cv::Rect( face.pos.x, face.pos.y, face.pos.width, face.pos.height ), CV_RGB( 128, 128, 255 ), 3 );
        for (int i = 0; i < 5; ++i)
        {
            auto &point = points[i];
            cv::circle(frame, cv::Point(int(point.x), int(point.y)), 2, CV_RGB(128, 255, 128), -1);
        }

        // no face queried from database
        if (queried < 1) continue;

        // similarity greater than threshold, means recognized
        if( similarity > threshold )
        {
            cv::putText( frame, GalleryIndexMap[index], cv::Point( face.pos.x, face.pos.y - 5 ), 3, 1, CV_RGB( 255, 128, 128 ) );
        }
    }

    cv::imshow( "Frame", frame );

    auto key = cv::waitKey( 20 );
    if( key == 27 )
    {
        break;
    }
}

}

有了以上这个基础例子后,就是将人脸特征提取然后保存到mysql数据库。
比对时读取数据库中特征,然后与模板进行比对。这种比对需要消耗大量的内存,百万级的库需要8G以上的内存。
文件下载 https://download.csdn.net/download/slmrj/11998184

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值