मैं ओपनसीवी में एक पैनोग्राफी/पैनोरमा एप्लिकेशन पर काम कर रहा हूं और मैंने एक समस्या में भाग लिया है जिसे मैं वास्तव में समझ नहीं सकता। एक पैनोरामा तस्वीर कैसा दिखता है, इस बारे में एक विचार के लिए, यहां पैनोग्राफी विकिपीडिया आलेख पर एक नज़र डालें: http://en.wikipedia.org/wiki/PanographyOpenCV findHomography Issue
अब तक, मैं कई छवियां ले सकता हूं, और किसी भी छवि को बनाने के दौरान उन्हें एक साथ सिलाई कर सकता हूं, मुझे एक संदर्भ छवि पसंद है; मेरा मतलब यह है कि मेरा मतलब थोड़ा सा है।
हालांकि, जैसा कि आप देख सकते हैं - यह मुद्दों का एक बहुत कुछ है। प्राथमिक मुझे सामना करना पड़ रहा है कि छवियां कटौती कर रही हैं (पुनः: दूर दाएं छवि, छवियों के शीर्ष)। यह बताने के लिए क्यों यह हो रहा है, मैं अंक कि मिलान किया गया है आकर्षित कर देंगे, और जहां परिवर्तन खत्म हो जाएगा के लिए रेखा खींचने:
कहाँ बाईं छवि संदर्भ छवि है, और सही छवि का अनुवाद होने के बाद छवि है (नीचे मूल) - मैंने छवि को हाइलाइट करने के लिए हरे रंग की रेखाएं खींची हैं। छवि निम्नलिखित कोने अंक हैं:
TL: [234.759, -117.696]
TR: [852.226, -38.9487]
BR: [764.368, 374.84]
BL: [176.381, 259.953]
तो मुख्य समस्या मैं यह है कि बाद परिप्रेक्ष्य छवि बदल दिया गया है:
तो तरह ग्रस्त नुकसान:
अब पर्याप्त छवियां, कुछ कोड। करने के लिए
/* calculate the matches */
for(int i = 0; i < descriptors_thisImage.rows; i++) {
double dist = matches[i].distance;
if(dist < min_dist) min_dist = dist;
if(dist > max_dist) max_dist = dist;
}
/* calculate the good matches */
for(int i = 0; i < descriptors_thisImage.rows; i++) {
if(matches[i].distance < 3*min_dist) {
good_matches.push_back(matches[i]);
}
}
यह वह जगह है सुंदर मानक है, और:
मैं एक cv::SurfFeatureDetector
, cv::SurfDescriptorExtractor
और cv::FlannBasedMatcher
उपयोग कर रहा हूँ उन बिंदुओं के सभी प्राप्त करने के लिए, और मैं मैच और ऐसा करके अधिक महत्वपूर्ण बात यह अच्छा मैचों निम्नलिखित गणना ऐसा करने मैं ट्यूटोरियल यहाँ पाया बाद: http://opencv.itseez.com/trunk/doc/tutorials/features2d/feature_homography/feature_homography.html
एक-दूसरे के ऊपर छवियों नकल के लिए, मैं निम्न विधि का उपयोग
+०१२३५१६४१०६१ (जहांimg1
और
img2
std::vector<cv::Point2f>
कर रहे हैं)
/* set the keypoints from the good matches */
for(int i = 0; i < good_matches.size(); i++) {
img1.push_back(keypoints_thisImage[ good_matches[i].queryIdx ].pt);
img2.push_back(keypoints_referenceImage[ good_matches[i].trainIdx ].pt);
}
/* calculate the homography */
cv::Mat H = cv::findHomography(cv::Mat(img1), cv::Mat(img2), CV_RANSAC);
/* warp the image */
cv::warpPerspective(thisImage, thisTransformed, H, cv::Size(thisImage.cols * 2, thisImage.rows * 2), cv::INTER_CUBIC);
/* place the contents of thisImage in gsThisImage */
thisImage.copyTo(gsThisImage);
/* set the values of gsThisImage to 255 */
for(int i = 0; i < gsThisImage.rows; i++) {
cv::Vec3b *p = gsThisImage.ptr<cv::Vec3b>(i);
for(int j = 0; j < gsThisImage.cols; j++) {
for(int grb=0; grb < 3; grb++) {
p[j][grb] = cv::saturate_cast<uchar>(255.0f);
}
}
}
/* convert the colour to greyscale */
cv::cvtColor(gsThisImage, gsThisImage, CV_BGR2GRAY);
/* warp the greyscale image to create an image mask */
cv::warpPerspective(gsThisImage, thisMask, H, cv::Size(thisImage.cols * 2, thisImage.rows * 2), cv::INTER_CUBIC);
/* stitch the transformed image to the reference image */
thisTransformed.copyTo(referenceImage, thisMask);
तो, मेरे पास निर्देशांक हैं कि युद्ध की गई छवि कहां खत्म हो रही है, मेरे पास ऐसे अंक हैं जो इन परिवर्तनों के लिए उपयोग की जाने वाली सजातीय मैट्रिक्स बनाते हैं - लेकिन मुझे यह नहीं पता कि मुझे कैसे जाना चाहिए इन छवियों का अनुवाद करना ताकि वे काट नहीं सकें। किसी भी मदद या पॉइंटर्स की बहुत सराहना की जाती है!
आह, मैं देखता हूं - इससे पहले कि मैं cv :: warp चलाता हूं, संभवतः मैं होलोग्रफ़ी में मानों को संपादित करता हूं? यह अब इतना स्पष्ट है! बहुत बहुत धन्यवाद! इसके अलावा, मैं छवि सिलाई मॉड्यूल में देखूंगा और इसे एक विकल्प के रूप में जोड़ूंगा (अंतरों की तुलना करने के लिए जीपीयू और सीपीयू का उपयोग करके) - बस ओपनसीवी सीखने की कोशिश कर रहा हूं। :-) – krslynx
फिर से धन्यवाद! http://krslynx.com/images/ – krslynx
अपने अच्छे नतीजे देखने के लिए खुशी हुई! – Sam