|
@@ -59,7 +59,7 @@ namespace o0.Project
|
|
|
float areaPercent => locateArea[locateIndex].size.x; // 当前白色区域的占比
|
|
float areaPercent => locateArea[locateIndex].size.x; // 当前白色区域的占比
|
|
|
int areaSelected = -1; // 选择哪个区域,顺序与Quadrilateral对应
|
|
int areaSelected = -1; // 选择哪个区域,顺序与Quadrilateral对应
|
|
|
readonly List<float> sumTemp = new List<float>();
|
|
readonly List<float> sumTemp = new List<float>();
|
|
|
- readonly List<OrdinalQuadrilateral> quadTemp = new List<OrdinalQuadrilateral>();
|
|
|
|
|
|
|
+ readonly List<QuadrilateralInCamera> quadTemp = new List<QuadrilateralInCamera>();
|
|
|
|
|
|
|
|
//public ScreenIdentification(WebCamTexture texture)
|
|
//public ScreenIdentification(WebCamTexture texture)
|
|
|
//{
|
|
//{
|
|
@@ -83,6 +83,7 @@ namespace o0.Project
|
|
|
Screen = new ScreenMap();
|
|
Screen = new ScreenMap();
|
|
|
OnLocateScreenEnter += () => Application.targetFrameRate = 30; // 固定识别的帧率,确保摄像机拍到正确的画面
|
|
OnLocateScreenEnter += () => Application.targetFrameRate = 30; // 固定识别的帧率,确保摄像机拍到正确的画面
|
|
|
OnLocateScreenEnd += () => Application.targetFrameRate = 60;
|
|
OnLocateScreenEnd += () => Application.targetFrameRate = 60;
|
|
|
|
|
+ OnLocateScreenEnd += ScreenLocate.Main.OnLocateScreenEnd;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public void SetScreenQuad(QuadrilateralInCamera quad) => Screen.QuadInCamera = quad;
|
|
public void SetScreenQuad(QuadrilateralInCamera quad) => Screen.QuadInCamera = quad;
|
|
@@ -106,6 +107,7 @@ namespace o0.Project
|
|
|
|
|
|
|
|
if (target == null)
|
|
if (target == null)
|
|
|
return false;
|
|
return false;
|
|
|
|
|
+ Debug.Log($"<color=aqua>[ScreenIdentification] 选择已识别到的屏幕({Enum.GetName(typeof(ScreenLocate.ScreenIdentificationTag), tag)}), {target}</color>");
|
|
|
SetScreenQuad(target);
|
|
SetScreenQuad(target);
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
@@ -117,7 +119,7 @@ namespace o0.Project
|
|
|
{
|
|
{
|
|
|
ScreenLocate.Main.CameraSize = new Geometry2D.Vector<int>(ScreenLocate.Main.DebugScreenImages[0].width, ScreenLocate.Main.DebugScreenImages[0].height);
|
|
ScreenLocate.Main.CameraSize = new Geometry2D.Vector<int>(ScreenLocate.Main.DebugScreenImages[0].width, ScreenLocate.Main.DebugScreenImages[0].height);
|
|
|
DebugImage(ScreenLocate.Main.DebugScreenImages);
|
|
DebugImage(ScreenLocate.Main.DebugScreenImages);
|
|
|
- Screen.QuadInCamera = new QuadrilateralInCamera(quadTemp[0], new Vector(ScreenLocate.Main.DebugScreenImages[0].width, ScreenLocate.Main.DebugScreenImages[0].height));
|
|
|
|
|
|
|
+ Screen.QuadInCamera = quadTemp[0];
|
|
|
ScreenLocate.SetScreen(null);
|
|
ScreenLocate.SetScreen(null);
|
|
|
ScreenLocate.Main.ShowScreen(ScreenLocate.Main.ScreenQuad, Screen.QuadInCamera);
|
|
ScreenLocate.Main.ShowScreen(ScreenLocate.Main.ScreenQuad, Screen.QuadInCamera);
|
|
|
delay = 0;
|
|
delay = 0;
|
|
@@ -166,9 +168,7 @@ namespace o0.Project
|
|
|
#endif
|
|
#endif
|
|
|
if (quadTemp.Count > 0)
|
|
if (quadTemp.Count > 0)
|
|
|
{
|
|
{
|
|
|
- var quad = quadTemp[0];
|
|
|
|
|
- ScreenLocate.Main.ShowScreen(ScreenLocate.Main.outputRawImages[4].transform.GetChild(0) as RectTransform,
|
|
|
|
|
- new QuadrilateralInCamera(quad, images[0].Size().o0Vector()));
|
|
|
|
|
|
|
+ ScreenLocate.Main.ShowScreen(ScreenLocate.Main.outputRawImages[4].transform.GetChild(0) as RectTransform, quadTemp[0]);
|
|
|
|
|
|
|
|
// 透视变换
|
|
// 透视变换
|
|
|
// var srcWidth = LocateLightedRedTex.width;
|
|
// var srcWidth = LocateLightedRedTex.width;
|
|
@@ -319,8 +319,8 @@ namespace o0.Project
|
|
|
}
|
|
}
|
|
|
else if (quadTemp.Count == 1)
|
|
else if (quadTemp.Count == 1)
|
|
|
{
|
|
{
|
|
|
- Screen.QuadInCamera = new QuadrilateralInCamera(quadTemp[0], new Vector(Size.x, Size.y));
|
|
|
|
|
- Debug.Log($"<color=aqua>[ScreenIdentification] 拟合成功,Quad: {Screen.QuadInCamera.QuadString}____{Screen.QuadInCamera.SizeString}</color>");
|
|
|
|
|
|
|
+ Screen.QuadInCamera = quadTemp[0];
|
|
|
|
|
+ Debug.Log($"<color=aqua>[ScreenIdentification] 拟合成功,识别数据: {Screen.QuadInCamera}</color>");
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
@@ -335,7 +335,7 @@ namespace o0.Project
|
|
|
{
|
|
{
|
|
|
foreach (var q in quadTemp)
|
|
foreach (var q in quadTemp)
|
|
|
{
|
|
{
|
|
|
- baseVertex += q[areaSelected];
|
|
|
|
|
|
|
+ baseVertex += q.Quad[areaSelected];
|
|
|
}
|
|
}
|
|
|
baseVertex /= quadTemp.Count;
|
|
baseVertex /= quadTemp.Count;
|
|
|
}
|
|
}
|
|
@@ -351,7 +351,7 @@ namespace o0.Project
|
|
|
var yValue = new List<Vector>() { baseVertex };
|
|
var yValue = new List<Vector>() { baseVertex };
|
|
|
foreach (var q in quadTemp)
|
|
foreach (var q in quadTemp)
|
|
|
{
|
|
{
|
|
|
- yValue.Add(q[i]);
|
|
|
|
|
|
|
+ yValue.Add(q.Quad[i]);
|
|
|
}
|
|
}
|
|
|
var lr = LinerRegression1D.Fit(2, xValue.ToArray(), yValue.ToArray());
|
|
var lr = LinerRegression1D.Fit(2, xValue.ToArray(), yValue.ToArray());
|
|
|
rs += lr.RSquared / 3;
|
|
rs += lr.RSquared / 3;
|
|
@@ -786,17 +786,17 @@ namespace o0.Project
|
|
|
if (QuadSemiAuto == null && QuadAuto == null && Screen.QuadInCamera != null) // 如果可能,回退到上一个screen
|
|
if (QuadSemiAuto == null && QuadAuto == null && Screen.QuadInCamera != null) // 如果可能,回退到上一个screen
|
|
|
{
|
|
{
|
|
|
Debug.Log("<color=aqua>[ScreenIdentification] 本次识别失败,回退到上次的识别结果</color>");
|
|
Debug.Log("<color=aqua>[ScreenIdentification] 本次识别失败,回退到上次的识别结果</color>");
|
|
|
- quadTemp.Add(Screen.QuadInCamera.Quad);
|
|
|
|
|
|
|
+ quadTemp.Add(Screen.QuadInCamera);
|
|
|
}
|
|
}
|
|
|
else if (QuadSemiAuto != null)
|
|
else if (QuadSemiAuto != null)
|
|
|
{
|
|
{
|
|
|
Debug.Log("<color=aqua>[ScreenIdentification] 识别到四边形</color>");
|
|
Debug.Log("<color=aqua>[ScreenIdentification] 识别到四边形</color>");
|
|
|
- quadTemp.Add(QuadSemiAuto.Quad);
|
|
|
|
|
|
|
+ quadTemp.Add(QuadSemiAuto);
|
|
|
}
|
|
}
|
|
|
else if (QuadAuto != null)
|
|
else if (QuadAuto != null)
|
|
|
{
|
|
{
|
|
|
Debug.Log("<color=aqua>[ScreenIdentification] 识别到四边形</color>");
|
|
Debug.Log("<color=aqua>[ScreenIdentification] 识别到四边形</color>");
|
|
|
- quadTemp.Add(QuadAuto.Quad);
|
|
|
|
|
|
|
+ quadTemp.Add(QuadAuto);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#region 绘制 output texture
|
|
#region 绘制 output texture
|