当前位置: 首页 > news >正文

网站开发 百度编辑器鹤壁网站推广公司

网站开发 百度编辑器,鹤壁网站推广公司,开发网站开始的工作,四川平台网站建设哪里有1. 背景 大多数商用相机都可以描述为针孔相机#xff0c;通过透视投影进行建模。然而#xff0c;有些投影系统的几何结构无法使用传统针孔模型来描述#xff0c;因为成像设备引入了非常高的失真。其中一些系统就是全方位摄像机。 有几种方法可以制作全向相机。屈光照相机(D… 1. 背景 大多数商用相机都可以描述为针孔相机通过透视投影进行建模。然而有些投影系统的几何结构无法使用传统针孔模型来描述因为成像设备引入了非常高的失真。其中一些系统就是全方位摄像机。 有几种方法可以制作全向相机。屈光照相机(Dioptric cameras)使用成形透镜的组合例如鱼眼透镜见图1a并且可以达到甚至大于180度的视野即略大于半球。折反射相机(Catadioptric cameras)将标准相机与成型镜如抛物面镜、双曲面镜或椭圆镜相结合在水平面上提供360度的视野在仰角(elevation)上提供100度以上的视野。在图1b中您可以看到使用双曲镜的折反射相机示例。最后多折射相机使用多个具有重叠视场的相机迄今为止是唯一提供真正全向球形视场即4π立体视场的相机。 折反射相机最早于1990年由Yagi和Kawato引入机器人学他们使用折反射相机定位机器人。直到2000年由于新的制造技术和精密工具鱼眼相机才开始普及使其视野增加到180度甚至更多。然而直到2005年这些相机才被小型化到1-2厘米的大小并且它们的视野增加到190度甚至更大。 2. 模型原理 Ocam模型成像参考D Scaramuzza可分为两个过程先将相机坐标系下的坐标转换成ocam坐标系下的角度再根据θ计算畸变系数进而计算像素坐标需要注意Ocam相机是左手系存在一个相机坐标系到Ocam坐标系的坐标变换其θ角度与Fisheye不同。 2.1. Central omnidirectional cameras 当被观察物体的光线在3D中的一个点称为投影中心或单有效视点相交时视觉系统被称为中心图2。此属性称为单一有效视点属性。透视相机(perspective camera)是中央投影系统的一个示例因为所有光线(optical rays)在一个点即相机光学中心相交。 所有现代鱼眼相机都是中心的因此它们满足单一有效视点特性。相反中央折反射相机只能通过适当选择镜子形状和相机与镜子之间的距离来构建。正如Baker和Nayar[6]所证明的满足单视点特性的镜族是一类旋转扫描圆锥截面即双曲、抛物线和椭圆镜。对于双曲线镜和椭圆镜通过确保相机中心即针孔或透镜中心与双曲线椭圆的一个焦点重合来实现单视点特性图3。对于抛物面反射镜必须在相机和反射镜之间插入正交透镜这使得抛物面反射镜反射的平行光线可能会聚到相机中心图3。 单一有效视点之所以如此理想是因为它允许用户从全向相机拍摄的图片中生成几何正确的透视图像图4。这是可能的因为在单视点约束下感知图像中的每一个像素测量是通过视点的光在特定方向上的辐照度。当全向相机的几何形状已知时即相机校准时可以为每个像素预先计算出该方向。因此可以将每个像素测量的辐照度值映射到视点任意距离的平面上形成平面透视图像。此外可以将图像映射到以单个视点为中心的球体上即球形投影(图4底部)。单视点属性如此重要的另一个原因是它允许用户应用著名的视极几何理论这对从运动到结构非常重要。极向几何适用于任何中央相机无论是透视还是全向。 2.2. Omnidirectional camera model and calibration 直观地说全向相机的模型比标准透视相机稍微复杂一点。该模型确实应该考虑折反射相机的镜面反射或者鱼眼相机的镜头折射。由于这一领域的文献相当多本章回顾了两种不同的预测 这些模型已经成为全方位视觉和机器人技术的标准。此外, 已经为这两个模型开发了Matlab工具箱全世界的专家和非专家都在使用它们。 第一种模型称为中央折反射相机的统一投影模型。它是由Geyer和Daniilidis(后来由Barreto和Araujo[8]改进)在2000年开发的他们的优点是提出了一个包括所有三种类型的中央折反射相机的模型即使用双曲镜、抛物面镜或椭圆镜的相机。这个模型是专门为中央折反射相机开发的对鱼眼相机无效。用折反射透镜近似鱼眼透镜模型通常是可能的-然而只有有限的精度-在[9]中进行了研究。 相反第二种模型将中心折反射相机和鱼眼相机统一在一个通用模型下也称为泰勒模型。它由Scaramuzza等人在2006年开发[10,11]其优点是折反射相机和屈光相机都可以用同一个模型来描述即一个泰勒多项式。 2.3. Unified model for central catadioptric cameras(中央折反射相机的统一模型) Geyer和Daniilidis在2000年发表的具有里程碑意义的论文中指出每一种折反射(抛物线、双曲线、椭圆线)和标准透视投影都等价于从一个以单一视点为中心的球体到一个以垂直于平面且距离较远的平面为投影中心的平面的投影映射。从球体的中心。图5总结了这一点。 本节的目标是找到场景点的观看方向和其对应图像点的像素坐标之间的关系。Geyer和Daniilidis的投影模型遵循四个步骤。设P (x, y, z)为以C为中心的镜像参照系中的场景点(图5)。为了方便起见我们假设镜子的对称轴与相机的光轴完全对齐。我们还假设相机和镜子的x轴和y轴是对齐的。因此相机和镜像参考系的不同只是沿z轴的平移。 第一步是将场景点投射到单位球体上;因此: 然后将点坐标转换为以c为中心的新参照系 (0,0…);因此: 范围在0(平面镜)和1(抛物面镜)之间。的正确值。可以通过知道圆锥曲线的焦点和直侧肌之间的距离d得到如表1所示。圆锥剖面的直腹侧是通过平行于圆锥剖面准线的焦点的弦。 然后将p投影到距离c1的归一化图像平面上;因此, 最后通过本征参数矩阵K将该点m映射到摄像机图像点p (u, v, 1);因此, 很容易证明函数g.1是双射的它的逆g由: ∝表示g与右边的量成正比。为了得到归一化因子只要将g(m)归一化到单位球上就足够了。 式(6)可通过对式(3)求逆加上p_s必须在单位球上的约束而得因此。从这个约束条件我们得到了zs作为xm和ym的函数的表达式。更多细节可以在[12]中找到。 可以看出式(6)是中心折反相机投影模型的核心。它表示了归一化图像平面上的点m与镜像参考系中单位向量Ps之间的关系。注意对于平面镜我们成为透视相机的投影方程。 该模型已被证明能够准确地描述所有中心折反相机(抛物面镜、双曲镜和椭圆镜)和标准透视相机。Ying和Hu[9]在2004年提出了对鱼眼镜头模型的扩展。然而通过折反射光学相机来接近鱼眼相机只能在有限的精度下工作。这主要是因为虽然可以用精确的参数函数(抛物线、双曲线、椭圆)表示三种中心折射率相机但鱼眼镜头的投影模型因相机而异并取决于镜头的视场。为了克服这个问题提出了一个新的统一模型将在下一节中进行描述。 2.4. Unified model for catadioptric and fisheye cameras折射率相机和鱼眼相机的统一模型 该统一模型由Scaramuzza等人在2006年提出[10,11]。与前一个模型的主要区别在于函数g的选择。针对鱼眼相机参数化模型知识不足的问题提出了利用泰勒多项式的方法通过标定过程求出泰勒多项式的系数和度。因此,规范化的关系像点m (xm, ym, 1)和鱼眼的单位向量Ps(镜子)参考系可以写成: 其中 ​。读者可能已经注意到多项式的一阶项(即)不见了。这是根据观察得出的在ρ 0处计算的多项式的一阶导数对于折反射相机和鱼眼相机都必须是零(这是通过微分(6)对折反射相机进行验证的直接方法)。还要注意由于它的多项式性质这个表达式可以包含折反射相机、鱼眼相机和透视相机。这可以通过适当地选择多项式的次数来实现。正如作者所强调的阶数为3或4的多项式能够非常准确地建模所有折反射相机和市场上可用的多种鱼眼相机。这一模型适用于广泛的商业相机是其成功的根源。 2.5. Omnidirectional camera calibration 全向摄像机的标定与标准视角摄像机的标定类似。同样最流行的方法利用了用户在不同位置和方向上显示的平面网格。对于全向相机来说标定图像是在相机周围拍摄的而不是在单面拍摄的这一点非常重要。这是为了补偿相机和后视镜之间可能出现的偏差。 值得一提的是目前有三种开源的Matlab校准工具箱它们的区别主要在于所采用的投影模型和校准模式的类型。 3. ocam图转多张针孔图 3.1. Python实现 import numpy as np Reads file containing the ocamcalib parameters exported from the Matlab toolbox def get_ocam_model(filename):o {}with open(filename) as f:lines [l for l in f]l lines[2]data l.split()o[length_pol] int(data[0])o[pol] [float(d) for d in data[1:]]l lines[6]data l.split()o[length_invpol] int(data[0])o[invpol] [float(d) for d in data[1:]]l lines[10]data l.split()o[xc] float(data[0])o[yc] float(data[1])l lines[14]data l.split()o[c] float(data[0])o[d] float(data[1])o[e] float(data[2])l lines[18]data l.split()o[height] int(data[0])o[width] int(data[1])return odef get_ocam_model_from_json(camera_name, camera_calib_dict):o {}o[length_pol] camera_calib_dict[camera_name][intrinsic_param][cam2world_len]o[pol] [float(d) for d in camera_calib_dict[camera_name][intrinsic_param][cam2world]]o[length_invpol] camera_calib_dict[camera_name][intrinsic_param][world2cam_len]o[invpol] [float(d) for d in camera_calib_dict[camera_name][intrinsic_param][world2cam]]o[xc] camera_calib_dict[camera_name][intrinsic_param][center][0]o[yc] camera_calib_dict[camera_name][intrinsic_param][center][1]o[c] camera_calib_dict[camera_name][intrinsic_param][affine_c]o[d] camera_calib_dict[camera_name][intrinsic_param][affine_d]o[e] camera_calib_dict[camera_name][intrinsic_param][affine_e]o[width] camera_calib_dict[camera_name][ImgSize][0]o[height] camera_calib_dict[camera_name][ImgSize][1]print (o , o)return odef cam2world(point2D, o):point3D []invdet 1.0/(o[c]-o[d]*o[e])xp invdet*((point2D[0]-o[xc]) - o[d]*(point2D[1]-o[yc]))yp invdet*(-o[e]*(point2D[0]-o[xc]) o[c]*(point2D[1]-o[yc]))r np.linalg.norm([xp,yp])zp o[pol][0]r_i 1.0for i in range(1,o[length_pol]):r_i * rzp r_i*o[pol][i]invnorm 1.0/np.linalg.norm([xp,yp,zp])point3D.append(invnorm*xp)point3D.append(invnorm*yp)point3D.append(invnorm*zp)return point3Ddef world2cam_bak(point3D, o):point2D [] norm np.linalg.norm(point3D[:2])if norm ! 0:theta np.arctan(point3D[2]/norm)invnorm 1.0/normt thetarho o[invpol][0]t_i 1.0for i in range(1,o[length_invpol]):t_i * trho t_i*o[invpol][i]x point3D[0]*invnorm*rhoy point3D[1]*invnorm*rhopoint2D.append(x*o[c]y*o[d]o[xc])point2D.append(x*o[e]yo[yc])else:point2D.append(o[xc])point2D.append(o[yc])return point2Ddef world2cam(point3D, o):point2D [] norm np.linalg.norm(point3D[:2])if norm ! 0:theta np.arctan(point3D[2]/norm)invnorm 1.0/normt thetarho o[invpol][0]t_i 1.0for i in range(1,o[length_invpol]):t_i * trho t_i*o[invpol][i]x point3D[0]*invnorm*rhoy point3D[1]*invnorm*rhopoint2D.append(x y*o[e] o[xc])point2D.append(x*o[d] y*o[c] o[yc])else:point2D.append(o[xc])point2D.append(o[yc])return point2Ddef create_perspective_undistortion_LUT(o, sf):mapx np.zeros((o[height],o[width])) mapy np.zeros((o[height],o[width])) Nxc o[height]/2.0Nyc o[width]/2.0 Nz -o[width]/sf for i in range(o[height]):for j in range(o[width]):M []M.append(i - Nxc)M.append(j - Nyc)M.append(Nz)m world2cam(M, o) mapx[i,j] m[1]mapy[i,j] m[0]return mapx, mapy# horizontal_angle_offset, in degree, [-90, 90], default 0 def create_perspective_undistortion_LUT_Focal(o, persp_height, persp_width, focal, horizontal_angle_offset):mapx np.zeros((persp_height,persp_width)) mapy np.zeros((persp_height,persp_width)) Nxc persp_width/2.0 Nyc persp_height/2.0Nz -focal theat horizontal_angle_offset*np.pi/180.0rotation np.array([ np.cos(theat), 0, np.sin(theat),0, 1, 0,-np.sin(theat), 0, np.cos(theat)]).reshape(3,3)#print(rotation)for i in range(persp_height):for j in range(persp_width):M []M.append(j - Nxc)M.append(i - Nyc)M.append(Nz)M_ary np.array(M).reshape(3,-1)#print(M_ary)M_ary_rot np.dot(rotation, M_ary).astype(np.float64)#print(M_ary_rot)m world2cam(M_ary_rot.reshape(3).tolist(), o) mapx[i,j] m[0]mapy[i,j] m[1]return mapx, mapydef create_panoramic_undistortion_LUT(Rmin, Rmax, o):mapx np.zeros((o[height],o[width])) mapy np.zeros((o[height],o[width])) for i in range(o[height]):for j in range(o[width]):theta -(float(j))/o[width]*2*np.pirho Rmax - float(Rmax-Rmin)/o[height]*imapx[i,j] o[yc] rho*np.sin(theta)mapy[i,j] o[xc] rho*np.cos(theta)return mapx, mapy 3.2. C实现 #include map #include string #include math.h #include Eigen/Dense #include opencv2/core/core.hpp #include jsoncpp/json/json.htypedef std::paircv::Mat, cv::Mat LUT;struct OcamModel{int length_pol, length_invpol, height, width;float xc, yc, c, d, e;std::vectorfloat pol, invpol; };// used OcamModel get_ocam_model(std::string filename){OcamModel o;return o; }OcamModel get_ocam_model_from_json(std::string camera_name, std::mapstd::string, Json::Value camera_calib_dict){OcamModel o;o.length_pol camera_calib_dict[camera_name][intrinsic_param][cam2world_len].asInt();Json::Value vec camera_calib_dict[camera_name][intrinsic_param][cam2world];for(auto x : vec)o.pol.push_back(x.asFloat());o.length_invpol camera_calib_dict[camera_name][intrinsic_param][world2cam_len].asInt();vec camera_calib_dict[camera_name][intrinsic_param][world2cam];for(auto x : vec)o.invpol.push_back(x.asFloat());o.xc camera_calib_dict[camera_name][intrinsic_param][center][0].asFloat();o.yc camera_calib_dict[camera_name][intrinsic_param][center][1].asFloat();o.c camera_calib_dict[camera_name][intrinsic_param][affine_c].asFloat();o.d camera_calib_dict[camera_name][intrinsic_param][affine_d].asFloat();o.e camera_calib_dict[camera_name][intrinsic_param][affine_e].asFloat();o.width camera_calib_dict[camera_name][ImgSize][0].asInt();o.height camera_calib_dict[camera_name][ImgSize][1].asInt();// std::cout o.length_pol o.length_pol std::endl;// std::cout o.length_invpol o.length_invpol std::endl;// std::cout o.height o.height std::endl;// std::cout o.width o.width std::endl;// std::cout o.xc o.xc std::endl;// std::cout o.yc o.yc std::endl;// std::cout o.c o.c std::endl;// std::cout o.d o.d std::endl;// std::cout o.e o.e std::endl;return o; }cv::Vec3f cam2world(cv::Vec2f p2, OcamModel o){float invdet 1.0 / (o.c-o.d*o.e);float xp invdet * ((p2(0)-o.xc) - o.d*(p2(1) - o.yc));float yp invdet * (-o.e*(p2(0) - o.xc) o.c * (p2(1) - o.yc));float r sqrt(xp * xp yp * yp);float zp o.pol[0];float r_i 1.0;for(int i 1; io.length_pol; i){r_i * r;zp r_i * o.pol[i];}float invnorm 1.0 / sqrt(xp * xp yp * yp zp * zp);return cv::Vec3f(invnorm * xp, invnorm * yp, invnorm * zp); }cv::Vec2f world2cam(cv::Vec3f p3, OcamModel o){float norm sqrt(p3(0) * p3(0) p3(1) * p3(1));if(norm 0)return cv::Vec2f(o.xc, o.yc);float theta atan(p3(2) / norm);float invnorm 1.0 / norm;float t theta;float rho o.invpol[0];float t_i 1.0;for(int i 1; io.length_invpol; i){t_i * t;rho t_i * o.invpol[i];}float x p3[0] * invnorm * rho;float y p3[1] * invnorm * rho;return cv::Vec2f(x y*o.e o.xc, x*o.d y*o.c o.yc); }LUT create_perspective_undistortion_LUT_Focal(OcamModel o, int persp_height, int persp_width, int focal, int horizontal_angle_offset){cv::Mat mapx(persp_height, persp_width, CV_32FC1), mapy(persp_height, persp_width, CV_32FC1);// std::vectorstd::vectorfloat mapy(persp_height, std::vectorfloat(persp_width));float Nxc (float)persp_width / 2.0;float Nyc (float)persp_height / 2.0;float Nz -(float)focal;float theta (float)horizontal_angle_offset * M_PI / 180.0;Eigen::Matrix3f rotation;rotation cos(theta), 0, sin(theta), 0, 1, 0, -sin(theta), 0, cos(theta);for (int i 0; ipersp_height; i) {// uchar *ptrx mapx.ptruchar(i);// uchar *ptry mapy.ptruchar(i);for(int j 0; jpersp_width; j){Eigen::Vector3f p3(j-Nxc, i-Nyc, Nz);Eigen::Vector3f v3 rotation * p3;cv::Vec2f m world2cam(cv::Vec3f(v3[0], v3[1], v3[2]), o);// std::cout m std::endl;// *ptrx m[0]; ptrx;// *ptry m[1]; ptry;mapx.atfloat(i, j) m[0];mapy.atfloat(i, j) m[1];}}return {mapx, mapy}; }LUT create_panoramic_undistortion_LUT(float Rmin, float Rmax, OcamModel o){cv::Mat mapx(o.height, o.width, CV_32FC1), mapy(o.height, o.width, CV_32FC1);for(int i 0; io.height; i){for(int j 0; jo.width; i){float theta -2 * M_PI * (float)j / o.width;float rho Rmax - (float)(Rmax - Rmin) * (float)i / (float)o.height;mapx.atfloat(i, j) o.yc rho * sin(theta);mapy.atfloat(i, j) o.xc rho * cos(theta);}}return {mapx, mapy}; } 4. 坐标投影到像素 4.1. 3D到2D投影 class SVCCalibrationSDK:def __init__(self, intrinsic_param, width, height):self.image_size np.array([height, width]) # rows, colsself.world2cam np.array(intrinsic_param[world2cam]).reshape(-1, 1)self.world2cam_len np.array(intrinsic_param[world2cam_len])self.svc_rotation np.array([[1., intrinsic_param[affine_e]],[intrinsic_param[affine_d], intrinsic_param[affine_c]]])self.svc_translation np.array(intrinsic_param[center])def cam_to_pixel(self, points):num_points len(points)if num_points 0:return np.empty((0, 3))else:norm np.sqrt(np.sum(points[:, 0:2] * points[:, 0:2], axis1, keepdimsTrue))theta np.arctan(points[:, 2:3] * (-1 / norm))poly_theta np.power(theta, np.arange(self.world2cam_len))rho (poly_theta self.world2cam)pixels (points[:, 0:2] * (rho / norm)) self.svc_rotation self.svc_translationreturn pixels 4.2. 2D到3D投影 其中所以的有效系数的个数不一定与f的有效系数一样  参考文献 A Toolbox for Easily Calibrating Omnidirectional Cameras Omnidirectional Camera https://sites.google.com/site/scarabotix/ocamcalib-omnidirectional-camera-calibration-toolbox-for-matlab 相机模型 Omnidirectional Camera(全方位摄像机)_中心折反射相机-CSDN博客
http://www.hkea.cn/news/14282866/

