2015-07-15 12 views
5

Ich fragte auch dies auf dem OpenCV-Forum, versuche mein Glück woanders. Ich verwende OpenCV 3.0 in Visual Studio Professional 2013.OpenCV-Ausgabe mit findChessboardCorners

Also versuche ich eine Kamera mit dem Tutorial-Code in calib3d und this Tutorial zu kalibrieren. Ich bekomme immer wieder den gleichen Fehler (std :: length_error am Speicherort) und ich habe es zurückverfolgt, wo ich versuche, den Eckvektor von findChessboardCorners zum Vektor image_points in der letzten Zeile meines Codes hinzuzufügen.

image_points.push_back(corners); 

im Debug-Fenster wird die Größe der Ecken aufgelistet wie: Ecken {size = 2305843009213050645}, die zu groß offensichtlich Art und Weise ist (es gibt nur 35 Ecken in dem Kalibrierungsbild Ich verwende).

Stripped nach unten tutorial code ist unten, obwohl ich wieder das Problem zu findsChessboardCorners isoliert, die einen scheinbar unsinnigen Eckvektor geben. Der komische Teil ist, dass es kein Problem gibt, die Ecken des Kalibrierungsbildes, das ich verwende, zu zeichnen - es scheint, als wären die Ecken perfekt kalibriert. Also, was ist das Problem hier? Ich weiß wirklich nicht, warum findSchachbrettCorners mir einen so großen Eckvektor geben würde, 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); 
} 

Antwort

1

Ich habe es herausgefunden. Das Problem war ein Fehler in findSchachbrettCorners-- Ecken wurde nicht richtig in der Funktion selbst angepasst, so dass es explodiert. Ich habe das Problem gefunden und das Update von here bekommen, obwohl ich die Ecken wieder in einen Vektor konvertieren musste, nachdem ich die korrigierte Funktion ausgeführt hatte.

Aktualisiert Code:

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

diese Funktion verwenden:

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

ich dich Lösung und haben immer noch Assertionsfehler Problem mit 'cornerSubPix'. Hattest du dieses Problem? – Misaki