पर रोटेशन/अनुवाद वेक्टर कुछ बुनियादी संवर्धित वास्तविकता करने के लिए ओपनसीवी का उपयोग करने की कोशिश कर रहा हूं। जिस तरह से मैं इसके बारे में जा रहा हूं वह कैमरे की छवि से बिंदुओं का एक सेट प्राप्त करने के लिए findChessboardCorners
का उपयोग कर रहा है। फिर, मैं z = 0 विमान के साथ एक 3 डी क्वाड बनाता हूं और इमेज किए गए बिंदुओं और प्लानर बिंदुओं के बीच एक होमोग्राफी प्राप्त करने के लिए solvePnP
का उपयोग करता हूं। उस से, मुझे लगता है कि मुझे एक मॉडलव्यू मैट्रिक्स स्थापित करने में सक्षम होना चाहिए जो मुझे छवि के शीर्ष पर दाएं पॉज़ के साथ घन प्रस्तुत करने की अनुमति देगा।ओपनसीवी: ओपनजीएल मॉडलव्यू मैट्रिक्स
solvePnP
के लिए documentation कहना है कि यह एक रोटेशन वेक्टर आउटपुट "है कि (एक साथ के साथ [अनुवाद वेक्टर]) मॉडल से अंक कैमरे के लिए समन्वय प्रणाली समन्वय प्रणाली लाता है।" मुझे लगता है कि मैं जो चाहता हूं उसके विपरीत है; चूंकि मेरा ट्रैक्टर विमान z = 0 पर है, इसलिए मुझे एक मॉडलव्यू मैट्रिक्स चाहिए जो उस क्वाड को उचित 3 डी प्लेन में बदल देगा।
मैंने सोचा कि विपरीत क्रम में विपरीत घूर्णन और अनुवाद करके मैं सही मॉडलव्यू मैट्रिक्स की गणना कर सकता हूं, लेकिन ऐसा लगता है कि यह काम नहीं करता है। जबकि रेंडर ऑब्जेक्ट (एक घन) कैमरे की छवि के साथ चलता है और लगता है कि अनुवादक रूप से लगभग सही है, तो घूर्णन बिल्कुल काम नहीं करता है; यह एकाधिक अक्षों पर होता है जब इसे केवल एक पर घूर्णन करना चाहिए, और कभी-कभी गलत दिशा में। यहाँ मैं अब तक क्या कर रहा है:
std::vector<Point2f> corners;
bool found = findChessboardCorners(*_imageBuffer, cv::Size(5,4), corners,
CV_CALIB_CB_FILTER_QUADS |
CV_CALIB_CB_FAST_CHECK);
if(found)
{
drawChessboardCorners(*_imageBuffer, cv::Size(6, 5), corners, found);
std::vector<double> distortionCoefficients(5); // camera distortion
distortionCoefficients[0] = 0.070969;
distortionCoefficients[1] = 0.777647;
distortionCoefficients[2] = -0.009131;
distortionCoefficients[3] = -0.013867;
distortionCoefficients[4] = -5.141519;
// Since the image was resized, we need to scale the found corner points
float sw = _width/SMALL_WIDTH;
float sh = _height/SMALL_HEIGHT;
std::vector<Point2f> board_verts;
board_verts.push_back(Point2f(corners[0].x * sw, corners[0].y * sh));
board_verts.push_back(Point2f(corners[15].x * sw, corners[15].y * sh));
board_verts.push_back(Point2f(corners[19].x * sw, corners[19].y * sh));
board_verts.push_back(Point2f(corners[4].x * sw, corners[4].y * sh));
Mat boardMat(board_verts);
std::vector<Point3f> square_verts;
square_verts.push_back(Point3f(-1, 1, 0));
square_verts.push_back(Point3f(-1, -1, 0));
square_verts.push_back(Point3f(1, -1, 0));
square_verts.push_back(Point3f(1, 1, 0));
Mat squareMat(square_verts);
// Transform the camera's intrinsic parameters into an OpenGL camera matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Camera parameters
double f_x = 786.42938232; // Focal length in x axis
double f_y = 786.42938232; // Focal length in y axis (usually the same?)
double c_x = 217.01358032; // Camera primary point x
double c_y = 311.25384521; // Camera primary point y
cv::Mat cameraMatrix(3,3,CV_32FC1);
cameraMatrix.at<float>(0,0) = f_x;
cameraMatrix.at<float>(0,1) = 0.0;
cameraMatrix.at<float>(0,2) = c_x;
cameraMatrix.at<float>(1,0) = 0.0;
cameraMatrix.at<float>(1,1) = f_y;
cameraMatrix.at<float>(1,2) = c_y;
cameraMatrix.at<float>(2,0) = 0.0;
cameraMatrix.at<float>(2,1) = 0.0;
cameraMatrix.at<float>(2,2) = 1.0;
Mat rvec(3, 1, CV_32F), tvec(3, 1, CV_32F);
solvePnP(squareMat, boardMat, cameraMatrix, distortionCoefficients,
rvec, tvec);
_rv[0] = rvec.at<double>(0, 0);
_rv[1] = rvec.at<double>(1, 0);
_rv[2] = rvec.at<double>(2, 0);
_tv[0] = tvec.at<double>(0, 0);
_tv[1] = tvec.at<double>(1, 0);
_tv[2] = tvec.at<double>(2, 0);
}
ड्राइंग कोड में फिर ...
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 0.0f);
modelViewMatrix = GLKMatrix4Translate(modelViewMatrix, -tv[1], -tv[0], -tv[2]);
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, -rv[0], 1.0f, 0.0f, 0.0f);
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, -rv[1], 0.0f, 1.0f, 0.0f);
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, -rv[2], 0.0f, 0.0f, 1.0f);
कोने मैं (यानी से मूल के आसपास इकाई लंबाई की एक घन बनाने के प्रतिपादन कर रहा हूँ - प्रत्येक किनारे के साथ 0.5 से 0.5।) मुझे पता है कि ओपनजीएल अनुवाद कार्यों में "रिवर्स ऑर्डर" में परिवर्तन किए गए हैं, इसलिए उपरोक्त को ज़ेड, वाई, और फिर एक्स अक्ष के साथ घन घुमाया जाना चाहिए, और फिर इसका अनुवाद करना चाहिए। हालांकि, ऐसा लगता है कि इसका अनुवाद पहले किया जा रहा है और फिर घुमाया गया है, तो शायद ऐप्पल का GLKMatrix4
अलग-अलग काम करता है?
This question मेरा बहुत ही समान लगता है, और विशेष रूप से कोडर 9 का उत्तर ऐसा लगता है कि मैं जो कुछ भी ढूंढ रहा हूं वह उतना ही कम हो सकता है। हालांकि, मैंने कोशिश की और परिणामों को मेरी विधि से तुलना की, और मैट्रिस जो मैं दोनों मामलों में पहुंचा था वही थे। मुझे लगता है कि यह जवाब सही है, लेकिन मुझे कुछ महत्वपूर्ण जानकारी याद आ रही है।
यह करने का प्रयास करें कि यह कैसे करें। समन्वय प्रणाली मतभेद के विषय पर इस पोस्ट को देखा। http://stackoverflow.com/questions/9081900/reference-coordinate-system-changes-between-opencv-opengl-and-android-sensor – Koobz