OpenCV - Bản đồ độ sâu từ Hệ thống âm thanh nổi chưa được hiệu chỉnh


175

Tôi đang cố lấy bản đồ độ sâu bằng một phương pháp chưa được hiệu chỉnh. Tôi có thể có được ma trận cơ bản bằng cách tìm các điểm tương ứng với SIFT và sau đó sử dụng cv2.findFundamentalMat. Sau đó, tôi sử dụng cv2.stereoRectifyUncalibratedđể lấy ma trận đồng nhất cho mỗi hình ảnh. Cuối cùng, tôi sử dụng cv2.warpPerspectiveđể điều chỉnh và tính toán sự chênh lệch, nhưng điều này không tạo ra một bản đồ độ sâu tốt. Các giá trị này rất cao vì vậy tôi đang tự hỏi liệu tôi có phải sử dụng warpPerspectivehay không hoặc liệu tôi có phải tính toán một ma trận xoay từ các ma trận đồng nhất mà tôi đã có stereoRectifyUncalibrated.

Tôi không chắc về ma trận xạ ảnh với trường hợp của ma trận đồng nhất thu được với stereoRectifyUncalibratedđể chỉnh lưu.

Một phần của mã:

#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()

Dưới đây là các hình ảnh đã được chỉnh sửa bằng phương pháp chưa hiệu chỉnh (và warpPerspective):

nhập mô tả hình ảnh ở đây

Dưới đây là những hình ảnh đã được hiệu chỉnh với phương pháp đã được hiệu chỉnh:

nhập mô tả hình ảnh ở đây

Tôi không biết làm thế nào sự khác biệt là rất quan trọng giữa hai loại hình ảnh. Và đối với phương pháp đã hiệu chỉnh, nó dường như không được căn chỉnh.

Bản đồ chênh lệch sử dụng phương pháp chưa hiệu chỉnh:

nhập mô tả hình ảnh ở đây

Độ sâu được tính với: C1[0,0]*T[0]/(disp) với T từ stereoCalibrate. Các giá trị rất cao.

------------ CHỈNH SỬA SAU ------------

Tôi đã cố gắng "gắn" ma trận tái tạo ( [Devernay97] , [Garcia01] ) với ma trận đồng nhất thu được với "stereoRectifyUncalibrated", nhưng kết quả vẫn không tốt. Tôi đang làm điều này một cách chính xác?

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)

3
Bạn đã xem chất lượng của các trận đấu chưa? Với hình ảnh, đây có thể là một vấn đề. Sẽ hữu ích nếu bạn đăng hình ảnh gốc.
yhenon

Đối với thực tế là hiệu chuẩn dường như không căn chỉnh hình ảnh, có thể là do các máy ảnh được xếp chồng lên nhau theo chiều dọc (đây là trường hợp của tập dữ liệu mview của Middlebury). Bạn có thể thử vẽ một số epilines trước và sau khi cải chính để xem bạn có thấy cải thiện không.
Gabriel Devillers,

31
Bạn vẫn quan tâm đến câu trả lời cho câu hỏi này? Nếu vậy, bạn có thể đăng liên kết đến các tệp dữ liệu thô của mình (hình ảnh) và các dòng mã nơi bạn đọc chúng không? Và vui lòng bao gồm mô tả không có biệt ngữ về dữ liệu và bất kỳ thông số nào khác mà bạn có, bao gồm cả hình học và khoảng cách, ngay cả khi gần đúng.
DrM

2
Vui lòng đăng các hình ảnh thô hoặc một liên kết đến chúng.
DrM

1
Thứ nhất: các phương pháp chưa hiệu chuẩn luôn kém hoàn hảo hơn các phương pháp đã hiệu chuẩn (với việc hiệu chuẩn tốt). Thứ hai: StereoBMnó không phải là thuật toán đối sánh tốt nhất ... Bạn có thể tìm thấy một số cải tiến khi sử dụng StereoSGBM. Tôi muốn trợ giúp nhưng tôi không hiểu hết câu hỏi của bạn ...
decadenza

