2012-07-10 27 views
7

मैं वर्तमान में ओपनसीवी में स्टीरियो छवि जोड़ी दिए गए 3 डी अंक उत्पन्न करने की कोशिश कर रहा हूं। जहां तक ​​मैं खोज सकता हूं, यह काफी कुछ किया गया है।3 डी अंक उत्पन्न करने के लिए ओपनसीवी का उपयोग करना (फ्रंटल समानांतर विन्यास मानना)

मुझे स्टीरियो सेटअप के बाहरी पैरामीटर पता हैं जो मुझे लगता है कि सामने के समानांतर विन्यास में है (वास्तव में, यह बुरा नहीं है!)। मुझे फोकल लम्बाई, आधार रेखा पता है, और मैं मुख्य बिंदु को छवि के केंद्र के रूप में मानने जा रहा हूं (मुझे पता है, मुझे पता है ...)।

Q = [ 1 0 0  -c_x 
     0 1 0  -c_y 
     0 0 0  f 
     0 0 -1/T_x (c_x - c_x')/T_x ] 

मुझे लगता है कि (c_x, c_y) ले लेंगे प्रमुख है:

मैं एक छद्म-सभ्य असमानता मानचित्र का उपयोग StereoSGBM और हाथ जो निर्दिष्ट करता है ओ रेली लर्निंग OpenCV पुस्तक निम्नलिखित प्रश्न मैट्रिक्स कोडित गणना बिंदु (जिसे मैंने छवि निर्देशांक में निर्दिष्ट किया है), एफ फोकल लम्बाई है (जिसे मैंने मिमी में वर्णित किया है), और टी_एक्स दो कैमरों या बेसलाइन (जिसे मैंने मिमी में भी वर्णित किया है) के बीच अनुवाद है।

int type = CV_STEREO_BM_BASIC; 
double rescx = 0.25, rescy = 0.25; 
Mat disparity, vdisparity, depthMap; 

Mat frame1 = imread("C:\\Users\\Administrator\\Desktop\\Flow\\IMG137.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
Mat frame1L = frame1(Range(0, frame1.rows), Range(0, frame1.cols/2)); 
Mat frame1R = frame1(Range(0, frame1.rows), Range(frame1.cols/2, frame1.cols)); 

resize(frame1L, frame1L, Size(), rescx, rescy); 
resize(frame1R, frame1R, Size(), rescx, rescy); 

int preFilterSize = 9, preFilterCap = 32, disparityRange = 4; 
int minDisparity = 2, textureThreshold = 12, uniquenessRatio = 3; 
int windowSize = 21, smoothP1 = 0, smoothP2 = 0, dispMaxDiff = 32; 
int speckleRange = 0, speckleWindowSize = 0; 

bool dynamicP = false; 

StereoSGBM stereo(minDisparity*-16, disparityRange*16, windowSize, 
    smoothP1, smoothP2, dispMaxDiff, 
    preFilterCap, uniquenessRatio, 
    speckleRange*16, speckleWindowSize, dynamicP); 

stereo(frame1L, frame1R, disparity); 

double m1[3][3] = { { 46, 0, frame1L.cols/2 }, { 0, 46, frame1L.rows/2 }, { 0, 0, 1 } }; 
double t1[3] = { 65, 0, 0 }; 
double q[4][4] = {{ 1, 0, 0, -frame1L.cols/2.0 }, { 0, 1, 0, -frame1L.rows/2.0 }, { 0, 0, 0, 46 }, { 0, 0, -1.0/65, 0 }}; 
Mat cm1(3, 3, CV_64F, m1), cm2(3, 3, CV_64F, m1), T(3, 1, CV_64F, t1); 
Mat R1, R2, P1, P2; 
Mat Q(4, 4, CV_64F, q); 

//stereoRectify(cm1, Mat::zeros(5, 1, CV_64F), cm2, Mat::zeros(5, 1, CV_64F), frame1L.size(), Mat::eye(3, 3, CV_64F), T, R1, R2, P1, P2, Q); 

normalize(disparity, vdisparity, 0, 256, NORM_MINMAX); 
//convertScaleAbs(disparity, disparity, 1/16.0); 
reprojectImageTo3D(disparity, depthMap, Q, true); 
imshow("Disparity", vdisparity); 
imshow("3D", depthMap); 

तो मैं StereoSGBM से उत्पन्न असमानता नक्शा और कहा कि क्यू 3 डी अंक है, जो मैं एक प्लाई फाइल करने के लिए लिख पाने के लिए मैट्रिक्स खाते हैं।

लेकिन परिणाम यह है: http://i.stack.imgur.com/7eH9V.png

मज़ा को देखने के लिए, लेकिन नहीं है कि मैं क्या जरूरत है :(मैं ऑनलाइन पढ़ा है कि यह 16 से असमानता नक्शा विभाजित के बाद बेहतर परिणाम हो जाता है और वास्तव में यह मामूली बेहतर देखा (। यह वास्तव में लगता है कि वहाँ एक कैमरा है कि शॉट ले लिया था)

यह मेरा असमानता नक्शा है अगर आप रुचि रखते हैं:। http://i.stack.imgur.com/lNPkO.png

मैं समझता हूँ कि callibration बिना, यह शायद ही सबसे अच्छा 3 डी की तरह लग रहे करने जा रहा है प्रक्षेपण, लेकिन मैं कुछ थोड़ा उम्मीद कर रहा था ... बेहतर।

कोई सुझाव?

उत्तर

0

ललाट-समानांतर धारणा के तहत, असमानता और 3 डी गहराई के बीच संबंध है: d = f*T/Z, जहां d असमानता है, f फोकल लंबाई है, T आधार-रेखा है और Z 3D गहराई है। यदि आप छवि केंद्र को मुख्य बिंदु के रूप में देखते हैं, तो 3 डी समन्वय प्रणाली बस जाती है। फिर एक पिक्सेल (px,py) के लिए, अपने 3 डी समन्वय (X, Y, Z) है:

X = (px-cx)*Z/f, Y = (py- cy)*Z/f, Z = f*T/d,

जहां cx, cy पिक्सेल छवि केन्द्र के समन्वय कर रहे हैं।

आपकी असमानता छवि बहुत अच्छी लगती है और यह उचित 3 डी बिंदु बादल उत्पन्न कर सकती है।

github पर एक साधारण असमानता ब्राउज़र।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^