我现在需要实现分水岭算法,但不是用opencv的函数来实现,要自己写,我查看了opencv的源码但一直没看明白,不知道那位大侠做个这方面的解读工作?如果有blog解读的给个链接吧。
现在问一些问题,opencv熟悉的帮个忙。
CvMat 这个结构体的成员各是什么?
分水岭源代码中找盆地中下面二句干嘛用,我怎么看也没明白mask[j] = mask[j + mstep*(size.height-1)] = WSHED;//根据什么来设的分数岭,为什么每次都要重新设置最后的一行?
//或者mstep = dst->step / sizeof(mask[0]);这个代表什么是不是矩阵的行长度?
uchar* ptr = img + j*3; //这个什么意思?为什么是3?这个源码我有很多问题?我看懂的分水岭的原理,但opencv如何实现的我一点没看明白,我没用过opencv,所以问题特别多。我没多少分了,如果那位大仙可以帮我详细解答,我可以在开贴给分,或者教我怎么追加分。
现在问一些问题,opencv熟悉的帮个忙。
CvMat 这个结构体的成员各是什么?
分水岭源代码中找盆地中下面二句干嘛用,我怎么看也没明白mask[j] = mask[j + mstep*(size.height-1)] = WSHED;//根据什么来设的分数岭,为什么每次都要重新设置最后的一行?
//或者mstep = dst->step / sizeof(mask[0]);这个代表什么是不是矩阵的行长度?
uchar* ptr = img + j*3; //这个什么意思?为什么是3?这个源码我有很多问题?我看懂的分水岭的原理,但opencv如何实现的我一点没看明白,我没用过opencv,所以问题特别多。我没多少分了,如果那位大仙可以帮我详细解答,我可以在开贴给分,或者教我怎么追加分。
{
img += istep; mask += mstep;
mask[0] = mask[size.width-1] = WSHED;
for( j = 1; j < size.width-1; j++ )
{
int* m = mask + j;
if( m[0] < 0 ) m[0] = 0;
if( m[0] == 0 && (m[-1] > 0 || m[1] > 0 || m[-mstep] > 0 || m[mstep] > 0) )
{
uchar* ptr = img + j*3;
int idx = 256, t;
if( m[-1] > 0 )
c_diff( ptr, ptr - 3, idx );
if( m[1] > 0 )
{
c_diff( ptr, ptr + 3, t );
idx = ws_min( idx, t );
}
if( m[-mstep] > 0 )
{
c_diff( ptr, ptr - istep, t );
idx = ws_min( idx, t );
}
if( m[mstep] > 0 )
{
c_diff( ptr, ptr + istep, t );
idx = ws_min( idx, t );
}
assert( 0 <= idx && idx <= 255 );
ws_push( idx, i*mstep + j, i*istep + j*3 );
m[0] = IN_QUEUE; //处理过的;
}
}
} 这段代码应该是找盆地连成的连通域,但我没看目标压站这下怎么保证他们各自是联通的?
如差分值如果为
1 1 2 3 6 5
6 4 2 2 3 4
这样情况如何保证差分为6的时候他们有联通关系?还是这样情况不会出现?为什么?