findChessboardCorners 给出意想不到的结果

findChessboardCorners gives unexpected results

这是我的代码

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

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

输出:

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

  1. 不要使用松散的纸张 -> print/glue 平板上的棋盘
  2. 用大白边打印它以改进检测
  3. 棋盘必须完全位于图像内部(不像您的示例那样)
  4. 拍几张棋盘不同位置的照片

其次,您不能将轮廓绘制成 8 位灰度图像,而是使用 8 位彩色图像。 如果我数对了(算内角),你的棋盘大小为 (8,6).

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