How to find endpoints of lines in OpenCV?

前端 未结 4 741
滥情空心
滥情空心 2021-01-19 00:42

I have an image made up of lines; how can I find the endpoints with OpenCV?

The lines are about 20 pixels wide. They turn, branch, and can be at angles (although mos

相关标签:
4条回答
  • 2021-01-19 00:58

    The easiest way for me would be to thin the image to 1px thickness and then use hit and miss transform to detect the endpoints. Unfortunately, none of these functions are implemented in OpenCV. Thinning can also be obtained with hit or miss transform. All you need is thoroughly described in the following link: http://homepages.inf.ed.ac.uk/rbf/HIPR2/thin.htm

    Let me know if you have any problems with this, as I have it all implemented. Hit or miss transform might be really old and simple, but it's a very powerful tool.

    0 讨论(0)
  • 2021-01-19 01:17

    I speak Chinese, while my English is poor.

    So I just post my core steps.

    A general way to find endpoints of lines is:

    1. Binary the gray image.
    2. Find the skeleton of the binary image.
    3. Do hit-miss operation (all end points) or goodFeaturesToTrack(all corners include endpoints) on the skeleton.

    Notice:

    You should select a good skeleton method to make sure that the endpoints wouldn't shrink(while my example does shrink).


    This is the result.

    This is a demo using hit-miss to find special points.

    0 讨论(0)
  • 2021-01-19 01:18

    You can create a morphological skeleton (thinning algorithm which you talked about) as described here, my implementation of this is here. Then you can traverse the skeleton(s) and just look for the end of it in every way.

    0 讨论(0)
  • 2021-01-19 01:25

    If your endpoints are always either horizontal or vertical you can also try to convolve the image with a simple kernel - square (side should be equal to your line width) with background (width should be equal to minimal distance between neighboring endpoints). Color (or intensity) of square and background should match those on your images.

    In this case endpoints would "match" the kernel along 3 "sides", line segments and corners along "2 sides", other shapes should have a weaker response. By thresholding response appropriately you should be able to get endpoint locations.

    This approach should be simpler and faster (if implemented appropriately) than the one you settled on currently, but it may have some quirks depending on the input. Unfortunately, I don't have time to try implementing it.

    0 讨论(0)
提交回复
热议问题