ওপেনসিভি - অব্যাহত স্টেরিও সিস্টেম থেকে গভীরতার মানচিত্র


174

আমি অব্যক্ত পদ্ধতিতে গভীরতার মানচিত্র পাওয়ার চেষ্টা করছি। আমি এসআইএফটি-র সাথে সংবাদদাতা পয়েন্টগুলি সন্ধান করে এবং তারপরে ব্যবহার করে মৌলিক ম্যাট্রিক্সটি অর্জন করতে পারি 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)

4
আপনি কি ম্যাচগুলির মানের দিকে নজর রেখেছেন? ইমেজ দেওয়া এটি একটি সমস্যা হতে পারে। আপনি যদি মূল চিত্রটি পোস্ট করেন তবে এটি সহায়তা করবে।
ইয়েনন

ক্যালিগ্রেশন ছবিগুলি সারিবদ্ধ করে বলে মনে হচ্ছে না, সম্ভবত এটি কারণ ক্যামেরাটি উল্লম্বভাবে স্ট্যাক করা ছিল (এটি মিডলবারির মিউজু ডেটাসেটের ক্ষেত্রে)। আপনি উন্নতি দেখতে পান কিনা তা দেখার জন্য আপনি সংশোধন করার আগে এবং পরে কিছু এপিলিনগুলি আঁকার চেষ্টা করতে পারেন।
গ্যাব্রিয়েল ডেভিলার্স

31
আপনি কি এখনও এই প্রশ্নের উত্তরে আগ্রহী? যদি তা হয় তবে আপনি নিজের কাঁচা ডেটা ফাইলগুলি (চিত্রগুলি) এবং কোড লাইনগুলি যেখানে পড়েছেন সেখানে লিঙ্ক পোস্ট করতে পারেন? এবং দয়া করে ডেটা এবং কোনও জ্যামিতি এবং দূরত্বগুলি সহ যে কোনও প্যারামিটারগুলির জার্গন মুক্ত বর্ণনা অন্তর্ভুক্ত করুন, এমনকি যদি আনুমানিকও হয়।
DrM

4
কাঁচা ছবি বা তাদের একটি লিঙ্ক পোস্ট করুন।
DrM

4
প্রথম: অব্যাহতিযুক্ত পদ্ধতিগুলি সর্বদা ক্যালিব্রেটেডগুলির চেয়ে কম নিখুঁত হয় (একটি ভাল ক্রমাঙ্কন সম্পন্ন করে) দ্বিতীয়: StereoBMএটি সেরা মিলে যাওয়া অ্যালগরিদম নয় ... ব্যবহার করে আপনি কিছু উন্নতি পেতে পারেন StereoSGBM। আমি সাহায্য করতে চাই তবে আমি আপনার প্রশ্নটি পুরোপুরি বুঝতে পারি নি ...
ডেকাডেনজায়

উত্তর:


12

টিএলডিআর; মসৃণ প্রান্তযুক্ত চিত্রগুলির জন্য স্টেরিওএসবিএম (সেমি গ্লোবাল ব্লক ম্যাচিং) ব্যবহার করুন এবং আপনি যদি এখনও এটি আরও মসৃণ করতে চান তবে কিছু পোস্ট ফিল্টারিং ব্যবহার করুন

ওপি মূল চিত্র সরবরাহ করে না, তাই আমি মিডলবারির ডেটা সেটTsukuba থেকে ব্যবহার করছি

নিয়মিত স্টেরিওবিএম সহ ফলাফল

স্টেরিওবম

স্টেরিওএসজিবিএম (টিউনড) এর ফলাফল

stereosgbm

সাহিত্যে আমি সেরা ফলাফল খুঁজে পেলাম

এখানে চিত্র বর্ণনা লিখুন

এখানে প্রকাশনা দেখুনবিশদ জন্য ।

পোস্ট ফিল্টারিংয়ের উদাহরণ (নীচের লিঙ্কটি দেখুন)

পোস্ট ফিল্টার উদাহরণ

থিওরি / ওপির প্রশ্ন থেকে অন্যান্য বিবেচনা

আপনার ক্যালিব্রেটেড রেকটিফায়েড ইমেজগুলির বৃহত কালো অঞ্চলগুলি আমাকে বিশ্বাস করতে পরিচালিত করবে যেগুলির জন্য, ক্রমাঙ্কন খুব ভালভাবে করা হয়নি। বিভিন্ন কারণ রয়েছে যা খেলতে হতে পারে, শারীরিক সেটআপ হতে পারে, আপনি যখন ক্যালিগ্রেশন করেছিলেন তখন আলোকসজ্জা ইত্যাদি but অব্যর্থযুক্ত সেটআপ থেকে আরও গভীর গভীরতার মানচিত্র পান (এটি 100% পরিষ্কার নয়, তবে শিরোনামটি এটি সমর্থন করে বলে মনে হয় এবং আমি মনে করি এটিই লোকেরা এখানে সন্ধানের চেষ্টা করবে)।

