2015-12-16 7 views
6

मैं मछली-आंख लेंस के साथ कैमरों का उपयोग करके ली गई छवियों को कैलिब्रेट करने के लिए ओपनसीवी का उपयोग कर रहा हूं।ओपनसीवी फिशिए अंशांकन परिणामस्वरूप छवि का बहुत अधिक कटौती

कार्यों मैं उपयोग कर रहा हूँ कर रहे हैं:

  • findChessboardCorners(...); अंशांकन पैटर्न के कोनों को खोजने के लिए।
  • cornerSubPix(...); पाए गए कोनों को परिष्कृत करने के लिए।
  • fisheye::calibrate(...); कैमरा मैट्रिक्स और विरूपण गुणांक को कैलिब्रेट करने के लिए।
  • fisheye::undistortImage(...); अंशांकन से प्राप्त कैमरा जानकारी का उपयोग कर छवियों को अनदेखा करने के लिए।

जबकि परिणामस्वरूप छवि अच्छी लगती है (सीधी रेखाएं और इसी तरह), मेरी समस्या यह है कि फ़ंक्शन छवि का बहुत अधिक कट जाता है।

यह एक वास्तविक समस्या है, क्योंकि मैं उनके बीच 9 0 डिग्री के साथ चार कैमरों का उपयोग कर रहा हूं, और जब बहुत से पक्षों काट दिया जाता है, तो उनके बीच कोई ओवरलैपिंग क्षेत्र नहीं होता है क्योंकि मुझे सिलाई करने की आवश्यकता होती है इमेजिस।

मैं fisheye::estimateNewCameraMatrixForUndistortRectify(...) का उपयोग कर में देखा है, लेकिन मैं जहां N नंबर नहीं मिल सका यह अच्छा परिणाम देने के लिए के रूप में मैं नहीं जानता कि मैं क्या R इनपुट के रूप में में रखना चाहिए, fisheye::calibrate के रोटेशन वेक्टर आउटपुट के रूप में 3xN (है अंशांकन छवियों के) और fisheye::estimateNewCameraMatrixForUndistortRectify को 1x3 या 3x3 की आवश्यकता होती है।

नीचे दी गई छवियां मेरे निर्विवाद परिणाम की एक छवि दिखाती हैं, और परिणाम का एक उदाहरण मैं आदर्श रूप से चाहता हूं।

Undistortion:

My undistortion

वांछित परिणाम का उदाहरण:

Example of wanted result

उत्तर

0

आप ठीक कर रहे हैं, तो आप सिर्फ getOptimalNewCameraMatrix() उपयोग करने के लिए undistort() में newCameraMatrix सेट करना होगा। सभी पिक्सेल दृश्यमान प्राप्त करने के लिए, आपको से getOptimalNewCameraMatrix() में 1 सेट करना होगा।

+0

मैंने कोशिश की है कि, और (opencv नमूने फ़ोल्डर में चित्र का प्रयोग करके) नियमित रूप से छवियों के लिए यह परिणाम मैं चाहता था के प्रकार दिया था, लेकिन जब मैं अपने फ़िशआई चित्र पर इसका इस्तेमाल, यह नहीं देता है परिणाम चाहता था। – NoShadowKick

+0

[फ़ोल्डर मेरे परिणामों की छवियां दिखा रहा है] (https://www.dropbox.com/sh/pkudy2acgqyyjc5/AAAWE5cMEiT6dGB0hwDnVm69a?dl=0) – NoShadowKick

+0

आपकी छवियां बहुत व्यापक कोण कैमरा (~ 180 डिग्री फ़ॉव) से प्रतीत होती हैं। यदि आप सभी पिक्सेल को शामिल करना चाहते हैं - तो आप एक अनंत आकार की छवि बना लेंगे (चूंकि मुख्य कैमरा धुरी से कोण वाले पिक्सेल> = 180 अनंत पर अनुमान लगाया जाएगा)। इसलिए आपको सीमित आकार की छवि प्राप्त करने के लिए कुछ तोड़ना होगा। वैसे, आपने किस अल्फा का उपयोग किया है? – alexisrozhkov

2

मुझे लगता है कि मैं इसी तरह के मुद्दे में भाग गया हूं, फिशिए के लिए getOptimalNewCameraMatrix में "अल्फा" गाँठ की तलाश में है।

मूल शॉट: Original

मैं cv2.fisheye.calibrate साथ यह कैलिब्रेटेड, कश्मीर हो गया और डी पैरामीटर

K = [[ 329.75951163 0.   422.36510555] 
[ 0.   329.84897388 266.45855056] 
[ 0.   0.   1.  ]] 

D = [[ 0.04004325] 
[ 0.00112638] 
[ 0.01004722] 
[-0.00593285]] 

यह है कि मैं क्या

map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, d, np.eye(3), k, (800,600), cv2.CV_16SC2) 
nemImg = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT) 

और साथ मिलता है मुझे लगता है कि यह बहुत ज्यादा चॉप करता है।मैं पूरी रूबिक क्यूब देखना चाहते हैं

initUndistortRectifyMap/remap with the K,D

मैं

nk = k.copy() 
nk[0,0]=k[0,0]/2 
nk[1,1]=k[1,1]/2 
# Just by scaling the matrix coefficients! 

map1, map2 = cv2.fisheye.initUndistortRectifyMap(k, d, np.eye(3), nk, (800,600), cv2.CV_16SC2) # Pass k in 1st parameter, nk in 4th parameter 
nemImg = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT) 

टाडा के साथ इसे ठीक!

This is what I want

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