• 根据人脸关键点实现平面三角剖分和最近邻搜索 ( KNN, K=1 ), opencv3.4.2, C++


    头文件:

    
    #pragma once
    #include <iostream>
    #include <vector>
    #include <map>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    
    #define UL unsigend long
    
    
    
    using namespace std;
    using namespace cv;
    
    
    int test_triangulation();
    
    void show_a_image_mat(const Mat& img);
    
    cv::Mat VisualizePoints(const cv::Mat& src_img, const vector<cv::Point2f>& pts);
    
    

    源文件:

    
    #include "delaunay_triangulation.h"
    
    
    void show_a_image_mat(const Mat& img){
        namedWindow("src_img", WINDOW_AUTOSIZE);
        imshow("src_img", img);
        waitKey();
        destroyAllWindows();
    }
    
    
    Mat VisualizePoints(const Mat& src_img, const vector<Point2f>& pts)
    {
        // draw circles on Mat
        Mat render = src_img.clone();
        for (auto& i: pts) {
            circle(render, i, 2, Scalar(255, 255, 255), -1, CV_AA);
        }
        return render;
    }
    
    
    int test_triangulation(){
        cout << "start test_triangulation" << endl;
    
        // 读图
        string src_img_path = "/Users/liujiashu/CLionProjects/debug_lrn/jpegs/JJY.jpg";
        Mat src_img = imread(src_img_path);
        if(src_img.empty()){
            cout << "empty img" << endl;
            return -1;
        }
        auto img_height = src_img.size[0];
        auto img_width = src_img.size[1];
    
        // 选取一些点
        vector<Point2f> pts_vec;
        vector<int> pts_index_vec;
        map<int, int> pt_id2pt_index;
    
        int pt_index = 0;
        for (int i = 0; i < 20; i++) {
            for (int j = 0; j < 20; j++ ){
                pts_vec.emplace_back(img_width / 20.0 * i, img_height / 20.0 * j);
                pts_index_vec.emplace_back(pt_index);
                pt_index++;
            }
        }
    
    
        CvRect rect = {0, 0, img_width, img_height};
        Subdiv2D sub_div;
        sub_div.initDelaunay(rect);
    
        for(int i = 0; i < pts_vec.size(); i++) {
            int pt_id = sub_div.insert(pts_vec[i]);
            pt_index = pts_index_vec[i];
            pt_id2pt_index.insert(pair<int, int>(pt_id, pt_index));
        }
    
    
        Point2f target = {50, 50};
    
        auto vertex_ptr = sub_div.findNearest(target);
        auto nearest_point_cord = sub_div.getVertex(vertex_ptr);
    
        cout << nearest_point_cord.x << endl;
        cout << nearest_point_cord.y << endl;
        cout << pt_id2pt_index[vertex_ptr] << endl;
    
    
    
    
        if(true){
            Mat render = src_img.clone();
            for (auto& i: pts_vec) {
                circle(render, i, 2, Scalar(255, 255, 255), -1, CV_AA);
            }
            circle(render, target, 2, Scalar(0, 0, 255), -1, CV_AA);
            circle(render, nearest_point_cord, 5, Scalar(0, 255, 0), -1, CV_AA);
            show_a_image_mat(render);
        }
    
    
        return 0;
    }
    
    
    
    
  • 相关阅读:
    交换机的配置文件和系统映像文件备份与恢复(如果不小心损坏了,可以用这种方法恢复)
    交换机端口安全配置
    路由器密码重置(不是适用于所有有些启动顺序数字不一样)
    交换机的默认网关(跨网段telnet)
    思科交换机的初始配置(使用telnet登录)
    Linux命令集(第一部分共40个)
    Linux6.9安装
    javamail邮件发送报错解决方案
    isEmpty()与equals()、==“”区别
    eclipse svn 修改了类名之后提交
  • 原文地址:https://www.cnblogs.com/theodoric008/p/9493543.html
Copyright © 2020-2023  润新知