网站设计自学seo的特点是什么
news/
2025/9/27 4:14:08/
文章来源:
网站设计自学,seo的特点是什么,做电商网站都需要学什么软件,网站下载链接打不开一、前言
最近想实现AVM拼接#xff0c;看了不少博客和论文#xff0c;不过比较愚钝#xff0c;一直没能很好理解原理#xff0c;尤其是怎么在实现时把下文式1与式2中Z1和Z2消除的#xff0c;所以严谨的推导了一下对应的公式#xff0c;如有不对#xff0c;水平有限看了不少博客和论文不过比较愚钝一直没能很好理解原理尤其是怎么在实现时把下文式1与式2中Z1和Z2消除的所以严谨的推导了一下对应的公式如有不对水平有限烦请指出~
IPM变换逆透视变换顾名思义即将正常透视效应消除的变换变换结果为鸟瞰图BEV俯视图AVM环视拼接一般是将车身前后左右的四个鱼眼相机拼接成环视图也是俯视其使用的单应矩阵将四个相机转到同一个俯视坐标系。
投影变换的通俗理解就是假设同一个相机分别在A、B两个不同位置以不同的位姿拍摄同一个平面重点是拍摄平面例如桌面、墙面、地平面生成了两张图象这两张图象之间的关系就叫做投影变换。
二、公式推导
公式太难打了全用word存了在这直接截图 这也就解释了为什么有的AVM算法是需要标定相机的内外参而有的只提供单应矩阵H。 三、示例代码
#include Eigen/Core
#include Eigen/Dense
#include iostream
#include opencv2/core/core.hpp
#include opencv2/core/eigen.hpp
#include opencv2/opencv.hpp
#include vectorvoid DistortEigenPoints(const Eigen::Vector3d undis_pt, Eigen::Vector3d dis_pt, double k1, double k2, double p1,double p2) {double x2 undis_pt[0] * undis_pt[0];double y2 undis_pt[1] * undis_pt[1];double r2 x2 y2;if (r2 0) return;double r4 r2 * r2;double r6 r2 * r4;double xy undis_pt[0] * undis_pt[1];dis_pt[0] undis_pt[0] * (1 k1 * r2 k2 * r4) 2 * p1 * xy p2 * (r2 2 * x2);dis_pt[1] undis_pt[1] * (1 k1 * r2 k2 * r4) p1 * (r2 2 * y2) 2 * p2 * xy;return;
}float interp(const cv::Mat img, float x, float y) {int ix x;int iy y;float dx x - ix;float dy y - iy;float ddx 1.0f - dx;float ddy 1.0f - dy;return ddx * ddy * img.data[iy * img.cols ix] ddx * dy * img.data[(iy 1) * img.cols ix] dx * ddy * img.data[iy * img.cols ix 1] dx * dy * img.data[(iy 1) * img.cols ix 1];
}int main() {std::string img_path Mynt/00001772.jpg;Eigen::Matrix3d K_c;K_c 1037.536376953125, 0, 600.182861328125, 0, 1038.532958984375, 358.40493774414062500, 0, 0, 1;double k1 0.03784750;double k2 -0.051872;double p1 -0.000938;double p2 0.000157;Eigen::Matrix3d R_gc;R_gc 0.9962626012012678, -0.08634899803974432, -0.00216332734845117, -0.005878375212093168, -0.04279258802138065,-0.9990666840182884, 0.08617583276389137, 0.9953454902434454, -0.0431402468639808;Eigen::Vector3d t_gc;t_gc 0.283289952815021, 1.136073800639606, -2.129837994618606;// 鸟瞰图设置为长宽20m分辨率0.2mdouble W_m 20;double H_m 20;double dx 0.02;double dy 0.02;Eigen::Matrix3d K_g;K_g 1.0 / dx, 0, W_m / (2 * dx), 0, -1.0 / dy, H_m / (2 * dy), 0, 0, 1;Eigen::Matrix3d J_gc;J_gc.block3, 2(0, 0) R_gc.block3, 2(0, 0);J_gc.block3, 1(0, 2) t_gc;//一定要带上图像类型比如IMREAD_GRAYSCALE默认的是IMREAD_COLORcv::Mat img cv::imread(img_path, cv::IMREAD_GRAYSCALE);//一、未去畸变鸟瞰图Eigen::Matrix3d H K_c * J_gc * K_g.inverse();cv::Mat trans_mat;cv::eigen2cv(H, trans_mat);cv::Mat bev_img(H_m / dy, W_m / dx, CV_8UC1);// warpPerspective是透视变换所有trans_mat需要取逆cv::warpPerspective(img, bev_img, trans_mat.inv(), bev_img.size());//二、去畸变鸟瞰图Eigen::Matrix3d H_gc J_gc * K_g.inverse();cv::Mat bev_img2(H_m / dy, W_m / dx, CV_8UC1);for (int row 0; row bev_img2.rows; row) {for (int col 0; col bev_img2.cols; col) {Eigen::Vector3d p_g(col, row, 1);Eigen::Vector3d P_c H_gc * p_g;// 去掉在相机后面的点if (P_c[2] 0) continue;P_c / P_c[2];Eigen::Vector3d P_c_dis;DistortEigenPoints(P_c, P_c_dis, k1, k2, p1, p2);Eigen::Vector3d p_c K_c * P_c_dis;// 在原图范围内的才能映射if (p_c[0] 0 p_c[1] 0 p_c[0] img.cols - 1 p_c[1] img.rows - 1) {bev_img2.atuchar(row, col) interp(img, p_c[0], p_c[1]);}}}cv::imshow(img, img);cv::imshow(bev_img, bev_img);cv::imshow(bev_img2, bev_img2);cv::waitKey(0);return 0;
} 效果展示 ps. // 1. 读取图像cv::Mat img cv::imread(img_path, cv::IMREAD_GRAYSCALE);
使用时一定要记得加对应图像类型 ,比如灰度的为cv::IMREAD_GRAYSCALE否则读取的会为三通道的IMREAD_COLOR导致整个转换出问题查了个半死。。。 参考文献
自动驾驶AVM环视算法--3D碗型投影模式的算法原理和代码实现_3d avm算法原理-CSDN博客
Fisheye Calibration Basics- MATLAB Simulink- MathWorks 中国
AVM 环视拼接方法介绍
IPM 鸟瞰图公式转换与推导 - 古月居
https://blog.51cto.com/u_16099267/10196291
逆透视变换详解 及 代码实现二_uvlimitsp-CSDN博客
Online Camera Pose Optimization for the Surround-view System
IPM原理_ipm转换-CSDN博客
https://zhuanlan.zhihu.com/p/636990989
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916797.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!