我试图用下面的代码显示的视差图来计算视差。我现在得到一个 如何限制所选像素位于x、y轴上的某个区域,以及所选像素的视差值。你知道吗
目前,当我打印的差距,我得到一个矩阵,我不能用来计算差距。我使用公式D=bf/D,其中D是距离,b是基线,f是焦距,D是视差。我知道基线,焦距和实际距离,但我不能得到正确的距离使用视差图。你知道吗
如何在代码中实现这一点?你知道吗
如果它有助于我有k矩阵从相机校准,但我不知道如何使用它在我的代码。你知道吗
from __future__ import print_function
import numpy as np
import cv2 as cv
from PIL import Image
from matplotlib import pyplot as plt
def main():
print('loading images...')
imgL = cv.imread('00004l.png')
imgR = cv.imread('00004r.png')
#Disparity settings
window_size = 5
min_disp = 16
num_disp = 112-min_disp
matcher_left = cv.StereoSGBM_create(
blockSize = 5,
numDisparities = num_disp,
minDisparity = min_disp,
P1 = 8*3*window_size**2,
P2 = 32*3*window_size**2,
disp12MaxDiff = 10,
uniquenessRatio = 10,
speckleWindowSize = 100,
speckleRange = 5,
preFilterCap=1,
mode=cv.STEREO_SGBM_MODE_SGBM_3WAY
)
matcher_right = cv.ximgproc.createRightMatcher(matcher_left)
# Filter
lmbda = 80000 #org 80000
sigma = 1.2 #org 1.2
visual_multiplier = 1.0
wls_filter = cv.ximgproc.createDisparityWLSFilter(matcher_left=matcher_left)
wls_filter.setLambda(lmbda)
wls_filter.setSigmaColor(sigma)
print('computing disparity...')
disp = matcher_left.compute(imgL, imgR).astype(np.float32) / 16
displ = matcher_left.compute(imgL, imgR).astype(np.float32) / 16
dispr = matcher_right.compute(imgR, imgL).astype(np.float32) / 16
displ = np.int16(displ)
dispr = np.int16(dispr)
filteredImg = wls_filter.filter(displ, imgL, None, dispr)
# Display the result
filteredImg = cv.normalize(src=filteredImg, dst=filteredImg, beta=0, alpha=255, norm_type=cv.NORM_MINMAX, dtype=cv.CV_8U);
filteredImg = np.uint8(filteredImg)
#print distance
b = 120
f = 510
D = b * f / d
print (disp)
print (D)
plt.imshow(filteredImg, 'gray')
plt.show()
cv.waitKey()
print('Done')
if __name__ == '__main__':
main()
cv.destroyAllWindows(1)
目前没有回答
相关问题 更多 >
编程相关推荐