2013-02-22 10 views
13

द्वारा बहुत बड़े चित्र पर बिसात पहचान नहीं कर सकता मैं छवियों के लिए FindChessboardCorners कार्यों का उपयोग कर सकते हैं कि 2k एक्स 1.5k की तरह इस तरह के कम से कम 15 मेगा पिक्सेल। हालांकि जब मैं इसे डीएसएलआर से छवि पर उपयोग करता हूं, तो 3700x5300 पर संकल्प, यह काम नहीं करता है।FindChessboardCorners लंबे फोकल लंबाई लेंस

मैंने छवि आकार को कम करने के लिए आकार बदलने के लिए आकार बदलने की कोशिश की, तो यह काम करता है।

जाहिर है ओपनसीवी स्रोत कोड में कुछ हार्ड कोड या बग है।

क्या आप इसे समझने में मेरी सहायता कर सकते हैं, या मुझे इसके लिए पैच पर इंगित कर सकते हैं?

मैंने पाया किसी को 2006, here में एक समान मुद्दा तैनात है, तो समस्या की तरह अभी भी बना हुआ यह लग रहा है।

कोड मैं इस्तेमाल किया

बस यहाँ

तरह
found = findChessboardCorners(viewGray, boardSize, ptvec, 
           CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FILTER_QUADS + CV_CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FAST_CHECK); 

अद्यतन स्पष्ट करने के लिए है। मुझे लगता है कि एल्गोरिदम बड़े छवि रिज़ॉल्यूशन पर काम करता है, लेकिन जब यह शतरंज छवि के बड़े अनुपात पर कब्जा करता है तो यह विफल रहता है। उदाहरण के लिए, जब मैं एक ही कैमरे की स्थिति पर 50 मिमी फिक्स्ड लेंस का उपयोग करता हूं, तो FindChessboardCorners कभी विफल नहीं होता है। 100 एमएम फिक्स्ड लेंस में बदलने के बाद, फ़ंक्शन पैटर्न का पता लगाना बंद कर देता है। मुझे लगता है कि यह अनुपात या फोकल लंबाई से संबंधित है।

नीचे दी गई छवि 100 मिमी लेंस परिणाम है।

अद्यतन 2

मैं बड़ी छवि के लिए एक तेज फिल्टर जोड़ा, और यह समस्या को ठीक करने शुरू होता है।

सबसे पहले मैं

//do a sharpen filter for the large resolution image 
if (viewGray.cols > 1500) 
{ 
    Mat temp ; 
    GaussianBlur(viewGray,temp, Size(0,0), 105) ; //hardcoded filter size, to be tested on 50 mm lens 
    addWeighted(viewGray, 1.8, temp, -0.8,0,viewGray) ; //hardcoded weight, to be tested. 
//imwrite("test"+ imageList[k][i], viewGray) ; 

} 

found = findChessboardCorners(viewGray, boardSize, ptvec, 
CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FILTER_QUADS + CV_CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FAST_CHECK); 

छवि अपलोड की गई प्रयोग किया है:

मूल रिज़ॉल्यूशन पर एक JPG छवि 3744 x 5616, अगर इस साइट बल परिवर्तित, तो सुनिश्चित करें कि आप सही संकल्प पर प्रयोग कर रहे हैं ।

A jpg image at original resolution 3744 x 5616, if this site force convert, then make sure you are using at the correct resolution.

+0

आप चित्र अपलोड कर सकते हैं? इसके अलावा, क्या यह दुर्घटनाग्रस्त हो जाता है या यह झूठी वापसी करता है? – Sassa

+0

@Chrys, छवि अपलोड की गई –

+0

क्या यह छवि के साथ समस्या हो सकती है? आप किस प्रकार का एफ-स्टॉप उपयोग करते हैं? शायद क्षेत्र की कम गहराई एल्गोरिदम को भ्रमित कर सकती है? निचले दाएं कोने को देखो, यह थोड़ी धुंधली है? – Alex

उत्तर

21

