摄像头校准opencv



嗨,我正在做一个图像三维重建项目。我是校准相机的阶段,这需要很长时间。但当我编译代码并在相机前显示棋盘时,它会直接进入未处理的异常错误。

当图片不在帧中时,它一进入帧就没有错误,出现未处理的错误,我不知道为什么。

我问过很多人,似乎没有人能帮上忙。

这是我的代码

#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错误:在未知函数文件中断言失败(ncorners>=0&&corners.depth()==CV_32F),文件。。。。。\src\opencv\modules\imgproc\src\cornersubpix.cpp,第257行。

错误对话框显示

basicalibration.exe中0x769afc16处未处理的异常:Microsoft C++异常:cv::内存位置0x0021f51c处的异常。。

我们将不胜感激。感谢

使用Point2f和Point3f而不是Point2d和Point3d。请阅读断言文本。它需要CV_32F深度结构。

相关内容

  • 没有找到相关文章

最新更新