第一行是提取有效区域后的鱼眼图;第二行就是展开图(第二张和第四张根据需要裁剪了一部分)

#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include <opencv2/core/core.hpp>  using namespace std;
using namespace cv;
#define IMAGE_WIDTH 1000
#define IMAGE_HEIGHT 1000
#define mode 0 //mode=0是不需要重新生成映射yml
#define FOV_240 4.188790//FOV是240°void ExtractFish(vector<cv::Mat>& fishes) {for (int i = 1; i < 5; i++) {cv::Mat input = cv::imread("./input/" + to_string(i) + ".png", 1);cv::Mat mask = cv::imread("./input/Mask" + to_string(i) + ".png", 0);//cv::Mat mask1 = cv::Mat::zeros(mask.size(), mask.type());//for (int j = 0; j < mask1.rows; j++) {// for (int k = 0; k < mask1.cols; k++) {//      if ((float)mask.at<uchar>(j, k) == 0) {//           mask1.at<uchar>(j, k) = (uchar)0.0;//        }//     else {//            mask1.at<uchar>(j, k) = (uchar)255.0;//      }//     //mask1.at<uchar>(j, k) =(uchar)(1.0 - (float)mask.at<uchar>(j, k));// }//}//cv::imwrite("./out/Mask" + to_string(i) + ".png", mask1);cv::Mat out;input.copyTo(out, mask);cv::Mat newbg = cv::Mat::zeros(1000, 1000, CV_8UC3);if (i == 1) {resize(out, out, cv::Size(1000, 1000));cv::Rect rec(0, 0, out.cols, out.rows);out.copyTo(newbg(rec));resize(newbg, newbg, cv::Size(1000, 1000));fishes.emplace_back(newbg);cv::imwrite("./out/out" + to_string(i) + ".png", newbg);}else {resize(out, out, cv::Size(1000, 1000));fishes.emplace_back(out);cv::imwrite("./out/out" + to_string(i) + ".png", out);}}
}void writeMatToFile(cv::Mat& m, int width, int height)
{std::ofstream fout("./out/step_240.yml");if (!fout){std::cout << "File Not Opened" << std::endl;return;}int n = 0;int t = 0;fout << "%YAML:1.0" << std::endl;fout << "    " << "Xd: !!opencv-matrix" << std::endl;fout << "        " << "rows: " << width << std::endl;fout << "        " << "cols: " << height << std::endl;fout << "        " << "dt: f" << std::endl;fout << "        " << "data: [ ";for (int i = 0; i<m.cols - 1; i++){fout << m.at<float>(0, i) << ",";n++;if (n % 10 == 0){fout << std::endl << "            ";}}fout << m.at<float>(0, m.cols - 1) << "]" << std::endl;fout << "    " << "Yd: !!opencv-matrix" << std::endl;fout << "        " << "rows: " << width << std::endl;fout << "        " << "cols: " << height << std::endl;fout << "        " << "dt: f" << std::endl;fout << "        " << "data: [ ";for (int j = 0; j < m.cols - 1; j++){fout << m.at<float>(1, j) << ",";t++;if (t % 10 == 0){fout << std::endl << "            ";}}fout << m.at<float>(1, m.cols - 1) << "]" << std::endl;
}void fish2Eqt(double x_dest, double  y_dest, double* x_src, double* y_src, double Wd)
{double phi1, phi2, theta1, theta2, dc, zcoor, p, _y, _z;double v[3];int theta = 20;double cos0 = 1.0;//俯仰角cosdouble sin0 = 0.0;//俯仰角sintheta1 = FOV_240 * (x_dest / Wd);//-pi to piphi1 = CV_PI * (y_dest / Wd);//0 to pizcoor = sin(phi1);//zv[0] = sin(theta1) * cos(phi1);//xv[1] = cos(phi1) * cos(theta1);//y_y = v[1] * cos0 - zcoor * sin0;_z = v[1] * sin0 + zcoor * cos0;dc = sqrt(_z * _z + v[0] * v[0]);theta2 = atan2(_z, v[0]);phi2 = atan2(dc, _y);p = Wd * phi2 / FOV_240;*x_src = p * cos(theta2);*y_src = p * sin(theta2);
}void fish_2D_map(cv::Mat &map_x, cv::Mat &map_y, int Hs, int Ws)
{double x_d, y_d; // destdouble x_s, y_s; // sourcedouble w2 = (double)Ws / 2.0 - 0.5; double h2 = (double)Hs / 2.0 - 0.5; Point2f temp, ttemp;vector<Point2f> changepoints;Mat fv = Mat::zeros(2, IMAGE_WIDTH*IMAGE_HEIGHT, CV_32F);int t = 0;for (int _y = 0; _y < Hs; _y++){// y-coordinate in dest image relative to centery_d = (double)_y - h2;//y_d代表相对于展开图中心位置的y坐标for (int _x = 0; _x < Ws; _x++){x_d = (double)_x - w2;//x_d代表相对于展开图中心位置的x坐标// Convert fisheye coordinate to cartesian coordinate (equirectangular)fish2Eqt(x_d, y_d, &x_s, &y_s, Ws);//cout << x_d << endl;x_s += w2;y_s += h2;// Create mapmap_x.at<float>(_y, _x) = float(x_s);map_y.at<float>(_y, _x) = float(y_s);//map_x map_y是鱼眼展开图对应原鱼眼图xy位置     fv.at<float>(0, t) = x_s;fv.at<float>(1, t) = y_s;if (t < IMAGE_WIDTH*IMAGE_HEIGHT) {t++;}}}writeMatToFile(fv, IMAGE_WIDTH, IMAGE_HEIGHT);
}vector<cv::Mat> Unwarping(vector<cv::Mat>& fishes) {cv::Rect rect(0, 0, 1000, 1000);cv::Mat mls_map_x, mls_map_y;cv::Mat map_x, map_y;map_x = cv::Mat(IMAGE_HEIGHT, IMAGE_WIDTH, CV_32FC1);map_y = cv::Mat(IMAGE_HEIGHT, IMAGE_WIDTH, CV_32FC1);cv::Mat remapped[4];vector<cv::Mat> vectorremapped;cv::Mat Crop_remapped[4];if (mode == 0) {cv::FileStorage fs("./out/step_240.yml", cv::FileStorage::READ);fs["Xd"] >> mls_map_x;fs["Yd"] >> mls_map_y;fs.release();}for (int i = 0; i < fishes.size(); i++) {//需要重新生成yml时就取消fish_2D_map,注释remap。if (mode == 1) {fish_2D_map(map_x, map_y, IMAGE_HEIGHT, IMAGE_WIDTH);}else{remap(fishes[i], remapped[i], mls_map_x, mls_map_y, INTER_AREA, BORDER_CONSTANT, Scalar(0, 0, 0, 0));imwrite("./out/Unwarp/" + to_string(i) + ".jpg", remapped[i]);}vectorremapped.emplace_back(remapped[i]);}return vectorremapped;
}void main() {vector<cv::Mat> fishes;//根据掩膜抠出图像有效区域并重置大小ExtractFish(fishes);//图像展开vector<cv::Mat> unwarpFish = Unwarping(fishes);
}

鱼眼图像的unwarping过程相关推荐

  1. 一种新型鱼眼图像轮廓提取算法

    from: http://www.scimao.com/read/2307651     摘 要:提取鱼眼图像轮廓是利用鱼眼图像的前提.传统提取鱼眼图像轮廓的扫描线逼近法对噪点抑制能力不强,精度差.本 ...

  2. 鱼眼图像自监督深度估计原理分析和Omnidet核心代码解读

    作者丨苹果姐@知乎 来源丨https://zhuanlan.zhihu.com/p/508090405 编辑丨3D视觉工坊 在自动驾驶实际应用中,对相机传感器的要求之一是拥有尽可能大的视野范围,鱼眼相 ...

  3. 利用opencv棋盘格标定法对鱼眼图像校正分析

    利用opencv棋盘格标定法对鱼眼图像校正分析 一.开发环境 PC端.vs2013+opencv3.0.摄像头为淘宝购置的鱼眼摄像头外设+iphone6 二.镜头标定 1.  输入畸变的棋盘格图以及棋 ...

  4. 鱼眼校正c语言算法,一种鱼眼图像逆向经纬映射的快速校正算法

    1. 引言 鱼眼镜头因其焦距短,视场大,拍摄图像信息量大等优点,在安防监控.360度汽车成像仪等领域中得到广泛应用.但鱼眼镜头在获得大视场的同时,会产生严重的图像畸变问题 [1] [2] .通过鱼眼镜 ...

  5. 鱼眼图像校正(球面等距投影模型)

    为了真正的理清鱼眼图像校正的原理,查阅了很多的资料,本文主要从以下几个方面详细阐述基于球面透视投影等距模型的鱼眼图像校正算法. 1,鱼眼相机的构造原理. 2,透视投影. 3,等距投影算法 鱼眼相机的构 ...

  6. 鱼眼图像的校正(Python实现)

    问题描述 本文承接上文<鱼眼图像提取有效区域>,链接:https://blog.csdn.net/Megurine_Luka_/article/details/110563049 相对于常 ...

  7. 鱼眼图像(fisheye image)通过几何变换形成透视图(a perspective view)[存疑]

    我看的论文是: Efficient Pedestrian Detection in Top-View Fisheye Images Using Compositions of Perspective ...

  8. 鱼眼校正c语言算法,一种简单而精确的鱼眼图像校正算法研究

    舒旭 摘 要: 针对鱼眼图像的校正提出了一种有效区域提取算法,并在鱼眼图像的球面物投影平面展开时与目标半立方体的校正平面建立线性映射.实验结果表明,该算法能有效地提取鱼眼图像轮廓的有效区域,同时半立方 ...

  9. 图像处理--鱼眼图像

    鱼眼镜头--最开始(1919)是源于摄影的需求--因为鱼眼图像存在几何畸变>>>鱼眼校正的需求 发展: 装满水的针孔摄像机>>>半球形玻璃>>>在 ...

最新文章

  1. uml 时序图_UML学习-14种UML图
  2. 信息学奥赛一本通C++语言——1053:最大数输出
  3. angular6 设置全局变量_Angularjs 设置全局变量的方法总结
  4. python工程师工资多少-2018年涨工资了吗?Python 工程师薪资最新出炉
  5. Cuiwei Li / Detection of ECG characteristic points using wavelet transforms
  6. 在Crystal Report 8中调用Oracle的procedure储存过程,并取得返回的类型为Sys_Refcursor数据表...
  7. 金融用计算机,CFA考试指定计算器使用攻略
  8. 域名该怎样选_怎样选择域名?
  9. 都柏林圣三一大学计算机科学,都柏林圣三一学院简介-录取要求-就业情况-录取案例-就读体验-WordSunny留学...
  10. Spring乱码问题解决
  11. MyIM2006开发报告1:概要
  12. 《Tux福音》中英对照注释版
  13. 打造跳跃音波播音乐放器(Electron+Nodejs+React)
  14. DNS解析时发现域名和IP不一致,访问了该域名会如何(大厂真题)
  15. 模糊测试工具Sulley开发指南(3)——整体介绍
  16. MYSQL 修改语句(数据)
  17. 枚举----暴力枚举
  18. 2018 年最流行的十大编程语言,Java 无可争议!
  19. mac系统共享服务器,mac 链接共享服务器
  20. 操作系统题库(选择题部分,带解析)

热门文章

  1. 2022-2028年中国民用航空装备行业市场需求与投资规划分析报告
  2. 导致命令注入漏洞的php函数,PHP安全-函数
  3. 运算符及题目(2017.1.8)
  4. c#属性中的get和set属性
  5. 30+程序员,平时都忙些什么事情?平时都想些什么?以后有啥计划?
  6. 一些有用的webservice
  7. c#正则表达式使用详解
  8. 解决在SQL Server 2000的存储过程不能调试
  9. ssh服务器拒绝证书,使用SSH.NET以密钥文件连接到SFTP(权限被拒绝(publickey))...
  10. mysql的判断更新_mysql判断记录是否存在,存在则更新,不存在则插入