从网络中找到两种计算焦距的方法
1。两幅图像的单应矩阵H计算焦距f(取自《全景图拼接》opencv代码)

//从两幅图像的单应矩阵H计算焦距f。
void focalsFromHomography(const Mat& H, double &f0, double &f1, bool &f0_ok, bool &f1_ok)
{CV_Assert(H.type() == CV_64F && H.size() == Size(3, 3));const double* h = H.ptr<double>();//h 是一个向量double d1, d2; // 分母double v1, v2; // 焦距平方值候选f1_ok = true;d1 = h[6] * h[7];d2 = (h[7] - h[6]) * (h[7] + h[6]);v1 = -(h[0] * h[1] + h[3] * h[4]) / d1;v2 = (h[0] * h[0] + h[3] * h[3] - h[1] * h[1] - h[4] * h[4]) / d2;if (v1 < v2) std::swap(v1, v2);if (v1 > 0 && v2 > 0) f1 = std::sqrt(std::abs(d1) > std::abs(d2) ? v1 : v2);else if (v1 > 0) f1 = std::sqrt(v1);else f1_ok = false;f0_ok = true;d1 = h[0] * h[3] + h[1] * h[4];d2 = h[0] * h[0] + h[1] * h[1] - h[3] * h[3] - h[4] * h[4];v1 = -h[2] * h[5] / d1;v2 = (h[5] * h[5] - h[2] * h[2]) / d2;if (v1 < v2) std::swap(v1, v2);if (v1 > 0 && v2 > 0) f0 = std::sqrt(std::abs(d1) > std::abs(d2) ? v1 : v2);else if (v1 > 0) f0 = std::sqrt(v1);else f0_ok = false;
}

用下面的测试

 //读入两个图Mat img1 = imread(name1);//Mat img2 = imread(name2);////匹配vector<KeyPoint> kp1,kp2;vector<DMatch> matches;meMatch2(img1, img2,kp1,kp2,matches);//生成匹配点vector<Point2f> points1, points2;get_match_points (kp1, kp2, matches, points1, points2);//4对相对应的像点计算图像的单应 HomographyMat H = findHomography(points1, points2, 0);double f0; double f1; bool f0_ok; bool f1_ok;//从两幅图像的单应矩阵H计算焦距f。focalsFromHomography(H, f0, f1, f0_ok, f1_ok);if (f0_ok)std::cout <<"图1焦距:"<< f0 << '\n';if (f1_ok)std::cout <<"图2焦距:"<< f1 << '\n';

结果:


图1焦距:81.9963
图2焦距:992.465
只有图2计算得很算准确。

-=-=-=-=-=-=-=-=-=-----------------分隔线------------------------=-=-=-=-=-=-=-=-=

2。两图的匹配点计算焦距f(取自一个《极线校正工具包》matlab)

