//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;
}
C++ OpenCV进行透视变换后再把坐标映射回原图
最新推荐文章于 2022-05-16 10:35:38 发布