Измените CvFindContours() на 4-связных соседей с 8-связных

Метод OpenCV cvFindContour() получает подключенные компоненты в соответствии с правилом 8-связных соседей. Можно ли как-то изменить его на правило 4-связного соседа - угловые ячейки не будут учитываться при проверке на связность.

По-видимому, Mathematica делает это с помощью простого CornerNeighbors->False показанного здесь на SO. Любой способ сделать это в OpenCV? Даже если бы мы фактически изменили определение функции в файле cv*.h (что довольно сложно)... какие-нибудь указатели?


person AruniRC    schedule 05.08.2011    source источник


Ответы (1)


Боюсь, это невозможно, вы могли бы предложить изменить код opencv, добавив флаг, который позволил бы это сделать. Сейчас в этом файле:

http://code.opencv.org/projects/opencv/repository/entry/trunk/opencv/modules/imgproc/src/contours.cpp

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

static const CvPoint icvCodeDeltas4[4] =  { {1, 0}, {0, -1}, {-1, 0}, {0, 1} };

который используется, когда, например, указан CV_NEIGHBOURS_CROSS. Затем попросите сообщество opencv добавить его, как работает открытый исходный код. Возможно, быстрое, грязное, вам должно быть стыдно исправить что-то вроде этого:

virtual CvPoint icvCodeDeltas[8];
icvCodeDeltas =  { {1, 0}, {0, -1}, {-1, 0}, {0, 1}, {1, 0}, {0, -1}, {-1, 0}, {0, 1} };

Но я не проверял это, и я понятия не имею, позволит ли это избежать «статических» и «константных», так что будьте осторожны;)

person Herbert    schedule 28.05.2012