findChessboardCorners给出了意想不到的结果

时间:2016-09-29 12:01:55

标签: c++ opencv camera-calibration

这是我的代码

#include <opencv/cv.h> 
#include <opencv/highgui.h>
#include<opencv2/opencv.hpp>

#include<iostream>
//#include<vector>

using namespace cv;
using namespace std;

int main()
{
    VideoCapture cap = VideoCapture(0);
    int successes = 0;

    int numBoards = 0;
    int numCornersHor = 6;
    int numCornersVer = 4;

    int numSquares = (numCornersHor - 1) * (numCornersVer - 1);
    Size board_sz = Size(numCornersHor, numCornersVer);



    vector<Point2f> corners;


    for (;;)
    {
        Mat img;
        cap >> img;
        Mat gray;
        cvtColor(img, gray, CV_RGB2GRAY);
        if (img.empty()) break; // end of video stream
        imshow("this is you, smile! :)", gray);
        if (waitKey(1) == 27) break; // stop capturing by pressing ESC 


    bool found = findChessboardCorners(gray, board_sz, corners, CALIB_CB_ADAPTIVE_THRESH);
    if (found == 1)
    {
        cout << corners.size()<<"\n";

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

    }

    cap.release();
        waitKey();
        return 0;
    }

代码正在从网络摄像头捕获帧。如果检测到棋盘,则会打印出找到的角落总数(我这样做是因为我没有获得与教程代码相同的输出,我想找到错误的位置)。

输出:

2 个答案:

答案 0 :(得分:1)

首先你应该遵循一些基本规则:

  1. 不要使用松散的纸张 - &gt;将棋盘打印/粘贴在平板上
  2. 使用大白边打印以提高检测效果
  3. 棋盘必须完全在图像中(不像你的例子)
  4. 拍摄具有不同棋盘位置的图像
  5. 其次,您无法将轮廓绘制为8位灰度图像,而是使用8位彩色图像。 如果我算得正确(计算内角)你的棋盘大小(8,6)

答案 1 :(得分:1)

我遇到同样的问题,corners的数量很大。经过一番搜索,我发现了这个解决方案Here。 出于某种原因,findChessboardCorners函数会调整corners向量的大小。我尝试了上面的解决方案,它与输出corners配合得很好,但我仍然有cornerSubPix函数的断言失败问题。