質問内容
カメラで撮影した画像からパラメータを算出するプログラムが欲しいので,
参考書(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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/01 03:21
2018/02/01 04:05
2018/02/01 04:24