有一篇论文介绍了几种展开的方法:

《基于3D全景视觉的智能三维立体摄像设备的设计》

原始全景图像,我从另一篇博客中下载下来的:

展示一下结果:

柱面展开图:

标题

透视展开结果:

一  圆柱展开

cylinderOn

void  cylinderOn(Mat Src)
{int nbottom = 0;int ntop = 0;int nright = 0;int nleft = 0;//根据边界值来获得直径nright = Src.cols;nleft = 0;nbottom = Src.rows;ntop =0;int d = min(nright - nleft, nbottom - ntop);Mat imgRoi;imgRoi = Src(Rect(nleft, ntop, d, d));imshow("ROI", imgRoi);imwrite("ROI.jpg", imgRoi);Mat dst(imgRoi.size(), CV_8UC3, Scalar(255, 255, 255));//建立映射表Mat map_x, map_y;map_x.create(imgRoi.size(), CV_32FC1);map_y.create(imgRoi.size(), CV_32FC1);for (int j = 0; j < d - 1; j++){for (int i = 0; i < d - 1; i++){map_x.at<float>(i, j) = static_cast<float>(d / 2.0 + i / 2.0*cos(1.0*j / d * 2 * CV_PI));//计算映射后的坐标map_y.at<float>(i, j) = static_cast<float>(d / 2.0 + i / 2.0*sin(1.0*j / d * 2 * CV_PI));}}//opencv自带的重映射函数remap(imgRoi, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));//用线性插值//重设大小resize(dst, dst, Size(), 2.0, 1.0);rotateImage(dst);//将图像旋转180度 映射之后是倒着的imshow("柱面投影结果", dst);imwrite("result.jpg", dst);
}

映射完之后旋转180度  rotateImage 

void rotateImage(Mat &dst)//旋转图像
{Point center(dst.cols / 2, dst.rows / 2);double angle = 180;//旋转180度double scale = 1.0;//不缩放Mat rotMat = getRotationMatrix2D(center, angle, scale);//计算旋转矩阵warpAffine(dst, dst, rotMat, dst.size());//生成图像
}

二 透视展开

double GetAngle(int i_ExpandWidth, int i_ExpandHeight,int outR)//获取角度
{double dw_Angle = (double)i_ExpandWidth / (double)outR;return dw_Angle;
}int GetRadius(int i_ExpandWidth, int i_ExpandHeight)
{return i_ExpandHeight;
}CvPoint FindPoint(double dw_Angle, int i_Radius, int innerR, int x_dot, int y_dot, IplImage* src)
{double x, y;i_Radius += innerR;x = i_Radius * cos(dw_Angle) + x_dot;//计算新的坐标 y = i_Radius * sin(dw_Angle) + y_dot;if (x < 0)x = 0;//判断是否超过边界 超过左边设置为0  超过右边 设置为右边坐标if (x >= src->width)x = src->width - 1;if (y < 0)y = 0;if (y >= src->height)y = src->width - 1;CvPoint pt = { (int)x,(int)y };//将点转化为整数坐标return pt;
}void perspectOn(IplImage* src)
{int x_dot = 314;int y_dot = 295;int innerR = 50;int outR = 310;int Width = int(2 * PI * outR);   //展开图像的宽int Height = outR - innerR; //展开图像的高cout << "展开图像宽:" << Width << " 高:" << Height << endl;int i, j;double dw_Angle;int i_Radius;CvPoint pt;IplImage*dst;dst = cvCreateImage(cvSize(Width, Height), 8, 3);dst->origin = 0;cvZero(dst);uchar *dstData = (uchar*)dst->imageData;int step = dst->widthStep / sizeof(uchar);uchar *data1 = (uchar*)src->imageData;int step1 = src->widthStep / sizeof(uchar);int channels = src->nChannels;for (i = 0; i < Width-1; i++){for (j = 0; j < Height-1; j++){dw_Angle = GetAngle(i, j, outR);i_Radius = GetRadius(i, j);//获取半径pt = FindPoint(dw_Angle, i_Radius, innerR, x_dot, y_dot,src);//找转换后的坐标dstData[j*step + i * 3 + 0] = data1[pt.y*step1+pt.x*3+0];//重新赋值dstData[j*step + i * 3 + 1] = data1[pt.y*step1 + pt.x *3+ 1];dstData[j*step + i * 3 + 2] = data1[pt.y*step1 + pt.x *3+ 2];}}cvShowImage("透视", dst);cvSaveImage("dst.jpg", dst);
}

