2014-03-05 175 views
0

失败时总是收到一个assertion failed(0 < =我& &我<(INT)vv.size())in cv::_InputArray::getMat,文件matrix.cpp试图运行projectPoints时。我已经检查了所有我能想到的东西,但我无法弄清楚什么是错的。我的猜测是calibratecamera出了问题,但我不知道我会如何确切地发现问题。这是我的代码,谢谢。断言试图运行projectPoints

using namespace cv; 
using namespace std; 
std::vector<cv::Point3f> Generate3DPoints() 
{ 
    std::vector<cv::Point3f> points; 

    float x,y,z; 

    x=.5;y=.5;z=.5; 
    points.push_back(cv::Point3f(x,y,z)); 

    x=0;y=0;z=0; 
    points.push_back(cv::Point3f(x,y,z)); 

    x=-0;y=0;z=.5; 
    points.push_back(cv::Point3f(x,y,z)); 

    x=0;y=.5;z=.5; 
    points.push_back(cv::Point3f(x,y,z)); 

    x=0;y=-.5;z=0; 
    points.push_back(cv::Point3f(x,y,z)); 

    x=.5;y=0;z=.5; 
    points.push_back(cv::Point3f(x,y,z)); 

    x=.5;y=0;z=0; 
    points.push_back(cv::Point3f(x,y,z)); 

    /* 
    for(unsigned int i = 0; i < points.size(); ++i) 
    { 
    std::cout << points[i] << std::endl; 
    } 
    */ 
    return points; 
} 
int main() 
{ 
    int numBoards = 4; 
    int numCornersHor = 6; 
    int numCornersVer = 9; 
    int numSquares = numCornersHor * numCornersVer; 
    Size board_sz = Size(numCornersHor, numCornersVer); 

    VideoCapture capture = VideoCapture(0); 

    vector<vector<Point3f>> object_points; 
    vector<vector<Point2f>> imagePoints; 
    vector<vector<Point2f>> image_points; 
    vector<Point3f> objectPoints1 = Generate3DPoints(); 

    vector<Point2f> corners; 
    int successes=0; 

    Mat image; 
    Mat gray_image; 
    //capture >> image; 
    Sleep(1000); 
    capture.read(image); 

    imshow("Welcome", image); 
    vector<Point3f> obj; 
    for(int j=0;j<numSquares;j++) 
    obj.push_back(Point3f(j/numCornersHor, j%numCornersHor, 0.0f)); 

    while(successes<numBoards) 
    { 
     cvtColor(image, gray_image, CV_BGR2GRAY); 
     bool found = findChessboardCorners(image, board_sz, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS); 

     if(found) 
     { 
      cornerSubPix(gray_image, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1)); 
      drawChessboardCorners(gray_image, board_sz, corners, found); 
      cout << "SUCESS\n"; 

     } 
     else 
      cout << "FAIL\n"; 

     imshow("win1", image); 
     imshow("win2", gray_image); 

     capture.read(image); 
     image_points.push_back(corners); 
     object_points.push_back(obj); 
     printf("Snap stored!\n"); 
     char continues; 
     cout << "Press c to continue\n"; 
     cin >> continues; 
     successes++; 

     //if(successes>=numBoards) 
     // break; 


    } 

    Mat intrinsic = Mat(3, 3, CV_32FC1); 
    Mat distCoeffs; 
    vector<Mat> rvecs; 
    vector<Mat> tvecs; 

    intrinsic.ptr<float>(0)[0] = 1; 
    intrinsic.ptr<float>(1)[1] = 1; 

    calibrateCamera(object_points, image_points, image.size(), intrinsic, distCoeffs, rvecs, tvecs); 

    cout << "Done\n"; 


    projectPoints(objectPoints1, rvecs, tvecs, intrinsic, distCoeffs, imagePoints); 

    cout << "done2"; 

    return 0; 
} 
+2

*哪个*断言失败? – berak

+0

对不起[此处为剪贴簿](http://i.imgur.com/zhH7JBt.png)。 – OneTwo

+1

将它作为文本添加到问题 – bolov

回答

1

您正在试图通过rvecstvecs的功能projectPoints,其中预计Mat而不是vector<Mat>

基本上,calibrateCamera函数使用几个棋盘图像来估计相机的固有矩阵和失真系数。该函数还返回extrinsics参数的多个版本(旋转+平移),每个图像使用一个。这些外在参数存储在rvecstvecs中。

然而,要在只有这些图像中的一个项目的三维点,所以你应该选择什么样的设置要相对应的图像,其中要投影的对象外在参数(即rvecs[i]tvecs[i]i的)并且仅针对这些外部参数调用projectPoints,而不是整个vectors<Mat>

+0

好吧,虽然错误仍然存​​在后,我改变了代码。 .. 'calibrateCamera(object_points,image_points,image.size(),特性,distCoeffs,rvecs,tvecs); \t垫rvecs1 = rvecs [1]; \t垫tvecs1 = tvecs [1]; \t projectPoints (objectPoints1,rvecs1,tvecs1,intrinsic,distCoeffs,imagePoints);' – OneTwo

+0

感谢您的帮助我明白了,这是您所说的并且我的imagePoints被宣布为错误的组合。不知道为什么说实话,但我改变了它到 'std :: vector imagePoints;'它现在起作用了。 – OneTwo

+0

谢谢!这帮助我解决了与solveP2P()类似的错误。我正在从calibrateCamera()函数移植类似的输入参数,但没有发现变化。 – Hintron