上篇文章的方法使用体验感很差,换图很不好调整参数得出对应线,图像倾斜更是凉凉
测了很多图才发现是我菜
最近突然想到用平均来计算,目前是能解决之前的问题
0和1.57是平行和垂直,根据这个范围来区分类型,这样来计算,线更贴近,也不用考虑其他的,只需要控制—+2-2那个
List<LineSegmentPolar> cleanline(LineSegmentPolar[] lines)
{
for (int i = 0; i < lines.Length; i++)
{
if (lines[i].Rho < 0)
{
lines[i].Rho = -lines[i].Rho;
lines[i].Theta = (float)(lines[i].Theta - Cv2.PI);
}
}
List<LineSegmentPolar> res = new List<LineSegmentPolar>();
List<LineSegmentPolar> h0 = new List<LineSegmentPolar>();
List<LineSegmentPolar> hBig0 = new List<LineSegmentPolar>();
List<LineSegmentPolar> hSmall0 = new List<LineSegmentPolar>();
List<LineSegmentPolar> h157 = new List<LineSegmentPolar>();
List<LineSegmentPolar> hBig157 = new List<LineSegmentPolar>();
List<LineSegmentPolar> hSmall157 = new List<LineSegmentPolar>();
//三种:小于0的,等于0的,大于0的肯定小于0.1
//三种:小于1.57,等于1.57,大于1.57
#region MyRegion
float sumBig157Theta = 0;
float sum157Theta = 0;
float sumSmall157Theta = 0;
float sum157Rho = 0;//
float sumBig157Rho = 0;//
float sumSmall157Rho = 0;//
float sum0Theta = 0;
float sumBig0Theta = 0;
float sumSmall0Theta = 0;
float sum0Rho = 0;
float sumBig0Rho = 0;
float sumSmall0Rho = 0;
foreach (var item in lines)
{
if (item.Theta > 1 && item.Theta < 1.57)
{
hSmall157.Add(item);
sumSmall157Theta += item.Theta;
sumSmall157Rho += item.Rho;
}
if (item.Theta >= 1.58 && item.Theta < 2)
{
hBig157.Add(item);
sumBig157Theta += item.Theta;
sumBig157Rho += item.Rho;
}
if (item.Theta >= 1.57 && item.Theta < 1.58)
{
h157.Add(item);
sum157Theta += item.Theta;
sum157Rho += item.Rho;
}
if (item.Theta == 0)
{
h0.Add(item);
sum0Theta += item.Theta;
sum0Rho += item.Rho;
}
if (item.Theta < 0.2 && item.Theta > 0)
{
hBig0.Add(item);
sumBig0Theta += item.Theta;
sumBig0Rho += item.Rho;
}
if (item.Theta < 0 && item.Theta > -0.2)
{
hSmall0.Add(item);
sumSmall0Theta += item.Theta;
sumSmall0Rho += item.Rho;
}
}
float avg157Theta = sum157Theta / h157.Count;
float avgBig157Theta = sumBig157Theta / hBig157.Count;
float avgSmall157Theta = sumSmall157Theta / hSmall157.Count;
float avg157Rho = sum157Rho / h157.Count;
float avgBig157Rho = sumBig157Rho / hBig157.Count;
float avgSmall157Rho = sumSmall157Rho / hSmall157.Count;
float avg0Theta = sum0Theta / h0.Count;
float avgBig0Theta = sumBig0Theta / hBig0.Count;
float avgSmall0Theta = sumSmall0Theta / hSmall0.Count;
float avg0Rho = sum0Rho / h0.Count;
float avgBig0Rho = sumBig0Rho / hBig0.Count;
float avgSmall0Rho = sumSmall0Rho / hSmall0.Count;
#endregion
//判断数量 取出合适的线 h0 和h157是标准的,
#region H0
if (h0.Count == 1)
{
if (hSmall0.Count < hBig0.Count)
{
res.Add(h0[0]);
//res.Add(new LineSegmentPolar(avgBig0Rho, avgBig0Theta));
res.Add(new LineSegmentPolar(h0[0].Rho + 2, 0));
}
else
{
res.Add(h0[0]);
//res.Add(new LineSegmentPolar(avgSmall0Rho, avgSmall0Theta));
res.Add(new LineSegmentPolar(h0[0].Rho - 2, 0));
}
}
if (h0.Count >= 2)
{
res.Add(h0[0]);
res.Add(h0[1]);
}
if (h0.Count < 1)
{
if ((hSmall0.Count < hBig0.Count))
{
res.Add(new LineSegmentPolar(hSmall0[0].Rho, 0));
res.Add(new LineSegmentPolar(hSmall0[0].Rho + 2, 0));
}
else
{
res.Add(new LineSegmentPolar(hBig0[0].Rho, 0));
res.Add(new LineSegmentPolar(hBig0[0].Rho - 2, 0));
}
//res.Add(new LineSegmentPolar(avgBig0Rho, avgBig0Theta));
//res.Add(new LineSegmentPolar(avgBig0Rho, 0));
//res.Add(new LineSegmentPolar(avgSmall0Rho, avgSmall0Theta));
//res.Add(new LineSegmentPolar(avgSmall0Rho, 0));
}
#endregion
#region H157
if (h157.Count == 1)
{
if (hSmall157.Count < hBig157.Count)
{
res.Add(h157[0]);
//res.Add(new LineSegmentPolar(avgBig157Rho, avgBig157Theta));
res.Add(new LineSegmentPolar(h157[0].Rho + 2, h157[0].Theta));
}
else
{
res.Add(h157[0]);
//res.Add(new LineSegmentPolar(avgSmall157Rho, avgSmall157Theta));
res.Add(new LineSegmentPolar(h157[0].Rho - 2, h157[0].Theta));
}
}
if (h157.Count >= 2)
{
res.Add(h157[0]);
res.Add(h157[1]);
}
if (h157.Count < 1)
{
if ((hSmall157.Count < hBig157.Count))
{
res.Add(new LineSegmentPolar(hSmall157[0].Rho, float.Parse("1.57")));
res.Add(new LineSegmentPolar(hSmall157[0].Rho + 2, float.Parse("1.57")));
}
else
{
res.Add(new LineSegmentPolar(hBig157[0].Rho, float.Parse("1.57")));
res.Add(new LineSegmentPolar(hBig157[0].Rho - 2, float.Parse("1.57")));
}
//res.Add(new LineSegmentPolar(avgBig157Rho, avgBig157Theta));
//res.Add(new LineSegmentPolar(avgSmall157Rho, avgSmall157Theta));
}
#endregion
return res;
}