C++ 为什么;findChessboardCorners“;函数返回false

C++ 为什么;findChessboardCorners“;函数返回false,c++,opencv,C++,Opencv,我使用Opencv“findChessboardCorners”函数查找棋盘的角点,但从“findChessboardCorners”函数返回的值为false 以下是我的代码: int main(int argc, char* argv[]) { vector<vector<Point2f>> imagePoints; Mat view; bool found; vector<Point2f> pointBuf;

我使用Opencv“findChessboardCorners”函数查找棋盘的角点,但从“findChessboardCorners”函数返回的值为false

以下是我的代码:

int main(int argc, char* argv[])
{
    vector<vector<Point2f>> imagePoints;    
    Mat view;
    bool found; 
    vector<Point2f> pointBuf;
    Size boardSize;            // The size of the board -> Number of items by width and height  
    boardSize.width = 75;
    boardSize.height = 49;

    view = cv::imread("FraunhoferChessBoard.jpeg"); 
    namedWindow("Original Image", WINDOW_NORMAL);// Create a window for display.
    imshow("Original Image", view);

    found = findChessboardCorners(view, boardSize, pointBuf,
             CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FAST_CHECK | CV_CALIB_CB_NORMALIZE_IMAGE);

    if (found)
    {
        cout << "Corners of chess board detected";
    }
    else
    {
        cout << "Corners of chess board not detected";
    }
    waitKey(0);
    return 0;
}
intmain(intargc,char*argv[])
{
向量成像点;
Mat view;
布尔发现;
向量点buf;
大小boardSize;//板的大小->按宽度和高度列出的项目数
boardSize.width=75;
boardSize.height=49;
view=cv::imread(“FraunhoferChessBoard.jpeg”);
namedWindow(“原始图像”,窗口正常);//创建一个显示窗口。
imshow(“原始图像”,视图);
found=findChessboardCorners(视图、板尺寸、点BUF、,
CV|CALIB|CB|自适应|阈值| CV|CALIB|CB|FAST|CHECK | CV|CALIB|CB|归一化|图像);
如果(找到)
{

cout函数没有在图像中找到模式,这就是它返回false的原因。可能完全相同的代码适用于不同的图像。
我无法直接回答为什么此函数没有找到图像中的图案,但我建议使用不同的方法来降低对噪声的敏感性,以便算法能够正确检测角点:
-使用
findChessboardCornersSB
而不是
findChessboardCorners
。根据文档,它对噪音更为鲁棒,对于像您这样的大型图像工作更快。这可能是您正在寻找的。我尝试过使用python,它可以与您发布的图像正常工作。请参见下面的结果。 -更改文档中所示的模式形状,用于
FindChessBoardCornersb

-在你的图案中使用更少和更大的方块。有这么多的方块是没有帮助的

下一步你需要使用非对称的图案。如果你的左上角是白色,那么右下角必须是黑色

如果您对方形模式有其他问题,您还可以更改使用角点的方法,并切换到圆形模式。opencv中提供了所有函数。在我的情况下,它工作得更好。请参阅
findCirclesGrid
。如果使用此方法,您可以运行“BlobDetector”检查如何检测每个圆,并配置一些参数以提高精度

希望这有帮助

编辑: 下面是python代码,它可以从下载的图像中工作

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('img.jpg')
img_small = cv2.resize(img, (img.shape[1], img.shape[0]))

found, corners = cv2.findChessboardCornersSB(img_small, (75, 49), flags=0)

plt.imshow(cv2.cvtColor(img_small, cv2.COLOR_BGR2RGB), cmap='gray')
plt.scatter(corners[:, 0, 0], corners[:, 0, 1])

plt.show()

尝试添加标志:
CV\u CALIB\u CB\u ADAPTIVE\u THRESH+CV\u CALIB\u CB\u FAST\u CHECK+CV\u CALIB\u CB\u NORMALIZE\u IMAGE
非常感谢您的帮助和时间。我尝试过“findChessboardCornersSB(视图、电路板大小、指针、校准CB\u NORMALIZE\u图像|校准CB\u详尽无遗|校准CB\u准确性)”在图片中寻找方格坐标的功能,我已经附上了,但我仍然不能用C++代码找到方框的角。在运行“FixChess BoordCordNSSB(视图,Boad Sosith,PositBuf,CalbyBbCurnCyrimeSeIIGIMAIL)CalbByCBX穷尽性CalbByCBB精度)之前,你也对上面的附件图像做了任何修改吗?algo?谢谢:)对不起,我没有尝试使用你的旗帜。使用你的旗帜确实不起作用。使用0它起作用。如果你认为在这一点上不再需要帮助,请接受答案:)@87VN0…我再次尝试了使用下面给定图片的方法,但这次可以找到方形框的角。你能请求吗se再次通知我如何改善这种情况……非常感谢……)