c++ - 如何让程序等到我移动棋盘

标签 c++ opencv camera-calibration

我想校准我的立体相机,所以我尝试从左右相机为棋盘捕捉 10 张图像。

代码应该做什么: 从右相机和左相机捕获棋盘的 10 张图像。如果两张图像都包含明确的角点,程序将保存两张图像。程序应该等待 20 帧让我改变棋盘的位置。

发生了什么: 它捕获了 10 个好的图像并保存了它们,但它不等我改变棋盘的位置

这是我的代码:

int captureImages_stereoCal()
{
    CvCapture* captureL = cvCreateCameraCapture(1);
    assert(captureL);
    waitKey(10000);
    CvCapture* captureR = cvCreateCameraCapture(2);
    assert(captureR);
    waitKey(10000);
    /*Mat imageL ;
    Mat imageR*/ ;
    int nx=8 , nh=5;


    int frame=0;
    int s =1;
    int ss;

    CvPoint2D32f* cornersL = new CvPoint2D32f[nx*nh];
    int corner_countL;
    CvPoint2D32f* cornersR = new CvPoint2D32f[nx*nh];
    int corner_countR;

    IplImage *imageL=cvQueryFrame(captureL);
    IplImage *gray_imageL=cvCreateImage(cvGetSize(imageL),8,1);
    IplImage *CimageL=cvCreateImage(cvGetSize(imageL),32,3);
    IplImage *imageR=cvQueryFrame(captureR);
    IplImage *gray_imageR=cvCreateImage(cvGetSize(imageR),8,1);
    IplImage *CimageR=cvCreateImage(cvGetSize(imageL),32,3);
    const int board_dt=20;

    while(s<=12)
    {
        if(frame++ % board_dt == 0)
        {
            string Result;     
            ostringstream convert;  
            ss=s-2;
            convert << ss; 
            Result = convert.str(); 

            //n=(char)s;
            //waitKey(1000);
            //Left -----------------------------------------------------------------------------------------------------------
            string nameL="L.jpg";

            //Find chessboard corners:
            int foundL = cvFindChessboardCorners(imageL, Size(nx,nh), cornersL, &corner_countL,CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
            //Get Subpixel accuracy on those corners
            cvCvtColor(imageL, gray_imageL, CV_BGR2GRAY);
            cvFindCornerSubPix(gray_imageL, cornersL, corner_countL,cvSize(11,11),cvSize(-1,-1), cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));
            //Draw it
            Mat MimageL(imageL);
            CimageL=imageL;
            cvDrawChessboardCorners(CimageL, Size(nx,nh), cornersL,corner_countL, foundL);

            //Right -----------------------------------------------------------------------------------------------
            string nameR="R.jpg";

            //Find chessboard corners:
            int foundR = cvFindChessboardCorners(imageR, Size(nx,nh), cornersR, &corner_countR,CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
            //Get Subpixel accuracy on those corners
            cvCvtColor(imageR, gray_imageR, CV_BGR2GRAY);
            cvFindCornerSubPix(gray_imageR, cornersR, corner_countR,cvSize(11,11),cvSize(-1,-1), cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));
            //Draw it
            Mat MimageR(imageR);
            CimageR=imageR;
            cvDrawChessboardCorners(CimageR, Size(nx,nh), cornersR,corner_countR, foundR);
            cvShowImage( "CalibrationL", CimageL );
            cvShowImage( "CalibrationR", CimageR );



            if(s>2)
            {   
                if((corner_countL==(nx*nh)) && (corner_countR==(nx*nh)) )
                {
                    nameL.insert(1,Result);

                    imwrite(nameL,MimageL); 
                    nameR.insert(1,Result);

                    imwrite(nameR,MimageR);
                    s++;
                }
            }
            int c = cvWaitKey(15);
            if(c == 'p')
            {
                c = 0;
                while(c != 'p' && c != 27)
                {
                    c = cvWaitKey(250);
                }
            }
            if(c == 27)
                return 0;
            imageL = cvQueryFrame(captureL);

            imageR = cvQueryFrame(captureR);
            if(s<3)
                s++;
        }// frame++ end

    } // while end
    return 0;
}

此外,在绘制角之后,它会保存绘制有角的图像。我想在不做任何更改的情况下保存图像。

最佳答案

如果我对问题的理解正确,那是因为您在 if 条件语句中使用了后增量:

if(frame++ % board_dt == 0)

您在上面将 frame 初始化为 0,因此在第一次调用时,if 语句有效地测试了 (0 % 20) == 0,这是正确的.

您可以将 if 语句更改为预增量,例如 if(++frame % board_dt == 0) 以获得您正在寻找的行为

关于c++ - 如何让程序等到我移动棋盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29832690/

相关文章:

python - 有没有办法使我的相机的视平面与场景中的物体表面平行?

C++ : Extend object by downcasting to derived class

c++ - 热键、快捷键和加速键有什么区别?

python - 无法在 Python 中通过 opencv 编写视频

c++ - 十六进制的 OpenCV RGB 值?

c++ - 在 OpenCV 和 c++ 中使用一组有限的图像进行相机校准

c++ - CreateProcess() 中的 lpCommandLine 出现问题

c++ - 从哪里获得 Fedora 19 的 SDL2 非默认库?

iphone - iPhone/ios视频​​图像处理工具和资源

python - 使用 openCV 进行相机校准 - cv2.getOptimalNewCameraMatrix 导致 roi 为零