আপনার প্রাথমিক পদ্ধতির সঠিক, তবে ফলাফল অবশ্যই উন্নত করা যেতে পারে। এই আকারের ম্যাপিংয়ের ফর্মটি এমন নয় যেগুলি সর্বোচ্চ মানের মানচিত্র তৈরি করে (বিশেষত অব্যাহতিযুক্ত)। সবচেয়ে বড় উন্নতি সম্ভবত ভিন্ন স্টেরিও মেলানো অ্যালগরিদম ব্যবহার করে আসে। আলো এছাড়াও একটি উল্লেখযোগ্য প্রভাব থাকতে পারে। ডান চিত্রটি (কমপক্ষে আমার নগ্ন চোখের দিকে) কম ভাল আলোকিত বলে মনে হচ্ছে যা পুনর্গঠনে বাধা দিতে পারে। আপনি প্রথমে অন্যটির মতো একই স্তরে আলোকিত করার চেষ্টা করতে পারেন, বা সম্ভব হলে নতুন চিত্র সংগ্রহ করতে পারেন। এখান থেকে, আমি ধরে নেব যে আপনার কাছে মূল ক্যামেরাগুলির কোনও অ্যাক্সেস নেই, তাই আমি নতুন চিত্র সংগ্রহ করা, সেটআপ পরিবর্তন করতে, বা ক্রমাঙ্কন সম্পাদনকে সুযোগের বাইরে রাখার বিষয়টি বিবেচনা করব। (যদি আপনার কাছে সেটআপ এবং ক্যামেরা অ্যাক্সেস থাকে তবে,

আপনি StereoBMআপনার বৈষম্য গণনার জন্য ব্যবহার করেছেন (গভীরতার মানচিত্র) যা কাজ করে তবে StereoSGBMএই অ্যাপ্লিকেশনটির জন্য এটি আরও ভাল উপযুক্ত (এটি মসৃণ প্রান্তগুলি আরও ভালভাবে পরিচালনা করে)। আপনি নীচের পার্থক্য দেখতে পারেন।

এই নিবন্ধটি আরও গভীরতার মধ্যে পার্থক্য ব্যাখ্যা করে:

ব্লক ম্যাচিং উচ্চ টেক্সচার ইমেজগুলিতে ফোকাস করে (গাছের একটি ছবি মনে করুন) এবং আধা-বিশ্বব্যাপী ব্লক মেলানো সাব পিক্সেল স্তর ম্যাচিং এবং আরও মসৃণ টেক্সচার সহ চিত্রগুলিতে ফোকাস করবে (একটি হলওয়ের চিত্র মনে করুন)।

কোনও স্পষ্ট অভ্যন্তরীণ ক্যামেরা প্যারামিটার ব্যতীত, ক্যামেরা সেটআপ সম্পর্কে বিশদ বিবরণ (যেমন ফোকাস দূরত্ব, ক্যামেরার মধ্যে দূরত্ব, বিষয়টির দূরত্ব ইত্যাদি), চিত্রের একটি পরিচিত মাত্রা বা গতি ( গতি থেকে কাঠামো ব্যবহার করতে), আপনি করতে পারেন কেবলমাত্র একটি প্রজেক্টিভ ট্রান্সফর্ম পর্যন্ত 3 ডি পুনর্গঠন পান; আপনার কোনও স্কেল বা অগত্যা ঘোরানোর কোনও ধারণা থাকবে না তবে আপনি এখনও একটি আপেক্ষিক গভীরতার মানচিত্র তৈরি করতে পারেন। আপনি সম্ভবত কিছু ব্যারেল এবং অন্যান্য বিকৃতিতে ভুগবেন যা যথাযথ ক্যামেরার ক্যালিব্রেশন দিয়ে অপসারণ করা যেতে পারে, তবে যতক্ষণ না ক্যামেরা ভয়ানক না হয় (লেন্স সিস্টেমটি খুব বেশি বিকৃত হয় না) এবং সুন্দর সেট আপ করা হয় ততক্ষণ আপনি এগুলি ছাড়া যুক্তিসঙ্গত ফলাফল পেতে পারেন can কাছাকাছি ক্যানোনিকাল কনফিগারেশন(যার মুলত অর্থ তারা ওরিয়েন্টেড যাতে তাদের অপটিকাল অক্ষগুলি যথাসম্ভব সমান্তরাল এবং তাদের দেখার ক্ষেত্রগুলি যথেষ্ট পরিমাণে ওভারল্যাপ হয়)। তবে এটি ওপিএস ইস্যু হিসাবে দেখা যাচ্ছে না কারণ তিনি অব্যক্ত পদ্ধতিতে সঠিকভাবে সংশোধিত চিত্র পেতে সক্ষম হন।

বেসিক পদ্ধতি

  1. ফান্ডামেন্টাল ম্যাট্রিক্স গণনা করতে আপনি উভয় চিত্রেই কমপক্ষে 5 টি মিলে যাওয়া পয়েন্টগুলি সন্ধান করুন (আপনি নিজের পছন্দ মতো কোনও ডিটেক্টর এবং ম্যাচার ব্যবহার করতে পারেন, আমি সিএফটি ওপেনসিভির মূল সংস্করণে নেই বলে সনাক্তকরণ করতে ওআরবি ব্যবহার করেছি) ৪.২.০ এর জন্য)
  2. এর সাথে ফান্ডামেন্টাল ম্যাট্রিক্স, এফ, গণনা করুন findFundamentalMat
  3. আপনার ইমেজগুলি অনিস্টোর্ট করুন stereoRectifyUncalibratedএবং দিয়েwarpPerspective
  4. এর সাথে বৈষম্য (গভীরতার মানচিত্র) গণনা করুন StereoSGBM

