【Eigen开源库】linux系统如何安装使用Eigen库

 

code

/*
* File : haedPose.cpp
* Coder: 
* Date : 20181126
* Refer: https://www.learnopencv.com/head-pose-estimation-using-opencv-and-dlib/
*/

#include <opencv2/opencv.hpp>
#include <Eigen/Eigen>
 
using namespace std;
using namespace cv;
 
int main(int argc, char **argv)
{
     
    // Read input image
    cv::Mat im = cv::imread("headPose.jpg");
     
    // 2D image points. If you change the image, you need to change vector
    std::vector<cv::Point2d> image_points;
    image_points.push_back( cv::Point2d(359, 391) );    // Nose tip
    image_points.push_back( cv::Point2d(399, 561) );    // Chin
    image_points.push_back( cv::Point2d(337, 297) );     // Left eye left corner
    image_points.push_back( cv::Point2d(513, 301) );    // Right eye right corner
    image_points.push_back( cv::Point2d(345, 465) );    // Left Mouth corner
    image_points.push_back( cv::Point2d(453, 469) );    // Right mouth corner
     
    // 3D model points.
    std::vector<cv::Point3d> model_points;
    model_points.push_back(cv::Point3d(0.0f, 0.0f, 0.0f));               // Nose tip
    model_points.push_back(cv::Point3d(0.0f, -330.0f, -65.0f));          // Chin
    model_points.push_back(cv::Point3d(-225.0f, 170.0f, -135.0f));       // Left eye left corner
    model_points.push_back(cv::Point3d(225.0f, 170.0f, -135.0f));        // Right eye right corner
    model_points.push_back(cv::Point3d(-150.0f, -150.0f, -125.0f));      // Left Mouth corner
    model_points.push_back(cv::Point3d(150.0f, -150.0f, -125.0f));       // Right mouth corner
     
    // Camera internals
    double focal_length = im.cols; // Approximate focal length.
    Point2d center = cv::Point2d(im.cols/2,im.rows/2);
    cv::Mat camera_matrix = (cv::Mat_<double>(3,3) << focal_length, 0, center.x, 0 , focal_length, center.y, 0, 0, 1);
    cv::Mat dist_coeffs = cv::Mat::zeros(4,1,cv::DataType<double>::type); // Assuming no lens distortion
     
    cout << "Camera Matrix " << endl << camera_matrix << endl ;
    // Output rotation and translation
    cv::Mat rotation_vector; // Rotation in axis-angle form
    cv::Mat translation_vector;
     
    // Solve for pose
    cv::solvePnP(model_points, image_points, camera_matrix, dist_coeffs, rotation_vector, translation_vector);
 
     
    // Project a 3D point (0, 0, 1000.0) onto the image plane.
    // We use this to draw a line sticking out of the nose
     
    vector<Point3d> nose_end_point3D;
    vector<Point2d> nose_end_point2D;
    nose_end_point3D.push_back(Point3d(0,0,1000.0));
     
    projectPoints(nose_end_point3D, rotation_vector, translation_vector, camera_matrix, dist_coeffs, nose_end_point2D);
     
     
    for(int i=0; i < image_points.size(); i++)
    {
        circle(im, image_points[i], 3, Scalar(0,255,255), -1);
    }
     
    cv::line(im,image_points[0], nose_end_point2D[0], cv::Scalar(255,255,0), 2);
     
    cout << "Rotation Vector " << endl << rotation_vector << endl;
    cout << "Translation Vector" << endl << translation_vector << endl;
     
    cout <<  nose_end_point2D << endl;

    //Eigen.
    cv::Mat rMatrix = cv::Mat(3, 3, CV_64F);
    cv::Rodrigues(rotation_vector, rMatrix);
    Eigen::Matrix3d R;
    R << rMatrix.at<double>(0, 0), rMatrix.at<double>(0, 1), rMatrix.at<double>(0, 2),
         rMatrix.at<double>(1, 0), rMatrix.at<double>(1, 1), rMatrix.at<double>(1, 2),
         rMatrix.at<double>(2, 0), rMatrix.at<double>(2, 1), rMatrix.at<double>(2, 2);
    Eigen::Vector3d eular_radian = R.eulerAngles(0, 1, 2);//radian.
    Eigen::Vector3d eular_angle = R.eulerAngles(0, 1, 2)*180.f/M_PI;//angle. 
    // Display image.
    std::stringstream ss;
    ss << eular_angle[0];
    std::string txt = "Pitch: " + ss.str();
    cv::putText(im, txt,  cv::Point(60, 20), 0.5,0.5, cv::Scalar(0,0,255));
    std::stringstream ss1;
    ss1 << eular_angle[1];
    std::string txt1 = "Yaw: " + ss1.str();
    cv::putText(im, txt1, cv::Point(60, 40), 0.5,0.5, cv::Scalar(0,0,255));
    std::stringstream ss2;
    ss2 << eular_angle[2];
    std::string txt2 = "Roll: " + ss2.str();
    cv::putText(im, txt2, cv::Point(60, 60), 0.5,0.5, cv::Scalar(0,0,255));
    cv::imshow("Output", im);
    cv::waitKey(0);
 
}
View Code

 

参考

1. https://blog.csdn.net/ttomchy/article/details/56859841

2. https://blog.csdn.net/qq_31806429/article/details/78844305

3. https://www.learnopencv.com/head-pose-estimation-using-opencv-and-dlib/

 完

转载于:https://www.cnblogs.com/happyamyhope/p/10020056.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值