Files
ImaageQ_Unity_App/Assets/Scripts/ObjectDetection/ObjectDetectionSample.cs
Ignacio Gómez Puga 60d9159b04 Test new models 2
2025-03-23 18:45:46 -06:00

151 lines
4.6 KiB
C#

using Niantic.Lightship.AR.ObjectDetection;
using UnityEngine;
public class ObjectDetectionSample : MonoBehaviour
{
private ARObjectDetectionManager _objectDetectionManager;
[SerializeField]
private DrawRect _drawRect;
private Camera _mainCamera;
private Canvas _canvas;
private Color[] _colors = new Color[]
{
Color.red, Color.blue, Color.green, Color.yellow, Color.magenta,
Color.cyan, Color.white, Color.black
};
private Vector3 _lastCameraPosition;
private float _movementThreshold = 0.005f; // Adjust for sensitivity
private float _detectionSlowdownRate = 0.0f; // Detection frame rate for stationary camera
private float _detectionNormalRate = 1.0f; // Detection frame rate for moving camera
private bool _isCameraMoving = false;
private float confidencePercentage = 1f;
private void Awake()
{
_mainCamera = Camera.main;
if (_mainCamera == null)
{
Debug.LogError("Main Camera not found.");
}
_objectDetectionManager = FindObjectOfType<ARObjectDetectionManager>();
if (_objectDetectionManager == null)
{
Debug.LogError("ARObjectDetectionManager not found.");
}
_canvas = FindObjectOfType<Canvas>();
if (_canvas == null)
{
Debug.LogError("Canvas not found.");
}
}
private void Start()
{
if (_objectDetectionManager != null)
{
_objectDetectionManager.enabled = true;
_objectDetectionManager.ObjectDetectionsUpdated += ObjectDetectionsUpdated;
Debug.Log("Object detection started.");
}
_lastCameraPosition = _mainCamera.transform.position;
}
private void Update()
{
DetectCameraMovement();
}
private void DetectCameraMovement()
{
if (_mainCamera == null) return;
Vector3 currentCameraPosition = _mainCamera.transform.position;
float movement = Vector3.Distance(currentCameraPosition, _lastCameraPosition);
Debug.Log($"Camera Movement Detected: {movement}");
if (movement > _movementThreshold)
{
if (!_isCameraMoving)
{
// Resume full frame rate for detection
_isCameraMoving = true;
SetDetectionFrameRate(_detectionNormalRate);
Debug.Log("Camera is moving, increasing detection rate.");
}
}
else
{
if (_isCameraMoving)
{
// Slow down detection to save performance
_isCameraMoving = false;
SetDetectionFrameRate(_detectionSlowdownRate);
Debug.Log("Camera is stationary, slowing detection rate.");
}
}
_lastCameraPosition = currentCameraPosition;
}
private void SetDetectionFrameRate(float frameRate)
{
if (_objectDetectionManager != null)
{
_objectDetectionManager.TargetFrameRate = (uint)frameRate;
}
}
private void ObjectDetectionsUpdated(ARObjectDetectionsUpdatedEventArgs args)
{
if (_mainCamera == null || _objectDetectionManager == null) return;
var result = args.Results;
if (result == null || result.Count == 0)
{
Debug.Log("No detections found.");
return;
}
Debug.Log($"Detections found: {result.Count}");
_drawRect.ClearRects();
for (int i = 0; i < result.Count; i++)
{
var detection = result[i];
if (detection.GetConfidentCategorizations().Count == 0) continue;
var categoryToDisplay = detection.GetConfidentCategorizations()[0];
float confidence = categoryToDisplay.Confidence;
if (confidence <= confidencePercentage) continue; // Adjust threshold if needed
string categoryName = categoryToDisplay.CategoryName;
int h = Mathf.FloorToInt(_canvas.GetComponent<RectTransform>().rect.height);
int w = Mathf.FloorToInt(_canvas.GetComponent<RectTransform>().rect.width);
var rect = detection.CalculateRect(w, h, Screen.orientation);
Debug.Log($"Detected: {categoryName} with confidence {confidence * 100:F1}%");
string label = $"{categoryName}";
_drawRect.CreateRect(rect, _colors[i % _colors.Length], label);
}
}
private void OnDestroy()
{
if (_objectDetectionManager != null)
{
_objectDetectionManager.ObjectDetectionsUpdated -= ObjectDetectionsUpdated;
}
}
}