def write_ply(fn, verts, colors):
verts = verts.reshape(-1, 3)
colors = colors.reshape(-1, 3)
verts = np.hstack([verts, colors])
with open(fn, 'wb') as f:
f.write((ply_header % dict(vert_num=len(verts))).encode('utf-8'))
np.savetxt(f, verts, fmt='%f %f %f %d %d %d ')def main():
print('loading images...')
imgL = cv2.imread("/workspace/dataset/processed/left/000100.jpg", 0)
imgR = cv2.imread("/workspace/dataset/processed/right/000100.jpg", 0)
imgL = cv2.resize(imgL, (500, 500))
imgR = cv2.resize(imgR, (500, 500))
# disparity range is tuned for 'aloe' image pair
window_size = 3
min_disp = 16
num_disp = 112-min_disp
stereo = cv2.StereoSGBM_create(
minDisparity = min_disp,
numDisparities = num_disp,
blockSize = 16,
P1 = 8*3*window_size**2,
P2 = 32*3*window_size**2,
disp12MaxDiff = 1,
uniquenessRatio = 10,
speckleWindowSize = 100,
speckleRange = 32
)
print('computing disparity...')
disp = stereo.compute(imgL, imgR).astype(np.float32) / 16.0
print('generating 3d point cloud...',)
h, w = imgL.shape[:2]
f = 0.8*w # guess for focal length
Q = np.float32(
[[1, 0, 0, -0.5*w],
[0,-1, 0, 0.5*h], # turn points 180 deg around x-axis,
[0, 0, 0, -f], # so that y-axis looks up
[0, 0, 1, 0]]
)
points = cv2.reprojectImageTo3D(disp, Q)
colors = cv2.cvtColor(imgL, cv.COLOR_BGR2RGB)
mask = disp > disp.min()
out_points = points[mask]
out_colors = colors[mask]
out_fn = 'out.ply'
write_ply(out_fn, out_points, out_colors)
print('%s saved' % out_fn)
cv2.imshow('left', imgL)
cv2.imshow('disparity', (disp-min_disp)/num_disp)
cv2.waitKey()
print('Done')cv2.StereoSGBM_create ํ๋ผ๋ฏธํฐ
minDisparity- ๊ฐ๋ฅํ ์ต์ํ์ disparity ๊ฐ
- ๋ณดํต 0์ผ๋ก ์ค์ ํ์ง๋ง ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ด ์ด๋ฏธ์ง๋ฅผ ์ด๋์ํฌ ์ ์์ด์ ์๋ง๊ฒ ์กฐ์ ํด์ผํจ
numDisparities- Disparity ์ ๋ฒ์ ์ค์
- 16 ๋ฐฐ์์ฌ์ผ ํ๋ฉฐ, ์ต์ Disparity ์์ ์ต๋ Disparity ๊น์ง์ ๋ฒ์
blockSize-
๋งค์นญ์ ์ํํ ๋ ์ฌ์ฉํ๋ ๋ธ๋ก(ํจ์น)์ ํฌ๊ธฐ ์ง์
collapse: true - ๋ธ๋ก ๋งค์นญ - ๋ ์ด๋ฏธ์ง์์ ์ ์ฌํ ๋ธ๋ก์ ์ฐพ์ Disparity ๋ฅผ ๊ณ์ฐํ๋ ๊ณผ์ - ์์์๋ก ๋ ์ธ๋ฐํ ๋งค์นญ์ ๊ฐ๋ฅํ๊ฒ ํ์ง๋ง, ๋ ธ์ด์ฆ์ ๋ฏผ๊ฐํ ์ ์์ -
ํ์์ฌ์ผ ํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก 3~11 ์ฌ์ด์ ๊ฐ ์ฌ์ฉ
-
P1- Disparity map ์ ์์ฑํ ๋ ์ฌ์ฉ๋๋ Smoothness ๋ฅผ ์กฐ์ ํ๋ ํ๋ผ๋ฏธํฐ
- ์ผ๋ฐ์ ์ผ๋ก
8 * # of channels * blockSize ** 2๋ก ์ค์
P2- Smoothness ๋ฅผ ์กฐ์ ํ๋ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ
- ์ผ๋ฐ์ ์ผ๋ก
32 * # of channels * blockSize ** 2๋ก ์ค์
disp12MaxDiff- ์ข์ฐ Disparity map ์ ์ต๋ ํ์ฉ ์ฐจ์ด
- 0 ๋๋ ์์๋ก ์ค์ ํ ๊ฒฝ์ฐ ํด๋น ๊ฒ์ฌ ์๋ต
uniquenessRatio- 1๋ฑ ๋งค์น์ 2๋ฑ ๋งค์น๊ฐ์ ๋ง์ง์ ํผ์ผํธ๋ก ๋ํ๋ธ ๊ฐ
- ์ผ๋ฐ์ ์ผ๋ก 5~15 ์ฌ์ด ๊ฐ
speckleWindowSize- ์์ ์ ๋ ธ์ด์ฆ (Speckle) ๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํ ์ฐฝ์ ํฌ๊ธฐ
- 0์ผ๋ก ์ค์ ํ๋ฉด ํด๋น ๊ฒ์ฌ ์๋ต
- ์ผ๋ฐ์ ์ผ๋ก 5~200 ์ฌ์ด ๊ฐ
speckleRange- Speckle ์ ๊ฑฐ๋ฅผ ์ํ Disparity ๋ฒ์๋ฅผ ์ค์
- Speckle ๋ด ๋ชจ๋ Disparity ๋ ์ด ๊ฐ์ ์ด๊ณผํ์ง ์์์ผ ํจ
- 0์ผ๋ก ์ค์ ํ๋ฉด ํด๋น ๊ฒ์ฌ ์๋ต
- ์ผ๋ฐ์ ์ผ๋ก 1, 2
- Speckle ์ ๊ฑฐ๋ฅผ ์ํ Disparity ๋ฒ์๋ฅผ ์ค์
preFilterCap- ์ ๋ ฅ ์ด๋ฏธ์ง์ ์ฌ์ ํํฐ๋ง์ ์ํ ์ต๋ ๊ฐ
- ์ผ๋ฐ์ ์ผ๋ก 31
modecv2.STEREO_SGBM_MODE_SGBMcv2.STEREO_SGBM_MODE_HHcv2.STEREO_SGBM_MODE_SGBM_3WAYcv2.STEREO_SGBM_MODE_HH4