2016-02-03 226 views
1

我有一個問題,正確的OpenCV程序投影3d點。在使用OpenCV的projectPoints功能時,我似乎遇到了這個問題。OpenCV的3d點投影

這是我得到的錯誤:

OpenCV Error: Assertion failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0)) in create, file /home/daniel/Comp4102/opencv/modules/core/src/matrix.cpp, line 2375 terminate called after throwing an instance of 'cv::Exception' what(): /home/daniel/Comp4102/opencv/modules/core/src/matrix.cpp:2375: error: (-215) mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0) in function create

這裏是我寫的代碼:

#include "opencv2/core/core.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/calib3d/calib3d.hpp" 
#include "opencv2/highgui/highgui.hpp" 

#include <iostream> 
#include <string> 

std::vector<cv::Point3d> set3DPoints(); 

int main(int argc, char* argv[]) { 
    // Setting given variables. 
    double f = 500; 
    double sx = 1; 
    double sy = 1; 
    double ox = 320; 
    double oy = 240; 

    std::vector<cv::Point3d> objectPoints = set3DPoints(); 


    cv::Mat Xw(1,3,cv::DataType<double>::type); 

    Xw.at<double>(0,0) = 150; 
    Xw.at<double>(0,1) = 200; 
    Xw.at<double>(0,2) = 350; 

    // Create the K matrix. 
    cv::Mat K(3,3,cv::DataType<double>::type); 

    K.at<double>(0,0) = -f/sx; 
    K.at<double>(1,0) = 0; 
    K.at<double>(2,0) = ox; 

    K.at<double>(0,1) = 0; 
    K.at<double>(1,1) = -f/sy; 
    K.at<double>(2,1) = oy; 

    K.at<double>(0,2) = 0; 
    K.at<double>(1,2) = 0; 
    K.at<double>(2,2) = 1; 

    // Creating the Rotation Matrix 
    cv::Mat R(3,3,cv::DataType<double>::type); 

    R.at<double>(0,0) = 1; 
    R.at<double>(1,0) = 0; 
    R.at<double>(2,0) = 0; 

    R.at<double>(0,1) = 0; 
    R.at<double>(1,1) = 1; 
    R.at<double>(2,1) = 0; 

    R.at<double>(0,2) = 0; 
    R.at<double>(1,2) = 0; 
    R.at<double>(2,2) = 1; 

    // Creating the Translation vector 
    cv::Mat T(3,1,cv::DataType<double>::type); 
    T.at<double>(0) = -70; 
    T.at<double>(1) = -95; 
    T.at<double>(2) = -120; 

    std::cout << "K: " << "\n" << K << "\n"; 
    std::cout << "R: " << "\n" << R << "\n"; 
    std::cout << "T: " << "\n" << T << "\n"; 

    // Create zero distortion 
    cv::Mat distCoeffs(4,1,cv::DataType<double>::type); 
    distCoeffs.at<double>(0) = 0; 
    distCoeffs.at<double>(1) = 0; 
    distCoeffs.at<double>(2) = 0; 
    distCoeffs.at<double>(3) = 0; 

    // Creating Rodrigues rotation matrix 
    cv::Mat rvecR(3,1,cv::DataType<double>::type); 
    cv::Rodrigues(R,rvecR); 

    std::vector<cv::Point2f> projectedPoints; 

    cv::projectPoints(objectPoints, rvecR, T, K, distCoeffs, projectedPoints); 

    for(unsigned int i=0; i<projectedPoints.size(); i++){ 
    std::cout << "Image point: " << objectPoints[i] << " Projected to " << projectedPoints[i] << "\n"; 
    } 

    return 0; 

} 

std::vector<cv::Point3d> set3DPoints() { 
    std::vector<cv::Point3d> points; 

    double x,y,z; 

    x=150; 
    y=200; 
    z=350; 
    points.push_back(cv::Point3d(x,y,z)); 

    return points; 
} 

回答

2

projectPoints需要的參數objectPoints和相同類型的imagePoints的功能,當你'objectPoints作爲Point3dimagePoints作爲Point2f

錯誤告訴你,這兩種類型是不同的:double != float

簡單地聲明projectedPointsPoint2d,使之具有相同的類型Point3d

std::vector<cv::Point2d> projectedPoints; 
+0

感謝了很多人!我剛剛開始使用opencv,所以我在某些事情上仍然有點失落。 –

+0

很高興幫助! – Miki

+0

@Miki你救了我的命!乾杯。 – metsburg