前提・実現したいこと、試したこと
Zhangのキャリブレーションを行うプログラム(下記のプログラム)で
内部パラメータ、外部パラメータ、レンズのゆがみ係数を求めることはできました。
しかし、ここで求められた外部パラメータとは、プログラムに与えた1枚目のチェスボードパターンを
撮影した時の外部パラメータです。
例えば、事前にZhangのキャリブレーションで内部パラメータとゆがみ係数を求めておき、
実験する時にその都度、その状態の外部パラメータを算出するというようなことをやりたい場合
どうしたらいいのでしょうか。
その時もまたZhangのキャリブレーションを行わなければならないのでしょうか。
Webで調べたところ、openCVにはsolvePnPという関数があるようなのですが、
これは前述したような状況の時に使うものでしょうか?
しかし、これを使用する場合、どういう値をどういう形で与え、使用すればいいのかわかりませんでした。
もしよろしければ、使い方を詳しく教えていただけないでしょうか。
該当のソースコード
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 = 10; 12 const Size PAT_SIZE(5, 4); 13 float CHESS_SIZE = 1.56; 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}
補足情報(FW/ツールのバージョンなど)
Windows10
VisualStudio2017
OpenCV-3.4.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/20 04:29
2018/11/20 04:54
2018/11/20 06:19
2018/11/20 06:25
2018/11/21 06:44
2018/11/21 08:55
2018/11/21 15:26
2018/11/22 01:33
2018/11/22 07:11