繁体   English   中英

找不到棋盘角

[英]Couldn't find Chessboard corners

我的目标是在 Chessgame 中获得对颜色和棋子 position 的识别。 由于 github 上有很多教程,因此识别非常容易。使用 opencv 函数cv2.findChessboardCornerscv2.drawChessboardCorners (清除棋盘),我获得了满意的结果,如下图所示:

发现棋盘角

但是,当我尝试使用已识别的棋子或棋盘(不是空棋盘)上的棋子图像获取图像的角落时,它失败了,我没有得到任何结果。

公认的棋子

我没有附加任何代码,因为我只使用这两个功能。

我该如何解决? 我需要做任何手动校准吗?

我希望有人做了类似的事情并且可以解决我的问题。

我的答案是 C++,但很容易转移到 Python。

您正在使用 function findChessboardCorners of OpenCV 这实际上不是 function 用于在任何可能的棋盘上查找角落。 function通常用于相机标定(确定相机参数),需要自行打印黑白棋盘等。 可以在此处找到一个较旧的示例。 有趣的是它也适用于你的棕色棋盘。

为了找到棋盘角,我建议使用不同的 OpenCV 工作流程。 我正在读取图像,在图像上应用双边滤波器以使图像平滑但保留边缘,然后我使用 function goodFeaturesToTrack找到图像中最强的角。 由于您没有提供没有附加线条的图像,因此我使用了棕色棋盘的随机 inte.net 图像: 棕色棋盘 C++代码如下:

int main(int argc, char** argv)
{
    // Reading the images 
    cv::Mat img = cv::imread("chessboard_2.jpg", cv::IMREAD_GRAYSCALE);
    cv::Mat img_rgb = cv::imread("chessboard_2.jpg", cv::IMREAD_COLOR);
    cv::Mat bilateral_filtered_image;

    // Applying a bilateral filter to smooth the image
    cv::bilateralFilter(img, bilateral_filtered_image, 5, 75, 75);
    cv::namedWindow("Bilateral Filter", cv::WINDOW_NORMAL);
    cv::imshow("Bilateral Filter", bilateral_filtered_image);
    cv::waitKey(0);

    // Find corner points using goodFeaturestoTrack with appropriate parameters
    std::vector<cv::Point2f> corners;
    cv::goodFeaturesToTrack(bilateral_filtered_image, corners, 200, 0.01, 120);
    std::cout << corners.size() << std::endl;

    // Draw all corners on the original image and show the image
    for (size_t i = 0; i < corners.size(); ++i) {
        cv::circle(img_rgb, cv::Point2f(corners[i].x, corners[i].y), 7, (0,0,255), 3);
    }
    cv::namedWindow("Corners", cv::WINDOW_NORMAL);
    cv::imshow("Corners", img_rgb);
    cv::waitKey(0);
}

结果: 角落

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM