Не удалось найти углы шахматной доски - PullRequest
3 голосов
/ 03 августа 2020

Моя цель - добиться распознавания цвета и положения пешек в Chessgame. Распознавание было довольно простым благодаря множеству руководств на github. С функциями opencv cv2.findChessboardCorners и cv2.drawChessboardCorners (очистить шахматную доску) я получил удовлетворительный результат, как на картинке ниже:

Found Chessboard Corners

But when I try to get the corners of image with recognized pawns or of image of pawns on Chessboard (not empty Chessboard) it fail and I don't get any result.

Признанные пешки

Я не прилагаю никакого кода, потому что использую только эти две функции.

Как я могу это исправить? Обязательно ли выполнять калибровку вручную?

Надеюсь, что кто-то сделал что-то похожее и может решить мою проблему.

1 Ответ

3 голосов
/ 04 августа 2020

Мой ответ на C ++, но его легко передать на Python.

Вы используете функцию findChessboardCorners OpenCV, которая на самом деле не является функцией для поиска углов на любой возможной шахматной доске. Эта функция обычно используется для калибровки камеры (определение параметров камеры) и требует, например, самопечатной черно-белой шахматной доски. Более старый пример можно найти здесь . Интересно, что это работает и для вашей коричневой шахматной доски.

Для поиска углов шахматной доски я бы порекомендовал другой рабочий процесс OpenCV. Я читаю изображение, применяю двусторонний фильтр к изображению, чтобы сгладить изображение, но сохранить края, а затем использую функцию goodFeaturesToTrack, чтобы найти самые сильные углы в изображении. Поскольку вы не предоставили изображение без дополнительных строк, я использовал случайное целое rnet изображение коричневой шахматной доски: brown chessboardThe C++ code is as follows:

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 corners;
    cv::goodFeaturesToTrack(bilateral_filtered_image, corners, 200, 0.01, 120);
    std::cout 

Result: Углы

...