2013-10-30 10 views
6

मैं अपने आईपैड द्वारा कैप्चर की गई छवियों पर मार्कर का पता लगा रहा हूं। इसके कारण मैं उनके बीच अनुवाद और घूर्णन की गणना करना चाहता हूं, मैं इन छवियों पर छवियों पर परिवर्तन परिप्रेक्ष्य बदलना चाहता हूं, इसलिए ऐसा लगता है कि मैं उन्हें सीधे मार्करों से ऊपर ले जा रहा हूं।ओपनसीवी: पूरे छवि पर लपेटें

photo 1 photo 2 photo 3

के रूप में:

अभी मैं

points2D.push_back(cv::Point2f(0, 0)); 
points2D.push_back(cv::Point2f(50, 0)); 
points2D.push_back(cv::Point2f(50, 50)); 
points2D.push_back(cv::Point2f(0, 50)); 

Mat perspectiveMat = cv::getPerspectiveTransform(points2D, imagePoints); 
cv::warpPerspective(*_image, *_undistortedImage, M, cv::Size(_image->cols, _image->rows)); 

कौन सा मेरी इन परिणामों (warpPerspective का परिणाम के लिए सही-नीचे कोने में देखो) देता है का उपयोग कर रहा

आप शायद परिणाम छवि में परिणाम छवि के बाएं कोने में मान्यता प्राप्त मार्कर शामिल हैं। मेरी समस्या यह है कि मैं पूरी छवि (फसल के बिना) पर कब्जा करना चाहता हूं ताकि मैं बाद में उस छवि पर अन्य मार्करों का पता लगा सकूं।

मैं यह कैसे कर सकता हूं? शायद मुझे solvePnP फ़ंक्शन से रोटेशन/अनुवाद वैक्टर का उपयोग करना चाहिए?

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

Unfortunatelly बदलते विकृत छवि का आकार बहुत मदद नहीं है, क्योंकि छवि अभी भी अनुवाद किया है तो मार्कर के बाएं शीर्ष कोने छवि के ऊपरी-बाएं कोने में है।

उदाहरण के लिए जब मैं आकार दोगुना कर दिया का उपयोग कर:

cv::warpPerspective(*_image, *_undistortedImage, M, cv::Size(2*_image->cols, 2*_image->rows)); 

मैं इन छवियों को प्राप्त किया है:

photo 4 photo 5

उत्तर

3

आपका कोड पूरा होने के लिए प्रतीत नहीं होता है, तो यह कहना मुश्किल है कि समस्या क्या है।

किसी भी मामले में विकृत छवि में इनपुट छवि की तुलना में पूरी तरह से अलग आयाम हो सकते हैं, इसलिए आपको आकार के पैरामीटर को समायोजित करना होगा जिसे आप warpPpectivepective के लिए उपयोग कर रहे हैं।

उदाहरण के लिए आकार को दोगुना करने का प्रयास करें:

cv::warpPerspective(*_image, *_undistortedImage, M, 2*cv::Size(_image->cols, _image->rows)); 

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

यकीन है कि पूरे छवि इस छवि के अंदर है बनाने के लिए, अपनी मूल छवि के हर कोने जिसके परिणामस्वरूप के अंदर होने के लिए विकृत किया जाना चाहिए छवि। तो बस प्रत्येक कोने बिंदुओं के लिए warped गंतव्य की गणना करें और तदनुसार गंतव्य बिंदु समायोजित करें।

इसे और अधिक कुछ नमूना कोड को स्पष्ट करने के लिए:

// calculate transformation 
cv::Matx33f M = cv::getPerspectiveTransform(points2D, imagePoints); 

// calculate warped position of all corners 

cv::Point3f a = M.inv() * cv::Point3f(0, 0, 1); 
a = a * (1.0/a.z); 

cv::Point3f b = M.inv() * cv::Point3f(0, _image->rows, 1); 
b = b * (1.0/b.z); 

cv::Point3f c = M.inv() * cv::Point3f(_image->cols, _image->rows, 1); 
c = c * (1.0/c.z); 

cv::Point3f d = M.inv() * cv::Point3f(_image->cols, 0, 1); 
d = d * (1.0/d.z); 

// to make sure all corners are in the image, every position must be > (0, 0) 
float x = ceil(abs(min(min(a.x, b.x), min(c.x, d.x)))); 
float y = ceil(abs(min(min(a.y, b.y), min(c.y, d.y)))); 

// and also < (width, height) 
float width = ceil(abs(max(max(a.x, b.x), max(c.x, d.x)))) + x; 
float height = ceil(abs(max(max(a.y, b.y), max(c.y, d.y)))) + y; 

// adjust target points accordingly 
for (int i=0; i<4; i++) { 
    points2D[i] += cv::Point2f(x,y); 
} 

// recalculate transformation 
M = cv::getPerspectiveTransform(points2D, imagePoints); 

// get result 
cv::Mat result; 
cv::warpPerspective(*_image, result, M, cv::Size(width, height), cv::WARP_INVERSE_MAP); 
+0

मैं जानता हूँ कि उत्पादन छवि अलग dimenstions हो सकता है, मैं उन्हें दोहरीकरण के साथ की कोशिश की है (परिणामों के लिए संपादित सवाल पर देखने के), लेकिन उसने ऐसा नहीं किया मुझे उपयोगी परिणाम दिया। आप कहते हैं कि मेरा कोड अधूरा है - मुझे क्या जोड़ना चाहिए? मैं रूपांतरण मैट्रिक्स प्राप्त करने के लिए 'getPerspectiveTransform' का उपयोग कर रहा हूं, और मैं 'dst' मैट्रिक्स के रूप में पता लगाए गए मार्कर के कोनों के निर्देशांक का उपयोग कर रहा हूं (ओपनसीवी दस्तावेज़ीकरण के अनुसार - http://docs.opencv.org/modules/imgproc /doc/geometric_transformations.html#getperspectivetransform)। – Axadiw

+0

ठीक है मुझे लगता है कि (-6, -6) इत्यादि के आपके लक्ष्य निर्देशांक थोड़ा अजीब हैं। क्योंकि इसका मतलब है कि परिणामस्वरूप छवि में आपका लक्ष्य आयताकार इन निर्देशांकों पर होगा। उन्हें स्थानांतरित करने के लिए लक्ष्य आयत को लक्ष्य छवि के बीच में ले जाएं। – littleimp

+0

धन्यवाद - मुझे पता चला है कि मैंने गलत पॉइंट 2 डी सरणी पोस्ट की है (मैंने इसे अभी प्रश्न में संपादित किया है)। इन बिंदुओं को थोड़ा सा स्थानांतरित करने से पूरी आउटपुट छवि चली गई है, लेकिन मैं अभी भी इसके कुछ हिस्सों को फसल कर रहा हूं। – Axadiw

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