While循环使Kairos仅每1分钟捕获一次

时间:2018-07-12 05:13:30

标签: c# while-loop kairos-api

我目前正在使用一种名为Kairos的面部识别软件来分析视频中人群的情绪。

我的问题是,而不是一会儿使用“ true”(每秒分析人群情绪),而是如何配置它仅每1分钟分析一次人群?预先感谢。

HumanAnalysisService has = null;

try{
    has = new HumanAnalysisService("license.xml", "", 20, 4);
} catch (ApplicationException lie) {
    Console.WriteLine(lie.Message);
    return;
}

// has = new HumanAnalysisService("license.xml", "", 20, 4);

/* attach to camera device */
// has.initUsingCameraSource(0);
has.initUsingImageSource(file1);

/* *loop thru the capture feed */
while (true) {
    /* pull pull out the next frame */
    has.pullFrame();

    /* does the device have more frames */
    if (has.isFrameEmpty())
        break;

    /* process the pulled frame */
    has.processFrame();

    /* get the people that are in the current frame*/
    People people = has.getPeople();

    System.Console.Write("Media Height: " + has.getMediaSourceHeight());
    System.Console.Write("Media Width: " + has.getMediaSourceWidth());
    System.Console.Write("Media Type: " + has.getMediaType());
    System.Console.Write("Mime Type: " + has.getMediaContentType() + "\n\n");

    /* print out the info from every person in te frame*/
    // foreach ( Person person in people )
        for (int i = 0; i < people.size(); i++) {
            System.Console.Write("Person id" + people.get(i).id + " , face x coordinate: " + people.get(i).face.x + "\n");
            System.Console.Write("Person id" + people.get(i).id + " , face y coordinate: " + people.get(i).face.x + "\n");
            System.Console.Write("Person id" + people.get(i).id + " , face width coordinate: " + people.get(i).face.width + "\n");
            System.Console.Write("Person id" + people.get(i).id + " , face height coordinate: " + people.get(i).face.height + "\n");
            System.Console.Write("Person id" + people.get(i).id + " , Emotion - Joy: " + people.get(i).impression.emotion_response.joy_score + "\n");
            System.Console.Write("Person id" + people.get(i).id + " , Emotion - Surprise: " + people.get(i).impression.emotion_response.surprise_score + "\n");
            System.Console.Write("Person id" + people.get(i).id + " , Emotion - Anger: " + people.get(i).impression.emotion_response.anger_score + "\n");
            System.Console.Write("Person id" + people.get(i).id + " , Emotion - Fear: " + people.get(i).impression.emotion_response.fear_score + "\n");
            System.Console.Write("Person id" + people.get(i).id + " , Emotion - Sadness: " + people.get(i).impression.emotion_response.sadness_score + "\n");
            System.Console.Write("Person id" + people.get(i).id + " , Emotion - Disgust: " + people.get(i).impression.emotion_response.disgust_score + "\n");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

我建议使用Timer

var timer = new System.Timers.Timer()
timer.Interval = 60000;
timer.Elapsed += (_s, _e) =>
{
    /* pull pull out the next frame */
    has.pullFrame();

    /* does the device have more frames */
    if (has.isFrameEmpty())
        timer.Enabled = false;;

    // REST OF YOUR LOOP CODE HERE
};
timer.Enabled = true;

或使用Microsoft Reactive Framework:

IDisposable subscription =
    Observable
        .Interval(TimeSpan.FromMinutes(1.0))
        .Do(x => has.pullFrame())
        .TakeWhile(n => !has.isFrameEmpty())
        .Do(x =>
        {
            /* process the pulled frame */
            has.processFrame();

            /* get the people that are in the current frame*/
            People people = has.getPeople();

            // REST OF YOUR LOOP CODE HERE
        })
        .Wait();

对于后一种选择,只需NuGet“ System.Reactive”并将using System.Reactive.Linq;添加到您的代码中即可。

答案 1 :(得分:0)

对于您的应用而言,可能已经结束了,但是请看一下Quartz.Net 您可以简单地创建一个任务以无限期重复。 干净的代码,可以轻松测试

[DisallowConcurrentExecution]
public class CaptureFeedFeedbackLoop : IJob
{
    public static HumanAnalysisService Has;

    public Task Execute(IJobExecutionContext context)
    {
        //Do stuff
        return Task.CompletedTask;
    }
}

然后

HumanAnalysisService has = null;

try
{
    has = new HumanAnalysisService("license.xml", "", 20, 4);
} 
catch (ApplicationException lie)
{
    Console.WriteLine(lie.Message);
    return;
}

// has = new HumanAnalysisService("license.xml", "", 20, 4);

/* attach to camera device */
// has.initUsingCameraSource(0);
has.initUsingImageSource(file1);
IJobDetail job = JobBuilder.Create<CaptureFeedFeedbackLoopJob>().WithIdentity("job1", "group1").Build();

ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
    .WithIntervalInSeconds(60)
    .RepeatForever())
.Build();


await scheduler.ScheduleJob(job, trigger);

如果您需要方法的同步版本,则可以使用Quartz.net 2.x