Câu trả lời:


12

TLDR; Sử dụng StereoSGBM (Đối sánh khối bán toàn cầu) để có hình ảnh với các cạnh mịn hơn và sử dụng một số bộ lọc bài đăng nếu bạn muốn nó vẫn mượt mà hơn

OP không cung cấp hình ảnh gốc, vì vậy tôi đang sử dụng Tsukubatừ tập dữ liệu Middlebury .

Kết quả với StereoBM thông thường

stereobm

Kết quả với StereoSGBM (đã điều chỉnh)

stereosgbm

Kết quả tốt nhất tôi có thể tìm thấy trong sách báo

nhập mô tả hình ảnh ở đây

Xem ấn phẩm tại đây để biết chi tiết.

Ví dụ về lọc bài đăng (xem liên kết bên dưới)

ví dụ về bộ lọc bài đăng

Lý thuyết / Các cân nhắc khác từ câu hỏi của OP

Các vùng đen lớn của các hình ảnh đã chỉnh sửa đã hiệu chỉnh của bạn sẽ khiến tôi tin rằng đối với những hình ảnh đó, việc hiệu chỉnh không được thực hiện tốt lắm. Có nhiều lý do có thể xảy ra, có thể là thiết lập vật lý, có thể ánh sáng khi bạn hiệu chỉnh, v.v., nhưng có rất nhiều hướng dẫn hiệu chỉnh máy ảnh cho điều đó và tôi hiểu rằng bạn đang yêu cầu một cách để có được bản đồ độ sâu tốt hơn từ một thiết lập chưa được hiệu chỉnh (điều này không rõ ràng 100%, nhưng tiêu đề dường như hỗ trợ điều này và tôi nghĩ đó là những gì mọi người đến đây để cố gắng tìm kiếm).

