作者: 青云,qq307942727

根据几何光学,理想透镜的程序模型如下图所示。物点P所成的像点P2可以用两条光线来求得。其中一条经物方焦点F到透镜P1点,然后光线平行于光轴方向沿着像空间转播。另一条经过透镜中心传播。这两条光线的焦点相交于P2点。如图1所示。

图1 理想透镜几何光学成像模型

事实上,P1与P2具有相同的2维坐标,唯一不同的是沿着光轴方向的坐标不同。因此,可以把成像面平移到透镜上,即连接物点与物方焦点的射线与透镜相交的点即为像点。于是成像模型可以简化成图2.

图2 简化的成像模型

图2中,P1与P分布在光轴的两侧,用数学表达时,物点坐标P与像点坐标P1符号相反。且成的像是反像。为了更清晰地分析,对图2模型进一步简化,让成像面绕物方焦点F旋转180度,得到图3右边的虚拟成像面。需要特别注意的是,图3右图中的O不是透镜的光心,而是投影的物方焦点F!即图3左图中的F。

图3 进一步简化的成像模型

有了图3的简化模型,就可以讨论相机拍摄全景图时如何旋转了。相机旋转是绕在O点(相机的镜头的物方焦点!)旋转的,否则远近不同的物体会出现不能同时对准的现象。下图中,左边的不是绕在物方焦点旋转拍摄的全景图(部分),右边是绕在物方焦点拍摄的全景图(部分)。左图中“这”字处出现的断裂,而右图中过度平缓。手机有拍摄全景图的功能,这就告诉摄影者,拍全景时不要让手机绕着人转,而是绕着物方焦点转!如果找不到物方焦点,绕着镜头转也是可以的,因为镜头离物方焦点很近。在拍摄近景全景图时,这尤为重要。

    

图4 不绕物方焦点与绕物方焦点旋转拍摄的全景图(部分)的差异

柱面投影示意图如下所示。原图上的X坐标将投影到X'。根据几何关系,可以推得原图上(x,y)坐标投影到(x‘,y’)的公式为:

上式中,f为:

上时中,W为图像宽度(像素),为水平视场角。

图5 柱面投影示意图

以下为柱面投影的结果及c++代码。理想情况下,绕物方焦点旋转的两幅有公共区域的图像,经过柱面投影后,两幅图像仅存在水平方向的平移。由于误差的关系,这只是近似成立。但在一般的拼接中,柱面投影后,只矫正水平与竖直方向的偏移就能够拼接得很好了。

     

/
// 功能: 柱面投影
// *
// 输入: imgSrc 原始图像
// fov 原始图像水平视场角
// *
// 输出: imgDst 柱面投影图像

// *

// 说明: 传入的imgDst最好是IplImage类型的空指针

void CProjection:: CylindricalProjection( IplImage * imgSrc, IplImage *& imgDst, double fov )
{
int i,j,k;
const int width = imgSrc->width;
const int widthStep = imgSrc->widthStep;
const int height = imgSrc->height;
const int channels = imgSrc->nChannels;

IplImage * imgTemp = cvCloneImage( imgSrc );

uchar * srcData = (uchar *)imgSrc->imageData;
uchar * tempData = (uchar *)imgTemp->imageData;

cvZero(imgTemp);

f = width / ( 2*tan( fov/2 ) );
double j1,i1,i2,j2;

//计算柱面投影后,两侧无效的宽度
int len = f * atan( ( 0 -width / 2 ) / f ) + width / 2;

for ( i=0; i<height; ++i )
{
for ( j=0; j<width; ++j )
{
i2 = i - height / 2;
j2 = j - width / 2;

//计算第二幅图(i,j)点在第一幅图中的位置(i1,j1)
j1 = ( f * tan( j2 / f )  );
i1 = ( i2 * ( sqrt( f*f + j2*j2 ) / f ) );
j1 += width / 2;
i1 += height / 2;

if ( i1<0 || i1+1>=height || j1<0 || j1+1>=width )
{
continue;
}

for ( k=0; k<channels; ++k )
{
//获取投影点上下左右四个像素的灰度
int gray_left_top, gray_right_top, gray_left_bot, gray_right_bot;
gray_left_top = srcData[ int(i1) * widthStep + int(j1) * channels + k ];
gray_right_top = srcData[ int(i1) * widthStep + int(j1+1) * channels + k ];
gray_left_bot = srcData[ int(i1+1) * widthStep + int(j1) * channels + k ];
gray_right_bot = srcData[ int(i1+1) * widthStep + int(j1+1) * channels + k ];

double dx = j1 - (int)j1;
double dy = i1 - (int)i1;

//最近邻插值
// tempData[ i * widthStep + j * channels + k ]
// = srcData[ int(i1) * widthStep + int(j1) * channels + k ];

//双线性插值
double grayTop = dx*gray_right_top + (1-dx)*gray_left_top;
double grayBot = dx*gray_right_bot + (1-dx)*gray_left_bot;
tempData[ i * widthStep + j * channels + k ]
= int( grayTop * (1-dy) + grayBot * dy );
}
}
}

if ( imgDst != NULL )
{
cvReleaseImage( &imgDst );
imgDst = NULL;
}
imgDst = cvCreateImage( cvSize( width - len * 2, height ), IPL_DEPTH_8U, channels );
cvSetImageROI( imgTemp, cvRect( len, 0, width - 2 * len, height ) );
cvCopyImage( imgTemp, imgDst );

cvResetImageROI( imgTemp );
cvReleaseImage( &imgTemp );
}

