如何基于python實(shí)現(xiàn)單目三維重建詳解_第1頁(yè)
如何基于python實(shí)現(xiàn)單目三維重建詳解_第2頁(yè)
如何基于python實(shí)現(xiàn)單目三維重建詳解_第3頁(yè)
如何基于python實(shí)現(xiàn)單目三維重建詳解_第4頁(yè)
如何基于python實(shí)現(xiàn)單目三維重建詳解_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論