दिलचस्प पोस्ट
माता-पिता की मौत के बाद बच्चे की प्रक्रिया कैसे शुरू हो जाती है? जेनरिक दूसरे पैरामीटर का अनुमान नहीं लगा सकते हैं? कैसे jQuery के साथ एक तत्व के दूसरे तत्व को स्थानांतरित करने के लिए? आईपैड सफारी – कीबोर्ड को गायब बनाओ जब मैं एच का प्रयोग करना चाहिए: h: commandLink के बजाय outputLink? सी # में ईमेल सत्यापन के लिए सर्वश्रेष्ठ नियमित अभिव्यक्ति एंटाइटेलमेंट मान्य नहीं हैं जावास्क्रिप्ट फोन नंबर सत्यापन जीजीप्लोट के लिए पैरामीटर गुजर रहा है RestTemplate अनुरोधों के साथ पोस्ट पैरामीटर के रूप में मल्टीपार्ट फ़ाइल भेज रहा है Intent.ACTION_VIEW का उपयोग करते हुए आंतरिक मेमोरी में सहेजी गई निजी फाइलें कैसे खोलें? बिलाव स्मृति सेटिंग्स बढ़ाएं जावा में लूप के लिए बढ़ाए जाने के अंतिम पुनरावृत्ति डॉकर कंटेनर को सेवाएं शुरू करने के बाद कैसे चलाना है? क्लाइंट नोटिफिकेशन, क्या मुझे एक AJAX पुश या पोल का उपयोग करना चाहिए?

छवि बिंदु से एक्स, वाई निर्देशांक (3 डी) कंप्यूटिंग

मेरे पास 3 डी समन्वय प्रणाली में एक ऑब्जेक्ट का पता लगाने का कार्य है चूंकि मुझे लगभग सटीक एक्स और वाई समन्वय प्राप्त करना है, मैंने एक रंग मार्कर को ज्ञात जेड निर्देशांक के साथ ट्रैक करने का फैसला किया है जो चलती ऑब्जेक्ट के शीर्ष पर रखा जाएगा, जैसे कि इस तस्वीर में ऑरेंज बॉल: undistored

सबसे पहले, मैंने आंतरिक पैरामीटर्स प्राप्त करने के लिए कैमरा अंशांकन किया है और उसके बाद मैंने सीवी :: हल पीएनपी का उपयोग रोटेशन और अनुवाद वेक्टर के लिए किया जैसे कि निम्न कोड में:

std::vector<cv::Point2f> imagePoints; std::vector<cv::Point3f> objectPoints; //img points are green dots in the picture imagePoints.push_back(cv::Point2f(271.,109.)); imagePoints.push_back(cv::Point2f(65.,208.)); imagePoints.push_back(cv::Point2f(334.,459.)); imagePoints.push_back(cv::Point2f(600.,225.)); //object points are measured in millimeters because calibration is done in mm also objectPoints.push_back(cv::Point3f(0., 0., 0.)); objectPoints.push_back(cv::Point3f(-511.,2181.,0.)); objectPoints.push_back(cv::Point3f(-3574.,2354.,0.)); objectPoints.push_back(cv::Point3f(-3400.,0.,0.)); cv::Mat rvec(1,3,cv::DataType<double>::type); cv::Mat tvec(1,3,cv::DataType<double>::type); cv::Mat rotationMatrix(3,3,cv::DataType<double>::type); cv::solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec); cv::Rodrigues(rvec,rotationMatrix); 

सभी मैट्रिक्स होने के बाद, यह समीकरण जो छवि बिंदु को wolrd निर्देशांक के साथ बदलने में मेरी मदद कर सकता है:

transform_equation

जहां एम कैमरा मैट्रिक्स है, आर – रोटेशन मैट्रिक्स, टी – टीवीसी, और एस एक अज्ञात है। Zconst ऊंचाई का प्रतिनिधित्व करता है जहां नारंगी गेंद है, इस उदाहरण में यह 285 मिमी है तो, पहले मुझे "एस" प्राप्त करने के लिए, पिछले समीकरण को हल करना होगा, और छवि बिंदु का चयन करके मुझे एक्स और वाई समन्वय मिल जाने के बाद: equation2

इसे हल करने के लिए मैं मैट्रिक्स में अंतिम पंक्ति का उपयोग करके चर "s" पा सकते हैं, क्योंकि Zconst ज्ञात है, इसलिए इसके लिए निम्न कोड है:

 cv::Mat uvPoint = cv::Mat::ones(3,1,cv::DataType<double>::type); //u,v,1 uvPoint.at<double>(0,0) = 363.; //got this point using mouse callback uvPoint.at<double>(1,0) = 222.; cv::Mat tempMat, tempMat2; double s; tempMat = rotationMatrix.inv() * cameraMatrix.inv() * uvPoint; tempMat2 = rotationMatrix.inv() * tvec; s = 285 + tempMat2.at<double>(2,0); //285 represents the height Zconst s /= tempMat.at<double>(2,0); std::cout << "P = " << rotationMatrix.inv() * (s * cameraMatrix.inv() * uvPoint - tvec) << std::endl; 

इसके बाद, मुझे परिणाम मिला: पी = [-2629.5, 1272.6, 285.]

और जब मैं इसे मापने के लिए तुलना करता हूँ, जो है: प्रील = [-2629.6, 1269.5, 285]

त्रुटि बहुत छोटी है जो बहुत अच्छी है, लेकिन जब मैं इस बॉक्स को इस कमरे के किनारों पर ले जाता हूं, तो त्रुटियों शायद 20-40 मिमी हो और मैं इसे सुधारना चाहूंगा। क्या कोई मुझे उस के साथ मदद कर सकता है, क्या आपके पास कोई सुझाव है?

Solutions Collecting From Web of "छवि बिंदु से एक्स, वाई निर्देशांक (3 डी) कंप्यूटिंग"

आपके कॉन्फ़िगरेशन को देखते हुए किनारों पर 20-40 मिमी की त्रुटियां औसत होती हैं। ऐसा लगता है कि आपने सब कुछ अच्छी तरह से किया है

कैमरा / सिस्टम कॉन्फ़िगरेशन संशोधित किए बिना, बेहतर करना कठिन होगा आप कैमरे के अंशांकन को फिर से करने की कोशिश कर सकते हैं और बेहतर परिणाम के लिए उम्मीद कर सकते हैं, लेकिन इससे उन्हें बहुत सुधार नहीं होगा (और आप अंततः खराब परिणाम प्राप्त कर सकते हैं, इसलिए वास्तविक इन्टररिंसिक मापदंडों को मिटाना न भूलें)

जैसा कि count0 ने कहा है, यदि आपको अधिक सटीकता की आवश्यकता है तो आपको कई मापन के लिए जाना चाहिए।

क्या आप विकृत या undistorted छवि से हरे रंग की डॉट्स (छवि पॉइंट्स) प्राप्त करते हैं? क्योंकि फ़ंक्शन का समाधान पीएनपी पहले से ही छवि बिंदुओं को अंडरस्टोर्ट करता है (जब तक आप विरूपण गुणांक पारित नहीं करते हैं, या उन्हें नल के रूप में पास करते हैं)। आप उन छवि बिंदुओं को दोबारा undistorting हो सकता है अगर आप उन्हें undistorted छवि से प्राप्त कर रहे हैं, और यह कोनों में एक बढ़ी हुई त्रुटि पैदा हो जाएगी

https://github.com/Itseez/opencv/blob/master/modules/calib3d/src/solvepnp.cpp