• C++ Dlib库介绍和编译使用


    1 环境配置
    下载最新版源码。
    编译过程需要用到cmake,注意安装cmake的过程需要添加环境变量。
    解压源代码,然后通过命令行进入源码目录,输入四条指令

    mkdir build
    cd build
    cmake .. -G "Visual Studio 16 2019" -T host=x64
    cmake --build .
    

    我们所创建的build文件夹下面有一个dlib_project.sln文件,即为VS工程文件。以管理员身份打开,解决方案配置为release+x64,然后依次生解决方案下面的ALL_BUILD、dlib、INSTALL
    新建VS工程,右键项目名称->属性(快捷键Shift+F4),先将配置改为Release模式,然后编辑VC++目录。
    在包含目录中添加C:\Program Files (x86)\dlib_project\include
    在引用目录和库目录中添加C:\Program Files (x86)\dlib_project\lib

    添加引用库文件:dlib19.24.0_release_32bit_msvc1916.lib
    至此,dlib的环境便配置完成。

    2 face_detection_ex
    在dlib的解压包中,有一个examples文件夹,里面提供了dlib的一些案例。接下来将参考其中的face_detection_ex.cpp来写下我们的学习代码。

    #include <iostream>
    #include <dlib/image_processing/frontal_face_detector.h>
    #include <dlib/gui_widgets.h>
    #include <dlib/image_io.h>
     
    using namespace dlib;
    using namespace std;
     
    int main(int argc, char** argv)
    {
    	auto detector = get_frontal_face_detector();
    	auto path = "D:\\CS\\dlib-19.22\\examples\\faces\\2007_007763.jpg";     //此为examples中的示例图片
    	image_window win;           //声明一个展示图象的window
    	array2d<unsigned char> img; //声明一个表示灰度图像的矩阵
    	load_image(img, path);      //通过路径加载图像
    	pyramid_up(img);
    	std::vector<rectangle> dets = detector(img);    //存储人脸矩阵
    	cout << "number of faces detected:" << dets.size() << endl;
    	win.clear_overlay();        //清除缓存
    	win.set_image(img);         //设置图像
    	win.add_overlay(dets, rgb_pixel(255, 0, 0));    //添加一个overlay
    	system("pause");
    }
    

    结果如图所示

    上述大部分代码都可以无痛阅读,但仍旧有几点需要说明的地方。

    get_frontal_face_detector是通过经典的HOG(方向梯度直方图)特征而构建的一个线性分类器。
    pyramid_up即上采样,由于我们的脸部检测器的尺寸是固定的,所以对图像进行上采样,意味着可以检测到更小的人脸。

    3 video_tracking_ex.cpp
    这个示例用于展示目标跟踪的功能,在video_frames文件夹下是一组被拆分的视频图像,本代码就是要对图像中的果汁盒进行跟踪。

    #include <dlib/image_processing.h>
    #include <dlib/gui_widgets.h>
    #include <dlib/image_io.h>
    #include <dlib/dir_nav.h>
    #include <Windows.h>
     
    using namespace dlib;
    using namespace std;
     
    int main()
    {
        auto path = "D:\\CS\\dlib-19.22\\examples\\video_frames";
     
        // Get the list of video frames.  
        std::vector<file> files = get_files_in_directory_tree(path, match_ending(".jpg"));
        std::sort(files.begin(), files.end());
     
        array2d<unsigned char> img;     
        load_image(img, files[0]);      //加载第一帧
        correlation_tracker tracker;    //创建tracker
        //下面所创建的矩形,对果汁盒进行了框选
        tracker.start_track(img, centered_rect(point(93, 110), 38, 86));
     
        image_window win;
        for (unsigned long i = 1; i < files.size(); ++i)
        {
            load_image(img, files[i]);
            tracker.update(img);    //根据图像,对tracker进行更新
     
            win.set_image(img);
            win.clear_overlay();
            win.add_overlay(tracker.get_position());
            Sleep(100);
        }
    }
    
  • 相关阅读:
    JDBC连接MySQL数据库及演示样例
    用 managedQuery() 时须要注意的一个陷阱
    JAVA Calendar具体解释
    serialVersionUID作用
    D3DXMatrixMultiply 函数
    不同数据库oracle mysql SQL Server DB2 infomix sybase分页查询语句
    破解中国电信华为无线猫路由(HG522-C)自己主动拨号+不限电脑数+iTV
    数据库的增删改查和使用流程
    OutputCache说明
    HDU 4292Food(网络流的最大流量)
  • 原文地址:https://www.cnblogs.com/xiaohai123/p/16438736.html
Copyright © 2020-2023  润新知