OpenCV Problem mit findChessboardCorners

Ich habe dies auch im OpenCV-Forum gefragt, versuche mein Glück woanders. Ich verwende OpenCV 3.0 in Visual Studio Professional 2013.

So versuche ich, eine Kamera mit dem Tutorial-Code in calib3d und @ zu kalibrierDie Lernprogramm. Ich erhalte immer wieder den gleichen Fehler (std :: length_error am Speicherort) und habe ihn dahin zurückverfolgt, wo ich versuche, den von findChessboardCorners angegebenen Eckvektor zum image_points-Vektor in der letzten Zeile meines Codes hinzuzufügen.

image_points.push_back(corners);

Im Debug-Fenster wird die Größe der Ecken wie folgt angegeben: Ecken {size = 2305843009213050645}, was offensichtlich viel zu groß ist (das verwendete Kalibrierungsbild enthält nur 35 Ecken).

Stripped down Tutorial-Code ist unten, obwohl ich wieder das Problem zu findChessboardCorners isoliert habe, die einen scheinbar unsinnigen Eckvektor geben. Der seltsame Teil ist, dass es kein Problem gibt, die Ecken auf dem von mir verwendeten Kalibrierungsbild zu zeichnen - es scheint, als wären die Ecken perfekt kalibriert. Wo liegt hier also das Problem? Ich weiß wirklich nicht, warum findChessboardCorners mir einen so großen Eckvektor gibt, dass ich ihn nicht einmal einer Liste von Vektoren hinzufügen kann.

using namespace cv;
using namespace std;

int main(int argc, char** argv){

int numBoards = 1;
int numCornersHor=7;
int numCornersVer=5;

int numSquares = numCornersHor * numCornersVer;
Size board_sz = Size(numCornersHor, numCornersVer);

vector<vector<Point3f>> object_points;
vector<vector<Point2f>> image_points;   

vector<Point2f> corners;

int successes = 0;

Mat large_image;
Mat image;
Mat gray_image;
large_image = imread(argv[1], IMREAD_COLOR);
resize(large_image, image, Size(), .5, .5);

vector<Point3f> obj;
for (int j = 0; j<numSquares; j++)
    obj.push_back(Point3f((j / numCornersHor)*29, (j%numCornersHor)*29, 0.0f));

if (image.empty())
        return(0);
else if (image.channels()>1)
    cvtColor(image, gray_image, CV_BGR2GRAY);
else gray_image = image;

bool found = findChessboardCorners(image, board_sz, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FAST_CHECK | CV_CALIB_CB_NORMALIZE_IMAGE);


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);

}

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

int key = waitKey(1);
if (key == 27)
    return 0;

image_points.push_back(corners);
} 

Antworten auf die Frage(2)

Ihre Antwort auf die Frage