丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能 正文
發(fā)私信給AI研習(xí)社-譯站
發(fā)送

0

教程:使用iPhone相機(jī)和openCV來完成3D重建(第二部分)

本文作者: AI研習(xí)社-譯站 2019-01-21 11:34
導(dǎo)語:歡迎來到關(guān)于立體重建三部曲的第2部。
教程:使用iPhone相機(jī)和openCV來完成3D重建(第二部分)

本文為 AI 研習(xí)社編譯的技術(shù)博客,原標(biāo)題 :

Tutorial: Stereo 3D reconstruction with openCV using an iPhone camera. Part II.

作者 | Omar Padierna

翻譯 | Disillusion、yaya牙牙、AIfresher

校對(duì) | Disillusion     審核 | 鄧普斯?杰弗     整理 | 菠蘿妹

原文鏈接:

https://medium.com/@omar.ps16/stereo-3d-reconstruction-with-opencv-using-an-iphone-camera-part-ii-77754b58bfe0

查看第一部分,請(qǐng)點(diǎn)擊:第一部分


教程:使用iPhone相機(jī)和openCV來完成3D重建(第二部分)

歡迎來到關(guān)于立體重建三部曲的第2部。在本節(jié)中,我們將討論如何校準(zhǔn)您的相機(jī)。

就像之前所提到的,照相機(jī)的鏡頭使你拍的照片失真。這在三維重建中是很麻煩的,所以我們需要糾正這個(gè)問題。在校正之前,我們需要知道我們所使用的相機(jī)的內(nèi)部參數(shù)。 

有時(shí)這些參數(shù)是未知的,但幸運(yùn)的是,OpenCV有一個(gè)專門針對(duì)這個(gè)的算法, 我們可以應(yīng)用該算法開始我們的3D重建。

在整個(gè)設(shè)計(jì)過程中,我們會(huì)用到Python 3.7.1, OpenCV 3.4.4. 還有一些python第三方庫: Numpy, Glob,tqdm和Pillow。因此,首先確保這些工具都已經(jīng)安裝好。

OpenCV中攝像機(jī)的標(biāo)定過程是讓計(jì)算機(jī)用棋盤圖形掃描一幅圖像,用不同的圖像多次識(shí)別內(nèi)部的角。 

教程:使用iPhone相機(jī)和openCV來完成3D重建(第二部分)

OpenCV提供的模型校準(zhǔn)示例  

大多數(shù)關(guān)于相機(jī)校準(zhǔn)的教程都是關(guān)于網(wǎng)絡(luò)攝像機(jī)或其他攝像機(jī)的,因此它們是為分析每一個(gè)單獨(dú)的幀(或多個(gè)幀)而定制的。

在我們的情況下,我們想校準(zhǔn)的是手機(jī)攝像頭,所以我們不能這樣做。為了讓計(jì)算機(jī)正確地校準(zhǔn)手機(jī)攝像頭,它需要幾個(gè)相同模式的例子。

在處理視頻流時(shí),我們可以分析用戶在攝像機(jī)前移動(dòng)時(shí)的每一幀,直到移動(dòng)的模型被多次檢測(cè)到(這通常是一個(gè)任意的測(cè)量,但一般是至少有10次檢測(cè))。

因?yàn)槲覀儾惶幚硪曨l流,所以我們必須為相同的模型拍多張照片。


  步驟1. 得到一個(gè)棋盤圖案.

前往這個(gè)鏈接,把這個(gè)棋盤圖案打印在一張紙上。為求完美結(jié)果,確保每個(gè)正方形都是30毫米長(zhǎng)(盡管這不是特別重要)。 


  步驟2. 把棋盤圖案掛在白色的墻上.

當(dāng)我運(yùn)行這個(gè)算法時(shí),我注意到背景中的東西越多,計(jì)算相機(jī)矩陣的時(shí)間就越長(zhǎng)。所以我用了一面白色的墻,把棋盤圖案貼在上面。確保它是完全平坦的。

教程:使用iPhone相機(jī)和openCV來完成3D重建(第二部分)

根據(jù)棋盤圖案重新裝飾房子  


  步驟3. 拍幾張圖案的照片.

這一步很重要,確保你拍的照片有很好的光照,并且圖案是從不同的角度拍攝的。還要確保圖案位于屏幕的不同部分。  

如果你只拍攝居中的照片,可能會(huì)發(fā)生錯(cuò)誤的校準(zhǔn)。確保你的照片有很多變化。  

教程:使用iPhone相機(jī)和openCV來完成3D重建(第二部分)

這是一個(gè)很好的關(guān)于如何拍攝圖案的例子。來自烏特卡什·西納。  

在Utkarsh Sinah的博客(AI shack)中可以找到關(guān)于相機(jī)校準(zhǔn)和如何捕捉圖案的豐富資源。如果你對(duì)C++校準(zhǔn)相機(jī)的方法感興趣,你應(yīng)該去看看。

需要指出的是,并不是所有的圖片都適合檢測(cè)模式。而你事先很難知道哪些照片會(huì)起作用,因此拍盡可能多的照片是一個(gè)好主意。我拍了64張。


  步驟4:讓我們開始代碼部分

