2015-07-15 3 views
5

J'ai également demandé cela sur le forum OpenCV, tente ma chance ailleurs. J'utilise OpenCV 3.0 dans Visual Studio Professional 2013.OpenCV problème avec findChessboardCorners

Donc j'essaie de calibrer une caméra en utilisant le code du tutoriel dans calib3d et this tutoriel. Je continue d'avoir la même erreur encore et encore (std :: length_error à l'emplacement mémoire) et je l'ai tracé à l'endroit où j'essaie d'ajouter le vecteur de coin donné par findChessboardCorners au vecteur image_points dans la dernière ligne de mon code.

image_points.push_back(corners); 

Dans la fenêtre de débogage, la taille des coins est répertorié comme: coins {size = 2305843009213050645}, ce qui est évidemment trop grande (il y a seulement 35 coins de l'image d'étalonnage J'utilise).

Le code tutoriel réduit est ci-dessous, mais encore une fois, j'ai isolé le problème à findChessboardCorners donnant un vecteur de coin apparemment absurde. La partie étrange est qu'il n'y a aucun problème à dessiner les coins sur l'image d'étalonnage que j'utilise - il semble que les coins ont été calibrés parfaitement. Alors, quel est le problème ici? Je ne sais vraiment pas pourquoi findChessboardCorners me donnerait un si grand vecteur de coin que je ne peux même pas l'ajouter à une liste de vecteurs.

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

Répondre

1

Compris. Le problème était un bug dans findChessboardCorners - les coins n'étaient pas correctement redimensionnés dans la fonction elle-même, provoquant son explosion. J'ai trouvé le problème et j'ai obtenu le correctif de , bien que je devais convertir les coins en vecteur après avoir exécuté la fonction corrigée.

Code Mise à jour:

Mat pointBuf; 

found = actually_findChessboardCorners(image, board_sz, pointBuf, 
      CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_FAST_CHECK | CALIB_CB_NORMALIZE_IMAGE); 

corners.assign((Point2f*)pointBuf.datastart, (Point2f*)pointBuf.dataend); 

en utilisant cette fonction:

bool actually_findChessboardCorners(Mat& frame, Size& size, Mat& corners, int flags) { 
int count = size.area() * 2; 
corners.create(count, 1, CV_32FC2); 
CvMat _image = frame; 
bool ok = cvFindChessboardCorners(&_image, size, 
    reinterpret_cast<CvPoint2D32f*>(corners.data), 
    &count, flags) > 0; 
return ok; 

}

+0

Je vous utilisé la solution et ont toujours échoué problème avec l'affirmation 'cornerSubPix'. Avez-vous eu ce problème? – Misaki