我正在尝试使用SFM(运动结构)进行3D重建.我对计算机愿景很陌生,并将其作为一种爱好,因此,如果您使用首字母缩写词,请让我知道它的含义,所以我可以查找. 明智地学习,我一直在遵循此信息: 7WG1E62A和列表= plgnqpqtftftogryjqjdzxteqpzufhqa7o7y&ab_channel = cyrillstachniss 加上以下来自快速问题的链接. 我的最终目标是在人的脸上使用它,以创建3D面重建.如果人们对此主题有建议,请告诉我. 我执行以下步骤: 使用OpenCV.使用单个相机拍摄的视频. 使用Zhangs方法找到相机的内在参数和失真系数. 使用SIFT查找框架1和框架2的功能. 使用cv2.FlannBasedMatcher(). 进行功能匹配 使用cv2.findEssentialMat()来计算必需矩阵. 框架1的投影矩阵设置为numpy.hstack((numpy.eye(3), numpy.zeros((3
以下是关于 3d-reconstruction 的编程技术问答
我有四个位于固定位置的摄像机.因此,我可以使用标尺(物理上)测量它们之间的距离(甚至旋转).相机一号和第二个给我一个点云和相机的三和四,给了我另一个点云.我需要合并这些点云. 到目前为止,我已经理解,ICP和其他此类算法对一个点云进行了严格的变换以匹配另一个云.我的问题是,我如何使用额外的知识(以厘米为单位的相机之间的距离)进行这种转变. 我对这样的工作很陌生,所以如果我误解了某些东西,请纠正我.预先感谢. 解决方案 首先,您要寻找哪种准确性,以及空间的数量?在0.5 m的桌面场景上实现0.1 mm的注册精度是一个完全不同的问题(就机械设计和约束而言),与在宽几十米的地板上的几毫米相比. 一般来说,具有重建且明确的对象形状,ICP始终为您提供比手动测量更好的解决方案. 如果摄像机是静态的,那么您实际上是一个校准问题,并且您需要仅在设置时校准4摄像机的钻机,而其配置出于任何原因进行更改. 我建议使用精确已知的大小和几何形状的校准对象,例如一个机械的
我正在使用OpenCV SGMB进行立体声差异计算,以重建放在表上的一些简单对象.一切或多或少都奏效了,除了在对象的边缘上,我发现一些离群值以背景的颜色粘附.问题是我认为SGBM不匹配该背景点,这些点是对象边缘边缘的邻居,并且它们具有与这些边缘相同的差异值. 这是一个例子 您可以看到地板上的一些图像被卡在对象上.我正在使用SGBM参数的标准值: int sgbmWinSize = 3;//size of the window to be matched int numberOfDisparities = 256; //number of different disparity values in pixels int cn = inputImage1.channels(); sgbm.minDisparity = -128; //minimum possible disparity value in pixels sgbm.SADWindowSize = sgbmWinS
我以前曾问过"使用校准的相机获得3D重建的匹配点",但该问题尚未清楚地描述.因此,在这里,我在每个步骤中使用一个细节案例.希望有人可以帮助弄清楚我的错误在哪里. 首先,我用坐标做了10个3D点: >> X = [0,0,0; -10,0,0; -15,0,0; -13,3,0; 0,6,0; -2,10,0; -13,10,0; 0,13,0; -4,13,0; -8,17,0] 这些要点在此图片中显示的同一平面上: 我的下一步是使用3D-2D投影代码获得2D坐标.在此步骤中,我使用了Caltech校准工具箱中的MATLAB代码,称为" Project_Points.m".另外,我使用OpenCV C ++代码来验证结果并结果相同. (我使用了cvprojectpoints2()) 对于第一个投影,参数为: >
我从A sourceImage 中提取了四个角落: src_vertices[0] = corners[upperLeft]; src_vertices[1] = corners[upperRight]; src_vertices[2] = corners[downLeft]; src_vertices[3] = corners[downRight]; 这四个角落被扭曲到 destination图像喜欢的: dst_vertices[0] = Point(0,0); dst_vertices[1] = Point(width, 0); dst_vertices[2] = Point(0, height); dst_vertices[3] = Point(width, height); Mat warpPerspectiveMatrix = getPerspectiveTransform(src_vertices, dst_vertices); cv::Size
希望对更广泛的受众群体,我在这里重新提出问题,我在 ansys.opencv.org . tl; dr :传递给undistortPoints,findEssentialMat和recoverPose的参数之间应保持什么关系?? 我在程序中具有以下代码,K和dist_coefficients是相机内在的,imgpts.匹配的特征点来自2个图像. Mat mask; // inlier mask undistortPoints(imgpts1, imgpts1, K, dist_coefficients, noArray(), K); undistortPoints(imgpts2, imgpts2, K, dist_coefficients, noArray(), K); Mat E = findEssentialMat(imgpts1, imgpts2, 1, Point2d(0,0), RANSAC, 0.999, 3, m
我正在使用此遗产代码:http ://opencv-users.1802565.n2.nabble.com/trifocal-tensor-icvcomputeprojectmatrices6points-icvcomputeprojectmatricesnpoints-td2423108.html i可以使用 iCvComputeProjectMatrices6points 成功计算投影矩阵.我使用了3个视图中的6组相应点.结果如下所示: projMatr1 P1 = [-0.22742541, 0.054754492, 0.30500898, -0.60233182; -0.14346679, 0.034095913, 0.33134204, -0.59825808; -4.4949986e-05, 9.9166318e-06, 7.106331e-05, -0.00014547621] projMatr2 P2 = [-0.17060626, -0.007
我想验证我对基本矩阵的理解是正确的,如果可以计算F而无需使用任何相应的点对. 基本矩阵的计算为F = inv(transpose(Mr))*R*S*inv(Ml),其中MR和ML是左右的固有相机矩阵,R是将右坐标系带到左侧的旋转矩阵,而S是偏斜的对称矩阵 S = 0 -T[3] T[2] where T is the translation vector of the right coordinate system T[3] 0 -T[1] from the left. -T[2] T[1] 0 我知道可以使用8点算法计算基本矩阵,但是我没有任何点对应关系.但是,我的两个摄像机均已校准,因此我都有所有内在和外在参数.从上面的基本矩阵的定义来看,可以单独使用这些参数计算F,对 (我遇到的问题是,根据其定义计算,基本矩阵似乎是错误的.目前,我想知道上述理解是否正确.) 解决方案 如果相对于共同坐标系的每个相机的
说我计划使用立体声方法使用OpenCV进行3D重建...而且我没有任何特殊的立体声摄像头,而只有网络摄像头. 1.)如何使用一组Web摄像头构建便宜的立体声设置? 2.)是否可以使用Web Cams拍摄两个图像,并使用OpenCV API转换为立体声? 我将使用下面链接的立体声算法 with opencV 使用这种方法,我想创建室内环境的详细映射. (我不想使用任何项目之类的项目,而没有分发源代码就无法用于商业目的) 解决方案 您可以在这里找到很多资源资源/" rel =" noreferrer">教程和立体声摄像机 其他解决方案 首先,确保您的网络摄像头没有任何内置自动对焦技术.由于相机应具有固定焦距. 1)在规范配置中与基线距离变化的摄像机对齐.然后使用OpenCV的stereo_calib.cpp程序对其进行校准.通常,距离为20-60厘米.对于某些网络摄像机,甚至10厘米都可以为您带来更好的结果.如果RMS错误和再投影错误小于0.5,则可以
从已知内部校准的立体视图中有许多有关3D重建的帖子,其中一些是优秀.我已经阅读了它们的 lot ,根据我阅读的内容,我试图使用以下管道/算法来计算自己的3D场景重建.我将列出该方法,然后在底部提出特定问题. 0.校准您的相机: 这意味着检索摄像机校准矩阵k 1 和k 2 的相机1和相机2.这些是封装每个相机的3x3矩阵内部参数:焦距,主点偏移/图像中心.这些不会改变,只要您不缩放或更改记录的分辨率. 做这个离线.不要争论. 我正在使用 1.基本矩阵F: 现在,您的摄像头现在以立体声钻机设置.使用两个图像/视图之间的点对应关系确定该配置的基本矩阵(3x3). 您如何获得对应关系取决于您,并且将在场景本身上很大程度上取决于您. 我正在使用openCV的findFundamentalMat()获取F,它提供了许多选项方法(8点算法,RANSAC,LMEDS). 您可以通过将其插入基本矩阵的定义方程式来测试结果矩阵:x'Fx = 0其中x'和x是均匀坐标中的原始图像
问题语句 我试图将2D点重点重点为他们的原始3D坐标,假设我知道每个点的距离.跟随使用零距离.但是,当存在扭曲时,结果是不正确的. 当前方法 因此,这个想法是扭转以下内容: 进入以下内容: : 使用cv::undistortPoints 摆脱任何扭曲 使用内在来逆转上面的第二个方程 乘以z逆转归一化. 问题 为什么我需要减去f_x和f_y才能回到归一化的相机坐标(测试时经验发现)?在下面的代码中,在步骤2中,如果我不减去 - 即使未延迟的结果也没有,这是我的错误 - 我把索引弄乱了. 如果我包括失真,结果是错误的 - 我在做什么错? 示例代码(C ++) #include #include #include #include #incl
我正在尝试根据相应图像的运动来计算新的相机位置. 图像符合针孔摄像机模型. 事实上,我没有有用的结果,所以我尝试描述我的程序并希望有人可以帮助我. i将相应图像的功能与SIFT匹配,将它们与OpenCV的FlannBasedMatcher匹配,并使用OpenCV的FindFundAmentalMat(方法RANSAC)计算基本矩阵. 然后,我通过摄像机固有矩阵(K)计算必需矩阵: Mat E = K.t() * F * K; i将基本矩阵分解为旋转和翻译的奇异值分解: SVD decomp = SVD(E); Matx33d W(0,-1,0, 1,0,0, 0,0,1); Matx33d Wt(0,1,0, -1,0,0, 0,0,1); R1 = decomp.u * Mat(W) * decomp.vt; R2 = decomp.u * Mat(Wt) * decom
我是这个领域的新手,我正在尝试在2D图像中的3D中建模一个简单的场景,但我没有有关摄像机的任何信息.我知道有 3个选项: 我有两个图像,我知道我从xml加载的相机模型(异议),以实例loadXMLFromFile() => stereoRectify() => reprojectImageTo3D() reprojectImageTo3D() 我没有它们,但是我可以校准我的相机=> stereoCalibrate() => stereoRectify() => reprojectImageTo3D() reprojectImageTo3D() 我无法校准相机(这是我的情况,因为我没有拍摄2张图像的相机,然后我需要在两个图像上使用Surf,例如SIFT找到Pair Kepoints (我实际上可以使用任何BLOB检测器),然后计算这些关键点的描述符,然后根据其描述符左图和图像匹配关键点,然后从它们中找到其基本矩阵.处理更加困难,并且会像这样. : 检测关键点(Sur
我正在使用OpenCV进行一个项目,以检测使用立体校准的盲人路径中的障碍.我已经正确计算了差异图.现在,要找到障碍物与相机的距离,我希望它的3D坐标[x,y,z],我猜我可以通过reprojectimageto3d()找到它,但是我没有在此功能中使用的Q矩阵,因为q矩阵我从stereorectify()中获得的q null可能是因为我使用了预校准的图像.尽管我确实有相机的inrinsic和外部参数. 因此,我的问题是,如果我知道焦距,基线以及有关相机的其他所有内容,我如何手动创建Q矩阵直接在函数中使用? Q矩阵的基本格式是什么? 解决方案 Q矩阵的形式如下: 在该图像中, c x 和 c y 是左侧主要点的坐标摄像机(如果您确实与左摄像头匹配的立体声匹配),则 c' x 是右相机中主要点的x坐标( c c x 和 c' x ,如果您指定了CV_CALIB_ZERO_DISPARITY flag的stereoRectify()>), f 是焦距, t x 是基线长度(可能是基
我意识到有很多与我要的蠕虫罐有关,但是我必须从某个地方开始.基本上,我要问的是: 给出了两张场景的照片,用未知摄像机拍摄,我可以在多大程度上确定照片之间的(相对)翘曲? 以下是1904年世界博览会的两幅图像.它们是在无线电报塔上的不同级别上采用的,因此相机或多或少地垂直排列.我的目标是从这些照片和其他照片中创建该区域的模型(在搅拌机中,如果很重要).我不是在寻找全自动解决方案,例如,我对手动选择点和功能没有任何问题. 在过去的一个月中,我已经教会了自己关于投射转变和外相几何形状的能力.对于一些照片,我可以通过从点对应关系找到基本矩阵 f 来做得很好.但是下面的两个使我有问题.我怀疑有某种扭曲 - 也许只是纵横比的变化,也许不仅仅是. 我的过程如下: 我找到了两张照片之间的对应关系(下面看到的红色锯齿线). 我通过MATLAB(实际上八度)运行点对以找到Epipoles.目前,我正在使用彼得·科维西(Peter Kovesi) peter for Com
我试图了解3D重建的基本原理,并选择与 OpenMVG . 但是,我已经看到证据表明,我询问的以下概念适用于 all/most sfm/mvs工具,而不仅仅是OpenMVG.因此,我怀疑任何计算机视觉工程师都应该能够回答这些问题,即使他们没有直接的OpenMvg经验. 我试图完全理解固有的摄像机参数,或者似乎被称为" camera instrinsics" "或" intinsic参数".根据OpenMVG的文档,摄像机的内在设备取决于用于拍摄图片的相机类型(例如,摄像机模型),其中OpenMVG支持五个模型: 针孔:3个内在参数(焦点,主点X,主点Y) 针孔径向1:4内在参数(焦点,主点X,主点Y,一个径向失真因子) 针孔径向3:6参数(焦点,主点X,主要点Y,3径向失真因子) 针孔棕色:8个参数(焦点,主点X,主点Y,5个失真因子(3级+2切向切角)) ) 针孔W/鱼眼失真:7个参数(焦点,主要点X,主点Y,4个失真因子) 所有这些都在他们的 WIKI页面
如果从各个角度收集了各种图像以及深度数据,我认为可以构建一个静态物体的3D模型,我认为的是有一条圆形的传送带,放置了一个kinect和传送带皮带虽然要在3D空间中重建的真实物体位于中间.此后,输送带以圆圈围绕图像旋转,并捕获了许多图像(也许每秒10张图像),这将使Kinect从每个角度(包括深度数据)中捕获图像,从理论上讲这是可能的.该模型还必须通过纹理重新创建. 我想知道的是是否已经有任何类似的项目/软件,并且将不胜感激 这是否可以在6个月内进行 我该如何继续这样做?例如,您可以指出我的任何类似算法以及这样的 谢谢, Milindad 解决方案 绝对有可能,并且有很多3D扫描仪,或多或少具有立体镜的原理. 您可能知道这一点,但只是为了上下文:这个想法是从同一点获得两个图像,并使用三角剖分计算场景中点的3D坐标.尽管这很容易,但最大的问题是找到2个图像中的点之间的对应关系,这是您需要一个好的软件来提取和识别类似点的地方. 有一个开源项目,称为 3D重建*算
特别是,我理想地想要具有点对应关系的图像以及f和左和右骨的"金标准"计算值.我也可以使用必需的矩阵以及内在和外在的相机属性. 我知道我可以从两个投影矩阵中构建F,然后从3D实际点生成左右投影点坐标,并应用高斯噪声,但我真的很想与别人的参考数据一起工作,因为我正在尝试测试我的代码的功效并编写更多代码以测试第一批(可能是坏)代码似乎并不聪明. 感谢您的任何帮助 问候 dave 解决方案 您应该使用地面真相数据集进行多视图重建.我建议使用也许,结果不是由Hartley和Zisserman中提出的"黄金标准算法"计算的,但是您可以使用它来计算您在两个视图之间需要的基本矩阵. . 要计算两个投影矩阵P1和P2的基本矩阵F请参阅代码 andrew zisserman 提供.
我必须重建一个对象,该对象将放置在距离立体声设置的基线约1米至1.5米的地方.两个相机捕获的图像均具有高分辨率(10 MP) 在所有三个坐标轴中,我必须检测到其位置的精度为+/- 0.5mm. (如果您需要更多详细信息,请告诉我) 为此,我的棋盘格(用于校准)的最佳规格应该是什么? 我只知道它应该是一个不对称的板.它应与预期放置对象的范围相同的距离范围.另外,应该以所有可能的角度定向(确保两个相机都可以看到所有角) 怎么样: 正方形数量水平和垂直? (另外,在哪一侧应该更多/偶数?) 棋盘上每个正方形的维度? 基线距离对此有何影响? 棋盘的这些参数是否会影响我的准确性?我还需要考虑其他参数以进行校准? 我正在使用MATLAB立体声校准器应用程序. 解决方案 我会尽力回答: 正方形数量.好吧,您可以猜到的是,越多的正方形(实际上使用了正方形之间的角度!)结果越好,因为您有一个越好的方程式系统可以解决.此外,它与Chequb