4

こんにちは私は画像の3D再構成を行うプロジェクトを行っています。私はカメラのキャリブレーションの段階であり、これには長い時間がかかります。しかし、コードをコンパイルしてカメラの前にチェッカーボードを表示すると、例外エラーが処理されなくなります。

画像がフレームにない場合、フレームに入るとすぐにエラーが発生せず、未処理のエラーが発生します。理由はわかりません。

私は多くの人に尋ねました、体は助けにならないようです。

これが私のコードです

#include <cv.h>
#include <highgui.h>
#include <vector>
#include <stdlib.h>
#include <stdio.h>

using namespace cv;
using namespace std;

int main()
{
    int numBoards = 0;
    int numCornersHor;
    int numCornersVer;

    printf("Enter number of corners along width: ");
    scanf("%d", &numCornersHor);

    printf("Enter number of corners along height: ");
    scanf("%d", &numCornersVer);

    printf("Enter number of boards: ");
    scanf("%d", &numBoards);

    int numSquares = numCornersHor * numCornersVer;
    Size board_sz = Size(numCornersHor, numCornersVer);
    VideoCapture capture = VideoCapture(0);

    vector<vector<Point3d>> object_points;
    vector<vector<Point2d>> image_points;

    vector<Point2d> corners;
    int successes=0;

    Mat image;
    Mat gray_image;
    capture >> image;

    vector<Point3d> obj;
    for(int j=0;j<numSquares;j++)
        obj.push_back(Point3d(j/numCornersHor, j%numCornersHor, 0.0f));

    while(successes<numBoards)
    {
        cvtColor(image, gray_image, CV_BGR2GRAY);

        bool found = findChessboardCorners(image, board_sz, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);

        if(found)
        {
            cornerSubPix(gray_image, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
            drawChessboardCorners(gray_image, board_sz, corners, found);
        }

        imshow("win1", image);
        imshow("win2", gray_image);

        capture >> image;

        int key = waitKey(1);

        if(key==27)
            return 0;

        if(key==' ' && found!=0)
        {
            image_points.push_back(corners);
            object_points.push_back(obj);
            printf("Snap stored!\n");

            successes++;

            if(successes>=numBoards)
                break;
        }
    }

    Mat intrinsic = Mat(3, 3, CV_32FC1);
    Mat distCoeffs;
    vector<Mat> rvecs;
    vector<Mat> tvecs;

    intrinsic.ptr<float>(0)[0] = 1;
    intrinsic.ptr<float>(1)[1] = 1;

    calibrateCamera(object_points, image_points, image.size(), intrinsic, distCoeffs, rvecs, tvecs);

    Mat imageUndistorted;
    while(1)
    {
        capture >> image;
        undistort(image, imageUndistorted, intrinsic, distCoeffs);

        imshow("win1", image);
        imshow("win2", imageUndistorted);

        waitKey(1);
    }

    capture.release();

    return 0;
}

コンソールで発生するエラーは

OpenCVエラー:不明な関数ファイル、ファイル..... \ src \ opencv \ modules \ imgproc \ src \cornersubpix.cppの257行でアサーションが失敗しました(ncorners> = 0 &&corners.depth()== CV_32F)。

エラーダイアログには

basiccalibration.exeの0x769afc16での未処理の例外:Microsoft C ++例外:メモリ位置0x0021f51cでのcv::Exception。

助けていただければ幸いです。ありがとう

4

1 に答える 1

3

Point2dとPoint3dの代わりにPoint2fとPoint3fを使用してください。アサーションテキストを読んでください。CV_32F深度構造が必要です。

于 2013-02-13T09:26:56.540 に答える