一旦你拍了足夠多的照片,是時(shí)候?qū)懸恍┐a了(記住整個(gè)代碼都在這里)。第一步是選擇棋盤大小。雖然大小完全是任意的,但建議您選擇一個(gè)不對(duì)稱的大?。淳匦?,而不是正方形)。此處,我選擇了7X5。

import cv2
import numpy as np
import glob
from tqdm import tqdm
import PIL.ExifTags
import PIL.Image

#============================================
# Camera calibration
#============================================

#Define size of chessboard target.

chessboard_size = (7,5)

第二步是定義一個(gè)網(wǎng)格來存儲(chǔ)所有點(diǎn)。存儲(chǔ)的點(diǎn)需要是有序的,如:(0,0,0),(1,0,0),(2,0,0)….,(6,5,0)

#Define arrays to save detected points
obj_points = [] #3D points in real world space
img_points = [] #3D points in image plane

#Prepare grid and points to display

objp = np.zeros((np.prod(chessboard_size),3),dtype=np.float32)

objp[:,:2] = np.mgrid[0:chessboard_size[0],
0:chessboard_size[1]].T.reshape(-1,2)

因?yàn)槲覀円幚韼讉€(gè)圖像,所以我們可以使用glob迭代地打開它們。此外,由于OpenCv中的角點(diǎn)檢測(cè)算法需要一些時(shí)間來處理,因此我們可以用tqdm包裹我們的循環(huán),以了解距離處理上一個(gè)圖像已經(jīng)有多長(zhǎng)時(shí)間了,還剩下多少圖像沒有處理。

#read images

calibration_paths = glob.glob('./calibration_images/*')

#Iterate over images to find intrinsic matrix
for image_path in tqdm(calibration_paths):

#Load image
image = cv2.imread(image_path)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
print("Image loaded, Analizying...")
#find chessboard corners
ret,corners = cv2.findChessboardCorners(gray_image,
chessboard_size, None)

if ret == True:
 print("Chessboard detected!")
 print(image_path)
 #define criteria for subpixel accuracy
 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER,
30, 0.001)
 #refine corner location (to subpixel accuracy) based on criteria.
 cv2.cornerSubPix(gray_image, corners, (5,5), (-1,-1), criteria)
 obj_points.append(objp)
 img_points.append(corners)

在這個(gè)循環(huán)里,所有的魔法都在發(fā)生。加載圖像后,我們必須將先其轉(zhuǎn)換為灰度圖,然后使用findchessboardcorners算法。

此算法將返回檢測(cè)到的角點(diǎn)和一個(gè)名為ret的標(biāo)志而且如果算法能夠檢測(cè)到模式,則返回true。

為了提高標(biāo)定算法的精度,將角點(diǎn)位置細(xì)化到亞像素精度。在這種情況下,我們必須定義定位所需的標(biāo)準(zhǔn)。

我們采用了如果的標(biāo)準(zhǔn)定義:標(biāo)準(zhǔn)=(類型、迭代次數(shù)、精度)。在這個(gè)例子中,我們告訴算法我們關(guān)心迭代次數(shù)和精度(cv2.term_criteria_eps+cv2.term_criteria_max_iter),我們選擇了30次迭代,精度為0.001。

cv2.cornerSubPix是一種專注于重新定位點(diǎn)的算法。它接收?qǐng)D像、角點(diǎn)、窗口大小、零區(qū)域和實(shí)際條件作為輸入。窗口大小是搜索區(qū)域。

關(guān)注這個(gè)算法不是很重要,我只是決定對(duì)參數(shù)進(jìn)行評(píng)論,因?yàn)榇蠖鄶?shù)教程只是對(duì)這個(gè)算法進(jìn)行了潤(rùn)色。如果想要了解有關(guān)其工作原理的更多信息,請(qǐng)查看此處。

分析完所有圖片后,我們運(yùn)行cv2.calibratecamera算法。這是輸出相機(jī)參數(shù)的算法。該算法返回?cái)z像機(jī)矩陣(k)畸變系數(shù)(dist)和旋轉(zhuǎn)和平移矢量(rvecs和tvecs)。

#Calibrate camera
ret, K, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points,gray_image.shape[::-1], None, None)

#Save parameters into numpy file
np.save("./camera_params/ret", ret)
np.save("./camera_params/K", K)
np.save("./camera_params/dist", dist)
np.save("./camera_params/rvecs", rvecs)
np.save("./camera_params/tvecs", tvecs)

注意,我們將這些值保存到不同的numpy文件中。我之所以選擇這樣做是因?yàn)閷?shí)用性。由于運(yùn)行這個(gè)腳本需要一段時(shí)間,所以每次我們想要重建某個(gè)東西時(shí)都要執(zhí)行它是不方便的(也是不必要的)。

因此,只需將所有內(nèi)容保存到一個(gè)numpy文件中,并在以后加載就更容易了。為什么是numpy而不是xml或json?因?yàn)閷?duì)于numpy文件,不需要解析數(shù)據(jù)。

