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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

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

C++

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

Q&A

解決済

1回答

2663閲覧

カメラパラメータの算出でのエラー

optimist

総合スコア7

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

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

C++

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

0グッド

0クリップ

投稿2018/01/31 11:07

質問内容

カメラで撮影した画像からパラメータを算出するプログラムが欲しいので,
参考書(OpenCV3プログラミングブック)のソースコードを使用したのですが,
実行した際にエラーが発生してしまいます.

画像処理のプログラミングを始めて1週間程度の初心者です.
プログラムもまだ切って張り付けて実行する程度ですが,
ご教授いただければ幸いです.

環境
VisualStudio2017
OpenCV3.3.1

発生している問題・エラーメッセージ

ハンドルされない例外が 0x00007FFE25703FB8 で発生しました (calibration.exe 内): Microsoft C++ の例外: cv::Exception (メモリの場所 0x0000003C10DECF00)。
Debug Error!! Program:...(ファイルの場所)\calibration.exe abort() has been called (Press Retry to debug the application)

該当のソースコード

c++

1// calibration.cpp : アプリケーションのエントリ ポイントを定義します。 2// 3 4#include "stdafx.h" 5 6#include <iostream> 7#include <opencv2\opencv.hpp> 8 9#pragma comment(lib,"opencv_world331d.lib") 10 11using namespace cv; 12using namespace std; 13 14int main( int argc,char** argv) 15{ 16 const std::string windowNameSrc = "Source"; 17 const std::string windowNameUnd = "Undistorted Image"; 18 const std::string fileNameCameraParameters = "cam_param.xml"; 19 20 std::vector<cv::Mat>checkerImgs; //チェッカーパターン画像 21 const int numberOfCheckerPaterns = 5; //チェッカーパターンが何枚あるか 22 const cv::Size patternSize(10, 7); //チェッカーパターンの交点の数 23 float sizeOfSquare = 23.0; //チェッカーパターンのマス目サイズ[mm] 24 25 std::vector<std::vector<cv::Point3f>> worldPoints(numberOfCheckerPaterns); 26 std::vector<std::vector<cv::Point2f>> imagePoints(numberOfCheckerPaterns); 27 28 cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS, 20, 0.001); 29 cv::Mat cameraMatrix; //内部パラメータ行列 30 cv::Mat distCoeffs; //レンズ歪み行列 31 std::vector<cv::Mat> rotationVectors; //撮影画像ごとに得られる回転ベクトル 32 std::vector<cv::Mat> translationVectors; //撮影画像ごとに得られる平行移動ベクトル 33 34 for (int i = 0; i < numberOfCheckerPaterns; i++) { 35 std::stringstream stream; 36 stream << "f" << i + 1 << ".jpg"; 37 std::string fileName = stream.str(); 38 checkerImgs.push_back(cv::imread(fileName)); 39 std::cout << "チェッカーパターン読み込み:" << fileName << std::endl; 40 } 41 42 for (int i = 0; i < numberOfCheckerPaterns; i++) { 43 std::cout << i + 1 << "番目の画像からチェッカーパターンの交点を検出します"; 44 if (cv::findChessboardCorners(checkerImgs[i], patternSize, imagePoints[i])) { 45 std::cout << "-交点をすべて検出しました" << std::endl; 46 47 cv::drawChessboardCorners(checkerImgs[i], patternSize, imagePoints[i], true); 48 cv::imshow(windowNameSrc, checkerImgs[i]); 49 cv::waitKey(500); 50 51 cv::Mat gray; 52 cv::cvtColor(checkerImgs[i], gray, cv::COLOR_BGR2GRAY); 53 cv::cornerSubPix(gray, imagePoints[i], cv::Size(11, 11), cv::Size(-1, -1), criteria); 54 } 55 else { 56 std::cout << "-検出されなった交点があります" << std::endl; 57 cv::waitKey(0); 58 return -1; 59 } 60 } 61 62 for (int i = 0; i < numberOfCheckerPaterns; i++) { 63 for (int j = 0; j < patternSize.area(); j++) { 64 worldPoints[i].push_back(cv::Point3f(static_cast<float>(j%patternSize.width*sizeOfSquare), static_cast<float>(j / patternSize.width*sizeOfSquare), 0.0)); 65 } 66 } 67 68 cv::calibrateCamera(worldPoints, imagePoints, checkerImgs[0].size(), cameraMatrix, distCoeffs, rotationVectors, translationVectors); 69 70 cv::Mat extrinsic(4, 4, CV_64F); 71 cv::setIdentity(extrinsic); 72 73 cv::Rodrigues(rotationVectors[0], extrinsic(cv::Rect(0, 0, 3, 3))); 74 75 translationVectors[0].copyTo(extrinsic(cv::Rect(3, 0, 1, 3))); 76 77 78 cv::FileStorage fswrite(fileNameCameraParameters, cv::FileStorage::WRITE); 79 if (fswrite.isOpened()) { 80 cv::write(fswrite, "extrinsic", extrinsic); 81 cv::write(fswrite, "intrinsic", cameraMatrix); 82 cv::write(fswrite, "distortion", distCoeffs); 83 } 84 85 cv::Mat undistorted; 86 for (int i = 0; i < numberOfCheckerPaterns; i++) { 87 88 cv::undistort(checkerImgs[i], undistorted, cameraMatrix, distCoeffs); 89 90 cv::imshow(windowNameUnd, undistorted); 91 cv::imshow(windowNameSrc, checkerImgs[i]); 92 cv::waitKey(0); 93 } 94 95 return 0; 96} 97 98