main函数调用

int main()
{Mat Src = imread("img.png");IplImage* src;src = cvLoadImage("img.png");cylinderOn(Src);perspectOn(src);waitKey();return 0;
}

Opencv实现全景图像展开之柱面展开和透视展开法相关推荐

  1. 360度全景图像展开MATLAB程序

    本程序主要是将360度全景相机拍摄的图片展开为一般图像.MATLAB代码及实验结果如下 function Expand2() Src=imread('100.jpg'); Src=im2double( ...

  2. php拼接全景图,Opencv使用Stitcher类图像拼接生成全景图像

    Opencv中自带的Stitcher类可以实现全景图像,效果不错.下边的例子是Opencv Samples中的stitching.cpp的简化,源文件可以在这个路径里找到: \opencv\sourc ...

  3. Opencv Surf特征实现图像无缝拼接生成全景图像(三)

    转自:https://guo-pu.blog.csdn.net/article/details/90657830 图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解 ...

  4. Opencv 使用Stitcher类图像拼接生成全景图像

    Opencv中自带的Stitcher类可以实现全景图像,效果不错.下边的例子是Opencv Samples中的stitching.cpp的简化,源文件可以在这个路径里找到: \opencv\sourc ...

  5. 基于全景图像与激光点云配准的彩色点云生成算法(2014年文章)

    标题:The algorithm to generate color point-cloud with the registration between panoramic imageand lase ...

  6. OpenCV优化:图像的遍历4种方式

    小知识:反色 反色原理很简单,在一个rgb色彩空间中,可将任何一种颜色看成笛卡尔坐标中的一个点,对于任意点,反色就是计算以(128, 128,128)为中心时该点的对称点,比如rgb(100, 150 ...

  7. 用CNN实现全景图像语义分割!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:张强,Datawhale成员 相信许多读者体验过b站上的全景视频, ...

  8. 【深度学习】用CNN实现全景图像语义分割!

    作者:张强,Datawhale成员 相信许多读者体验过b站上的全景视频,如果还没有,快来体验一下吧[1]!只需鼠标点击并移动,便可360度无死角的浏览全景视频,让人如同身临其境.全景图像,又称360° ...

  9. opencv 图像拼接和图像融合技术

    图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要. 再举一个身边的例子吧,你用你的手 ...

最新文章

  1. ecside使用笔记(1)
  2. halcon get_image_pointer1获取图像指针
  3. Linux命令:grep命令详解
  4. apache php显示成列表,centos中设置apache显示目录列表
  5. Linux centosVMware df命令、du命令、磁盘分区
  6. 每日一测1(带命令行参数运行)
  7. php微信公众号登录
  8. 浏览器兼容性问题与解决方案
  9. [转载]什么是打新股? 打新股需要多少成本?打新股存在风险吗?
  10. 钉钉生成jspapi token出现IP地址不在白名单的解决办法
  11. 大数据技术之Spark(一)Spark Core
  12. win10輸入法去掉语言栏?win10輸入法切换简体繁体?
  13. C++对齐输出(左对齐和右对齐)
  14. 作业帮发布新品学习机,首创“AI老师一对一”模式
  15. 微信小程序实现大转盘抽奖----踩坑之路
  16. 浅尝辄止_数学建模(笔记_时间序列分析及其SPSS实现)
  17. Python装饰器最经典教程,以最易理解的方式教会你
  18. CCF-CSP Python Cheat Sheet
  19. quartz与数据库相连的更新操作
  20. ESP8266-Arduino编程实例-PWM

热门文章

  1. 必看:刺激战场国际服最全新手教程,你想要的都有,建议收藏
  2. 美国劳动局薪金排行-IT仍是收入最高的行业
  3. 玩转 Spring Boot 应用篇(搭建菜菜的店铺)
  4. angular之入门基础
  5. word文档首次使用的样式设置
  6. 数据库系统原理与应用教程(058)—— MySQL 练习题(二):单选题
  7. 计算机组成原理——屏蔽字设置
  8. JAVA基础知识之InputStreamReader流
  9. InputStreamReader和BufferedReader
  10. 机械师M7精英版鼠标控制驱动安装教程