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

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

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

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

Q&A

1回答

4104閲覧

opencv abort() has been called

hidekiM

総合スコア10

OpenCV

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

0グッド

0クリップ

投稿2016/01/20 15:02

編集2016/01/20 15:10

opencvで三次元復元の際にデバックエラーが表示されます。

内容:- abort() has been called

私のコードに明らかなミスなどはありますでしょうか。
(上の文は一部ゴミ化しています。)
(文字数制限のためメモリ開放は部分は書いていません)

LKとORBは普通に表示できるのに座標所得になると文字化けのような状態になるので演算子coutの文を消したところ上記のようなエラーメッセージが表示されます。
(演算子がある際は強制終了します。)
(サンプルコードで回した所、文字化けのような状態が発生してしまいました。)

C4819の警告文は一般的に無視してよいようなので無視しています。

もしくは設定の問題でしょうか。
もし設定に問題がある場合は_TCHARなどの問題でしょうか。

コード
#define NOMINMAX
#include <deque>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <opencv/cv.h>
#include <opencv/cxcore.h>
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/video/video.hpp>
#pragma comment(lib,"opencv_video2411d.lib")
#pragma comment (lib,"opencv_nonfree2411d.lib")
using namespace cv;
using namespace s
int main(int argc, char *argv[])
{
//reft.jpgがrightcamera.xml コマンドプロンプトの一番目の引数にすること
IplImage *src_img1;

CvFileStorage *fs1; CvFileNode *nodeA, *nodeB, *nodeC, *nodeD; //camera.xmlに格納した4つのパラメータ http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1062693080 CvMat *intrinsic1; //カメラ内部マトリックス CvMat *distortion1; //歪みマトリックス CvMat *rotation1; //回転マトリックス CvMat *translation1; //並進マトリックス //right.jpgがletcamera.xml コマンドプロンプトの二番目にすること IplImage *src_img2; CvFileStorage *fs2; CvFileNode *nodeE, *nodeF; //二枚の画像だから、回転と並進は二つなければいけない! CvMat *rotation2; CvMat *translation2; vector<Point2f> LeftImagePoints; vector<Point2f> RightImagePoints; char filename1[] = "camera1.xml"; char filename2[] = "camera1.xml"; //-------------------------------------------------------------- //left fs1 = cvOpenFileStorage(filename1, NULL, CV_STORAGE_READ); if (fs1 == NULL) { MessageBox(NULL, "エラー0", "Message Box TEST PROGRAM", MB_OK); return -1; } //4つのパラメータを行列として表現する。 nodeA = cvGetFileNodeByName(fs1, 0, "intrinsic"); intrinsic1 = (CvMat *)cvRead(fs1, nodeA, 0); nodeB = cvGetFileNodeByName(fs1, 0, "distortion"); distortion1 = (CvMat *)cvRead(fs1, nodeB, 0); nodeC = cvGetFileNodeByName(fs1, 0, "rotation1"); rotation1 = (CvMat *)cvRead(fs1, nodeC, 0); nodeD = cvGetFileNodeByName(fs1, 0, "translation1"); translation1 = (CvMat *)cvRead(fs1, nodeD, 0); //right //二枚の画像だから、回転と並進は二つなければいけない! fs2 = cvOpenFileStorage(filename2, NULL, CV_STORAGE_READ); nodeE = cvGetFileNodeByName(fs2, 0, "rotation2"); rotation2 = (CvMat *)cvRead(fs2, nodeE, 0); nodeF = cvGetFileNodeByName(fs2, 0, "translation2"); translation2 = (CvMat *)cvRead(fs2, nodeF, 0); //コマンドプロンプトにright.jpgとreft.jpgの二枚の画像を格納しておく。 if (argc <2 || (src_img1 = cvLoadImage(argv[1], CV_LOAD_IMAGE_COLOR)) == 0 || (src_img2 = cvLoadImage(argv[2], CV_LOAD_IMAGE_COLOR)) == 0) //if (argc !=3|| (src_img1 = cvLoadImage(argv[1], CV_LOAD_IMAGE_COLOR)) == 0 || (src_img2 = cvLoadImage(argv[2], CV_LOAD_IMAGE_COLOR)) == 0)でもok { MessageBox(NULL, "エラー1", "Message Box TEST PROGRAM", MB_OK); return -1; } //左画像と左の回転行列,並進行列,射影行列 //left.jpg //intrinsic1 (leftcamera.xml) //distortion1 //rotation1 //translation1 //-------------------------------- //右画像と右の回転行列,並進行列,射影行列 //right.jpg //rotation2(rightcamera.xml) //translation2 //--------------------------------------------------------------------------------------------------------------------------------- //一番目 //画像の読み込み Mat imgL = imread("lena1.png"); Mat imgR = imread("lena2.png"); // ORBの特徴点検出子 ()は最大検出数を表す。 OrbFeatureDetector detector; OrbDescriptorExtractor extractor; // 特徴量抽出 Mat descriptorsL, descriptorsR; vector<KeyPoint> keypointsL; vector<KeyPoint> keypointsR; //ORBで検出した左所得画像からの特徴点はKeyPointに格納された。 //その点をピクセル位置まで表示させ座標としてLeftImagePointに格納させた。 detector.detect(imgL, keypointsL); detector.detect(imgR, keypointsR); extractor.compute(imgL, keypointsL, descriptorsL); extractor.compute(imgR, keypointsR, descriptorsR); // マッチング処理を施す事で2画像の対応ができるため有能と判断 vector<DMatch> matches; BFMatcher matcher(cv::NORM_HAMMING, true); matcher.match(descriptorsL, descriptorsR, matches); // 最小距離 double min_dist = DBL_MAX; for (int i = 0; i < (int)matches.size(); i++) { double dist = matches[i].distance; if (dist < min_dist) min_dist = dist; } if (min_dist < 1.0) min_dist = 1.0; // 良いペアのみ残す const double threshold = 3.0 * min_dist; vector<DMatch> matches_good; for (int i = 0; i < (int)matches.size(); i++) { if (matches[i].distance < threshold) { matches_good.push_back(matches[i]); } } Mat matchImage; drawMatches(imgL, keypointsL, imgR, keypointsR, matches_good, matchImage, Scalar::all(-1), Scalar::all(-1), std::vector<char>(), 2); imshow("ORB", matchImage); //--------------------------------------------------------------------------------------------------------------------------- //二番目 //LK法を行う。 vector<KeyPoint>::iterator itk; //特徴点を二次元座標として格納する。 for (itk = keypointsL.begin(); itk != keypointsL.end(); ++itk) { LeftImagePoints.push_back(itk->pt); } for (itk = keypointsR.begin(); itk != keypointsR.end(); ++itk) { RightImagePoints.push_back(itk->pt); } int win_size = 21; vector<unsigned char> status; vector<float> errors; //http://opencv.jp/opencv-2svn/cpp/motion_analysis_and_object_tracking.html calcOpticalFlowPyrLK( imgL, imgR, LeftImagePoints, RightImagePoints, status, errors, cvSize(win_size, win_size), 3, cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.05), 0 ); IplImage *dst_img; dst_img = cvLoadImage(argv[1], CV_LOAD_IMAGE_COLOR); for (int i = 0; i <(int)matches_good.size(); i++) { if (status[i]) cvLine(dst_img, cvPointFrom32f(LeftImagePoints[i]), cvPointFrom32f(RightImagePoints[i]), CV_RGB(255, 0, 0), 1, CV_AA, 0); } cvNamedWindow("calcOpticalFlowPyrLK", CV_WINDOW_AUTOSIZE); cvShowImage("calcOpticalFlowPyrLK", dst_img); waitKey(0); //---------------------------------------------------------------------------------------------------------------------------------------- vector<Point3f>points3D; vector<Point2f>pointsL2D; vector<Point2f>pointsR2D; Mat points4D; if (matches_good.size() > 5) { for (size_t i = 0; i <(int)matches_good.size(); ++i) { //http://moitkfm.blogspot.fi/2014/06/5.html Mat ip(2, 1, CV_64FC1); Point2f pl; Point2f pr; ip.at<double>(0) = keypointsL[matches_good[i].queryIdx].pt.x; ip.at<double>(1) = keypointsL[matches_good[i].queryIdx].pt.y; pl.x = ip.at<double>(0); pl.y = ip.at<double>(1); pointsL2D.push_back(pl); ip.at<double>(0) = keypointsR[matches_good[i].trainIdx].pt.x; ip.at<double>(1) = keypointsR[matches_good[i].trainIdx].pt.y; pr.x = ip.at<double>(0); pr.y = ip.at<double>(1); pointsR2D.push_back(pr); //まだ左右の正確な内部パラメータが分かっていないので、 //f=10,cx=20,cy=30 //hbi=40 double hbi = 40; Mat cameraMatrixL = (Mat_<double>(3, 4) << 10, 0, 20, 10 * hbi, 0, 10, 30, 0, 0, 0, 1, 0 ); Mat cameraMatrixR = (Mat_<double>(3, 4) << 10, 0, 20, 10 * -hbi, 0, 10, 30, 0, 0, 0, 1, 0 ); triangulatePoints(cameraMatrixL, cameraMatrixR, Mat(pointsL2D[i]), Mat(pointsR2D[i]), points4D); convertPointsFromHomogeneous(points4D.reshape(4, 1), points3D); cout << "三次元座標" << points3D << endl; } } //------------------------------------------------------------------------------------------------------------- //特徴点の二次元点群 vector<Point2f> LeftImagePoints //特徴点の三次元点群 points3D //基準画像 left.jpg //カメラ内部パラメータ intrinsic1 (leftcamera.xml) //歪みパラメータ distortion1 //回転行列 rotation1 //並進行列 translation1 //特徴点 vector<KeyPoint> keypointsL; //所得した三次元点群から二次元座標を再度所得する。 //Mat rotationL = (Mat_<float>(3, 1) <<rotation1 ); //Mat translationL = (Mat_<float>(3, 1) << translation1); //http://homepage3.nifty.com/ishidate/opencv_18/opencv_18.htm Mat cameraMatrix = (Mat_<float>(3, 3) << intrinsic1); Mat distcoeffs = (Mat_<float>(5, 1) << distortion1); Mat newrotationL(3, 1, CV_64FC1); Mat newtranslationL(3, 1, CV_64FC1); //所得した二次元と三次元からカメラ位置、姿勢を求める。 solvePnPRansac(points3D, LeftImagePoints, cameraMatrix , distcoeffs, newrotationL, newtranslationL, false, 100, 3.0, 100); projectPoints(points3D, newrotationL, newtranslationL, cameraMatrix, distcoeffs, LeftImagePoints); cout << "カメラ姿勢(左)" << newrotationL<< endl; cout << "カメラ位置(左)" << newtranslationL << endl; cout << "二次元座標(左)" << projectPoints << endl; Mat newrotationR(3, 1, CV_64FC1); Mat newtranslationR(3, 1, CV_64FC1); //所得した二次元と三次元からカメラ位置、姿勢を求める。 solvePnPRansac(points3D, RightImagePoints, cameraMatrix, distcoeffs, newrotationR, newtranslationR, false, 100, 3.0, 100); projectPoints(points3D, newrotationR, newtranslationR, cameraMatrix, distcoeffs, RightImagePoints); cout << "カメラ姿勢(右)" << newrotationR << endl; cout << "カメラ位置(右)" << newtranslationR << endl; cout << "二次元座標(右)" << projectPoints << endl; //http://homepage3.nifty.com/ishidate/opencv_24/opencv_24.htm //http://cvl-robot.hateblo.jp/entry/2014/04/24/160255 waitKey(0); cv::destroyAllWindows(); return 0;

}

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

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

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

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

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

guest

回答1

0

opencv abort() has been calledでぐぐって対処法をためしてみてもだめですかー?

投稿2019/03/16 18:57

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問