ফলাফলগুলি আরও ভাল:

ওআরবি এবং এফএলএনএনের সাথে ম্যাচগুলি

ম্যাচ

Undistorted চিত্র (বাম, তারপরে ডান)

বেনামে বাম
অনির্দিষ্ট ডান

বৈষম্য

স্টেরিওবিএম

এই ফলাফলটি ওপিএসের সমস্যার মতো দেখায় (কিছু জায়গায় স্পেকলিং, ফাঁক, ভুল গভীরতা)।

স্টেরিওবম

স্টিরিওএসজিবিএম (সুরযুক্ত)

এই ফলাফলটি আরও ভাল দেখায় এবং প্রায় ওপি হিসাবে একই পদ্ধতি ব্যবহার করে, চূড়ান্ত বৈষম্যের গণনা বিয়োগ করে, আমাকে মনে করে যে ওপি তার চিত্রগুলিতে একই রকম উন্নতি দেখতে পাবে, যদি তারা সরবরাহ করা হত।

stereosgbm

ফিল্টারিং

আছে এই সম্পর্কে একটি ভাল নিবন্ধ OpenCV ডক্সে। আপনার যদি সত্যিই মসৃণ মানচিত্রের প্রয়োজন হয় তবে আমি এটি দেখার পরামর্শ দিই।

উপরোক্ত উদাহরণে ফটো দৃশ্য থেকে ফ্রেম 1 হয় ambush_2মধ্যে MPI Sintel ডেটা সেটটি

পোস্ট ফিল্টার উদাহরণ

সম্পূর্ণ কোড (ওপেনসিভি 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প্রাক-উত্পন্ন হতে হবে। আপনি যখন 3D প্যাকেজে কাজ করেন আপনি কেবলমাত্র একটি ক্লিকের সাথে একটি উচ্চ-মানের গভীরতা চ্যানেল (খাস্তা প্রান্ত সহ) রেন্ডার করতে পারেন। তবে ভিডিও ক্রম থেকে একটি উচ্চমানের গভীরতার চ্যানেল তৈরি করা সহজ নয় কারণ ভবিষ্যতের গভীরতা থেকে গতি অ্যালগরিদমের জন্য প্রাথমিক ডেটা তৈরির জন্য স্টিরিও জুটিটি আপনার পরিবেশে চলে যেতে হবে। যদি কোনও ফ্রেমে কোনও গতি না থাকে তবে গভীরতার চ্যানেলটি অত্যন্ত দরিদ্র।

এখানে চিত্র বর্ণনা লিখুন

এছাড়াও, 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()

এখানে চিত্র বর্ণনা লিখুন


আপনি এই চূড়ান্ত চিত্রগুলি কীভাবে উত্পাদন করলেন? আপনার কি উদাহরণ কোড রয়েছে যা আমি চেষ্টা করে দেখতে পারি?
ম্যাথু সালভাতোর ভিগলিয়ন

এই চিত্রগুলি কমপোজিশন সফ্টওয়্যার তৈরি করা হয়। তাদের জন্য কোনও উদাহরণ কোড নেই।
অ্যান্ডি ফেদোরফ

4
আহ, এটি আরও অর্থবোধ করে। আমি কখনও গভীরতার মানচিত্র দেখিনি যা ওপেনসিভিতে একটি সাধারণ স্টেরিও জোড়া দিয়ে পরিষ্কার করে (বিশেষত শিবির ছাড়াই)
ম্যাথু সালভাতোর ভিগলিয়নে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.