Cách tiếp cận cơ bản của bạn là đúng, nhưng kết quả chắc chắn có thể được cải thiện. Hình thức lập bản đồ độ sâu này không nằm trong số những hình thức tạo ra bản đồ chất lượng cao nhất (đặc biệt là không được hiệu chỉnh). Cải tiến lớn nhất có thể sẽ đến từ việc sử dụng một thuật toán kết hợp âm thanh nổi khác. Ánh sáng cũng có thể có ảnh hưởng đáng kể. Hình ảnh bên phải (ít nhất là bằng mắt thường của tôi) có vẻ kém ánh sáng hơn có thể gây trở ngại cho việc tái tạo. Trước tiên, bạn có thể thử làm sáng nó bằng mức độ khác hoặc thu thập các hình ảnh mới nếu có thể. Từ đây trở đi, tôi sẽ cho rằng bạn không có quyền truy cập vào các máy ảnh ban đầu, vì vậy tôi sẽ cân nhắc việc thu thập các hình ảnh mới, thay đổi thiết lập hoặc thực hiện hiệu chỉnh nằm ngoài phạm vi. (Nếu bạn có quyền truy cập vào thiết lập và camera,

Bạn đã sử dụng StereoBMđể tính toán sự chênh lệch của mình (bản đồ độ sâu) hoạt động, nhưng StereoSGBMphù hợp hơn nhiều cho ứng dụng này (nó xử lý các cạnh mượt mà hơn). Bạn có thể thấy sự khác biệt bên dưới.

Bài viết này giải thích sự khác biệt sâu hơn:

Đối sánh khối tập trung vào hình ảnh có kết cấu cao (ví dụ như hình ảnh một cái cây) và đối sánh khối bán toàn cục sẽ tập trung vào đối sánh cấp độ pixel phụ và ảnh có kết cấu mịn hơn (ví dụ như hình ảnh của một hành lang).

Nếu không có bất kỳ thông số máy ảnh nội tại rõ ràng nào, chi tiết cụ thể về thiết lập máy ảnh (như khoảng cách tiêu cự, khoảng cách giữa các máy ảnh, khoảng cách đến chủ thể, v.v.), một kích thước đã biết trong hình ảnh hoặc chuyển động (để sử dụng cấu trúc từ chuyển động ), bạn có thể chỉ có được tái tạo 3D cho đến một chuyển đổi xạ ảnh; bạn sẽ không có cảm giác về tỷ lệ hoặc cũng không nhất thiết phải xoay, nhưng bạn vẫn có thể tạo bản đồ độ sâu tương đối. Bạn có thể sẽ bị một số thùng và các biến dạng khác có thể được loại bỏ bằng hiệu chỉnh máy ảnh thích hợp, nhưng bạn có thể nhận được kết quả hợp lý mà không cần đến nó miễn là máy ảnh không quá khủng (hệ thống ống kính không quá méo) và được thiết lập đẹp gần với cấu hình chuẩn(về cơ bản có nghĩa là chúng được định hướng sao cho các trục quang học của chúng càng gần song song càng tốt và trường nhìn của chúng trùng nhau đủ). Tuy nhiên, điều này dường như không phải là vấn đề OPs vì anh ấy đã quản lý để có được các hình ảnh được chỉnh sửa ổn định bằng phương pháp chưa hiệu chỉnh.

Thủ tục cơ bản

  1. Tìm ít nhất 5 điểm đối sánh tốt trong cả hai hình ảnh mà bạn có thể sử dụng để tính Ma trận cơ bản (bạn có thể sử dụng bất kỳ trình dò ​​và đối sánh nào bạn thích, tôi đã giữ FLANN nhưng đã sử dụng ORB để phát hiện vì SIFT không có trong phiên bản chính của OpenCV cho 4.2.0)
  2. Tính toán ma trận cơ bản, F, với findFundamentalMat
  3. Hủy phân loại hình ảnh của bạn với stereoRectifyUncalibratedwarpPerspective
  4. Tính toán sự chênh lệch (Bản đồ độ sâu) với StereoSGBM

Kết quả tốt hơn nhiều:

Đối sánh với ORB và FLANN

Diêm

Hình ảnh không bị biến dạng (trái, rồi phải)

trái không bị biến dạng
quyền không bị biến dạng

Khác biệt

StereoBM

Kết quả này trông giống với các vấn đề OP (lốm đốm, khoảng trống, độ sâu sai ở một số khu vực).

stereobm

StereoSGBM (đã điều chỉnh)

Kết quả này trông tốt hơn nhiều và sử dụng phương pháp gần giống với OP, trừ đi phép tính chênh lệch cuối cùng, khiến tôi nghĩ OP sẽ thấy những cải tiến tương tự trên hình ảnh của mình, nếu chúng được cung cấp.

stereosgbm

Lọc bài viết

một bài viết hay về điều này trong tài liệu OpenCV. Tôi khuyên bạn nên xem nó nếu bạn cần bản đồ thực sự mượt mà.

Các ảnh ví dụ ở trên là khung 1 từ cảnh ambush_2trong Bộ dữ liệu MPI Sintel .

ví dụ về bộ lọc bài đăng

Mã đầy đủ (Đã kiểm tra trên OpenCV 4.2.0):

import cv2
import numpy as np
import matplotlib.pyplot as plt

imgL = cv2.imread("tsukuba_l.png", cv2.IMREAD_GRAYSCALE)  # left image
imgR = cv2.imread("tsukuba_r.png", cv2.IMREAD_GRAYSCALE)  # right image


def get_keypoints_and_descriptors(imgL, imgR):
    """Use ORB detector and FLANN matcher to get keypoints, descritpors,
    and corresponding matches that will be good for computing
    homography.
    """
    orb = cv2.ORB_create()
    kp1, des1 = orb.detectAndCompute(imgL, None)
    kp2, des2 = orb.detectAndCompute(imgR, None)

    ############## Using FLANN matcher ##############
    # Each keypoint of the first image is matched with a number of
    # keypoints from the second image. k=2 means keep the 2 best matches
    # for each keypoint (best matches = the ones with the smallest
    # distance measurement).
    FLANN_INDEX_LSH = 6
    index_params = dict(
        algorithm=FLANN_INDEX_LSH,
        table_number=6,  # 12
        key_size=12,  # 20
        multi_probe_level=1,
    )  # 2
    search_params = dict(checks=50)  # or pass empty dictionary
    flann = cv2.FlannBasedMatcher(index_params, search_params)
    flann_match_pairs = flann.knnMatch(des1, des2, k=2)
    return kp1, des1, kp2, des2, flann_match_pairs


def lowes_ratio_test(matches, ratio_threshold=0.6):
    """Filter matches using the Lowe's ratio test.

    The ratio test checks if matches are ambiguous and should be
    removed by checking that the two distances are sufficiently
    different. If they are not, then the match at that keypoint is
    ignored.

    /programming/51197091/how-does-the-lowes-ratio-test-work
    """
    filtered_matches = []
    for m, n in matches:
        if m.distance < ratio_threshold * n.distance:
            filtered_matches.append(m)
    return filtered_matches


def draw_matches(imgL, imgR, kp1, des1, kp2, des2, flann_match_pairs):
    """Draw the first 8 mathces between the left and right images."""
    # https://docs.opencv.org/4.2.0/d4/d5d/group__features2d__draw.html
    # https://docs.opencv.org/2.4/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html
    img = cv2.drawMatches(
        imgL,
        kp1,
        imgR,
        kp2,
        flann_match_pairs[:8],
        None,
        flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS,
    )
    cv2.imshow("Matches", img)
    cv2.imwrite("ORB_FLANN_Matches.png", img)
    cv2.waitKey(0)


def compute_fundamental_matrix(matches, kp1, kp2, method=cv2.FM_RANSAC):
    """Use the set of good mathces to estimate the Fundamental Matrix.

    See  https://en.wikipedia.org/wiki/Eight-point_algorithm#The_normalized_eight-point_algorithm
    for more info.
    """
    pts1, pts2 = [], []
    fundamental_matrix, inliers = None, None
    for m in matches[:8]:
        pts1.append(kp1[m.queryIdx].pt)
        pts2.append(kp2[m.trainIdx].pt)
    if pts1 and pts2:
        # You can play with the Threshold and confidence values here
        # until you get something that gives you reasonable results. I
        # used the defaults
        fundamental_matrix, inliers = cv2.findFundamentalMat(
            np.float32(pts1),
            np.float32(pts2),
            method=method,
            # ransacReprojThreshold=3,
            # confidence=0.99,
        )
    return fundamental_matrix, inliers, pts1, pts2


############## Find good keypoints to use ##############
kp1, des1, kp2, des2, flann_match_pairs = get_keypoints_and_descriptors(imgL, imgR)
good_matches = lowes_ratio_test(flann_match_pairs, 0.2)
draw_matches(imgL, imgR, kp1, des1, kp2, des2, good_matches)


############## Compute Fundamental Matrix ##############
F, I, points1, points2 = compute_fundamental_matrix(good_matches, kp1, kp2)


############## Stereo rectify uncalibrated ##############
h1, w1 = imgL.shape
h2, w2 = imgR.shape
thresh = 0
_, H1, H2 = cv2.stereoRectifyUncalibrated(
    np.float32(points1), np.float32(points2), F, imgSize=(w1, h1), threshold=thresh,
)

############## Undistort (Rectify) ##############
imgL_undistorted = cv2.warpPerspective(imgL, H1, (w1, h1))
imgR_undistorted = cv2.warpPerspective(imgR, H2, (w2, h2))
cv2.imwrite("undistorted_L.png", imgL_undistorted)
cv2.imwrite("undistorted_R.png", imgR_undistorted)

############## Calculate Disparity (Depth Map) ##############

# Using StereoBM
stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)
disparity_BM = stereo.compute(imgL_undistorted, imgR_undistorted)
plt.imshow(disparity_BM, "gray")
plt.colorbar()
plt.show()

