2025-10-11 18:25:59 +08:00

154 lines
5.3 KiB
C#

using System;
using System.Threading.Tasks;
using System.Text.Json;
using XiaoZhiSharp_MauiApp.Services;
namespace XiaoZhiSharp_MauiApp.McpTools
{
/// <summary>
/// 摄像头视觉识别工具 - 实现拍照和AI图像识别功能
/// </summary>
public class CameraVision_Tool
{
private readonly ICameraService? _cameraService;
public CameraVision_Tool(ICameraService? cameraService)
{
_cameraService = cameraService;
}
/// <summary>
/// 拍照识别功能
/// </summary>
/// <param name="question">要询问的问题</param>
/// <returns>识别结果</returns>
public async Task<string> TakePhotoAndRecognize(string question = "请描述这张图片的内容")
{
try
{
if (_cameraService == null)
{
return "{\"success\": false, \"message\": \"摄像头服务不可用\"}";
}
if (!_cameraService.IsSupported)
{
return "{\"success\": false, \"message\": \"设备不支持摄像头功能\"}";
}
Console.WriteLine($"开始拍照识别,问题: {question}");
// 调用摄像头服务进行拍照和识别
var result = await _cameraService.CaptureAndExplainAsync(question);
Console.WriteLine($"拍照识别完成: {result}");
return result;
}
catch (Exception ex)
{
var errorMessage = $"拍照识别失败: {ex.Message}";
Console.WriteLine(errorMessage);
return $"{{\"success\": false, \"message\": \"{errorMessage}\"}}";
}
}
/// <summary>
/// 仅拍照功能
/// </summary>
/// <returns>拍照结果</returns>
public async Task<string> TakePhoto()
{
try
{
if (_cameraService == null)
{
return "{\"success\": false, \"message\": \"摄像头服务不可用\"}";
}
if (!_cameraService.IsSupported)
{
return "{\"success\": false, \"message\": \"设备不支持摄像头功能\"}";
}
Console.WriteLine("开始拍照...");
var imageData = await _cameraService.CapturePhotoAsync();
if (imageData != null && imageData.Length > 0)
{
Console.WriteLine($"拍照成功,图片大小: {imageData.Length} bytes");
return $"{{\"success\": true, \"message\": \"拍照成功\", \"imageSize\": {imageData.Length}}}";
}
else
{
return "{\"success\": false, \"message\": \"拍照失败或用户取消\"}";
}
}
catch (Exception ex)
{
var errorMessage = $"拍照失败: {ex.Message}";
Console.WriteLine(errorMessage);
return $"{{\"success\": false, \"message\": \"{errorMessage}\"}}";
}
}
/// <summary>
/// 设置AI识别服务
/// </summary>
/// <param name="url">识别服务URL</param>
/// <param name="token">认证Token</param>
/// <returns>设置结果</returns>
public string SetVisionService(string url, string token = "")
{
try
{
if (_cameraService == null)
{
return "{\"success\": false, \"message\": \"摄像头服务不可用\"}";
}
_cameraService.SetExplainUrl(url, token);
Console.WriteLine($"AI识别服务已设置: {url}");
return $"{{\"success\": true, \"message\": \"AI识别服务设置成功\", \"url\": \"{url}\"}}";
}
catch (Exception ex)
{
var errorMessage = $"设置AI识别服务失败: {ex.Message}";
Console.WriteLine(errorMessage);
return $"{{\"success\": false, \"message\": \"{errorMessage}\"}}";
}
}
/// <summary>
/// 获取摄像头状态
/// </summary>
/// <returns>摄像头状态信息</returns>
public string GetCameraStatus()
{
try
{
if (_cameraService == null)
{
return "{\"success\": false, \"message\": \"摄像头服务不可用\", \"supported\": false, \"hasPermission\": false}";
}
var status = new
{
success = true,
supported = _cameraService.IsSupported,
hasPermission = _cameraService.HasPermission,
message = _cameraService.IsSupported ?
(_cameraService.HasPermission ? "摄像头就绪" : "需要摄像头权限") :
"设备不支持摄像头"
};
return JsonSerializer.Serialize(status);
}
catch (Exception ex)
{
return $"{{\"success\": false, \"message\": \"获取摄像头状态失败: {ex.Message}\"}}";
}
}
}
}