官网的语句说明
https://docs.opencv.org/3.4/d7/d1b/group__imgproc__misc.html#ga3267243e4d3f95165d55a618c65ac6e1
官网的例子
https://docs.opencv.org/3.4/d4/d40/samples_2cpp_2watershed_8cpp-example.html#a36
void cv::watershed ( InputArray image,
InputOutputArray markers
)
其中,inputArray是8bit单通道或者三通道原图。markers是32bit的初始标记图和输出图
作为输入markers图,存储了每个像素的初始label。给每个确定了分类的像素点,标记上1,2,3,4,……。对于不确定的像素,标记0。watershed会把每个标记为0的像素,计算出一个标记值。
作为输出markers图,每个点都标记了所属分类区域,-1的点是边界。
在官方例子samples/cpp/watershed.cpp中,让用户在界面上用鼠标点出了初始分类定义。由 onMouse记录。直到用户输入if( c == ‘w’ || c == ’ ’ )开始进行分水岭算法。我没有用这部分,所有初始类标记由代码完成,没有用户交互。
步骤一:
我自己的实用中,分水岭算法之前做了prepareWatershed();函数,为分水岭做预处理。标记了黑色背景为3,物体2,分割目标物体1,待分割0。
Mat labelImage(m_srcBGRImg.size(), CV_32S);
Mat labelDisp(m_srcBGRImg.size(), CV_8UC1);
int nrow