美术作品

教程:使用iPhone相机和OpenCV完成三维重建(第二部分)

????本文是人工智能研究所编写的技术博客。最初的标题是教程:立体三维侦察。

????本文是人工智能研究所编写的技术博客。原名为:

????教程:使用iphone相机使用opencv进行立体三维重建。第二部分。

????作者奥马尔帕迪尔纳

????翻译幻灭,牙牙,更清新

????校对幻灭审计丢弃杰弗安排菠萝女孩

????链接到原始文本:

????http://medium.com/@omar.ps16/stereo-3d-reorganization-with-opencv-use-an-iphone-camera-part-ii-77754b58bfe0

????第一部分请点击:第一部分

????教程:使用iPhone相机和OpenCV完成三维重建(第二部分)

????欢迎来到立体重建三部曲的第二部分。在本节中,我们将讨论如何校准您的相机。

????如前所述,相机的镜头会扭曲您拍摄的照片。这在三维重建中是很麻烦的,所以我们需要纠正这个问题。在校准之前,我们需要知道我们使用的相机的内部参数。

????有时这些参数是未知的,但幸运的是,opencv有一个专门针对这个的算法,我们可以使用它来开始我们的三维重建。

????整个设计过程中将使用python 3.7.1和opencv 3.4.4。还有python第三方库:numpy、glob、tqdm和palow。因此,首先,确保安装了这些工具。

????OpenCV中的摄像机标定过程是让计算机用棋盘图形扫描图像,并用不同的图像多次识别内角度。

????OpenCV提供的模型校准示例

????大多数关于摄像机校准的教程都是关于网络摄像机或其他摄像机的,因此它们是为分析每个单独的帧(或帧)而定制的。

????在我们的例子中,我们想校准移动摄像头,所以我们不能这样做。为了使计算机能够正确校准移动摄像机,它需要几个相同模式的例子。

????在处理视频流时,我们可以分析用户在摄像机前面移动时的每一帧,直到多次检测到移动模型(通常是任意测量,但通常至少是10次)。

????因为我们不处理视频流,所以我们必须为同一型号拍摄多张照片。

????第1步。得到棋盘图案。

????转到这个链接,在一张纸上打印电路板图案。为了达到完美的效果,请确保每个正方形都有30毫米长(尽管这并不特别重要)。

????第2步。把木板图案挂在白墙上。

????当我运行这个算法时,我注意到背景中的东西越多,计算相机矩阵的时间就越长。所以我用了一面白色的墙把棋盘图案贴在上面。确保它完全平坦。

????按照棋盘图案重新装修房子

????第3步。拍一些图案的照片。

????这一步对于确保照片得到良好的照明以及从不同角度拍摄图案非常重要。确保图案在屏幕的不同部分。

????如果只拍中间的照片,可能是校准错误。确保你的照片改变了很多。

????这是一个如何拍照的好例子。来自乌特卡什新浪。

????乌特卡什·西纳(UtkarshSinah)的博客(ai-shack)上有大量关于相机校准和如何捕捉模式的资源。如果你对C校准方法感兴趣,你应该去看看。

????应该指出的是,并不是所有的图片都适合检测模式。很难知道哪些照片可以提前拍摄,所以最好拍摄尽可能多的照片。我拍了64张照片。

????第4步:让我们开始代码部分

????一旦你拍了足够多的照片,是时候写一些代码了(记住整个代码都在这里)。第一步是选择棋盘的大小。虽然大小完全是任意的,但建议您选择不对称大小(即矩形,而不是方形)。在这里,我选择了7x5。

????导入cv2import numpy导入cvimport numpy as np import globalimport from tqdm import tqdm import pil。进出口PIL。皮勒。映像\====================================================================================================定义棋盘目标的大小。棋盘大小=7,5

????第二步是定义一个网格来存储所有点。需要订购存储点,例如:(0,0,0),(1,0,0),(2,0,0)……(6、5、0)

