前提・実現したいこと
単純なZhangのキャリブレーションを行うプログラムを作っています。
発生している問題・エラーメッセージ
findChessboardCornersが成功しません
該当のソースコード
C++
1#include"main.h" 2 3 4int main(void) { 5 6 const std::string win_src = "Source"; 7 const std::string win_und = "Undistorted Image"; 8 const std::string file_cam_param = "cam_param.xml"; 9 10 std::vector<Mat> img; 11 const int NUM_IMG = 5; 12 const Size PAT_SIZE(13, 8); 13 float CHESS_SIZE = 37.5; 14 15 std::vector<std::vector<Point3f>> obj_pos(NUM_IMG); 16 std::vector<std::vector<Point2f>> img_pos(NUM_IMG); 17 18 TermCriteria criteria(TermCriteria::MAX_ITER | TermCriteria::EPS, 20, 0.001); 19 20 Mat inner; 21 Mat distort; 22 std::vector<Mat> r_vec; 23 std::vector<Mat> t_vec; 24 25 for (int i = 0; i < NUM_IMG; i++) { 26 std::string fileName = "./calib_img" + std::to_string(i + 1) + ".jpg"; 27 img.push_back(imread(fileName)); 28 } 29 30 for (int i = 0; i < NUM_IMG; i++) { 31 for (int j = 0; j < PAT_SIZE.area(); j++) { 32 obj_pos[i].push_back(Point3f(static_cast<float>(j%PAT_SIZE.width*CHESS_SIZE), static_cast<float>(j / PAT_SIZE.width*CHESS_SIZE), 0.0)); 33 } 34 } 35 36 for (int i = 0; i < NUM_IMG; i++) { 37 std::cout << "calib_img" << i + 1 << ".jpg"; 38 imshow(win_src, img[i]); 39 if (findChessboardCorners(img[i], PAT_SIZE, img_pos[i])) { 40 drawChessboardCorners(img[i], PAT_SIZE, img_pos[i], true); 41 imshow(win_src, img[i]); 42 std::cout << " - siccess" << std::endl; 43 waitKey(0); 44 } 45 else { 46 std::cout << " - fail" << std::endl; 47 waitKey(0); 48 return -1; 49 } 50 } 51 52 calibrateCamera(obj_pos, img_pos, img[0].size(), inner, distort, r_vec, t_vec); 53 54 55 56 Mat extr(4, 4, CV_64F); 57 setIdentity(extr); 58 Rodrigues(r_vec[0], extr(Rect(0, 0, 3, 3))); 59 t_vec[0].copyTo(extr(Rect(3, 0, 1, 3))); 60 61 FileStorage fswrite(file_cam_param, FileStorage::WRITE); 62 if (fswrite.isOpened()) { 63 fswrite << "extrinsic" << extr; 64 fswrite << "intrinsic" << inner; 65 fswrite << "distortion" << distort; 66 } 67 fswrite.release(); 68 69 Mat img_undist; 70 for (int i = 0; i < NUM_IMG; i++) { 71 undistort(img[i], img_undist, inner, distort); 72 imshow(win_src, img[i]); 73 imshow(win_und, img_undist); 74 waitKey(0); 75 } 76 77 return 0; 78 79 80 81}
試したこと
以下のような画像を多数用意し、上記のプログラムを実行したのですが、どの画像でも一度もfindChessboardCornersが成功せずfailになってしまいます。
以下の画像は、USBカメラを使用し撮影したカラー画像を、cvtColor(color_img, gray_img, CV_BGR2GRAY)を使用してグレースケール化したものです。
補足情報(FW/ツールのバージョンなど)
windows10
visualstudio2017
opencv-3.4.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/18 09:17
2018/11/18 09:37 編集