本博客主要解释opencv中分水岭算法源码中的难点:1)将点push到队列中;2)将点pop出队列。有关分水岭算法原理网上有很多解释,请自行查阅,这里不解释。
下面三张图就是push和pop过程演示(不知道为何图片插进来就自动旋转了,尴尬,如果人懂,望一定告知解决方法,谢谢)
下面是opencv中分水岭算法源码:
void cv::watershed( InputArray _src, InputOutputArray _markers )
{
CV_INSTRUMENT_REGION()
// Labels for pixels
const int IN_QUEUE = -2; // Pixel visited
const int WSHED = -1; // Pixel belongs to watershed
// possible bit values = 2^8
const int NQ = 256;
Mat src = _src.getMat(), dst = _markers.getMat();
Size size = src.size();
// Vector of every created node
std::vector<WSNode> storage;
int free_node = 0, node;
// Priority queue of queues of nodes
// from high priority (0) to low priority (255)
WSQueue q[NQ];
// Non-empty queue with highest priority
int active_queue;
int i, j;
// Color differences
int db, dg, dr;
int subs_tab[513];
// MAX(a,b) = b + MAX(a-b,0)
#define ws_max(a,b) ((b) + subs_tab[(a)-(b)+NQ])
// MIN(a,b) = a - MAX(a-b,0)
#define ws_min(a,b) ((a) - subs_tab[(a)-(b)+NQ])
// Create a new node with offsets mofs and iofs in queue idx
#define ws_push(idx,mofs,iofs) \
{ \
i