# Using StereoSGBM
# Set disparity parameters. Note: disparity range is tuned according to
#  specific parameters obtained through trial and error.
win_size = 2
min_disp = -4
max_disp = 9
num_disp = max_disp - min_disp  # Needs to be divisible by 16
stereo = cv2.StereoSGBM_create(
    minDisparity=min_disp,
    numDisparities=num_disp,
    blockSize=5,
    uniquenessRatio=5,
    speckleWindowSize=5,
    speckleRange=5,
    disp12MaxDiff=2,
    P1=8 * 3 * win_size ** 2,
    P2=32 * 3 * win_size ** 2,
)
disparity_SGBM = stereo.compute(imgL_undistorted, imgR_undistorted)
plt.imshow(disparity_SGBM, "gray")
plt.colorbar()
plt.show()


6

Có thể có một số vấn đề có thể xảy ra dẫn đến chất lượng thấp Depth ChannelDisparity Channelđiều gì dẫn chúng ta đến chuỗi âm thanh nổi chất lượng thấp. Dưới đây là 6 trong số những vấn đề đó:

Vấn đề có thể xảy ra tôi

  • Công thức không đầy đủ

Như một từ uncalibratedngụ ý, stereoRectifyUncalibratedphương thức instance sẽ tính toán các phép biến đổi chỉnh lưu cho bạn, trong trường hợp bạn không biết hoặc không thể biết các thông số nội tại của cặp âm thanh nổi và vị trí tương đối của nó trong môi trường.

