2017-01-11 15 views
13

के साथ अपनी सामग्री के आधार पर 2 छवियों को संरेखित कैसे करें मैं ओपनसीवी के लिए बिल्कुल नया हूं और मैंने इसमें गोता लगाने शुरू कर दिया है। लेकिन मुझे थोड़ी सी मदद की ज़रूरत होगी।ओपनसीवी

तो मैं इन 2 छवियों संयोजित करना चाहते हैं:

enter image description here

2 छवियों उनके किनारों के साथ मैच के लिए (अब के लिए छवि के बहुत सही हिस्सा अनदेखी)

चाहते हैं कर सकते हैं कृपया मुझे सही दिशा में इंगित करें? मैंने findTransformECC फ़ंक्शन का उपयोग करने का प्रयास किया है। यहाँ मेरी कार्यान्वयन है:

cv::Mat im1 = [imageArray[1] CVMat3]; 
cv::Mat im2 = [imageArray[0] CVMat3]; 

// Convert images to gray scale; 
cv::Mat im1_gray, im2_gray; 
cvtColor(im1, im1_gray, CV_BGR2GRAY); 
cvtColor(im2, im2_gray, CV_BGR2GRAY); 

// Define the motion model 
const int warp_mode = cv::MOTION_AFFINE; 

// Set a 2x3 or 3x3 warp matrix depending on the motion model. 
cv::Mat warp_matrix; 

// Initialize the matrix to identity 
if (warp_mode == cv::MOTION_HOMOGRAPHY) 
    warp_matrix = cv::Mat::eye(3, 3, CV_32F); 
else 
    warp_matrix = cv::Mat::eye(2, 3, CV_32F); 

// Specify the number of iterations. 
int number_of_iterations = 50; 

// Specify the threshold of the increment 
// in the correlation coefficient between two iterations 
double termination_eps = 1e-10; 

// Define termination criteria 
cv::TermCriteria criteria (cv::TermCriteria::COUNT+cv::TermCriteria::EPS, number_of_iterations, termination_eps); 

// Run the ECC algorithm. The results are stored in warp_matrix. 
findTransformECC(
       im1_gray, 
       im2_gray, 
       warp_matrix, 
       warp_mode, 
       criteria 
       ); 

// Storage for warped image. 
cv::Mat im2_aligned; 

if (warp_mode != cv::MOTION_HOMOGRAPHY) 
    // Use warpAffine for Translation, Euclidean and Affine 
    warpAffine(im2, im2_aligned, warp_matrix, im1.size(), cv::INTER_LINEAR + cv::WARP_INVERSE_MAP); 
else 
    // Use warpPerspective for Homography 
    warpPerspective (im2, im2_aligned, warp_matrix, im1.size(),cv::INTER_LINEAR + cv::WARP_INVERSE_MAP); 


UIImage* result = [UIImage imageWithCVMat:im2_aligned]; 
return result; 

मैं termination_eps और number_of_iterations के साथ प्रयोग करना की कोशिश की और बढ़ गई हैं/उन मूल्यों में कमी आई है, लेकिन वे वास्तव में एक बड़ा अंतर नहीं किया।

तो यहाँ

परिणाम है:

enter image description here

मैं अपने परिणाम सुधारने के लिए क्या कर सकते हैं?

संपादित करें: मैंने लाल मंडलियों के साथ समस्याग्रस्त किनारों को चिह्नित किया है।

enter image description here

