2012-08-24 14 views
9

OpenCV में यह करना आसान है हालांकि मुझे मूल मैटलैब कार्यान्वयन चाहिए जो काफी कुशल है और आसानी से बदला जा सकता है। विधि उपरोक्त लिंक में निर्दिष्ट कैमरा पैरामीटर लेने में सक्षम होना चाहिए।ज्ञात कैमरा पैरामीटर का उपयोग करके मैटलैब में एक छवि को मैं कैसे रोक सकता हूं?

उत्तर

2

अब आप उस रिहाई R2013B के रूप में, कंप्यूटर विजन सिस्टम उपकरण बॉक्स का उपयोग कर सकते हैं। Camera Calibrator नामक एक जीयूआई ऐप और एक फ़ंक्शन undistortImage है।

+1

अंत में! यह बात बताने के लिए धन्यवाद – twerdster

13

अविश्वास करने का सबसे सरल और सबसे आम तरीका (जिसे लेंस विरूपण के लिए अनवरत या क्षतिपूर्ति भी कहा जाता है) एक चुने हुए आउटपुट फोटो आकार पर आगे विरूपण करना है और फिर बिलीनेर इंटरपोलेशन का उपयोग करके एक रिवर्स मैपिंग करना है।

यहाँ है कोड मैं इस प्रदर्शन के लिए लिखा है:

function I = undistort(Idistorted, params) 
fx = params.fx; 
fy = params.fy; 
cx = params.cx; 
cy = params.cy; 
k1 = params.k1; 
k2 = params.k2; 
k3 = params.k3; 
p1 = params.p1; 
p2 = params.p2; 

K = [fx 0 cx; 0 fy cy; 0 0 1]; 

I = zeros(size(Idistorted)); 
[i j] = find(~isnan(I)); 

% Xp = the xyz vals of points on the z plane 
Xp = inv(K)*[j i ones(length(i),1)]'; 

% Now we calculate how those points distort i.e forward map them through the distortion 
r2 = Xp(1,:).^2+Xp(2,:).^2; 
x = Xp(1,:); 
y = Xp(2,:); 

x = x.*(1+k1*r2 + k2*r2.^2) + 2*p1.*x.*y + p2*(r2 + 2*x.^2); 
y = y.*(1+k1*r2 + k2*r2.^2) + 2*p2.*x.*y + p1*(r2 + 2*y.^2); 

% u and v are now the distorted cooridnates 
u = reshape(fx*x + cx,size(I)); 
v = reshape(fy*y + cy,size(I)); 

% Now we perform a backward mapping in order to undistort the warped image coordinates 
I = interp2(Idistorted, u, v); 

इसका इस्तेमाल करने के लिए एक पता करने के लिए कैमरे के कैमरा मापदंडों इस्तेमाल किया जा रहा जरूरत है। मैं वर्तमान में PMD CamboardNano जो Cayim.com मंचों के अनुसार यहां इस्तेमाल किया पैरामीटर का उपयोग कर रहा:

params = struct('fx',104.119, 'fy', 103.588, 'cx', 81.9494, 'cy', 59.4392, 'k1', -0.222609, 'k2', 0.063022, 'k3', 0, 'p1', 0.002865, 'p2', -0.001446); 

I = undistort(Idistorted, params); 

subplot(121); imagesc(Idistorted); 
subplot(122); imagesc(I); 

यहाँ Camboard नैनो से उत्पादन का एक उदाहरण है। नोट: मैं कृत्रिम रूप से सीमा पंक्तियां जोड़ी को देखने के लिए क्या प्रभाव किनारों (अपने और अधिक स्पष्ट) के करीब विरूपण की थी: enter image description here

+0

आपके फ़ंक्शन का किस प्रकार का डेटा समर्थन करता है? मैं इसे किसी भी कोशिश के साथ काम नहीं कर सकता ... बीटीडब्लू: फ़ंक्शन के लिए धन्यवाद, यह अजीब है कि मैटलैब ने यह लागू नहीं किया है –

+0

@AnderBiguri इसे कम से कम एक चैनल प्रकार "डबल" के साथ काम करना चाहिए। करने के लिए पहली चीज किसी भी छवि को डबल में परिवर्तित करना है। इसके अलावा यदि आपके पास एक छवि है जो ग्रेस्केल या इसकी गहराई वाली छवि है तो इसे ठीक पैराम के साथ अनइंस्टोर्ट को कॉल करने के लिए ठीक काम करना चाहिए। यदि आपके पास 3 चैनल रंगीन छवि है तो आपको प्रत्येक चैनल पर अलग से अलग करने की आवश्यकता होगी। – twerdster

+0

यह ग्रेस्केल बिटमैप्स के साथ काम नहीं करता है, लेकिन मैं उन्हें दोबारा बदल दूंगा और कोशिश करूँगा! –

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

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