cv.StereoRectifyUncalibrated(pts1, pts2, fm, imgSize, rhm1, rhm2, thres)

Ở đâu:

# pts1    –> an array of feature points in a first camera
# pts2    –> an array of feature points in a first camera
# fm      –> input fundamental matrix
# imgSize -> size of an image
# rhm1    -> output rectification homography matrix for a first image
# rhm2    -> output rectification homography matrix for a second image
# thres   –> optional threshold used to filter out outliers

Và phương pháp của bạn trông theo cách này:

cv2.StereoRectifyUncalibrated(p1fNew, p2fNew, F, (2048, 2048))

Vì vậy, bạn không đưa vào tài khoản ba thông số: rhm1, rhm2thres. Nếu một threshold > 0, tất cả các cặp điểm đó không tuân thủ một epipolar geometry bị từ chối trước khi tính toán homographies. Nếu không, tất cả các điểm được coi là nội số. Công thức này trông như thế này:

(pts2[i]^t * fm * pts1[i]) > thres

# t   –> translation vector between coordinate systems of cameras

Vì vậy, tôi tin rằng sự thiếu chính xác trực quan có thể xuất hiện do tính toán của công thức không đầy đủ.

Bạn có thể đọc Hiệu chỉnh máy ảnh và Tái tạo 3D trên tài nguyên chính thức.


Sự cố có thể xảy ra II

  • Khoảng cách giữa các trục

Một mạnh mẽ interaxial distancegiữa ống kính máy ảnh trái và phải phải not greater than 200 mm. Khi interaxial distancelớn hơn interocularkhoảng cách, hiệu ứng được gọi là hyperstereoscopyhoặc hyperdivergencevà dẫn đến không chỉ phóng đại chiều sâu trong cảnh mà còn gây bất tiện về thể chất cho người xem. Đọc Sách trắng về kỹ thuật làm phim lập thể của Autodesk để tìm hiểu thêm về chủ đề này.

nhập mô tả hình ảnh ở đây


Sự cố có thể xảy ra III

  • Chế độ camera song song so với Toed-In

Hình ảnh không chính xác dẫn đến Disparity Mapcó thể xảy ra do tính toán Chế độ máy ảnh không chính xác. Nhiều nhà lập thể thích Toe-In camera modenhưng Pixar, chẳng hạn, thích hơn Parallel camera mode.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


