C++ OpenCV进行透视变换后再把坐标映射回原图

47 篇文章 2 订阅
29 篇文章 2 订阅
//test.cpp
//g++ test.cpp -std=c++11 `pkg-config --cflags --libs opencv`  -ldl  -Wl,-rpath,. -o test
#include <opencv2/opencv.hpp>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include <iostream>
#include <cassert>
using namespace std;
using namespace cv;

cv::Mat PerspectiveTrans(std::vector<cv::Point2f> scrPts, std::vector<cv::Point2f> dstPts)
{
    assert(scrPts.size() == dstPts.size()); 
    int len = scrPts.size();
    std::vector<cv::Point2f> scrPoints(len);
    std::vector<cv::Point2f> dstPoints(len);
    for(int i = 0; i < len; i++)
    {
        scrPoints[i] = scrPts[i];
        dstPoints[i] = dstPts[i];
    }
    //cv::Mat dst;
    cv::Mat Trans = cv::getPerspectiveTransform(scrPoints, dstPoints);
    
    //cv::warpPerspective(src, dst, Trans, Size(src.cols, src.rows), INTER_LINEAR, BORDER_CONSTANT);
    return Trans;
}
int main(int argc, char *argv[])
{
    std::vector<cv::Point2f> src_coners(4);
    std::vector<cv::Point2f> warp_coners(4);
    std::vector<cv::Point2f> origin(4);
    src_coners[0] = cv::Point2f(287, 769);
    src_coners[1] = cv::Point2f(536, 812);
    src_coners[2] = cv::Point2f(109, 790);
    src_coners[3] = cv::Point2f(254, 924);
    warp_coners[0] = cv::Point2f(300, 300);
    warp_coners[1] = cv::Point2f(600, 300);
    warp_coners[2] = cv::Point2f(300, 600);
    warp_coners[3] = cv::Point2f(600, 600);
    std::vector<cv::Point3f> dst_coners(4);
    cv::convertPointsHomogeneous(src_coners, dst_coners);
    std::cout << "dst_coners is: " << dst_coners << std::endl; //64FC1

    cv::Mat ho_mat = cv::Mat(dst_coners.size(), 3, CV_32FC1, dst_coners.data());
    cv::Mat warp_mat = PerspectiveTrans(src_coners, warp_coners);
    warp_mat.convertTo(warp_mat, CV_32FC1);
    cv::Mat warp_inv = warp_mat.inv();
    transpose(ho_mat, ho_mat);
    cv::Mat res = warp_mat * ho_mat;
    cv::Mat final_res = warp_inv * res;
    transpose(final_res, final_res);
    std::vector<cv::Point3f> pts(4);
    final_res.reshape(3, pts.size()).copyTo(pts);
    for (auto &pt : pts)
    {
        std::cout << "pt.x is: " << pt.x << std::endl;
        std::cout << "pt.y is: " << pt.y << std::endl;
        std::cout << "pt.z is: " << pt.z << std::endl;
    }
    cv::convertPointsFromHomogeneous(pts, origin);
    
    for (auto &pt : origin)
    {
        std::cout << "pt.x is: " << pt.x << std::endl;
        std::cout << "pt.y is: " << pt.y << std::endl;
    }
    return 0;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值