আমি অব্যক্ত পদ্ধতিতে গভীরতার মানচিত্র পাওয়ার চেষ্টা করছি। আমি এসআইএফটি-র সাথে সংবাদদাতা পয়েন্টগুলি সন্ধান করে এবং তারপরে ব্যবহার করে মৌলিক ম্যাট্রিক্সটি অর্জন করতে পারি cv2.findFundamentalMat
। আমি তারপরে cv2.stereoRectifyUncalibrated
প্রতিটি চিত্রের জন্য হোমোগ্রাফি ম্যাট্রিক্স পেতে ব্যবহার করি । অবশেষে আমি cv2.warpPerspective
বৈষম্য সংশোধন এবং গণনা করতে ব্যবহার করি তবে এটি ভাল গভীরতার মানচিত্র তৈরি করে না। মানগুলি খুব বেশি তাই আমি ভাবছি যে আমাকে ব্যবহার করতে হবে warpPerspective
বা আমি যে হোমোগ্রাফি ম্যাট্রিক্স পেয়েছি তা থেকে কোনও ঘূর্ণন ম্যাট্রিক্স গণনা করতে হবে stereoRectifyUncalibrated
।
আমি হোমোগ্রাফি ম্যাট্রিক্স ক্ষেত্রে stereoRectifyUncalibrated
সংশোধন করার সাথে প্রাপ্ত ক্ষেত্রে প্রজেক্টিভ ম্যাট্রিক্স সম্পর্কে নিশ্চিত নই ।
কোডের একটি অংশ:
#Obtainment of the correspondent point with SIFT
sift = cv2.SIFT()
###find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(dst1,None)
kp2, des2 = sift.detectAndCompute(dst2,None)
###FLANN parameters
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
good = []
pts1 = []
pts2 = []
###ratio test as per Lowe's paper
for i,(m,n) in enumerate(matches):
if m.distance < 0.8*n.distance:
good.append(m)
pts2.append(kp2[m.trainIdx].pt)
pts1.append(kp1[m.queryIdx].pt)
pts1 = np.array(pts1)
pts2 = np.array(pts2)
#Computation of the fundamental matrix
F,mask= cv2.findFundamentalMat(pts1,pts2,cv2.FM_LMEDS)
# Obtainment of the rectification matrix and use of the warpPerspective to transform them...
pts1 = pts1[:,:][mask.ravel()==1]
pts2 = pts2[:,:][mask.ravel()==1]
pts1 = np.int32(pts1)
pts2 = np.int32(pts2)
p1fNew = pts1.reshape((pts1.shape[0] * 2, 1))
p2fNew = pts2.reshape((pts2.shape[0] * 2, 1))
retBool ,rectmat1, rectmat2 = cv2.stereoRectifyUncalibrated(p1fNew,p2fNew,F,(2048,2048))
dst11 = cv2.warpPerspective(dst1,rectmat1,(2048,2048))
dst22 = cv2.warpPerspective(dst2,rectmat2,(2048,2048))
#calculation of the disparity
stereo = cv2.StereoBM(cv2.STEREO_BM_BASIC_PRESET,ndisparities=16*10, SADWindowSize=9)
disp = stereo.compute(dst22.astype(uint8), dst11.astype(uint8)).astype(np.float32)
plt.imshow(disp);plt.colorbar();plt.clim(0,400)#;plt.show()
plt.savefig("0gauche.png")
#plot depth by using disparity focal length `C1[0,0]` from stereo calibration and `T[0]` the distance between cameras
plt.imshow(C1[0,0]*T[0]/(disp),cmap='hot');plt.clim(-0,500);plt.colorbar();plt.show()
নিরক্ষিত পদ্ধতিতে (এবং warpPerspective
) দিয়ে এখানে সংশোধিত ছবিগুলি দেওয়া হয়েছে :
ক্যালিব্রেটেড পদ্ধতির সাথে সংশোধিত ছবি এখানে দেওয়া হয়েছে:
আমি জানি না দুই ধরণের ছবির মধ্যে পার্থক্যটি কীভাবে গুরুত্বপূর্ণ। এবং ক্রমাঙ্কিত পদ্ধতির জন্য, এটি প্রান্তিক মনে হয় না।
অমীমাংসিত পদ্ধতি ব্যবহার করে বৈষম্যের মানচিত্র:
গভীরতার সাথে গণনা করা হয়: C1[0,0]*T[0]/(disp)
টির সাথে টি দিয়ে stereoCalibrate
। মানগুলি খুব বেশি।
------------ লিটার সম্পাদনা করুন ------------
আমি "স্টেরিও রেক্টিফাইস আনক্যালাইব্রেটেড" দিয়ে প্রাপ্ত হোমোগ্রাফি ম্যাট্রিক্সের সাথে পুনর্গঠন ম্যাট্রিক্স ( [দেভারনেয় ৯7] , [গার্সিয়া01] ) "মাউন্ট" করার চেষ্টা করেছি , তবে ফলাফল এখনও ভাল হয়নি। আমি কি এটি সঠিকভাবে করছি?
Y=np.arange(0,2048)
X=np.arange(0,2048)
(XX_field,YY_field)=np.meshgrid(X,Y)
#I mount the X, Y and disparity in a same 3D array
stock = np.concatenate((np.expand_dims(XX_field,2),np.expand_dims(YY_field,2)),axis=2)
XY_disp = np.concatenate((stock,np.expand_dims(disp,2)),axis=2)
XY_disp_reshape = XY_disp.reshape(XY_disp.shape[0]*XY_disp.shape[1],3)
Ts = np.hstack((np.zeros((3,3)),T_0)) #i use only the translations obtained with the rectified calibration...Is it correct?
# I establish the projective matrix with the homography matrix
P11 = np.dot(rectmat1,C1)
P1 = np.vstack((np.hstack((P11,np.zeros((3,1)))),np.zeros((1,4))))
P1[3,3] = 1
# P1 = np.dot(C1,np.hstack((np.identity(3),np.zeros((3,1)))))
P22 = np.dot(np.dot(rectmat2,C2),Ts)
P2 = np.vstack((P22,np.zeros((1,4))))
P2[3,3] = 1
lambda_t = cv2.norm(P1[0,:].T)/cv2.norm(P2[0,:].T)
#I define the reconstruction matrix
Q = np.zeros((4,4))
Q[0,:] = P1[0,:].T
Q[1,:] = P1[1,:].T
Q[2,:] = lambda_t*P2[1,:].T - P1[1,:].T
Q[3,:] = P1[2,:].T
#I do the calculation to get my 3D coordinates
test = []
for i in range(0,XY_disp_reshape.shape[0]):
a = np.dot(inv(Q),np.expand_dims(np.concatenate((XY_disp_reshape[i,:],np.ones((1))),axis=0),axis=1))
test.append(a)
test = np.asarray(test)
XYZ = test[:,:,0].reshape(XY_disp.shape[0],XY_disp.shape[1],4)