Калибровка камеры OpenCV, утверждение не выполнено ‹ni › 0 && ni==ni1›

Я пытаюсь выполнить калибровку камеры с помощью openCV. На том же примере данных из openCV образцов это прекрасно работает, но мой источник выдает ошибку:

Assertion failed <ni > 0 && ni==ni1>... collectCallibrationData..    calibration.cpp line 3193"
objectPoints and imagePoints are the same size. Changing other inputs dont   affect error code. 

Может ли кто-нибудь помочь мне справиться с этим? Код следующий:

void main()//enter code here
{
//initial operations, declatarions etc
int *Asize; float *APoints; 
float AAPoints[]= {/* My Array */};
int AAsize[] = {4,54,2}; //My array size
Asize = AAsize; APoints = AAPoints; // will be called as dll that is why this wierd attribution
int page = *(Asize); int row = *(Asize+1); int col = *(Asize +2);
Point3f pointBuf;
vector<vector<Point3f>> imagePoints;
vector<Point3f> vectBuf;
Size boardSize; 
boardSize.height = 6; boardSize.width = 9;
Mat cameraMatrix, distCoeffs;
float squareSize=50;


//change 1d array to vector<vector<point3f>>
for (int i = 0; i<page; i++)
{
    for (int j = 0; j<row; j++)
    {
        pointBuf.x = *(APoints + (i*(row*col))+j*2);
        pointBuf.y = *(APoints + (i*(row*col))+j*2+1);
        pointBuf.z = 0;
        vectBuf.push_back(pointBuf);
    }
    imagePoints.push_back(vectBuf);
    vectBuf.clear();
}

// create objectPoint vector<vector<Points3f>>
vector<vector<Point3f>> objectPoints;
 vectBuf.clear();
  for( int i = 0; i < boardSize.height; ++i )
   {
    for( int j = 0; j < boardSize.width; ++j )
         vectBuf.push_back(Point3f(float( j*squareSize ), float( i*squareSize ), 0));
  }
objectPoints.resize(imagePoints.size(),vectBuf);

//initialize starting variables for calibration
cameraMatrix = Mat::eye(3, 3, CV_64F);
distCoeffs = Mat::zeros(1, 1, CV_64F);
cameraMatrix.at<double>(0,0) = 1.0;
vector<Mat> rvecs, tvecs;
Size imageSize; imageSize.width = 2040; imageSize.height = 2040; 


double rms = calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs);
}

person Noob    schedule 26.01.2015    source источник
comment
Хорошо, я что-то не понимаю. Вы говорите, что калибровка работает с выборочными данными, хорошо. Когда именно это не удается? Что вы делаете по-другому?   -  person Aleksander Lidtke    schedule 27.01.2015
comment
SB, редактировавший мой пост, неправильно меня понял (мой плохой английский ..). Я написал: На тех же данных пример (из образцов opecCV) работает отлично.   -  person Noob    schedule 03.02.2015


Ответы (2)


Возникла проблема с использованием cv::calibrateCamera(). Требуется std::vector<std::vector<cv::Point3f>> в качестве первого аргумента и std::vector<std::vector<cv::Point2f>> в качестве второго.

e.g.:

cv::Size imageSize(2040, 2040);
cv::Mat cameraMatrix, distCoeffs;
std::vector<cv::Mat> rvecs,  tvecs;
std::vector<std::vector<cv::Point2f> > imagePoints;  
std::vector<std::vector<cv::Point3f> > objectPoints;

// Fill imagePoints and objectPoints
...

cv::calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs);
person Kornel    schedule 27.01.2015

Я тоже встретил ту же проблему. В моем случае есть ошибка при преобразовании вектора‹ вектора ‹ Point3f > > в InputArrayOfArrays. Вы можете запустить следующий пример кода, чтобы проверить его в своей системе.

using namespace std;
using namespace cv;

/** @function main */
int main( void )
{   
    vector<Point3f> objectPoints_tmp(54);
    objectPoints_tmp.clear();

    for( int i = 0; i < 9; ++i )
        for( int j = 0; j < 6; ++j )
            objectPoints_tmp.push_back(Point3f(j*50, i*50, 0.0f));

    vector<vector<Point3f> > objectPoints(7, objectPoints_tmp); 
    InputArrayOfArrays OBJPOINT = objectPoints; std::cout << (int) OBJPOINT.total() << std::endl;  

    for( int i = 0; i < 7; ++i )
        std::cout << OBJPOINT.getMat(i).checkVector(3, CV_32F) << std::endl;  

    waitKey(0);
    return 0;
}

Обычно он должен распечатываться

7
54
54
54
54
54
54
54

В моем случае NG он выводит случайные числа.

Я предполагаю, что библиотека opencv не подходит для моей системы (win7 x64 + vs2012). После перестройки opencv я теперь могу работать. Вы можете ввести в Google ключевое слово "Win7x64 VS2012 OpenCV CMake TBB".

person Jancsi Wang    schedule 27.10.2015