




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第如何基于python實(shí)現(xiàn)單目三維重建詳解目錄一、單目三維重建概述二、實(shí)現(xiàn)過程(1)相機(jī)的標(biāo)定(2)圖像特征提取及匹配(3)三維重建三、結(jié)論四、代碼總結(jié)
一、單目三維重建概述
客觀世界的物體是三維的,而我們用攝像機(jī)獲取的圖像是二維的,但是我們可以通過二維圖像感知目標(biāo)的三維信息。三維重建技術(shù)是以一定的方式處理圖像進(jìn)而得到計(jì)算機(jī)能夠識(shí)別的三維信息,由此對(duì)目標(biāo)進(jìn)行分析。而單目三維重建則是根據(jù)單個(gè)攝像頭的運(yùn)動(dòng)來模擬雙目視覺,從而獲得物體在空間中的三維視覺信息,其中,單目即指單個(gè)攝像頭。
二、實(shí)現(xiàn)過程
在對(duì)物體進(jìn)行單目三維重建的過程中,相關(guān)運(yùn)行環(huán)境如下:
matplotlib3.3.4
numpy1.19.5
opencv-contrib-python6
opencv-python6
pillow8.2.0
python3.6.2
其重建主要包含以下步驟:
(1)相機(jī)的標(biāo)定
(2)圖像特征提取及匹配
(3)三維重建
接下來,我們來詳細(xì)看下每個(gè)步驟的具體實(shí)現(xiàn):
(1)相機(jī)的標(biāo)定
在我們?nèi)粘I钪杏泻芏嘞鄼C(jī),如手機(jī)上的相機(jī)、數(shù)碼相機(jī)及功能模塊型相機(jī)等等,每一個(gè)相機(jī)的參數(shù)都是不同的,即相機(jī)拍出的照片的分辨率、模式等。假設(shè)我們?cè)谶M(jìn)行物體三維重建的時(shí)候,事先并不知道我們相機(jī)的矩陣參數(shù),那么,我們就應(yīng)當(dāng)計(jì)算出相機(jī)的矩陣參數(shù),這一個(gè)步驟就叫做相機(jī)的標(biāo)定。相機(jī)標(biāo)定的相關(guān)原理我就不介紹了,網(wǎng)上很多人都講解的挺詳細(xì)的。其標(biāo)定的具體實(shí)現(xiàn)如下:
defcamera_calibration(ImagePath):
#循環(huán)中斷
criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,30,0.001)
#棋盤格尺寸(棋盤格的交叉點(diǎn)的個(gè)數(shù))
row=11
column=8
objpoint=np.zeros((row*column,3),np.float32)
objpoint[:,:2]=np.mgrid[0:row,0:column].T.reshape(-1,2)
objpoints=[]#3dpointinrealworldspace
imgpoints=[]#2dpointsinimageplane.
batch_images=glob.glob(ImagePath+'/*.jpg')
fori,fnameinenumerate(batch_images):
img=cv2.imread(batch_images[i])
imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#findchessboardcorners
ret,corners=cv2.findChessboardCorners(imgGray,(row,column),None)
#iffound,addobjectpoints,imagepoints(afterrefiningthem)
ifret:
objpoints.append(objpoint)
corners2=cv2.cornerSubPix(imgGray,corners,(11,11),(-1,-1),criteria)
imgpoints.append(corners2)
#Drawanddisplaythecorners
img=cv2.drawChessboardCorners(img,(row,column),corners2,ret)
cv2.imwrite('Checkerboard_Image/Temp_JPG/Temp_'+str(i)+'.jpg',img)
print("成功提取:",len(batch_images),"張圖片角點(diǎn)!")
ret,mtx,dist,rvecs,tvecs=cv2.calibrateCamera(objpoints,imgpoints,imgGray.shape[::-1],None,None)
其中,cv2.calibrateCamera函數(shù)求出的mtx矩陣即為K矩陣。
當(dāng)修改好相應(yīng)參數(shù)并完成標(biāo)定后,我們可以輸出棋盤格的角點(diǎn)圖片來看看是否已成功提取棋盤格的角點(diǎn),輸出角點(diǎn)圖如下:
圖1:棋盤格角點(diǎn)提取
(2)圖像特征提取及匹配
在整個(gè)三維重建的過程中,這一步是最為關(guān)鍵的,也是最為復(fù)雜的一步,圖片特征提取的好壞決定了你最后的重建效果。
在圖片特征點(diǎn)提取算法中,有三種算法較為常用,分別為:SIFT算法、SURF算法以及ORB算法。通過綜合分析對(duì)比,我們?cè)谶@一步中采取SURF算法來對(duì)圖片的特征點(diǎn)進(jìn)行提取。三種算法的特征點(diǎn)提取效果對(duì)比如果大家感興趣可以去網(wǎng)上搜來看下,在此就不逐一對(duì)比了。具體實(shí)現(xiàn)如下:
defepipolar_geometric(Images_Path,K):
IMG=glob.glob(Images_Path)
img1,img2=cv2.imread(IMG[0]),cv2.imread(IMG[1])
img1_gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
img2_gray=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
#InitiateSURFdetector
SURF=cv2.xfeatures2d_SURF.create()
#computekeypointdescriptions
keypoint1,descriptor1=SURF.detectAndCompute(img1_gray,None)
keypoint2,descriptor2=SURF.detectAndCompute(img2_gray,None)
print("角點(diǎn)數(shù)量:",len(keypoint1),len(keypoint2))
#Findpointmatches
bf=cv2.BFMatcher(cv2.NORM_L2,crossCheck=True)
matches=bf.match(descriptor1,descriptor2)
print("匹配點(diǎn)數(shù)量:",len(matches))
src_pts=np.asarray([keypoint1[m.queryIdx].ptforminmatches])
dst_pts=np.asarray([keypoint2[m.trainIdx].ptforminmatches])
#plot
knn_image=cv2.drawMatches(img1_gray,keypoint1,img2_gray,keypoint2,matches[:-1],None,flags=2)
image_=Image.fromarray(np.uint8(knn_image))
image_.save("MatchesImage.jpg")
#Constrainmatchestofithomography
retval,mask=cv2.findHomography(src_pts,dst_pts,cv2.RANSAC,100.0)
#Weselectonlyinlierpoints
points1=src_pts[mask.ravel()==1]
points2=dst_pts[mask.ravel()==1]
找到的特征點(diǎn)如下:
圖2:特征點(diǎn)提取
(3)三維重建
我們找到圖片的特征點(diǎn)并相互匹配后,則可以開始進(jìn)行三維重建了,具體實(shí)現(xiàn)如下:
points1=cart2hom(points1.T)
points2=cart2hom(points2.T)
#plot
fig,ax=plt.subplots(1,2)
ax[0].autoscale_view('tight')
ax[0].imshow(cv2.cvtColor(img1,cv2.COLOR_BGR2RGB))
ax[0].plot(points1[0],points1[1],'r.')
ax[1].autoscale_view('tight')
ax[1].imshow(cv2.cvtColor(img2,cv2.COLOR_BGR2RGB))
ax[1].plot(points2[0],points2[1],'r.')
plt.savefig('MatchesPoints.jpg')
fig.show()
points1n=np.dot(np.linalg.inv(K),points1)
points2n=np.dot(np.linalg.inv(K),points2)
E=compute_essential_normalized(points1n,points2n)
print('Computedessentialmatrix:',(-E/E[0][1]))
P1=np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0]])
P2s=compute_P_from_essential(E)
ind=-1
fori,P2inenumerate(P2s):
#Findthecorrectcameraparameters
d1=reconstruct_one_point(points1n[:,0],points2n[:,0],P1,P2)
#ConvertP2fromcameraviewtoworldview
P2_homogenous=np.linalg.inv(np.vstack([P2,[0,0,0,1]]))
d2=np.dot(P2_homogenous[:3,:4],d1)
ifd1[2]0andd2[2]0:
ind=i
P2=np.linalg.inv(np.vstack([P2s[ind],[0,0,0,1]]))[:3,:4]
Points3D=linear_triangulation(points1n,points2n,P1,P2)
fig=plt.figure()
fig.suptitle('3Dreconstructed',fontsize=16)
ax=fig.gca(projection='3d')
ax.plot(Points3D[0],Points3D[1],Points3D[2],'b.')
ax.set_xlabel('xaxis')
ax.set_ylabel('yaxis')
ax.set_zlabel('zaxis')
ax.view_init(elev=135,azim=90)
plt.savefig('Reconstruction.jpg')
plt.show()
其重建效果如下(效果一般):
圖3:三維重建
三、結(jié)論
從重建的結(jié)果來看,單目三維重建效果一般,我認(rèn)為可能與這幾方面因素有關(guān):
(1)圖片拍攝形式。如果是進(jìn)行單目三維重建任務(wù),在拍攝圖片時(shí)最好保持平行移動(dòng)相機(jī),且最好正面拍攝,即不要斜著拍或特異角度進(jìn)行拍攝;
(2)拍攝時(shí)周邊環(huán)境干擾。選取拍攝的地點(diǎn)最好保持單一,減少無關(guān)物體的干擾;
(3)拍攝光源問題。選取的拍照?qǐng)龅匾WC合適的亮度(具體情況要試才知道你們的光源是否達(dá)標(biāo)),還有就是移動(dòng)相機(jī)的時(shí)候也要保證前一時(shí)刻和此時(shí)刻的光源一致性。
其實(shí),單目三維重建的效果確實(shí)一般,就算將各方面情況都拉滿,可能得到的重建效果也不是特別好?;蛘呶覀兛梢钥紤]采用雙目三維重建,雙目三維重建效果肯定是要比單目的效果好的,在實(shí)現(xiàn)是也就麻煩一(億)點(diǎn)點(diǎn),哈哈。其實(shí)也沒有多太多的操作,主要就是整兩個(gè)相機(jī)拍攝和標(biāo)定兩個(gè)相機(jī)麻煩
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高溫合金材料生產(chǎn)線項(xiàng)目建筑工程方案
- 2025年核電普工考試題及答案
- 五金行業(yè)質(zhì)量檢驗(yàn)標(biāo)準(zhǔn)操作手冊(cè)
- 電信行業(yè)客戶關(guān)系管理系統(tǒng)需求文檔
- 全國(guó)高校專業(yè)代碼查詢與報(bào)考參考
- 公路橋梁維護(hù)技術(shù)實(shí)施方案
- 大學(xué)英語六級(jí)詞匯沖刺訓(xùn)練試卷 2025年
- 建筑工地腳手架安全加固技術(shù)規(guī)范
- 2025年重慶市初中學(xué)業(yè)水平暨高中招生考試數(shù)學(xué)模擬試題(B卷)
- 中國(guó)藝術(shù)品市場(chǎng)發(fā)展趨勢(shì)分析報(bào)告
- 風(fēng)電項(xiàng)目運(yùn)營(yíng)與維護(hù)管理方案
- 學(xué)習(xí)《水利水電工程生產(chǎn)安全重大事故隱患判定導(dǎo)則-SLT 842》課件
- 2025年秋招:招商銀行筆試真題及答案(可下載)
- 1.3 逐層分類細(xì)化分類結(jié)果【知識(shí)精研】二年級(jí)上冊(cè)數(shù)學(xué)(人教版2024)
- 甘肅省醫(yī)療建設(shè)管理辦法
- 計(jì)算機(jī)視覺(CV)工程師崗位面試問題及答案
- 胸痛的護(hù)理教學(xué)課件
- 學(xué)堂在線 積極心理學(xué)(上)厚德載物篇 章節(jié)測(cè)試答案
- 2025年輔警招聘考試題庫(kù)(+答案解析)
- 橋梁施工培訓(xùn)課件
- 社區(qū)護(hù)士培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論