2016-07-27 1 views
0

я использовал OpenCV для преобразования углов Эйлера к rotationmatrixCv :: Mat CvType изменения при возвращении

cv::Mat transformEulerToRotation(const cv::Mat &euler) { 
    float rot[9] 
    //transforming things 
    //... 
    cv::Mat resMat = cv::Mat(3, 3, CV_32F, rot); 
    //here can I check the result 
    std::cout << "resMat " << resMat << std::endl; 
    return resMat; 
} 

void otherFunction() { 
    //... 
    std::cout << "rotMat function " << transformEulerToRotation(euler) << std::endl; 
    cv::Mat rotMat = transformEulerToRotation(euler).clone; 
    std::cout << "rotMat variable " << rotMat << std::endl; 
} 

В результате я получаю, например:

resMat [0.99965221, -0.024546526, -0.009639469; 
-0.017124595, 0.99955207, 0.024376612; 
0.010061417, 0.017124617, 0.99980277] 

rotMat function [6.4592681e-31, 0, 2.6510468e-36; 
0, 4.291036e-38, 0; 
6.4569209e-31, 0, 0.21559119] 

rotMat variable [0.99965221, -0.024546526, 1.5537966e-32; 
-3.7597382e+19, 0.99955207, 0.024376612; 
9.3246211e-39, 0, 0.21557593] 

Я не знаю, что меняется, когда я просто возвращаю cv :: Mat. Что я могу сделать, чтобы вернуть матрицу с теми же значениями.

+1

Мы не знаем, что вы делаете внутри этой функции (что, вероятно, является проблемой). Попробуйте вернуть клонированную матрицу: 'return resMat.clone();' поскольку ваш внутренний буфер 'rot', вероятно, просто будет содержать мусор после выхода из функции. Или просто 'return cv :: Mat (3, 3, CV_32F, rot) .clone();' – Miki

+0

Да, это ответ. Я должен клонировать коврик. Спасибо – BeJay

+0

Рад, что это помогло, отправлено как ответ, тогда – Miki

ответ

0

После выхода из функции буфер rot будет содержать значения мусора. Для создания глубокой копии внутренних данных необходимо создать матрицу clone(), так как простая копия просто создаст еще один заголовок Mat, указывающий на те же внутренние данные (которые будут повреждены).

Таким образом, вы можете:

return resMat.clone(); 

или избегать создания промежуточной матрицы:

return cv::Mat(3, 3, CV_32F, rot).clone(); 
2

Я уверен, что clone() подход работает, но если вы заботиться о производительности, вы должны попробовать избегайте копирования. Идея состоит в том, чтобы сначала создать cv::Mat и напрямую работать с его данными. В вашем случае

cv::Mat transformEulerToRotation(const cv::Mat &euler) 
{ 
    cv::Mat rotMat(3, 3, CV_32F); 
    float* rot = rotMat.ptr<float>(); 
    // You can operate on rot now 
    // transforming things 
    // ... 
    // Check the result 
    std::cout << "rotMat" << rotMat<< std::endl; 
    return rotMat; 
} 
+0

Да, это лучше .. клонирование 9 плавает, это не большое дело, хотя – Miki

Смежные вопросы