कुछ अंक।

  1. जैसा कि आपने देखा, डाउन-साइजिंग, डिटेक्टर की मदद करता है। इसका कारण यह है कि कोनों का पता लगाने के लिए ओपनसीवी में इस्तेमाल किए जाने वाले कोने-डिटेक्शन फ़िल्टर का आकार तय होता है, और आपके कोनों का पता लगाने के लिए कनवॉल्यूशन मास्क का आकार बहुत छोटा हो सकता है - पूर्ण आकार की छवि वास्तव में उस पैमाने पर "चिकनी" लग सकती है, खासकर जहां यह थोड़ा धुंधला है। हालांकि, डाउनस्कलिंग से आप कुछ कोने स्थान सटीकता को फेंक देते हैं।
  2. इसी कारण से, sharpening भी मदद करता है। हालांकि, यह सटीकता के खिलाफ भी जाता है, क्योंकि यह कोनों के उप-पिक्सेल पदों में पूर्वाग्रह जोड़ता है - यहां तक ​​कि शोर के बिना आदर्श मामले में भी। अपने आप को यह समझाने के लिए कि यह मामला है, 1 डी एनालॉग पर विचार करें: एक कोने के चारों ओर छवि की तीव्रता (1 डी में, एक तेज काला-सफेद संक्रमण) आदर्श रूप से एक सिग्मोइड वक्र (चिकनी कोनों के साथ एक रैंप) की तरह दिखता है, और आप चाहते हैं इसके इन्फ्लिक्शन बिंदु का स्थान ढूंढने के लिए। Sharpening वक्र steeper बनाता है, जो सामान्य रूप से उस बिंदु के स्थान को स्थानांतरित करेगा।जब आप ध्यान में रखते हैं कि चीजें आम तौर पर शोर को बढ़ाती हैं तो हालात खराब हो जाते हैं।
  3. आगे बढ़ने का संभावित सही तरीका कम रिज़ॉल्यूशन (यानी डाउनसाइजिंग) पर शुरू करना है, फिर इस प्रकार के कोनों की स्थिति को स्केल करें, और पूर्ण संकल्प पर cvFindCornersSubpix के चलाने के लिए प्रारंभिक अनुमान के रूप में उनका उपयोग करें।
+1

धन्यवाद फ्रैंको, पॉइंट 3 शायद मेरे लिए सहायक हो सकता है। –

+1

आपका स्वागत है। मैंने आपकी तस्वीर में यह भी देखा कि लक्ष्य किसी प्रकार या फोम या बेसबोर्ड समर्थन पर चिपका हुआ प्रतीत होता है। मैं गर्मजोशी से कुछ और कठोर और फ्लैट का उपयोग करने की सलाह देता हूं - खासकर यदि आप एक आधुनिक डीएसएलआर सेंसर के पूर्ण संकल्प का लाभ उठाना चाहते हैं। मेरा जवाब यहां देखें: http://stackoverflow.com/questions/12794876/how-to-verify-the-correctness-of-calibration-of-a-webcam –

+0

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

1

यदि आपके पास ओपनसीवी स्रोत तक पहुंच है और इसे पुनर्निर्माण कर सकते हैं, तो हो सकता है कि आप cvFindChessboardCorners के व्यवहार को डीबग कर सकें।

आपको #defineDEBUG_CHESSBOARD और फिर आपको एल्गोरिदम को समझने में कुछ मदद मिलेगी।

मुझे लगता है कि ओपनसीवी 2.4 में यह क्षमता है (उदाहरण के लिए देखें https://github.com/Itseez/opencv/blob/2.4/modules/calib3d/src/calibinit.cpp)।

नोट:

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

http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findchessboardcorners

+0

इसमें शतरंज के चारों ओर एक सफेद सीमा है। मेरी सलाह यहां अंशांकन नमूना का उपयोग https://github.com/Itseez/opencv/blob/master/samples/cpp/calibration.cpp पर करना है। यह आपको बताएगा कि कोनों को कब मिलेगा। मैं if (found) {... drawChessboardCorners (...);} को संशोधित करता हूं और एक और-ब्लॉक शामिल करता हूं जो कोनों को नहीं मिला है, ताकि कोनों को नहीं मिला ताकि मैं छवियों पर अधिक सभ्य फैशन में ट्रैक रख सकूं। – rbaleksandar

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