c++ OpenCV के साथ अपनी सामग्री के आधार पर 2 छवियों को कैसे संरेखित करें




image-processing computer-vision (2)

मैं ओपनसीवी के लिए पूरी तरह से नया हूँ और मैंने इसे शुरू कर दिया है। लेकिन मुझे थोड़ी मदद की ज़रूरत है

इसलिए मैं इन 2 छवियों को जोड़ना चाहता हूं:

मैं अपने किनारों के साथ मिलान करने के लिए 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 साथ खेलने की कोशिश की और उन मूल्यों में वृद्धि / कमी की, लेकिन वे वास्तव में एक बड़ा अंतर नहीं बनाते

तो यहां परिणाम है:

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

संपादित करें: मैंने लाल हलकों वाले समस्याग्रस्त किनारों को चिह्नित किया है। इसका लक्ष्य नीचे की छवि को ताना देना है और इसे ऊपर की छवि से लाइनों के साथ मिलान करना है:

मैंने थोड़ा शोध किया और मुझे डर था कि findTransformECC समारोह मुझे नतीजा नहीं दे पाएगा :-(

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

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

यहां 3 स्रोत चित्र हैं:

परिणाम कुछ ऐसा होना चाहिए:

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


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

चित्रों में से किसी एक पर यह एल्गोरिदम चलाने से मुझे यही मिला है:

क्षैतिज रेखाओं को फ़िल्टर करना आसान होना चाहिए (जैसा कि वे Vec4i के रूप में दर्शाए जाते हैं), और फिर आप शेष रेखाओं को एक साथ संरेखित कर सकते हैं।

यहां OpenCV के दस्तावेज़ों में इसका उपयोग करने का उदाहरण दिया गया है।

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

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


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







image-stitching