要進(jìn)行三維重建,我們真正關(guān)心的是3個(gè)參數(shù):相機(jī)矩陣、畸變系數(shù)和焦距。焦距可以從相機(jī)矩陣中推導(dǎo)出來。

盡管如此,為了學(xué)習(xí),我決定決定從EXIF數(shù)據(jù)中包含的圖像中獲取焦距信息。相機(jī)手機(jī)的焦距信息是保存在EXIF數(shù)據(jù)中的。

#Get exif data in order to get focal length.
exif_img = PIL.Image.open(calibration_paths[0])

exif_data = {
PIL.ExifTags.TAGS[k]:v
for k, v in exif_img._getexif().items()
if k in PIL.ExifTags.TAGS}

#Get focal length in tuple form
focal_length_exif = exif_data['FocalLength']

#Get focal length in decimal form
focal_length = focal_length_exif[0]/focal_length_exif[1]

np.save("./camera_params/FocalLength", focal_length)

Exif 數(shù)據(jù)可以用pillow解析成字典形式,但是,鍵值將以數(shù)字形式給出,這也是我們必須使用ExifTags模塊才能將其轉(zhuǎn)換為可讀形式的原因。

最后,我們需要有一種方法來測(cè)量我們的校準(zhǔn)有多精確。我們有兩種方法可以做到這一點(diǎn)。視覺方式和數(shù)字方式。

數(shù)值方法包括計(jì)算投影點(diǎn)的總誤差。如果您注意到,在腳本的開頭,我們聲明了兩個(gè)數(shù)組,對(duì)象點(diǎn)(3d點(diǎn))和圖像點(diǎn)(2d點(diǎn))。

這些是在校準(zhǔn)過程中反復(fù)獲得的。這里的目標(biāo)是使用在校準(zhǔn)循環(huán)中計(jì)算的旋轉(zhuǎn)和平移向量將三維點(diǎn)投影到二維平面中。然后將這些新投影點(diǎn)(腳本中稱為img_points2)與在計(jì)算循環(huán)中獲得的圖像點(diǎn)進(jìn)行比較。

然后我們計(jì)算每個(gè)點(diǎn)的誤差,得到平均值。此錯(cuò)誤應(yīng)盡可能接近0。在我的例子中,誤差是0.44,比隨機(jī)稍好。

視覺上的方法是對(duì)相機(jī)拍攝的圖像(最好是顯示一些曲線扭曲的模式之一)做畫面扭曲消除。目標(biāo)是用算法消除透鏡畸變,如果它做得正確,那么你就有了一個(gè)好的標(biāo)定。

教程:使用iPhone相機(jī)和openCV來完成3D重建(第二部分)

Utkarsh Sinah做的畫面扭曲消除結(jié)果。由Ai Shack的Utkarsh Sinah提供。

如果您的錯(cuò)誤太高,請(qǐng)確保您檢測(cè)到棋盤至少10次,并確保圖片是不同的。

我也必須警告你,你必須要有耐心,尤其是當(dāng)涉及到大圖像時(shí)。在我的例子中,校準(zhǔn)算法需要1.5小時(shí)才能完成。

一旦標(biāo)定完成,您就可以計(jì)算出視差圖了,這是我們將在下一部分討論的主題。

再見!


想要繼續(xù)查看該篇文章相關(guān)鏈接和參考文獻(xiàn)?

長(zhǎng)按鏈接點(diǎn)擊打開或點(diǎn)擊底部【教程:使用iPhone相機(jī)和openCV來完成3D重建(第二部分)】:

https://ai.yanxishe.com/page/TextTranslation/1413

查看第一部分,請(qǐng)點(diǎn)這里

AI研習(xí)社每日更新精彩內(nèi)容,觀看更多精彩內(nèi)容:雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)

命名實(shí)體識(shí)別(NER)綜述

杰出數(shù)據(jù)科學(xué)家的關(guān)鍵技能是什么?

初學(xué)者怎樣使用Keras進(jìn)行遷移學(xué)習(xí)

如果你想學(xué)數(shù)據(jù)科學(xué),這 7 類資源千萬不能錯(cuò)過


等你來譯:

深度學(xué)習(xí)目標(biāo)檢測(cè)算法綜述

一文教你如何用PyTorch構(gòu)建 Faster RCNN

高級(jí)DQNs:利用深度強(qiáng)化學(xué)習(xí)玩吃豆人游戲

用于深度強(qiáng)化學(xué)習(xí)的結(jié)構(gòu)化控制網(wǎng)絡(luò) (ICML 論文講解)


雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

教程:使用iPhone相機(jī)和openCV來完成3D重建(第二部分)

分享:
相關(guān)文章

知情人士

AI研習(xí)社(yanxishe.com)譯站頻道,傳播前沿人工智能知識(shí),讓語言不再成為學(xué)習(xí)知識(shí)的門檻。(原雷鋒字幕組)
當(dāng)月熱門文章
最新文章
請(qǐng)?zhí)顚懮暾?qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說