Sự cố có thể xảy ra IV

  • Căn chỉnh dọc

Trong chế độ xem lập thể, nếu xảy ra sự thay đổi theo chiều dọc (ngay cả khi một trong các chế độ xem được dịch chuyển lên 1 mm) thì điều đó sẽ làm hỏng trải nghiệm âm thanh nổi mạnh mẽ. Vì vậy, trước khi tạo, Disparity Mapbạn phải đảm bảo rằng các chế độ xem trái và phải của cặp âm thanh nổi của bạn được căn chỉnh phù hợp. Hãy xem Technicolor Sterreoscopic Whitepaper về 15 vấn đề thường gặp trong âm thanh nổi.

Ma trận chỉnh lưu âm thanh nổi:

   ┌                  ┐
   |  f   0   cx  tx  |
   |  0   f   cy  ty  |   # use "ty" value to fix vertical shift in one image
   |  0   0   1   0   |
   └                  ┘

Đây là một StereoRectifyphương pháp:

cv.StereoRectify(cameraMatrix1, cameraMatrix2, distCoeffs1, distCoeffs2, imageSize, R, T, R1, R2, P1, P2, Q=None, flags=CV_CALIB_ZERO_DISPARITY, alpha=-1, newImageSize=(0, 0)) -> (roi1, roi2)


Vấn đề có thể xảy ra V

  • Biến dạng ống kính

Biến dạng ống kính là chủ đề rất quan trọng trong bố cục âm thanh nổi. Trước khi tạo, Disparity Mapbạn cần hủy phân loại lượt xem trái và phải, sau khi tạo kênh chênh lệch, rồi phân loại lại cả hai lượt xem.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


Vấn đề có thể xảy ra VI

  • Kênh Độ sâu chất lượng thấp không có khử răng cưa

Để tạo chất lượng cao, Disparity Mapbạn cần trái và phải Depth Channelsphải được tạo trước. Khi bạn làm việc trong gói 3D, bạn có thể hiển thị Kênh Độ sâu chất lượng cao (với các cạnh sắc nét) chỉ với một cú nhấp chuột. Nhưng việc tạo kênh độ sâu chất lượng cao từ chuỗi video không dễ dàng vì cặp âm thanh nổi phải di chuyển trong môi trường của bạn để tạo ra dữ liệu ban đầu cho thuật toán độ sâu từ chuyển động trong tương lai. Nếu không có chuyển động trong khung hình, kênh độ sâu sẽ cực kỳ kém.

nhập mô tả hình ảnh ở đây

Ngoài ra, Depthbản thân kênh còn có một nhược điểm nữa - các cạnh của nó không khớp với các cạnh của RGB vì nó không có khử răng cưa .

nhập mô tả hình ảnh ở đây


Đoạn mã kênh chênh lệch:

Ở đây tôi muốn trình bày một cách tiếp cận nhanh để tạo ra Disparity Map:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

imageLeft = cv.imread('paris_left.png', 0)
imageRight = cv.imread('paris_right.png', 0)
stereo = cv.StereoBM_create(numDisparities=16, blockSize=15)
disparity = stereo.compute(imageLeft, imageRight)
plt.imshow(disparity, 'gray')
plt.show()

nhập mô tả hình ảnh ở đây


Làm thế nào bạn tạo ra những hình ảnh cuối cùng? Bạn có mã ví dụ tôi có thể thử không?
Matthew Salvatore Viglione

Những hình ảnh này được tạo ra trong phần mềm tổng hợp. Không có mã mẫu nào cho chúng.
Andy Fedoroff

1
Ah, điều đó có ý nghĩa hơn. Tôi chưa bao giờ thấy một bản đồ độ sâu nào sạch sẽ với một cặp âm thanh nổi đơn giản trong OpenCV (đặc biệt là không hiệu chỉnh)
Matthew Salvatore Viglione
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.