OpenCV - Uncalibrated स्टीरियो सिस्टम से गहराई का नक्शा


174

मैं एक अनसाल्टेड विधि के साथ एक गहराई नक्शा प्राप्त करने की कोशिश कर रहा हूं। मैं SIFT के साथ संवाददाता बिंदुओं का पता लगाकर और फिर उपयोग करके मूलभूत मैट्रिक्स प्राप्त कर सकता हूं 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। मान बहुत अधिक हैं।

------------ EDIT LATER ------------

मैंने पुनर्निर्माण स्टीरियो मैट्रिक्स ( [Devernay97] , [गार्सिया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)

3
क्या आपने मैचों की गुणवत्ता पर ध्यान दिया है? छवि को देखते हुए यह एक मुद्दा हो सकता है। यदि आप मूल छवि पोस्ट करते हैं तो यह मदद करेगा।
योनन

इस तथ्य के लिए कि अंशांकन चित्रों को संरेखित नहीं करता है, शायद यह इसलिए है क्योंकि कैमरे लंबवत रूप से स्टैक्ड थे (यह मिडिलबरी के mview डेटासेट के लिए मामला है)। सुधार करने से पहले और सुधार के बाद आप कुछ एपिलाइनों को खींचने की कोशिश कर सकते हैं।
गैब्रियल डेविलर्स

31
क्या आप अभी भी इस प्रश्न के उत्तर में रुचि रखते हैं? यदि हां, तो क्या आप अपनी कच्ची डेटा फ़ाइलों (छवियों) और कोड लाइनों का लिंक पोस्ट कर सकते हैं जहां आप उन्हें पढ़ते हैं? और कृपया डेटा का एक शब्दजाल-मुक्त विवरण और किसी भी अन्य पैरामीटर को शामिल करें, जो आपके पास ज्यामिति और दूरियों सहित है, भले ही अनुमानित हो।
15

2
कृपया कच्ची छवियां, या उनके लिए एक लिंक पोस्ट करें।
DrM

1
पहला: अनसालिडेटेड तरीके हमेशा कैलिब्रेटेड वाले के कम सही होते हैं (एक अच्छे कैलिब्रेशन के साथ)। दूसरा: StereoBMयह सबसे अच्छा मिलान एल्गोरिथ्म नहीं है ... आप कुछ सुधार का उपयोग कर पा सकते हैं StereoSGBM। मैं मदद करना चाहूंगा लेकिन मुझे आपका सवाल पूरी तरह से समझ में नहीं आया ...
डेकाडेजा

जवाबों:


12

TLDR; चिकनी किनारों के साथ छवियों के लिए StereoSGBM (सेमी ग्लोबल ब्लॉक मिलान) का उपयोग करें और यदि आप इसे अभी भी चिकना चाहते हैं तो कुछ पोस्ट फ़िल्टरिंग का उपयोग करें

ओपी मूल चित्र प्रदान नहीं करता है, इसलिए मैं मिडलबरी डेटा सेटTsukuba से उपयोग कर रहा हूं ।

नियमित स्टीरियोबीएम के साथ परिणाम

stereobm

StereoSGBM (ट्यून्ड) के साथ परिणाम

stereosgbm

सबसे अच्छा परिणाम मुझे साहित्य में मिला

यहाँ छवि विवरण दर्ज करें

विवरण के लिए प्रकाशन यहाँ देखें।

पोस्ट फ़िल्टरिंग का उदाहरण (नीचे लिंक देखें)

फ़िल्टर उदाहरण पोस्ट करें

ओपी के प्रश्न से सिद्धांत / अन्य विचार

आपके कैलिब्रेटेड आयतों के बड़े काले क्षेत्र मुझे विश्वास दिलाते हैं कि उन लोगों के लिए, अंशांकन बहुत अच्छी तरह से नहीं किया गया था। वहाँ कारणों की एक किस्म है कि खेल में हो सकता है, शायद शारीरिक सेटअप, हो सकता है प्रकाश जब आप अंशांकन किया था, आदि, लेकिन वहाँ कैमरा अंशांकन ट्यूटोरियल के बहुत सारे हैं कि वहाँ के लिए और मेरी समझ यह है कि आप के लिए एक रास्ता पूछ रहे हैं एक अनसाल्टेड सेटअप से बेहतर गहराई का नक्शा प्राप्त करें (यह 100% स्पष्ट नहीं है, लेकिन शीर्षक इस बात का समर्थन करता है और मुझे लगता है कि लोग यहां क्या करने की कोशिश करेंगे)।

आपका मूल दृष्टिकोण सही है, लेकिन परिणाम निश्चित रूप से बेहतर हो सकते हैं। डेप्थ मैपिंग का यह रूप उन लोगों में नहीं है जो उच्चतम गुणवत्ता वाले नक्शे (विशेषकर अनब्रिलेटेड) का उत्पादन करते हैं। सबसे बड़ा सुधार संभवतः एक अलग स्टीरियो मिलान एल्गोरिथ्म का उपयोग करने से आएगा। प्रकाश व्यवस्था भी महत्वपूर्ण प्रभाव डाल सकती है। सही छवि (कम से कम मेरी नग्न आंखों के लिए) कम अच्छी तरह से जलाई जाती है जो पुनर्निर्माण में हस्तक्षेप कर सकती है। आप पहले इसे दूसरे स्तर के समान चमकाने की कोशिश कर सकते हैं, या यदि संभव हो तो नई छवियों को इकट्ठा कर सकते हैं। यहाँ से, मुझे लगता है कि आपके पास मूल कैमरों तक कोई पहुंच नहीं है, इसलिए मैं नई छवियों को इकट्ठा करने, सेटअप को बदलने या अंशांकन को कार्यक्षेत्र से बाहर करने पर विचार करूंगा। (यदि आपके पास सेटअप और कैमरों तक पहुंच है,)

आपने StereoBMअपनी असमानता (गहराई का नक्शा) की गणना के लिए उपयोग किया जो काम करता है, लेकिन StereoSGBMइस एप्लिकेशन के लिए बहुत बेहतर है (यह बेहतर किनारों को बेहतर बनाता है)। आप नीचे अंतर देख सकते हैं।

यह लेख अधिक गहराई में अंतर की व्याख्या करता है:

ब्लॉक मिलान उच्च बनावट की छवियों (एक पेड़ की एक तस्वीर सोचो) पर केंद्रित है और अर्ध-वैश्विक ब्लॉक मिलान उप पिक्सेल स्तर मिलान और अधिक चिकनी बनावट के साथ चित्रों पर ध्यान केंद्रित करेगा (एक दालान की तस्वीर पर विचार करें)।

किसी भी स्पष्ट आंतरिक कैमरा मापदंडों के बिना, कैमरा सेटअप (जैसे फोकल दूरी, कैमरों के बीच की दूरी, विषय के लिए दूरी, आदि) के बारे में निर्दिष्ट करता है, छवि में एक ज्ञात आयाम, या गति ( गति से संरचना का उपयोग करने के लिए ), आप कर सकते हैं केवल एक प्रक्षेप्य परिवर्तन तक 3 डी पुनर्निर्माण प्राप्त करें; आपके पास पैमाना या आवश्यक रूप से रोटेशन की भावना नहीं होगी, लेकिन आप अभी भी एक सापेक्ष गहराई मानचित्र उत्पन्न कर सकते हैं। आप संभवतः कुछ बैरल और अन्य विकृतियों से पीड़ित होंगे जिन्हें उचित कैमरा अंशांकन के साथ हटाया जा सकता है, लेकिन आप इसके बिना उचित परिणाम प्राप्त कर सकते हैं जब तक कि कैमरे भयानक नहीं हैं (लेंस सिस्टम बहुत विकृत नहीं है) और सुंदर सेट किए गए हैं विहित विन्यास के करीब(जो मूल रूप से इसका मतलब है कि वे इस तरह उन्मुख हैं कि उनके ऑप्टिकल कुल्हाड़ियां यथासंभव समानांतर हैं, और उनके देखने के क्षेत्र पर्याप्त रूप से ओवरलैप हैं)। हालांकि यह ओपीस मुद्दा नहीं प्रतीत होता है क्योंकि उन्होंने बिना ठीक की गई विधि के साथ ठीक से प्राप्त छवियों का प्रबंधन किया था।

मूल प्रक्रिया

  1. दोनों छवियों में कम से कम 5 अच्छी तरह से मिलान किए गए बिंदु खोजें जो आप फंडामेंटल मैट्रिक्स की गणना करने के लिए उपयोग कर सकते हैं (आप किसी भी डिटेक्टर और मिलानकर्ता का उपयोग कर सकते हैं, मैंने FLANN को रखा था, लेकिन ORB का पता लगाने के लिए उपयोग किया क्योंकि SIFT OpenVV के मुख्य संस्करण में नहीं है 4.2.0 के लिए)
  2. मौलिक मैट्रिक्स, एफ की गणना करें findFundamentalMat
  3. के साथ stereoRectifyUncalibratedऔरwarpPerspective
  4. के साथ विषमता (गहराई का नक्शा) की गणना करें StereoSGBM

परिणाम बहुत बेहतर हैं:

ORB और FLANN के साथ मेल खाता है

माचिस

बिना चित्र वाली छवियां (बाएं, फिर दाएं)

अविचलित छोड़ दिया
अविचलित सही

असमानता

StereoBM

यह परिणाम ओपी समस्याओं (कुछ क्षेत्रों में अंतराल, अंतराल, गलत गहराई) के समान दिखता है।

stereobm

स्टीरियोजीएमएम (ट्यून्ड)

यह परिणाम बहुत बेहतर दिखता है और लगभग उसी विधि का उपयोग करता है जैसे कि ओपी, अंतिम असमानता की गणना करता है, मुझे लगता है कि ओपी अपनी छवियों पर समान सुधार देखेगा, उन्हें प्रदान किया गया था।

stereosgbm

फ़िल्टरिंग पोस्ट करें

नहीं है इस बारे में एक अच्छा लेख OpenCV डॉक्स में। यदि आप वास्तव में चिकनी नक्शे की जरूरत है तो मैं इसे देखने की सलाह दूंगा।

ऊपर के उदाहरण तस्वीरें दृश्य से फ्रेम 1 हैं ambush_2में एमपीआई Sintel डेटासेट

फ़िल्टर उदाहरण पोस्ट करें

पूर्ण कोड (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

निम्न-गुणवत्ता वाले कई संभावित मुद्दे हो सकते हैं Depth Channelऔर Disparity Channelजो हमें निम्न-गुणवत्ता वाले स्टीरियो अनुक्रम की ओर ले जाते हैं। यहाँ उन मुद्दों में से 6 हैं:

संभव मुद्दा I

  • अपूर्ण सूत्र

जैसा कि एक शब्द का uncalibratedतात्पर्य है, stereoRectifyUncalibratedउदाहरण विधि आपके लिए एक सुधार परिवर्तनों की गणना करती है, यदि आप नहीं जानते हैं या अपने स्टीरियो जोड़ी के आंतरिक मापदंडों और पर्यावरण में इसकी सापेक्ष स्थिति को नहीं जान सकते हैं।

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

कहाँ पे:

# 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

और आपका तरीका इस तरह दिखता है:

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

तो, आप खाते में तीन पैरामीटर नहीं लेते: rhm1, rhm2और thres। यदि एक threshold > 0, सभी बिंदु जोड़े जो एक एपीपोलर ज्यामिति का अनुपालन नहीं करते हैं, तो उन्हें होमोग्राफ की गणना करने से पहले खारिज कर दिया जाता है। अन्यथा, सभी बिंदुओं को इनवर्स माना जाता है। यह सूत्र इस तरह दिखता है:

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

# t   –> translation vector between coordinate systems of cameras

इस प्रकार, मेरा मानना ​​है कि अधूरे सूत्र की गणना के कारण दृश्य अशुद्धि प्रकट हो सकती है।

आप आधिकारिक संसाधन पर कैमरा अंशांकन और 3 डी पुनर्निर्माण पढ़ सकते हैं ।


संभव मुद्दा II

  • अंतर-दूरी

interaxial distanceबाएं और दाएं कैमरे के लेंस के बीच एक मजबूत होना चाहिए not greater than 200 mm। जब दूरी interaxial distanceसे बड़ा होता है interocular, तो प्रभाव कहा जाता है hyperstereoscopyया hyperdivergenceन केवल दृश्य में गहराई से अतिरंजना में परिणाम होता है, बल्कि दर्शकों की असुविधा में भी होता है। इस विषय पर और अधिक जानकारी प्राप्त करने के लिए ऑटोडेस्क की स्टेरियोस्कोपिक फिल्ममेकिंग व्हाइटपैपर पढ़ें ।

यहाँ छवि विवरण दर्ज करें


संभव मुद्दा III

  • समानांतर बनाम टो-इन कैमरा मोड

Disparity Mapगलत कैमरा मोड गणना के कारण उत्पन्न दृश्य गलतियाँ हो सकती हैं। कई स्टीरियोग्राफर पसंद करते हैं Toe-In camera modeलेकिन पिक्सर उदाहरण के लिए पसंद करते हैं Parallel camera mode

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें


संभव मुद्दा IV

  • लंबवत संरेखण

स्टीरियोस्कोपी में, यदि एक ऊर्ध्वाधर बदलाव होता है (भले ही किसी एक विचार को 1 मिमी से ऊपर स्थानांतरित कर दिया जाए) यह एक मजबूत स्टीरियो अनुभव को बर्बाद कर देता है। इसलिए, Disparity Mapआपको यह सुनिश्चित करने से पहले सुनिश्चित करना चाहिए कि आपकी स्टीरियो जोड़ी के बाएं और दाएं दृश्य तदनुसार संरेखित हैं। स्टीरियो में 15 सामान्य समस्याओं के बारे में टेक्नीकलर स्टेरियोस्कोपिक व्हाइटपेपर देखें

स्टीरियो रेक्टिफिकेशन मैट्रिक्स:

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

यहाँ एक StereoRectifyविधि है:

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)


संभव मुद्दा वी

  • लेंस विरूपण

स्टीरियो रचना में लेंस विरूपण बहुत महत्वपूर्ण विषय है। उत्पन्न होने से पहले Disparity Mapआपको बाएं और दाएं विचारों को देखने की आवश्यकता है, इसके बाद एक असमानता चैनल उत्पन्न करता है, और फिर दोनों विचारों को फिर से वितरित करता है।

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें


संभव मुद्दा VI

  • एंटी-अलियासिंग के बिना कम गुणवत्ता वाला डेप्थ चैनल

उच्च-गुणवत्ता बनाने के लिए Disparity Mapआपको बाएं और दाएं की आवश्यकता होती है Depth Channelsजो पहले से उत्पन्न होनी चाहिए। जब आप 3 डी पैकेज में काम करते हैं तो आप केवल एक क्लिक के साथ एक उच्च गुणवत्ता वाले गहराई चैनल (कुरकुरा किनारों के साथ) को प्रस्तुत कर सकते हैं। लेकिन वीडियो अनुक्रम से उच्च-गुणवत्ता वाले गहराई चैनल का निर्माण करना आसान नहीं है क्योंकि भविष्य की गहराई से गति एल्गोरिथ्म के लिए प्रारंभिक डेटा का उत्पादन करने के लिए स्टीरियो पेयर को आपके वातावरण में स्थानांतरित करना पड़ता है। अगर फ्रेम में कोई गति नहीं है तो एक गहराई चैनल बेहद खराब होगा।

यहाँ छवि विवरण दर्ज करें

इसके अलावा, Depthचैनल के पास एक और दोष है - इसके किनारों को आरजीबी के किनारों से मेल नहीं खाता क्योंकि इसमें कोई एंटी-अलियासिंग नहीं है

यहाँ छवि विवरण दर्ज करें


विषमता चैनल कोड स्निपेट:

यहाँ मैं उत्पन्न करने के लिए एक त्वरित दृष्टिकोण का प्रतिनिधित्व करना चाहता हूँ 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()

यहाँ छवि विवरण दर्ज करें


आपने इन अंतिम चित्रों का निर्माण कैसे किया? क्या आपके पास उदाहरण कोड है जो मैं आज़मा सकता हूं?
मैथ्यू साल्वाटोर विग्लियोन

ये चित्र कंपोज़िटिंग सॉफ़्टवेयर में उत्पन्न होते हैं। उनके लिए कोई उदाहरण कोड नहीं है।
एंडी फेडोरॉफ

1
आह, यह अधिक समझ में आता है। मैंने OpenCV में एक साधारण स्टीरियो जोड़ी (विशेष रूप से अनब्रिलेटेड) के साथ साफ-सुथरा नक्शा नहीं देखा है
मैथ्यू सल्वाटोर विगलियोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.