2013-12-15 2 views
3

Следующее изображение передается на cv.findChessboardCorners, и по причинам, которые я не могу понять, это просто не дает мне угловых положений. Шахматная доска довольно очевидна, и толщина белой линии тоже очень заметна.Почему cv.findChessboardCorners не работает для меня?

Вы знаете, почему это не сработает?

Размер изображения 960X1280, а размер ячейки - [15,11], т.е. 15 внутренних углов на строку и 11 внутренних углов на столбец.

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

Checkerboard image projected on a Wall

+0

просто обратите внимание, что ваша проецируемая шахматная доска там уже искажена – berak

+0

Я не думаю, что, честно говоря, я думал, что это будет довольно простой случай для работы алгоритма, но я думаю, что проблема была в дверях. Настройка гистограммы делает это! –

ответ

2

Я надеюсь, что вы не возражаете ответ в Python, в отличие от Matlab. (Они используют ту же библиотеку OpenCV, и я надеюсь, что соответствие между командами ясно.)

Вашего изображения без изменений отлично работает для меня с кодом ниже, который находит углы и отображает их с цветными точками в окне:

#!/usr/bin/python 
import cv2.cv as cv 
import sys 

filename = sys.argv[1] 
im = cv.LoadImage(filename, cv.CV_LOAD_IMAGE_GRAYSCALE) 
im3 = cv.LoadImage(filename, cv.CV_LOAD_IMAGE_COLOR) 
chessboard_dim = (15, 11) 
found_all, corners = cv.FindChessboardCorners(im, chessboard_dim) 
cv.DrawChessboardCorners(im3, chessboard_dim, corners, found_all) 
cv.ShowImage("Chessboard with corners", im3) 
cv.WaitKey() 

Результирующее изображение (немного обрезанная) выглядит следующим образом:

Checkerboard with corners highlighted

+0

мужчина! Почему это не работает над MATlab?!? Спасибо в любом случае, я закончил настройку гистограммы, чтобы увеличить контрастность, а затем она работала нормально, но тогда почему она не работает для меня без корректировки? –

+0

@RakshitKothari Если это имеет значение, я использую OpenCV версии 2.3.1 (Debian Wheezy). – John1024

+0

Хм! Понимаю, но это все еще не работает для меня. Один из ответов предлагает вырезать область двери, и, похоже, после этого он отлично работает. Я думаю, что темная дверь на более светлую стену смутила алгоритм. –

2

Я попробовал его в MATLAB, используя mexopencv (скомпилированный против последней OpenCV 2.4.7), и у меня было то же самое где не было обнаружено никаких углов.

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

% read grayscale image 
img = imread('http://i.stack.imgur.com/5VsOP.jpg'); 

% crop image to the area of the chessboard 
img2 = img(100:600, 200:1000); 

% detect corners 
c = cv.findChessboardCorners(img2, [15,11]); 
if isempty(c), error('no corners found'); end 

% show result 
out = cv.drawChessboardCorners(repmat(img2,[1 1 3]), [15,11], c); 
imshow(out) 

corners_detected

+2

вы можете добавить 'c = cv.cornerSubPix (img2, c); 'после обнаружения для уточнения мест углов с использованием субпиксельной точности. – Amro

+0

Спасибо! Это означает, что дверь слева путала алгоритм. Интересно, почему? После настройки гистограммы это сработало для меня отлично. –

2

Если у вас есть Computer Vision System Toolbox, вы можете использовать функцию detectCheckerboardPoints. Он работает без предварительной обработки и дает вам субпиксельную точность. detected checkerboard

+1

Я вижу, заметьте себе: получите 2013b! –

+0

В этом случае вы должны проверить приложение Calibrator камеры, также в 2013b. http://www.mathworks.com/help/vision/ug/find-camera-parameters-with-the-camera-calibrator.html – Dima

Смежные вопросы