前提・実現したいこと
opencv4.4.0を用いてc++カメラの歪み補正を行いたいです.
参考にしているページはhttps://qiita.com/kazz4423/items/f173f298704bd121043dです.
またオライリー社のOpenCv3の本も参考にしています.
発生している問題・エラーメッセージ
calibratecamera関数に差し掛かった時点でハンドルされていない例外のエラーが出てしまいます.
ハンドルされない例外が 0x00007FFAC6A73E49 で発生しました (OpenCV_environment.exe 内): Microsoft C++ の例外: cv::Exception (メモリの場所 0x00000032FC177420)。
該当のソースコード
C++
1#include <sstream> 2#include <iomanip> 3#include <iostream> 4#include <opencv2/opencv.hpp> 5#include <stdio.h> 6#include <opencv2/core/types.hpp> 7#include <opencv2/flann/flann.hpp> 8#include <opencv2/highgui.hpp> 9 10using namespace cv; 11using namespace std; 12 13int main() 14{ 15 //変数宣言 16 Mat src; //入力画像 17 int gazou=32; 18 vector<cv::Mat> srcImages; 19 int i, j, k; //foe文カウント用 20 int chessbord_line = 4, chessbord_column = 7; //チェスボードの行と列 21 int chess_number = chessbord_line * chessbord_column; 22 double chess_size = 100.0; //チェスボードの行(mm) 23 Size patternSize = Size(chessbord_line, chessbord_column); 24 vector<cv::Point2f> corners;//検出したチェスボードのコーナー座標(画像上での二次元座標)を格納 25 cv::Point3d objects[896]; 26 Size winsize = Size(5, 5); //探索窓のサイズの半分 27 Size zerozone = Size(-1, -1);//探索領域の中心に存在する対象外領域の半分のサイズ 28 int maxCount = 30;//高精度化のための繰り返し回数 29 double epsilon = 0.1;//高精度化のためのεの値 30 vector<vector<cv::Point2f> > image_points;//二次元座標格納用(画像平面座標) 31 vector<vector<cv::Point3f> > object_points;//三次元座標格納用(現実の座標) 32 vector<cv::Point3f> object; 33 Size image_size; 34 Mat intrinsic_matrix; 35 36 for (int i = 0; i <= 32; i++) { 37 //画像の読み込み 38 string filename_i, filename_o; 39 if (i < 10) filename_i = "output_00" + to_string(i) + ".jpg"; 40 else if (i < 100) filename_i = "output_0" + to_string(i) + ".jpg"; 41 else if (i >= 100) filename_i = "output_" + to_string(i) + ".jpg"; 42 src = imread(filename_i, CV_8UC3); 43 srcImages.push_back(src); 44 //チェスボードのコーナー検出 45 bool found = findChessboardCorners(//コーナーが見つかったらtrueを返すのでbool 46 src, //入力画像 47 patternSize, //チェスボードのサイズ 48 corners //検出したコーナーの座標 49 ); 50 if (found==true){ 51 52 //コーナー位置の高精度化 53 cornerSubPix( 54 src, //入力画像 55 corners, //検出したコーナーの座標 56 winsize, //探索窓のサイズの半分.例えば winSize=Size(5,5) の場合,(5*2+1)*(5*2+1)= 11*11 サイズの探索窓が利用される 57 zerozone, //探索領域の中心に存在する対象外領域(後述の式において総和を計算する際に含まれない)の半分のサイズ.この値は,自己相関行列において発生しうる特異点を避けるために用いられます. 値が (-1,-1) の場合は,そのようなサイズはないということを意味します. 58 TermCriteria(maxCount + epsilon, 30, 0.01) 59 ); 60 61 //チェスボードのコーナー描画 <-- 検出できてるかの確認 62 drawChessboardCorners( 63 src, //入力画像 64 patternSize, //チェスボードのサイズ 65 corners, //検出したコーナーの座標 66 found //なにこれ 67 ); 68 imshow("src", src);//画像を表示 69 waitKey(100); 70 } 71 image_points.push_back(corners);//検出したコーナーの座標をimage_pointに格納 72 //object_points.push_back(vector<cv::Point3f>());// object_poinntsを初期化 73 } 74 for (j = 0; j < chessbord_line; j++) { 75 for (k = 0; k < chessbord_column; k++) { 76 Point3f p( 77 j * chess_size, 78 k * chess_size, 79 0.0); 80 object.push_back(p); 81 } 82 } 83 for (i = 0; i < gazou; i++) 84 { 85 object_points.push_back(object); 86 } 87 int flags = 0; 88 Mat cam_mat; 89 Mat dist_cofes; 90 vector<cv::Mat>rvecs, tvecs; 91 calibrateCamera( 92 object_points, 93 image_points, 94 srcImages[0].size(), 95 cam_mat, 96 dist_cofes, 97 rvecs, 98 tvecs 99 //CALIB_ZERO_TANGENT_DIST | CALIB_FIX_PRINCIPAL_POINT 100 ); 101}
試したこと
Opencvのリファレンスのcalibratecameraの記事を参照し,引数の型や何次元ベクトルでないといけないのかなどを確認しましたが,どこが間違いなのかイマイチわかりませんでした。
補足情報(FW/ツールのバージョンなど)
Opencv4.4.0とvisualstudio2019でローカルwindowsデバッガーで動かしています.
cv::Exception例外にはエラー原因情報が格納されています。次ページを参考に確認してみてはいかがでしょう。http://opencv.jp/opencv-2svn/cpp/error_handling.html
あなたの回答
tips
プレビュー