2015-07-15 4 views
5

Я также спросил об этом на форуме OpenCV, пробую удачу в другом месте. Я использую OpenCV 3.0 в Visual Studio Professional 2013.Проблема с OpenCV с помощью findChessboardCorners

Итак, я пытаюсь выполнить калибровку камеры с помощью кода учебного пособия в учебниках calib3d и this. Я продолжаю повторять ту же ошибку снова и снова (std :: length_error в ячейке памяти), и я проследил ее там, где я пытаюсь добавить вектор угла, указанный с помощью findChessboardCorners, в вектор image_points в последней строке моего кода.

image_points.push_back(corners); 

В окне отладки, размер углов в списке: углы {размер = 2305843009213050645}, что, очевидно, слишком большой (есть в калибровке изображения я использую только 35 углов).

Упомянутый ниже код учебника ниже, хотя снова я выделил проблему, чтобы найти ChessboardCorners, дающую, казалось бы, бессмысленный угловой вектор. Странная часть состоит в том, что нет никаких проблем с рисованием углов на калибровочном изображении, который я использую - кажется, что углы были откалиброваны отлично. Так в чем проблема? Я действительно не знаю, почему findChessboardCorners дал бы мне такой большой угловой вектор, который я даже не могу добавить в список векторов.

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

ответ

1

Понял. Проблема была ошибкой в ​​findChessboardCorners - углы были неправильно изменены внутри самой функции, в результате чего она взорвалась. Нашел проблему и получил исправление от here, хотя мне пришлось преобразовать углы обратно в вектор, как только я запустил исправленную функцию.

Обновленный код:

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

с помощью этой функции:

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

я вам решение и до сих пор не удалось утверждение проблемы с 'cornerSubPix'. У вас была эта проблема? – Misaki