## 実行結果

チェッカーパターン読み込み:f1.jpg チェッカーパターン読み込み:f2.jpg チェッカーパターン読み込み:f3.jpg チェッカーパターン読み込み:f4.jpg チェッカーパターン読み込み:f5.jpg 1番目の画像からチェッカーパターンの交点を検出しますOpenCV Error: Assertion failed (dims <= 2 && step[0] > 0) in cv::Mat::locateROI, file C:\build\master_winpack-build-win64-vc14\opencv\modules\core\src\matrix.cpp, line 991

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下推測で、原因の解明まではできていません。

「1番目の画像からチェッカーパターンの交点を検出します」のあと、「-交点をすべて検出しました」も「-検出されなった交点があります」も出力されていないことから、cv::findChessboardCorners(checkerImgs[i], patternSize, imagePoints[i])の呼び出しに問題があることは容易にわかると思います。
ここで関連するのは3つの引数で、それぞれ問題がないか確認してみください。
checkerImgs[i]:正しく画像が読み込めていてデータが格納されているか
patternSize:固定入力値なので正しい値が定義されているか
imagePoints[i]:固定出力値なので、関数が想定している領域が定義されているか
なんとなく怪しそうなのは第一引数の画像データでしょうか。
cv::imreadの戻り値を確認してみる。
画像ファイルをパス指定していないようなので、実行モジュールと同じフォルダに画像があるかなどを確認してみるとよいかと。

投稿2018/02/01 01:17

ttyp03

総合スコア16996

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

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

optimist

2018/02/01 03:21

回答ありがとうございます. 今回の件なのですが,ビルドして生成されたexeファイルをダブルクリックして 実行したところ,問題なく動作し,カメラの外部パラメータ,内部パラメータ, レンズ歪みの数値を書き出すことができました. 原因は特定できませんでしたが,要求していたものは得られた,という何とも言えない 形となってしまいました. 今まで,VisualStudioで作成したプログラムはそのままVisualStudioを使って開始して いて,問題なかったのですが,このようなことはよくあることなのでしょうか? 今回の件とは関係のない質問になってしまいますが,ご教授いただければ幸いです.
ttyp03

2018/02/01 04:05

ん?解決したのでしょうか? VisualStudioから実行する場合と、直接EXEを起動する場合で動きが変わったということでしょうか。 ということであればVisualStudioから実行する場合、カレントディレクトリがEXEのディレクトリではないのかもしれません。 (すみません、手元に環境がないので未確認です) おそらくソリューションファイルかプロジェクトファイルがある場所がカレントになっているのだと思います。 EXEと同じディレクトリに画像ファイルがある場合、VisualStudio上から実行すると参照できない場所になってしまっていたのではないでしょうか。 画像のファイル名をフルパス名変える、作業ディレクトリを変更する(たぶんできたと思うのですが)等すればVisualStudioから実行しても動くと思います。
optimist

2018/02/01 04:24

回答ありがとうございます. お察しの通り,プロジェクトファイルがある場所に検出する画像を置いたところ 問題なく動作しました. ありがとうございました.助かりました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問