Я также спросил об этом на форуме 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);
}
я вам решение и до сих пор не удалось утверждение проблемы с 'cornerSubPix'. У вас была эта проблема? – Misaki