मैं अनुसंधान का एक छोटा सा था और मुझे डर लग रहा findTransformECC समारोह मुझे नहीं देंगे: लक्ष्य नीचे छवि के ताने और यह ऊपर छवि से लाइनों के साथ मिलान करने के लिए है नतीजा यह है कि मैं चाहता हूं :-(

कुछ महत्वपूर्ण जोड़ने के लिए: मेरे पास वास्तव में उन छवियों "पट्टियों" की एक सरणी है, 8 इस मामले में, वे सभी यहां दिखाए गए चित्रों के समान दिखते हैं और उन्हें सभी की आवश्यकता है लाइन से मेल खाने के लिए संसाधित किया जाना चाहिए। मैंने ओपनसीवी के stitch फ़ंक्शन के साथ प्रयोग करने का प्रयास किया है, लेकिन परिणाम भयानक थे।

संपादित करें:

यहाँ 3 स्रोत छवियों:

:

1

2

3

परिणाम कुछ इस तरह होना चाहिए

मैंने मिलान करने वाली रेखाओं के साथ हर छवि को बदल दिया। एक दूसरे से बहुत दूर की रेखाएं अनदेखा की जा सकती हैं (छवि के दाहिने भाग पर छाया और सड़क का टुकड़ा)

+0

क्या आप हमें एक उदाहरण दिखा सकते हैं कि आप अपना परिणाम कैसा दिखाना चाहते हैं? – alhadhrami

+0

@alhadhrami बेशक। मैंने प्रश्न में कुछ विवरण जोड़े हैं। – gasparuff

+0

आपने मुझे गलत समझा। मैं एक सही आउटपुट का एक उदाहरण देखने के लिए कह रहा था, एक आउटपुट जिसे आप कोड बनाना चाहते हैं। @gasparuff – alhadhrami

उत्तर

5

आपकी छवियों से, ऐसा लगता है कि वे ओवरलैप करते हैं। चूंकि आपने कहा है कि stitch फ़ंक्शन आपको वांछित परिणाम नहीं मिला है, अपनी खुद की सिलाई लागू करें। मैं इसके करीब कुछ करने की कोशिश कर रहा हूं।सी ++ में इसे कार्यान्वित करने के तरीके पर एक ट्यूटोरियल यहां दिया गया है: https://ramsrigoutham.com/2012/11/22/panorama-image-stitching-in-opencv/

+0

उस इनपुट के लिए धन्यवाद। वास्तव में मैंने इसे जांच लिया है लेकिन परिणाम अभी तक उपयोगी नहीं हैं। मैं अभी भी पता लगा रहा हूँ। – gasparuff

3

आप दो छवियों पर उच्च दहलीज के साथ हफ़ एल्गोरिदम का उपयोग कर सकते हैं और फिर दोनों पर लंबवत रेखाओं की तुलना कर सकते हैं - उनमें से अधिकतर को थोड़ा सा स्थानांतरित किया जाना चाहिए, लेकिन रखें कोण।

Houghlines algorithm on first example

छनन बाहर क्षैतिज लाइनों आसान होना चाहिए (के रूप में वे Vec4i के रूप में प्रतिनिधित्व कर रहे हैं), और फिर आप कर सकते हैं:

यह है कि मैं क्या चित्रों में से एक पर इस एल्गोरिथ्म चलने से मिल गया है है शेष लाइनों को एक साथ संरेखित करें।

OpenCV's documentation में इसका उपयोग करने का उदाहरण यहां दिया गया है।

अद्यतन: एक और विचार। एक साथ लाइनों को संरेखित करना इस तरह की अवधारणा के साथ किया जा सकता है कि क्रॉस-सहसंबंध कार्य कैसे काम करता है। इससे कोई फर्क नहीं पड़ता कि तस्वीर 1 में 10 लाइनें हैं, और तस्वीर 2 में 100 लाइनें हैं, के साथ शिफ्ट की स्थिति लाइनों को गठबंधन किया गया है (जो ज्यादातर, सीसीएफ के लिए अधिकतम है) जवाब के बहुत करीब होना चाहिए, हालांकि इसकी आवश्यकता हो सकती है कुछ tweaking - उदाहरण के लिए प्रत्येक लंबाई के लिए वजन, कोण, आदि के आधार पर वजन देना। कंप्यूटर दृष्टि कभी सीधा रास्ता नहीं है, हुह :)

अद्यतन 2: मुझे वास्तव में आश्चर्य है कि शीर्ष छवि के नीचे पिक्सेल लाइन को लेना सरणी 1 और सरणी 2 के रूप में नीचे की छवि के शीर्ष पिक्सेल लाइन और उनके ऊपर सामान्य सीसीएफ चलाना, फिर शिफ्ट के रूप में अधिकतम का उपयोग करना भी काम कर सकता है ... लेकिन मुझे लगता है कि यह अच्छा काम करने पर एक ज्ञात विधि होगी।

+0

आपके मूल्यवान इनपुट के लिए धन्यवाद। हालांकि मैं वास्तव में नहीं जानता कि इस सिद्धांत को कोड में कैसे रखा जाए। आपका अपडेट 2 कुछ ऐसा है जो मैं भी सोच रहा था। लेकिन मुझे यह पता लगाना होगा कि सीसीएफ कैसे काम करता है। – gasparuff

+0

@gasparuff सीसीएफ (ए, बी) == आरईवी_एफएफटी (एफएफटी (ए) * कन्ज (एफएफटी (बी))), जहां ए, बी - 2 लंबाई की शक्ति के इनपुट वैक्टर, शून्य के साथ बचे हुए लोगों को भरें, एफएफटी तेज फूरियर ट्रांसफॉर्म है , और आरईवी_एफएफटी एक रिवर्स एक है, CONJ जटिल संयोग है। ए और बी के काल्पनिक हिस्सों में शुरुआत में शून्य हैं, वास्तविक भाग संबंधित पिक्सेल लाइनों के ग्रेस्केल मान हैं। सीसीएफ का नतीजा भी जटिल है, इसे प्रत्येक तत्व के लिए (re^2) + (im^2) में बदलना होगा। –

+0

परिणाम का अधिकतम तत्व आपको आवश्यक शिफ्ट प्रदान करेगा। –