点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自|CVer

以下是昨日发布的内容。今天把代码整理了一下,放到GitHub。包含注释和空行,C++代码一共70行,欢迎测试及指正!代码链接:

https://github.com/ShiqiYu/mars-fisheye-correct 


2021年5月19日18点多,中国火星探测器拍摄的第一张图片在互联网上发布。图片是火星车的前避障相机拍摄,为了追求广角,所以拍到的照片有鱼眼变形。火星地面成了曲面,而非平面,如下图。

作为一名计算机视觉的从业人员,我觉得应该用自己的知识做点什么。晚上陪孩子游泳回家就9点多了,马上动手!

为了表达敬意,不能用现成的程序来做这个事,我选择了C++和OpenCV库,纯手工制作,逐个像素计算和搬运!大约花了30分钟,矫正结果出来了,如下图。可以看到火星地平面变平了!

鱼眼矫正的原理图需要理解摄像机的小孔成像模型,以及了解一点立体几何知识,高中数学足够。成像原理示意图如下,然后再动手写个程序就可以了。

上图来自论文:Chan, Sixian & Zhou, Xiaolong & Huang, Chengbin & Chen, Shengyong & Li, Youfu. (2016). An improved method for fisheye camera calibration and distortion correction. 579-584. 10.1109/ICARM.2016.7606985.

为了更让大家更容易地理解鱼眼镜头成像,我手绘了如下示意图,时间仓促有点简陋,望谅解。

70行C++代码如下:

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
// map the fisheye image position to the rectilinear image position
// input:  src_x, src_y, center_x, center_y, R,
// output: dst_x, dst_y
int rectxy2fisheyexy(double src_x, double src_y, double *dst_x, double *dst_y,double center_x, double center_y,int image_width,double R)
{double phi;double theta;double D = sqrt( R * R - image_width*image_width/4);src_x -= center_x;src_y -= center_y;phi = atan( sqrt( double(src_x*src_x+src_y*src_y))/ D );theta = atan2(src_y, src_x);*dst_x = R * sin(phi) * cos(theta) + center_x;*dst_y = R * sin(phi) * sin(theta) + center_y;return 0;
}
int main(int argc, char ** argv)
{if(argc != 2){cout << "Usage: " << argv[0] << " filename.jpg" << endl;return -1;}// read a fisheye imageMat input = imread(argv[1]);if(input.empty()){cerr << "Cannot read input image file " << argv[1] << endl;return -1;}double fisheye_radius = 1500; //you can adjust the parameter in range [1500, +INF]int input_width = input.cols;int input_height = input.rows;// the output image is 1.25x largeint output_width = cvRound(input_width*1.25);int output_height = cvRound(input_height*1.25);Mat output(output_height, output_width, input.type(), Scalar(0,0,0));// copy each pixel from the fisheye image// the current implementation is using NN// bilinear interpolation can make the result more smoothfor ( int r = 0; r < output.rows; r++)for ( int c = 0; c < output.cols; c++){double src_r = 0;double src_c = 0;rectxy2fisheyexy(c-(output_width-input_width)/2 , r-(output_height-input_width)/2, &src_c, &src_r,input_width/2.0, input_height/2.0,input_width, fisheye_radius);// copy the current pixel if it's in the rangeif ( src_r > 0 && src_r < input_height-1 && src_c > 0 && src_c < input_width-1)//using pointer nor at() functioin can gain better performanceoutput.at<Vec3b>(r, c) = input.at<Vec3b>( cvRound(src_r), cvRound(src_c));}// save the result and show it in a windowimwrite("result.jpg", output);imshow("result", output);waitKey(0);return 0;
}

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

