xamarin iOS Обнаружение лица с использованием платформы Vision NSInvalidArgumentException - PullRequest
0 голосов
/ 17 апреля 2020

В настоящее время я занимаюсь разработкой приложения с распознаванием лиц в режиме реального времени с использованием 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;
        }
    }
...