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

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

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

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

C++

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

Q&A

解決済

1回答

6310閲覧

ステレオマッチングについて

toruhonda

総合スコア30

OpenCV

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

C++

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

0グッド

0クリップ

投稿2016/01/05 08:18

opencv2 プログラミングブックという教材のサンプルコード(ステレオマッチングのコード)を打ち込みビルドは問題なくできるのですがデバッグをするとハンドルされていない例外が発生しましたやアクセスエラーが発生してしまったとなり作動しません。
これは環境設定が間違っているのでしょうか。
opencv初心者ですので初歩的なミスなのかもしれません。
わかる方いましたらお願いします。
情報を追記することがありましたらご指摘ください。

// OpenCV2.3.1Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
//プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
// opencv2のあるフォルダ『C:\OpenCV\include』などを追加のこと
#include "opencv2\opencv.hpp"
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

#ifdef _DEBUG
//Debugモードの場合
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_core231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_imgproc231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_highgui231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_objdetect231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_contrib231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_features2d231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_flann231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_gpu231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_haartraining_engined.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_legacy231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_ts231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_video231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_calib3d231d.lib")
#else
//Releaseモードの場合
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_core231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_imgproc231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_highgui231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_objdetect231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_contrib231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_features2d231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_flann231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_gpu231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_haartraining_engined.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_legacy231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_ts231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_video231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_calib3d231.lib")
#endif

int _tmain(int argc, _TCHAR* argv[])
{
const std ::string windowNameSrc = "Source";
const std ::string windowNameUnd = "Undistorted Image";
const int numberOfCheckerPatterns = 5 ;

cv::vector<cv::Mat> checkerImgs1,checkerImgs2; //チェッカーパターン画像 cv::Mat sceneImg1 = cv::imread( "scene_1.bmp",0 ); cv::Mat sceneImg2 = cv::imread( "scene_r.bmp",0 ); cv::Size imageSize; const cv::Size patternSize( 10,7 ); cv::vector<cv::vector<cv::Point3f>>worldPoints( numberOfCheckerPatterns ); //チェッカー交点座標と対応する世界座標の値を格納する行列 cv::vector<cv::vector<cv::Point2f>>imagePoints1( numberOfCheckerPatterns ); //チェッカー交点座標を格納する行列 cv::vector<cv::vector<cv::Point2f>>imagePoints2( numberOfCheckerPatterns ); //チェッカー交点座標を格納する行列 cv::TermCriteria criteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS , 20, 0.001); //対応するワールド座標系パターン //カメラパラメータ行列 cv::Mat cameraMatrix1, cameraMatrix2; //内部パラメータ行列 cv::Mat distCoeffs1, distCoeffs2 ; //レンズ歪み行列 cv::Mat R,T,E,F,R1,R2,P1,P2,Q ; //2眼の間の関係を保持する行列群 //stereo cv::Mat disp, disp8 ; cv::Rect roi1, roi2 ; cv::StereoBM bm; cv::Mat xyz; int SADWindowSize = 0, numberOfDisparities = 0 ; //ブロックマッチングのパラメータを決定する numberOfDisparities = numberOfDisparities > 0 ? numberOfDisparities : sceneImg1.cols / 8 ; bm.state->roi1 = roi1; bm.state->roi2 = roi2; bm.state->preFilterCap = 31 ; bm.state->SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 9 ; bm.state->minDisparity = 0 ; bm.state->numberOfDisparities = numberOfDisparities ; bm.state->textureThreshold = 10 ; bm.state->uniquenessRatio = 15 ; bm.state->speckleWindowSize = 100 ; bm.state->speckleRange = 32 ; bm.state->disp12MaxDiff = 1 ; //世界座標を決める for(int i = 0; i <numberOfCheckerPatterns; i++ ) { for(int j = 0 ; j <patternSize.area(); j++) { worldPoints[i].push_back( cv::Point3f( static_cast<float>( j % patternSize.width *10 ), static_cast<float>( j / patternSize.width * 10 ), 0.0 ) ) ; } } //2眼分のチェッカーパターン画像を読み込む (グレーで) for( int i = 0 ; i< numberOfCheckerPatterns; i++ ) { std::stringstream stream1, stream2; stream1 << i + 1 << "1.jpg"; stream2 << i + 1 << "r.jpg"; std::string fileName1 = stream1.str(); std::string fileName2 = stream2.str(); checkerImgs1.push_back( cv::imread( fileName1, 0 ) ); checkerImgs2.push_back( cv::imread( fileName2, 0 ) ); } //画像サイズを得る imageSize = cv::Size( checkerImgs1[0].cols, checkerImgs1[0].rows ); //チェックパターンの交点座標を求め、ImagePointsに格納する cv::namedWindow( windowNameSrc, CV_WINDOW_AUTOSIZE ) ; for(int i = 0; i <numberOfCheckerPatterns; i++ ) { std::cout <<"Find corners from image " << i + 1 ; \ if( cv::findChessboardCorners( checkerImgs1[i], patternSize, imagePoints1[i] ) && cv::findChessboardCorners( checkerImgs2[i], patternSize, imagePoints2[i] ) ) { std::cout << "... All corners found." << std::endl ; cv::cornerSubPix( checkerImgs1[i], imagePoints1[i], cv::Size( 11, 11 ), cv::Size( -1, -1 ), criteria ); cv::cornerSubPix( checkerImgs2[i], imagePoints2[i], cv::Size( 11, 11 ), cv::Size( -1, -1 ), criteria ); } else { std::cout <<"... at least 1 corner not found. " << std::endl; cv::waitKey( 0 ); return -1; } } //2眼ステレオカメラ群を同時にキャリブレーション cv::stereoCalibrate( worldPoints, imagePoints1, imagePoints2, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imageSize, R, T, E, F ) ; //Rectification cv::stereoRectify( cameraMatrix1, distCoeffs1, cameraMatrix1, distCoeffs1, imageSize, R, T, R1, R2, P1, P2, Q, cv::CALIB_ZERO_DISPARITY, -1, imageSize, &roi1, &roi2 ); //視差画像の計算 bm(sceneImg1, sceneImg2, disp ); //視差画像を変換して表示

disp.convertTo( disp8, CV_8U,255 / (numberOfDisparities * 16 ) ) ;
cv::imshow( "hoge", disp8 ) ;
cv::waitKey( 0 );
cv::imwrite( "disparity.bmp", disp8 );

//視差画像を距離に変換 cv::reprojectImageTo3D( disp, xyz, Q ,true ); return 0;

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

このような時は、頭からステップ実行しつつ、想定通り動作しているのか確認していくと良いです。
特に画像ファイルの読み込みには成功してますか? imageSizeの内容を確認してみてください。
正常だった場合、そのままステップ実行を継続して、どこで落ちるのか確認してみるとよいと思います。

投稿2016/01/05 08:58

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問