В настоящее время я занимаюсь разработкой приложения с распознаванием лиц в режиме реального времени с использованием iOS Vision Framework, но я получаю неустойчивую ошибку Objective- C, которая, как ни странно, не происходит каждый раз.
Objective-C exception thrown. Name: NSInvalidArgumentException Reason: *** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[0]
эта ошибка останавливает процесс распознавания лиц, что очень расстраивает.
Это то, что я имею до сих пор, если кто-нибудь может указать мне, что вызывает эту ошибку и что я могу сделать, чтобы исправить ее, было бы очень полезно , Спасибо!
public class DataOutputDelegate : AVCaptureVideoDataOutputSampleBufferDelegate
{
public UIImage CapturedImage { get; set; }
VNDetectFaceRectanglesRequest faceDetection = new VNDetectFaceRectanglesRequest(null);
VNSequenceRequestHandler faceDetectionRequest = new VNSequenceRequestHandler();
[Export("captureOutput:didOutputSampleBuffer:fromConnection:")]
public override void DidOutputSampleBuffer(AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection)
{
if (connection.SupportsVideoOrientation)
connection.VideoOrientation = AVCaptureVideoOrientation.Portrait;
try
{
using (var pixelBuffer = sampleBuffer.GetImageBuffer())
using (var attachments = sampleBuffer.GetAttachments<NSString, NSObject>(CMAttachmentMode.ShouldPropagate))
using (var ciimage = new CIImage(pixelBuffer, attachments))
using (var ciImageWithOrientation = ciimage.CreateWithOrientation(CIImageOrientation.RightTop))
{
if(faceDetection != null)
{
faceDetectionRequest.Perform(new VNRequest[] { faceDetection }, ciImageWithOrientation, out var performError);
if(performError != null)
{
throw new Exception(performError.LocalizedDescription);
}
CheckForFace();
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
sampleBuffer.Dispose();
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
void CheckForFace()
{
var observations = faceDetection.GetResults<VNFaceObservation>() ?? Array.Empty<VNFaceObservation>();
if (observations.Length > 0)
{
Device.BeginInvokeOnMainThread(() =>
{
MessagingCenter.Send<object>(new object(), Constants.CameraPreview.MessageKeys.FaceDetected);
Console.WriteLine("\nFace detected . . .");
});
}
else
{
Device.BeginInvokeOnMainThread(() =>
{
MessagingCenter.Send<object>(new object(), Constants.CameraPreview.MessageKeys.FaceLost);
Console.WriteLine("\nFace is lost . . .");
});
}
return;
}
}