如何在csharp

时间:2015-05-25 13:56:40

标签: c# asynchronous kinect kinect-sdk

我正在开发一个年龄/性别分类的Kinect应用程序。我已经开发了一个代码,它将拍摄颜色流的快照,并且在裁剪头部关节周围的图像后,将使用face ++ api对图像进行性别分类。 / p>

        System.Timers.Timer myTimer = new System.Timers.Timer();
        myTimer.Elapsed += new ElapsedEventHandler(TakeImagesTimely);
        myTimer.Interval = 20000; // 1000 ms is one second
        myTimer.Start();



        public void TakeImagesTimely(object source, ElapsedEventArgs e)
        {
           this.Dispatcher.Invoke((Action)(() =>
            {
            // code here will run every 20 second

            if (X == 0 || Y == 0) { Console.WriteLine("sdsds");  return; }
                screen("Kinect123", faceImg);
                String myPhotos = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
                Bitmap bmp = new Bitmap(System.IO.Path.Combine(myPhotos, "Kinect123" + ".png"));
                Bitmap bmpCrop = CropBitmap(bmp, X - 100, Y - 30, 200, 100);
                BitmapSource bmpCropSrc = ConvertBitmap(bmpCrop);
                if (bmpCrop == null || bmpCropSrc == null) { return; }
                screen1("Kinect789", bmpCropSrc);
            }));
        }

此处屏幕功能获取颜色流的快照,然后在头部坐标周围裁剪图像后,screen1功能将裁剪后的图像上传到云端,并调用face ++ api进行年龄/性别分类。

我的问题是screen1函数需要3-4秒才能进行分类,这会挂起来自kinect的连续流。我知道我必须使用asynch / unblocking调用screen1函数,但不知道如何去做。< / p>

请指导我完成这件事。

1 个答案:

答案 0 :(得分:0)

尝试在async任务中包装screen1调用。

示例:

Task screen1Task = Task.Run( () => {
    screen1("Kinect789", bmpCropSrc);
});

这将要求您在父方法上声明async关键字。如果您不希望它“发射并忘记”,您还需要await某时screen1Task {/ 1}}。

更多示例:https://msdn.microsoft.com/en-us/library/hh195051%28v=vs.110%29.aspx