Problema de OpenCV con findChessboardCorners

También pregunté esto en el foro de OpenCV, estoy probando suerte en otro lugar. Estoy usando OpenCV 3.0 en Visual Studio Professional 2013.

Así que estoy tratando de calibrar una cámara usando el código tutorial en calib3d yesta tutorial. Sigo recibiendo el mismo error una y otra vez (std :: length_error en la ubicación de la memoria) y lo he rastreado hasta donde trato de agregar el vector de esquina dado por findChessboardCorners al vector image_points en la última línea de mi código.

image_points.push_back(corners);

En la ventana de depuración, el tamaño de las esquinas aparece como: esquinas {tamaño = 2305843009213050645}, que obviamente es demasiado grande (solo hay 35 esquinas en la imagen de calibración que estoy usando).

El código de tutorial simplificado se encuentra a continuación, aunque nuevamente he aislado el problema para encontrarChessboardCorners que dan un vector de esquina aparentemente sin sentido. La parte extraña es que no hay ningún problema para dibujar las esquinas en la imagen de calibración que estoy usando, parece que las esquinas se calibraron perfectamente. Entonces, ¿cuál es el problema aquí? Realmente no sé por qué findChessboardCorners me daría un vector de esquina tan grande que ni siquiera puedo agregarlo a una lista de vectores.

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta