ошибка open cv python при попытке найти углы шахматной доски

Мне нужно написать калибровку камеры, и я хотел использовать python и opencv. Текущая проблема заключается в следующем:

У меня есть код, записанный ниже:

import sys
import numpy as np
import cv2

image = cv2.imread(sys.argv[1])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

ret = False
ret, corners = cv2.findChessboardCorners(image, (7,6), None)

print ret

хорошо, пока все хорошо, но не имеет значения, какое изображение я использую, моя переменная ret каждый раз меняет значение на False, что в основном означает, что не было найдено никаких углов.

Есть несколько вопросов об этой проблеме здесь, о переполнении стека, но ни одно из решений не сработает для моей проблемы. Я пробовал использовать изображения от 500x500 до 8MP, потом я их увеличил резкость, я даже использовал оригинальные шахматные доски, чтобы получить углы. Ни один из них не работал.

Есть ли другой способ получить их, или я делаю что-то совершенно ложное с нуля?

Я также пробовал использовать изображения без оттенков серого, но проблема та же.


person hGen    schedule 28.11.2014    source источник
comment
stackoverflow.com/questions/17665912/   -  person stark    schedule 28.11.2014
comment
Как я уже говорил, я читал почти любую статью об этой ошибке, посвященную stackoverflow, а также использовал калибровочные изображения из руководств, которые вы найдете в сети. В дополнение к этому я использую исходный распечатанный файл pdf калибровки opencv размером 10x7   -  person hGen    schedule 28.11.2014


Ответы (2)


Хорошо, я выяснил, в чем проблема.

Раньше я не знал, что размеры, которые вы должны ввести, являются исходными размерами шахматной доски минус 1:

Итак, если у вас есть доска 10 x 7, вам нужно использовать размеры 9 x 6.

Может быть, это будет полезно для других людей с той же проблемой.

Обновление: исправлена ​​критическая опечатка. Используемые размеры: 9 x 6, а не 9 x 7.

person hGen    schedule 29.11.2014
comment
Вы имели ввиду 9x6? Или вычитается только первый? - person ComputerScientist; 06.02.2017
comment
Оно должно быть 9 x 6. В основном вы хотите посчитать внутренние углы шахматной доски. Перекрестки на краю шахматной доски не учитываются. Углы определяются как пересечение четырех квадратов шахматной доски. - person SherylHohman; 03.06.2017

спасибо hGen. ваш ответ был действительно полезен. но в моем случае сработало 9X6 (не 9X7).

cv::Mat imgClr = cv::imread( "05-00.png" );
cv::Mat imgGray;
cv::cvtColor( imgClr, imgGray, CV_BGR2GRAY );
cv::namedWindow( "Image", cv::WINDOW_NORMAL );
cv::imshow( "Image", imgGray );
cv::waitKey(0);

cv::Size board_sz = cv::Size(9, 6);
std::vector < cv::Point2f > corners;
bool found = cv::findChessboardCorners(imgGray, board_sz, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE
                                       | CV_CALIB_CB_FAST_CHECK | CV_CALIB_CB_FILTER_QUADS );
if(found)
{
    cv::drawChessboardCorners(imgGray, board_sz, corners, found);
    cv::imshow( "Image", imgGray );
    cv::waitKey(0);
}
person user4751415    schedule 05.04.2015