尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

图像变换中的点变换小结

图像变换中的点变换小结
📅 发布时间:2026/7/17 18:16:01
#include <opencv2/opencv.hpp> #include <iostream> // 20251105 透视变换逆变换 // 输入:透视变换后图片上一点 + 透视变换矩阵 // 输出:透视变换前图片上对应点 int perspInv(cv::Point2f centerPt, cv::Mat M, cv::Point2f& centerPt2) { cv::Mat srcT = cv::Mat::zeros(cv::Size(1, 1), CV_32FC2); srcT.at<cv::Vec2f>(0, 0)[0] = centerPt.x; srcT.at<cv::Vec2f>(0, 0)[1] = centerPt.y; cv::Mat M_inv; cv::invert(M, M_inv); cv::Mat srcT_inv; cv::perspectiveTransform(srcT, srcT_inv, M_inv); centerPt2.x = srcT_inv.at<cv::Vec3f>(0, 0)[0]; centerPt2.y = srcT_inv.at<cv::Vec3f>(0, 0)[1]; return 0; } void perspInv2(const cv::Point2f& centerPt, const cv::Mat& M, cv::Point2f& centerPt2) { cv::Mat M_inv; cv::invert(M, M_inv); std::vector<cv::Point2f> srcF{centerPt}, srcT; cv::perspectiveTransform(srcF, srcT, M_inv); centerPt2 = srcT[0]; } // 20251105 去畸变逆变换 // 输入:去畸变后图片上一点 + 相机参数 // 输出:去畸变前图片上对应点 int undistInv(cv::Point2f centerPt2, cv::Mat cameraMat, cv::Mat distCoeffs, cv::Point2f& centerPt3) { double cx = cameraMat.at<double>(0, 2); double cy = cameraMat.at<double>(1, 2); double fx = cameraMat.at<double>(0, 0); double fy = cameraMat.at<double>(1, 1); double k1 = distCoeffs.at<double>(0, 0); double k2 = distCoeffs.at<double>(0, 1); double k3 = distCoeffs.at<double>(0, 4); double p1 = distCoeffs.at<double>(0, 2); double p2 = distCoeffs.at<double>(0, 3); double xx = static_cast<double>(centerPt2.x); double yy = static_cast<double>(centerPt2.y); xx = (xx - cx) / fx; yy = (yy - cy) / fy; double rr = xx * xx + yy * yy; double xxx = xx * (1 + k1 * rr + k2 * rr * rr + k3 * rr * rr * rr) + 2 * p1 * xx * yy + p2 * (rr + 2 * xx * xx); double yyy = yy * (1 + k1 * rr + k2 * rr * rr + k3 * rr * rr * rr) + 2 * p2 * xx * yy + p1 * (rr + 2 * yy * yy); centerPt3.x = static_cast<double>(fx * xxx + cx); centerPt3.y = static_cast<double>(fy * yyy + cy); return 0; } // 20251106 透视变换逆变换+去畸变逆变换 // 输入:透视变换后图片上一点 + 透视变换矩阵 + 相机参数 // 输出:去畸变前图片上对应点 int perspInvAndUndistInv(cv::Point2f centerPt, cv::Mat cameraMat, cv::Mat distCoeffs, cv::Mat M, cv::Point2f& centerPt3) { cv::Mat srcT = cv::Mat::zeros(cv::Size(1, 1), CV_32FC2); srcT.at<cv::Vec2f>(0, 0)[0] = centerPt.x; srcT.at<cv::Vec2f>(0, 0)[1] = centerPt.y; cv::Mat M_inv; cv::invert(M, M_inv); cv::Mat srcT_inv; cv::perspectiveTransform(srcT, srcT_inv, M_inv); cv::Point2f centerPt2; centerPt2.x = srcT_inv.at<cv::Vec3f>(0, 0)[0]; centerPt2.y = srcT_inv.at<cv::Vec3f>(0, 0)[1]; double cx = cameraMat.at<double>(0, 2); double cy = cameraMat.at<double>(1, 2); double fx = cameraMat.at<double>(0, 0); double fy = cameraMat.at<double>(1, 1); double k1 = distCoeffs.at<double>(0, 0); double k2 = distCoeffs.at<double>(0, 1); double k3 = distCoeffs.at<double>(0, 4); double p1 = distCoeffs.at<double>(0, 2); double p2 = distCoeffs.at<double>(0, 3); double xx = static_cast<double>(centerPt2.x); double yy = static_cast<double>(centerPt2.y); xx = (xx - cx) / fx; yy = (yy - cy) / fy; double rr = xx * xx + yy * yy; double xxx = xx * (1 + k1 * rr + k2 * rr * rr + k3 * rr * rr * rr) + 2 * p1 * xx * yy + p2 * (rr + 2 * xx * xx); double yyy = yy * (1 + k1 * rr + k2 * rr * rr + k3 * rr * rr * rr) + 2 * p2 * xx * yy + p1 * (rr + 2 * yy * yy); centerPt3.x = static_cast<double>(fx * xxx + cx); centerPt3.y = static_cast<double>(fy * yyy + cy); return 0; } // 20251105 去畸变+透视变换 // 输入:去畸变前图片上一点 + 相机参数 // 输出:去畸变+透视变换后图片上对应点 int undistAndPersp(cv::Point2f centerPt3, cv::Mat cameraMat, cv::Mat distCoeffs, cv::Mat M, cv::Point2f& centerPt) { std::vector<cv::Point2f> fromPts; fromPts.push_back(centerPt3); std::vector<cv::Point2f> toPts; cv::undistortPoints(fromPts, toPts, cameraMat, distCoeffs, cv::Mat(), cameraMat); cv::Mat srcF = cv::Mat::zeros(cv::Size(1, 1), CV_32FC2); srcF.at<cv::Vec3f>(0, 0)[0] = toPts[0].x; srcF.at<cv::Vec3f>(0, 0)[1] = toPts[0].y; cv::Mat srcT; cv::perspectiveTransform(srcF, srcT, M); centerPt.x = srcT.at<cv::Vec3f>(0, 0)[0]; centerPt.y = srcT.at<cv::Vec3f>(0, 0)[1]; return 0; } // 透视点变换 void persp(const cv::Point2f& srcPt, const cv::Mat& M, cv::Point2f& dstPt) { // 合法性校验,避免perspectiveTransform崩溃 CV_Assert(M.type() == CV_64F && M.size() == cv::Size(3, 3)); std::vector<cv::Point2f> src{srcPt}, dst; cv::perspectiveTransform(src, dst, M); dstPt = dst[0]; } // 透视点变换2 void persp2(const cv::Point2f& srcPt, const cv::Mat& M, cv::Point2f& dstPt) { CV_Assert(M.type() == CV_64F && M.rows == 3 && M.cols == 3); const double* m = M.ptr<double>(); float x = srcPt.x; float y = srcPt.y; // 齐次坐标分母 double w = m[6] * x + m[7] * y + m[8]; if (std::abs(w) < 1e-9) { // 无穷远点,可自定义处理,这里置0 dstPt = cv::Point2f(0, 0); return; } double nx = m[0] * x + m[1] * y + m[2]; double ny = m[3] * x + m[4] * y + m[5]; dstPt.x = static_cast<float>(nx / w); dstPt.y = static_cast<float>(ny / w); } int main() { return 0; }

相关新闻

  • 敏感信息泄露攻防战:Damn Vulnerable Bank实战案例详解
  • 学历提升报名避坑指南:3个正规渠道对比,教你识别90%的虚假套路 - 品牌测评鉴赏家
  • autoDocstring安全最佳实践:保护代码文档的3个重要原则

最新新闻

  • Linux内核模块参数机制:module_param_named详解
  • 揭秘node-qrcode:为什么这是JavaScript开发者必备的二维码生成神器
  • 三相PWM整流器dq轴解耦控制与四象限稳定运行仿真实践
  • 一键修复损坏视频:Untrunc高效恢复MP4/MOV文件的完整指南
  • 2026年产品形态最全的10家收银机厂家盘点:全场景适配成核心竞争力 - 互联网科技品牌测评
  • Windows 10 22H2版本解析与安装优化指南

日新闻

  • 佛山青少年训练营推荐:军博营地实力顶尖 - 秋山寄远
  • 如何快速上手PvZ2 Gardendless:免费Web版植物大战僵尸2完整指南
  • jiuwen-deepsearch核心功能详解:规划-检索-反思三合一智能工作流

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号