组合相邻的平行线

时间:2014-08-07 16:52:34

标签: c# emgucv

有一个只有垂直线和水平线的图像。但是有些线条是相同的或它们彼此接近,但它们应该只组合成一条线。另外我写了循环来在新列表中添加行,速度很慢。所以我想知道是否有一些有效的方法让我将这些相邻的线组合成一条线。

以下是代码:

for (int i = 0; i < RecoverLine_list.Count; i++) {
        for (int j = 0; j < RecoverLine_list.Count; j++) {
            for (int m = 0; m < RecoverLine_list.Count; m++) {

                if (RecoverLine_list[i] != RecoverLine_list[j] 
                 && RecoverLine_list[i] != RecoverLine_list[m] 
                 && RecoverLine_list[j] != RecoverLine_list[m]) {

                    if (RecoverLine_list[i].orientation == 0 
                     && RecoverLine_list[j].orientation == 0 
                     && RecoverLine_list[m].orientation == 0) {

                        if (Math.Abs(RecoverLine_list[i].P1.Y - RecoverLine_list[j].P1.Y) < 3 
                         && Math.Abs(RecoverLine_list[i].P1.Y - RecoverLine_list[m].P1.Y) < 3 
                         && Math.Abs(RecoverLine_list[j].P1.Y - RecoverLine_list[m].P1.Y) < 3) {
                            // define RecoverLine_list[i] as grid line
                            GridLine_list.Add(RecoverLine_list[i]);
                        }
                    }
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

(REWRITTEN)因此,假设您想以某种方式过滤相似的水平线和垂直线&#39;并希望代码和良好条件的相似&#39;类似&#39;应该是,那么这是我的想法:

首先拆分水平和垂直线:

List<Line> vert = new List<Line>();
List<Line> horiz = new List<Line>();
foreach(Line ln in RecoverLine_list)
    if(ln.orientation == 0) horiz.Add(ln);
    else vert.Add(ln);
horiz.Sort(x, y => x.P1.Y.CompareTo(y.P1.Y));
vert.Sort(x, y => x.P1.X.CompareTo(y.P1.X));

或类似的东西(不完全确定你的方向是什么,我只是猜测包括使用lambdas进行排序的编码)。

然后你可以在一遍中搜索线条,提取好的线条:

List<Line> filtered = new List<Line>();
for(int i = 0; i < horiz.Count; i++) {
    filtered.Add(ln); // always add, we can skip next:
    if(i+1 >= horiz.Count) break;
    if(Math.Abs(horiz[i].P1.Y - horiz[i+1].P1.Y) <= 3)
    && Math.Abs(horiz[i].P1.X - horiz[i+1].P1.X) <= 3)
    && Math.Abs(horiz[i].P2.X - horiz[i+1].P2.X) <= 3))
        i++; // skip this line for being similar
}

但这不是最终解决方案,因为我们可以在一个坐标中彼此靠近但在另一个坐标中不相交。所以我们需要添加内部循环:

for(int i = 0; i < horiz.Count-1; i++) {
    for(int j = i+1; j < horiz.Count; j++) {
        if((horiz[j].P1.Y - horiz[i].P1.Y) > 3)
           break; // this one is too far, all next will be
        if(Math.Abs(horiz[i].P1.Y - horiz[j].P1.Y) <= 3)
        && Math.Abs(horiz[i].P1.X - horiz[j].P1.X) <= 3)
        && Math.Abs(horiz[i].P2.X - horiz[j].P2.X) <= 3))
            horiz.RemoveAt(j--); // skip this line for being similar
}}

知道了吗?垂直线相同。