相关文章:

  • 天津建设合同怎么在网站录入html5国内网站
  • 网站整站下载器 全站克隆页面图片视频下载 仿站专用源码工具软件电子商务网站规划原则
  • win2008r2做网站服务器windows下搭建wordpress
  • 中国工厂网站官方网站软件开发net教程免费
  • 网站建设的一般流程是购销网站建设视频百度云
  • 石狮app网站开发企业网站如何进行seo
  • 做网站 注意自己怎么注册域名
  • 上海个人网站备案wordpress 自定义布局
  • 长长沙网站制作中文网页模板免费
  • 沈阳专业网站制作团队做游戏网站要通过什么审核
  • 重庆网站定制开发一凡招聘 建筑人才网
  • 玉树电子商务网站建设黄页网页的推广网站
  • 题库网站建设的绩效指标wordpress微信域名回调
  • 建筑网站的功能模块企业所得税交多少
  • 门户网站的分类建筑施工模板
  • 网站模板用什么打开福州网站建设方案优化
  • 申请网页空间的网站运城推广型网站开发
  • 企业网站推广有哪些方式中英双语营销型网站
  • 网站推广怎么做关键词活动手机网站开发
  • 聊城做网站中企动力做销售的经历
  • 网站开发合同怎么写网站上线模板
  • 网加做网站推广阿里巴巴网站域名注册
  • 百度如何验证网站惠州企业网站设计
  • 网站报价收费单网站排行榜
  • 中国建设银行龙卡网站带地板翻转的网站怎么做
  • 四平做网站营销型网站代理
  • 网站建设与维护 教学大纲郴州网络有限公司
  • 网站内容策划方案百度运营培训班
  • 公司网站建设宣传公司浙江国有建设用地出让网站
  • p2p网站建设教程中英文网站怎么做的