Измените CvFindContours () на 4-соединенных соседей с 8-подключенных - PullRequest
0 голосов
/ 05 августа 2011

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

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

1 Ответ

1 голос
/ 28 мая 2012

Боюсь, что это невозможно, вы можете подумать о том, чтобы предложить изменить код 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-сообщество добавить его, как работает open source. Возможно, быстрое, грязное, вам должно быть стыдно было бы что-то вроде этого:

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

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

...