我的答案是 C++,但很容易转移到 Python。
您正在使用 OpenCV 的函数 findChessboardCorners,它实际上不是在任何可能的棋盘上查找角点的函数。该功能通常用于相机校准(确定相机参数)并需要例如一个自己印制的黑白棋盘。可以在here 找到一个较旧的示例。有趣的是,它也适用于您的棕色棋盘。
为了寻找棋盘角,我建议使用不同的 OpenCV 工作流程。
我正在读取图像,在图像上应用双边滤波器以平滑图像但保留边缘,然后我使用函数 goodFeaturesToTrack 来查找图像中最强的角。由于您没有提供没有附加线的图像,因此我使用了棕色棋盘的随机互联网图像: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);
}
结果: