質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

948閲覧

Zhangのキャリブレーションを行いたい

nuiri1343

総合スコア54

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/11/18 08:40

前提・実現したいこと

単純な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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

const Size PAT_SIZE(13, 8);
が間違ってませんか。

投稿2018/11/18 08:56

1T2R3M4

総合スコア114

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nuiri1343

2018/11/18 09:17

13,9ですか! 数え間違えていました ちなみに、偶数×奇数じゃなければならないというようなことが書いてあるサイトがあったのですが それだとこの画像ではできないのですか?
1T2R3M4

2018/11/18 09:37 編集

>偶数×奇数 についてはわかりません。 しかし、実際のチェスボードは8マスx8マス(つまり7x7)ですし、 https://docs.opencv.org/3.4/d9/d0c/group__calib3d.html#ga93efa9b0aa890de240ca32b11253dd4a に掲載のサンプルでは8x6を使用しています。 ``` Sample usage of detecting and drawing chessboard corners: : Size patternsize(8,6); //interior number of corners Mat gray = ....; //source image vector<Point2f> corners; //this will be filled by the detected corners //CALIB_CB_FAST_CHECK saves a lot of time on images //that do not contain any chessboard corners bool patternfound = findChessboardCorners(gray, patternsize, corners, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CALIB_CB_FAST_CHECK); ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問