????定义阵列以保存检测到的点sobj_points=[]现实世界空间中的三维点img_points=[]图像平面中的三维点准备网格和显示objp=np的点。零((np.prod(棋盘大小),3),dtype=np。float32)objp[:::::2]=np。mgrid[0:chessboard_size[0],0:chessboard_size[0],0:ressboard](-hape(-2)。

????因为我们有几个图像要处理,所以我们可以使用glob迭代打开它们。此外,由于OpenCv中的角点检测算法需要一些时间进行处理,因此我们可以用TQDM来包装我们的循环,以了解自上一个图像处理以来已经有多长时间了,还有多少图像未处理。

????\读取图像缩放路径=全局。全局(“./calibration_images/*')迭代图像以查找TQDM中图像路径的固有矩阵(calibration_path):加载图像=cv2.imread(image_path)灰色_image=cv2.cvtcolor(image,cv2.color_bgr2gray)(“加载的图像,打印图像,分析”()\ calibration\\calibration_images/*“)迭代图像以查找图像的固有矩阵e_path in image_path in tqdm(校准_path in tqdm查找棋盘角灰色_image,棋盘大小,无)if ret==true:print(“检测到棋盘!”)打印(图像路径)定义子像素精度标准的标准=(cv2.term35u-criteria35u-eps cv2.term35u-criteria35u-max-iter,30,0.001),根据cv2优化角位置(到子像素精度)。CV2.转弯图2.CV2.CV2.CV2.CV2.Subgraerx(图像 Subgray Subgragragragray 图像,5、5、5,(检测到棋盘!),(图5,5,5,5,5,5,(标准)OBJ点。附加(objp)img_点。附加(角)

????在这个循环中,所有的魔法都会发生。加载图像后,必须先将其转换为灰色图像,然后使用findchessboard角算法。

????如果算法检测到模式,则此算法返回检测到的角和一个名为ret和true的标志。

????为了提高标定算法的精度,将角点位置精确到亚像素级。在这种情况下,我们必须定义定位所需的标准。

????我们采用了if的标准定义:标准=(类型、迭代次数、精度)。在这个例子中,我们告诉算法我们关心迭代的数量和精度(cv2)。术语“标准”EPS CV2。术语“标准”最大值)。我们选择30次迭代,精度为0.001。

????CV2.CornerSubPix是一种专注于重新定位点的算法。它接收图像、角点、窗口大小、零区域和实际情况作为输入。窗口大小是搜索区域。

????关注这个算法并不重要。我只是决定对参数进行评论,因为大多数教程只是对算法进行了润色。有关它如何工作的更多信息,请查看此处。

????分析完所有图片后,我们运行cv2。校准Amera算法。这是一种输出相机参数的算法。该算法返回摄像机矩阵(k)畸变系数(dist)和旋转和平移矢量(rvecs和tvecs)。

????校准相机ret,k,dist,rvecs,tvecs=cv2。CalibrateCamera(obj_点,img_点,灰色图像)。shape[:::-1],none,none,none)将参数保存到numpy filenp中。保存(“./camera_params/ret“,ret)np.save(“./camera_params/params/k“”,k)np.不适用。保存(“./camera_params/camera_params/camera/camera/dist“,tvecs=cv2.calibratecamera=cv2.calibratecamera(obj_points,img_points,gray_image rvecs)np.save(“)。/camera_参数/tvecs“,tvecs)

????注意,我们将这些值保存在不同的numpy文件中。我选择这样做是因为实用性。因为运行这个脚本需要一段时间,所以每次我们想要重建某个脚本时都要执行它是不方便的(也是不必要的)。

????因此,将所有内容保存在一个numpy文件中并稍后加载更容易。为什么是numpy而不是xml或json?因为对于numpy文件,不需要解析数据。

????为了重建三维图像,我们真正关心的是三个参数:相机矩阵、畸变系数和焦距。焦距可以从相机矩阵中推导出来。

????然而,为了学习,我决定从包含在exif数据中的图像中获取焦点信息。摄像手机的焦距信息存储在exif数据中。

????获取exif数据以获得焦距。exif_img=pil.图像。打开(校准路径[0])exif_data=pil。出口。标签[K]:pil.出口。标签[k]:v代表k,v代表exif_img。获取exif()。项目()。PIL中的项目()如果K。出口。出口。标签\获取焦距中的焦距焦距焦距焦距焦距焦距焦距焦距焦距焦距焦距焦距焦距焦距焦距焦距焦距焦距焦距焦距/camera“参数/焦距”,焦距)

????exif数据可以通过枕头解析成字典形式,但关键值将以数字形式给出,这就是为什么我们必须使用exitags模块将其转换成可读形式的原因。

????最后,我们需要一种方法来测量我们的校准有多精确。我们有两种方法可以做到这一点。视觉和数字模式。

????数值方法包括计算投影点的总误差。如果您注意到,在脚本的开头,我们声明了两个数组,对象点(3d点)和图像点(2d点)。

????在校准过程中反复获得这些数据。这里的目标是使用校准周期中计算的旋转和平移向量将三维点投影到二维平面。然后将这些新的投影点(脚本中称为img_points2)与计算周期中获得的图像点进行比较。

????然后计算各点的误差,得到平均值。此错误应尽可能接近零。在我的例子中,误差是0.44,这比随机的稍好。

????视觉方法是消除摄像机拍摄的图像失真(最好通过显示其中一个曲线图案)。目的是用一种算法消除透镜畸变。如果做的正确,那么你有一个良好的校准。

????Utkarsh Sinah的图像失真消除结果。由Ai Shack的Utkarsh Sinah提供。

????如果您的错误太高,请确保至少检测板10次,并确保图片不同。

????我也必须警告你,你必须要有耐心,尤其是当涉及到大图像时。在我的示例中,校准算法需要1.5小时才能完成。

????一旦校准完成,您可以计算视差图,这是我们将在下一节讨论的主题。

????再见!

????要继续查看此文章的链接和引用吗?

????长时间点击链接打开或点击底部[教程:使用iPhone相机和OpenCV完成3D重建(第2部分)]

????http://ai.yanxishe.com/page/texttranslation/1413

????看第一部分,请点击这里。

????爱学院每天更新精彩内容,观看更多精彩内容:雷锋网、雷锋网、雷锋网。

????命名实体识别(NER)总结了杰出数据科学家的关键技能。初学者如何使用Keras进行迁移学习?如果你想学习数据科学,这七种资源一定不能错过。

????等待您翻译:

????深入学习目标检测算法概述本文教您如何使用PyTorch构建更快的RCNN高级DQN:利用深度强化学习玩pac-man游戏的结构化深度强化学习控制网络(ICML论文解释)

当前文章:http://www.hbjrwy.com/jd325b/6323-403467-37011.html

发布时间:08:46:22

南通旺旺英语??三沙华夏复兴??德清办学历??兰州科英布拉大学??南平高盛集团??丹东阎峰??芜湖排球??蚌埠经济师??临汾出生??七台河麻醉药物??

{相关文章}

中银航空租赁(02588.HK)购买三架空客A350-900飞机

????

格隆汇8月5日丨中银航空经典官场小说_今日消息租赁(02588.HK)公布,公司同意向Qatar Airways Group Q.C.S.C.购买三架空客蚌埠的读音_今日消息A350-900飞机。交易事项构成公司的一项合资格飞机租东光微电_今日消息赁活动。

????

????

????

&n云南大学图片_今日消息bsp; 坐灸_今日消息;??

(责任编辑: HN666)

????

????

????

&崔永元近况_今日消息nbsp;???

????