360度全景拼接之成像模型与柱面投影相关推荐

  1. 【Unity触控】实现缩放和360度观察模型、单击、双击、滑动

    话不多说,先看实现效果! 想要更牛X一点可以和AR增强现实技术相结合,如下效果 若想实现以上的AR增强现实效果可参考以下文章 (2条消息) EasyAR实战项目图像识别与模型交互(全网首发,保姆级教程 ...

  2. 3d模型 vv5_论SUV的自我修养,WEY VV5凭360度高清全景影像称霸同级!

    凭借零房租.低成本等优势,地摊经济开启了全民的创业狂欢,不少人开始支起摊位,走上了创业之路,从前不屑一顾的摆摊秘笈在网上疯狂流转,众人纷纷效仿.但在漫漫创业路上,除了机遇,也会面临挑战,不是所有的创业 ...

  3. 全景图的种类、360度三维实拍全景

    (转载地址:http://blog.sina.com.cn/s/blog_4b27c38d01019xlv.html 谢谢作者的分享) 根据全景外在表现形式可以分为柱形全景和球形全景两大类.柱形全景是 ...

  4. Php 360度跟随图,一种360度全景图像无缝拼接的方法与流程

    本发明涉及一种图像拼接方法,特别是一种360度全景图像无缝拼接的方法,本发明属于多传感器图像拼接技术领域. 背景技术: 图像拼接是将在同一场景下拍摄的多个图像拼接成具有宽视场的高分辨率图像的技术.图像 ...

  5. 鱼眼相机的成像模型与畸变校正

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨11号线人 来源丨十一号组织 "800万像素","250m测距能力 ...

  6. 360度相机(全景图片)中的卷积(二):SphereNet: Spherical Representations

    360度相机(全景图片)中的卷积(一):Equirectangular Convolutions 360度相机(全景图片)中的卷积(二):SphereNet: Spherical Representa ...

  7. CVPR2021最佳论文:当GAN遇到3D场景,无需监督就学会“动态抠图”、360度展示对象...

    月石一 发自 凹非寺 量子位 报道 | 公众号 QbitAI GAN又又又有新玩法了! 人脸?NO,NO,NO~ 这回,开发者利用「3D+GAN」生成了汽车大片,还是能360度展示.随手换背景那种. ...

  8. 一种用于360度全景视频超分的单帧多帧联合网络

    一种用于360度全景视频超分的单帧多帧联合网络 论文.代码地址:在公众号「3D视觉工坊」,后台回复「全景视频超分」,即可直接下载. 摘要和简介 球形视频,也称360度(全景)视频,它的捕获.存储和传输 ...

  9. Facebook 360度音频编码与渲染

    从360度视频到Oculus,通过Facebook 360音频编码与渲染都可实现身临其境的感受,并且使用的声道更少,小于0.5毫秒的渲染延迟.Facebook技术团队撰文对此进行了解读,LiveVid ...

最新文章

  1. 2007过年休息的日子
  2. 巧用CSS的Border属性
  3. 被字节跳动T4级大佬鄙视了:让你10倍提升认知效率,就这3个方法!
  4. 除了海思麒麟 华为在ARM芯片上还有哪些成就?
  5. Android用摄像头的那点破事
  6. java枚举可以int值不_java – 如何通过int值迭代枚举?
  7. Zookeeper:fsync超时导致实例异常
  8. GroupCoordinator介绍
  9. 在MVC3中使用code first生成数据局库并操作数据库
  10. windows Server 2008各版本区别详解
  11. php对象依赖注入作用,php面向对象依赖注入理解及代码举例分析解释
  12. 游戏中的影子制作技术
  13. 深度学习:文本检测数据集整理
  14. 百度网盘破解版Pandownload开发者被抓
  15. LOL或迈入科技时代?多位主播遭实锤脚本,官方不作为疑似默许!
  16. windows清理缓存性能加速
  17. MAC Sublime Text3 Preferences打不开
  18. 浙江大学软件学院网络自动认证+Padavan路由器挂python脚本
  19. 【BUG】.NET项目|未能加载文件或程序集“xxx”,或它的某一个依赖项。系统找不到指定的文件的通解
  20. 2015北京科技大学869计算机组成原理考试大纲,2014年北京科技大学869计算机组成原理考研真题...

热门文章

  1. 海信智慧黑板Android版本,海信智慧黑板,给老师减负,再也不用“喝”粉笔末了...
  2. 微积分——什么是导数
  3. 数据分析中,到底什么是特征 feature
  4. 对立统一(哲学与分析学)
  5. linux服务器上tcp有大量time_wait状态的解决方法和原因解释
  6. ABAP开发学习总结之一:ABAP入门基本要点
  7. 三大框架分别是Spring+SpringMVC+Mybatis ,这些东西必须融汇贯通
  8. 微信小程序--页面劫持
  9. 北电破产意味着电信业贵族时代的结束
  10. html6能代替原生app,网页转APP工具能否取代原生APP?这个在线制作平台,让移动开发更简单...