Watershed algorithm should work for most of the time from a marker image which may be obtained from a distance transform. For difficult images, the following splitting methods may be considered:
C. Zhang, C. Sun, R. Su, and T. D. Pham, Clustered nuclei splitting via curvature information and gray-scale distance transform, Journal of Microscopy, 2015. To appear.
X. Bai, P. Wang, C. Sun, F. Zhou, Y. Zhang, and C. Meng, Finding Splitting Lines for Touching Cell Nuclei with a Shortest Path Algorithm, Computers in Biology and Medicine, 2015. To appear. http://dx.doi.org/10.1016/j.compbiomed.2014.10.008
C. Zhang, C. Sun, and T. D. Pham, Segmentation of Clustered Nuclei Based on Concave Curve Expansion, Journal of Microscopy, 251(1):57-67, July 2013. http://dx.doi.org/10.1111/jmi.12043
X. Bai, C. Sun, and F. Zhou, Splitting touching cells based on concave points and ellipse fitting, Pattern Recognition, 42(11):2434-2446, November 2009. http://dx.doi.org/10.1016/j.patcog.2009.04.003
C. Zhang, C. Sun, R. Su, and T. D. Pham, Segmentation of Clustered Nuclei Based on Curvature Weighting, In Image and Vision Computing New Zealand, Dunedin, New Zealand, 26-28 November 2012, pp.49-54. http://dx.doi.org/10.1145/2425836.2425848
You can have a look to the 'findContours' function of OpenCV. It gives as output a list of the contours of all objects in your binary image. To separate your connected cells, all you have to do is to compute the distance transform image of your binary input, threshold this distance image to get your new binary image (with disconnected cells) and then use it as a marker to re-segment your image properly. I think that in the following link you will find all you need: https://opencv-code.com/tutorials/count-and-segment-overlapping-objects-with-watershed-and-distance-transform/