Skip to content

fast_line_detector will not merge segments while there are only two segs on one line #3715

@Roger8

Description

@Roger8
System information (version)
  • OpenCV => :4.9:
  • Operating System / Platform => :Windows 64 Bit:
  • Compiler => :Visual Studio 2019:
Detailed description

https://github.com/opencv/opencv_contrib/blob/4.x/modules/ximgproc/src/fast_line_detector.cpp#L584

    bool is_merged = false;
    int ith = (int)segments_tmp.size() - 1;
    int jth = ith - 1;
    while(ith > 1 || jth > 0)
    {
        seg1 = segments_tmp[ith];
        seg2 = segments_tmp[jth];
        SEGMENT seg_merged;
        is_merged = mergeSegments(seg1, seg2, seg_merged);
        if(is_merged == true)
        {
            seg2 = seg_merged;
            additionalOperationsOnSegment(src, seg2);
            std::vector<SEGMENT>::iterator it = segments_tmp.begin() + ith;
            *it = seg2;
            segments_tmp.erase(segments_tmp.begin()+jth);
            ith--;
            jth = ith - 1;
        }
        else
        {
            jth--;
        }
        if(jth < 0) {
            ith--;
            jth = ith - 1;
        }
    }
    segments_all = segments_tmp;
}

if two segs (they are on one line) in segmets_tmp, then segments_tmp.size()==2 .
the while loop will not enter , finally segments_all has still two segments , they are not merged.

Steps to reproduce
   // add this before while loop
   SEGMENT seg1, seg2;
   seg1.x1 = 0;
   seg1.y1 = 0;
   seg1.x2 = 100;
   seg1.y2 = 0;

   seg2.x1 = 110;
   seg2.y1  =0;
   seg2.x2 = 250;
   seg2.y2 =0;
    segments_tmp.clear();
    segments_tmp.push_back(seg1);
    segments_tmp.push_back(seg2);
    // keep the same 
    bool is_merged = false;
    int ith = (int)segments_tmp.size() - 1;
    int jth = ith - 1;
    while(ith > 1 || jth > 0)
    {
 ....
    }
Issue submission checklist
  • I report the issue, it's not a question
  • I checked the problem with documentation, FAQ, open issues,
    forum.opencv.org, Stack Overflow, etc and have not found any solution
  • I updated to the latest OpenCV version and the issue is still there
  • There is reproducer code and related data files: videos, images, onnx, etc

About how to fix , my idea: change while condition

   while(ith > 1 || jth >= 0)
{   ....
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions