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

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

ただいまの
回答率

88.37%

opencv abort() has been called

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,588

hidekiM

score 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;
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る