我为中国第一张火星照片做鱼眼矫正相关推荐

  1. 人类群星闪耀时!!!——人类史上第一张黑洞照片全面解析

    本篇文章谢绝转载\Large\fbox{\textcolor{red}{本篇文章谢绝转载}}本篇文章谢绝转载​ 3个多月前人类史上第一张黑洞照片正式出炉,虽然这个时候蹭热度有点晚,但我还是要把它写完 ...

  2. (资讯)历史——4 月 10 日:Github 诞生;人类第一张黑洞照片;计算机延误航天飞机

    透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 4 月 10 日,在 2007 年的今天,九城出资 2700 万美元闪电收购雅蜂网,当时雅蜂网上线时间还不到一年.九城 ...

  3. python黑洞_史上第一张黑洞照片是用Python合成的?

    这两天,史上第一张黑洞照片,在朋友圈和各大公众号疯传,希望你没有收到视觉中国的律师函. 好了,言归正传. 这个照片是怎么「拍到」的呢? 其中一位研究人员(一个妹子,MIT 的博士,就是头图这位)就在  ...

  4. 史上第一张黑洞照片是用Python合成的?

    作者 | 不正经IO 来源 | 不正经程序员(ID:VeroniqueVeronique) 这两天,史上第一张黑洞照片,在朋友圈和各大公众号疯传,希望你没有收到视觉中国的律师函. 好了,言归正传. 这 ...

  5. 【历史上的今天】4 月 10 日:Github 诞生;人类第一张黑洞照片;计算机延误航天飞机

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 4 月 10 日,在 2007 年的今天,九城出资 2700 万美元闪电收购雅蜂网,当时雅蜂网上线时 ...

  6. 人类第一张黑洞照片背后的功臣,竟然是她!

    北京时间4月10日晚 人类首张黑洞照片公布 这个让人类魂牵梦萦了一百年的"神秘黑洞" 瞬间成了议论最热的话题 黑洞图像揭示了室女座星系团中超大质量星系 Messier 87中心的黑 ...

  7. 美国29岁女科学家凯蒂·博曼,基于图像算法拼接人类第一张黑洞照片!!

    北京时间4月10日21点,人类历史上首张黑洞照片揭晓.事件视界望远镜(EHT)对于室女座星系团中超大质量星系Messier 87中心黑洞的观测,终于出现在世人面前. 照片的核心区域是一个阴影,周围环绕 ...

  8. 人类史上第一张黑洞照片更清晰了

    本文转载自IT之家,IT之家3月25日消息 据中国科学院官方发布,北京时间 2021 年 3 月 24 日晚 10 点,曾成功捕获人类有史以来首张黑洞照片的事件视界望远镜(EHT)合作组织,又为揭秘 ...

  9. 模拟黑洞图像_人类史上第一张黑洞照片即将问世,但其实早在40年前就有人画出了它的样子...

    一百年前,爱因斯坦提出了相对论,改变了人类对物理世界的认识,带领我们审视了整个宇宙. 相对论是一个非常复杂的理论,以至于很多理论直到现在还没有被证实. 在相对论中,爱因斯坦"预言" ...

最新文章

  1. c语言fd变量,有哪位大神会用FD程序包计算功能多样性呀,在线等......
  2. android 监听网络状态
  3. MySQL-TCL语言
  4. NiFi 脚本执行器使用指南 (part 3)
  5. readkeyboard方法_Linux笔记(12)| 几种并发式IO的实现方法
  6. jvm(8)-虚拟机字节码执行引擎
  7. chameleon 算法_为了简单起见,Arquillian Chameleon
  8. 二元矩阵峰值搜索_好斗的牛(二元搜索)
  9. maven实现多模块热部署
  10. 5.5 用户定义的可调用类型
  11. VMware Fusion下Centos联网
  12. 《圆明园的毁灭》教学设计方案
  13. Windows自带集成工具对ISO镜像是否源于官方网站的验证
  14. 【研一周小结】第八-九周个人学习总结
  15. 【博客5】缤果LabView串口调试助手V2.0 (高级篇)
  16. c语言编辑图形时钟软件,C++实现图形界面时钟表盘代码
  17. Python 抽扑克牌游戏
  18. ChemDraw如何画聚合物,看完就知道了!
  19. HTTP3 (QUIC) 协议
  20. OOAD教学管理系统 设计类图

热门文章

  1. 投稿近2000,NAACL 2019接收率仅为22.6%|附录取论文名单
  2. 爱奇艺火爆的背后,个性化推荐排序是如何配合的?
  3. Kirito 的博客崩了,这次是因为...
  4. 如何轻松搞定 CRUD 的创建人、修改人、时间等字段的赋值
  5. 为什么不建议使用 Java 自带的序列化?
  6. 推荐一款基于 SpringBoot 的接口快速开发框架
  7. where 1=1 是什么鬼?
  8. 分布式系统互斥性与幂等性问题的分析与解决
  9. AI工程师成长记 - 工作方法!
  10. Coggle加速计划:解决数据下载烦恼!