我现在需要实现分水岭算法,但不是用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,所以问题特别多。我没多少分了,如果那位大仙可以帮我详细解答,我可以在开贴给分,或者教我怎么追加分。

解决方案 »

  1.   

    谢谢,我也想直接用OPENCV,但有的时候,直接调用有些限制,只能自己去实现。
      

  2.   

    晕怎么么人来,大家讨论一下也好啊for( i = 1; i < size.height-1; i++ ) 

        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的时候他们有联通关系?还是这样情况不会出现?为什么?
      

  3.   

    论坛上用opencv的人不是蛮多的吗?怎么大家对这个话题不感兴趣啊