function [f] = compIntrinsic (ml,mr,width,height)
%计算一个焦距
%
%
% ml,mr 是图像中的对应点
%
% width, height 是图像的尺寸(用于取得焦距和图像中心)
% options = optimset('Jacobian','off');a0 = [0 0 0 0 0, 0];
[af,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(@(x) costRectif(x,width,height,ml,mr), a0,...[-pi/2, -pi/2, -pi/2, -pi/2, -pi/2, -1.5], [pi/2, pi/2, pi/2, pi/2, pi/2, 1.5],options);counter = 0;
while af(6)>1 || af(6)<-1counter = counter+1;disp('焦点超出范围;正在重新尝试(随机)...');a0 = [0 0 0 0 0, 2*rand-1.0];[af,resnorm] = lsqnonlin(@(x) costRectif(x,width,height,ml,mr), a0,...[-pi/2, -pi/2, -pi/2, -pi/2, -pi/2, -1.5], [pi/2, pi/2, pi/2, pi/2, pi/2, 1.5],options);if counter > 20warning('找不到范围内的焦点')breakendendf =3^af(6)*(width+height);
% disp(['焦距:f = ' num2str(f)]);

测试

f = compIntrinsic (ml,mr,width,height);%ml,mr 一个2xn矩阵的匹配点对.width,height 是图像的长,宽
disp(['焦距:f = ' num2str(f)]);

结果
焦距:f = 892.7031
基本准确。

从两幅图像的匹配点计算焦距f相关推荐

  1. 如何计算两幅图像的相似度,计算两张图片相似度

    怎么对比两张图片的相似度 1.首先打开微信,选择底部"发现".如图所示.2.然后在点击进入"小程序".如图所示.3.然后输入"腾讯AI体验中心&quo ...

  2. python双重直方图_Python 2.x中两幅图像的直方图匹配?

    我以前写过一个答案here解释如何在图像直方图上进行分段线性插值,以实现高光/中音/阴影的特定比率. 两幅图像之间histogram matching的基本原理相同.基本上,计算源图像和模板图像的累积 ...

  3. 相机计算坐标公式_相机位姿估计3:根据两幅图像的位姿估计结果求某点的世界坐标...

    关键词:相机位姿估计,单目尺寸测量,环境探知 用途:基于相机的环境测量,SLAM,单目尺寸测量 文章类型:原理说明.Demo展示 @Author:VShawn @Date:2016-11-28 @La ...

  4. 计算两幅图像PSNR

    计算两幅图像PSNR 1.原始图像 2.对比图像 3.MATLAB程序代码 4.计算结果 1.原始图像 lenna512.bmp 2.对比图像 lenna512_low_dynamic_range.b ...

  5. 使用OpenCV计算两幅图像的协方差

    要计算协方差首先要知道协方差的数学原理. 定义 Cov(X,Y) = E{ [X-E(X)][Y-E(Y)] }为随机量X与Y的协方差. 其中E(X)为随机变量X的期望(均值),E(Y)为随机变量Y的 ...

  6. 计算两幅图像的PSNR和SSIM以及python代码实现

    欢迎关注博主的公众号:happyGirl的异想世界.有更多干货还有技术讨论群哦~ psnr是"Peak Signal to Noise Ratio"的缩写,即峰值信噪比,是一种评价 ...

  7. 立体图像——NCC匹配方法计算视差图

    文章目录 一.什么是立体图像 二.以窗口代价计算视差的原理 三.归一化互相关(NCC)算法匹配原理 四.实验 1.实验要求 2.实验代码 3.实验结果 五.实验小结 一.什么是立体图像 一个多视图成像 ...

  8. OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))

    Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机.扫描仪.CT或者磁共振成像.无论哪种方法,我们(人类)看到的是图像,而让数字设备来"看"的时候,则 ...

  9. ITK:两幅图像之差的绝对值

    ITK:两幅图像之差的绝对值 内容提要 C++实现代码 内容提要 计算两个图像中相应像素之差的绝对值. C++实现代码 #include "itkImage.h" #include ...

最新文章

  1. IJCAI 2019 《GraspSnooker: Automatic Chinese Commentary Generation for Snooker Videos》论文笔记
  2. php 浏览器 兼容,兼容ie6浏览器的php下载文件代码分享
  3. android 加载外部矢量图SVG
  4. hive建表报错JsonSerDe
  5. Material Design 控件知识梳理(4) FloatingActionButton
  6. 网络故障一例:网络不能用,ping出错
  7. jmeter 计数器的使用
  8. 如何把pdf分割成多个?怎么把pdf文件分成多个?
  9. 基于工程量的智能动态计划管控
  10. python检测按键按下_如何检测按键是否被按下?
  11. 膜态沸腾UDF【转载】
  12. 微信视频压缩画质怎么办?微信发视频怎么不压缩画质
  13. __init__() takes 1 positional argument but 5 positional arguments (and 1 keyword-only argument) were
  14. lumen php命令,laravel/lumen —— Artisan Console 命令行
  15. 图的拓扑排序(AOV网络)
  16. 铅华洗尽的Windows XP
  17. uniapp使用百度语音识别语音转文字
  18. 如何绕过wegame下载英雄联盟
  19. 基于FPGA的DDS研究与设计
  20. 最小割树:证明与例题

热门文章

  1. 设计一个Dog类,包含名字,年龄,颜色三个属性
  2. 深造分布式 打败面试官 招式一 小试牛刀
  3. 安卓怎么转移到iphone_如何将联系人从iPhone转移到另一部电话
  4. 视频教程-微信公众平台开发入门-微信开发
  5. android 简单拍照,android实现简单拍照功能
  6. H5实现调用本地摄像头实现实时视频以及拍照功能
  7. doodoo.js发布1.1.0 -- 中文最佳实践Node.js Web快速开发框架,支持Koa.js, Express.js中间件。包含多项功能改进,及Bug修复。...
  8. 王者荣耀服务器维护到什么时候7月9号,王者荣耀7月9号更新产生的新变化
  9. 教授专栏17 | 许佳龙:银行查找网安漏洞 提高公众风险意识
  10. 地下城与勇士(DNF)格兰之森副本(幽暗密林、幽暗密林深处、雷鸣废墟、猛毒雷鸣废墟、冰霜幽暗密林、格拉卡、烈焰格拉卡、暗黑雷鸣废墟)(童年的回忆)