首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止C#中的Halcon摄像机吗?

停止C#中的Halcon摄像机吗?
EN

Stack Overflow用户
提问于 2015-11-20 08:05:46
回答 1查看 2.1K关注 0票数 0

我正在使用Halcon (http://www.halcon.com/),并将其转换为C#,并在2013年的visual中使用。现在,我点击btnLive,给我相机现场,当我点击btnLiveStop得到我的错误。我怎么能阻止摄像机?我应该用线吗?或者..。

这是Live.cs:

代码语言:javascript
复制
using System;
using HalconDotNet;

public partial class LiveExport
{
  public HTuple hv_ExpDefaultWinHandle;
  Int32 Flag = 0;
  // Main procedure 
  public void actionLive()
  {

    // Local iconic variables 

    HObject ho_Image=null;


    // Local control variables 

    HTuple hv_AcqHandle = null;

    // Initialize local and output iconic variables 
    HOperatorSet.GenEmptyObj(out ho_Image);

    HOperatorSet.CloseAllFramegrabbers();
    //Image Acquisition 01: Code generated by Image Acquisition 01
    HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb", 
        -1, "false", "default", "[0] DFx 72BUC02", 0, -1, out hv_AcqHandle);
    HOperatorSet.GrabImageStart(hv_AcqHandle, -1);

    while ((int)(1) != Flag)
    {
      ho_Image.Dispose();
      HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
      HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
      //Image Acquisition 01: Do something
    }

    HOperatorSet.CloseFramegrabber(hv_AcqHandle);
    ho_Image.Dispose();

  }

  public void InitHalconLive()
  {
    // Default settings used in HDevelop 
    HOperatorSet.SetSystem("width", 512);
    HOperatorSet.SetSystem("height", 512);
  }

  public void RunHalconLive(HTuple Window)
  {
    hv_ExpDefaultWinHandle = Window;
    //actionLive();
  }

  public void StopStart(Int32 value) {
      this.Flag = value;
      actionLive();
  }
}

在form.cs中,我编写了这些代码,但是当我单击btnStop时,不要工作,并显示没有响应(请帮助我):

代码语言:javascript
复制
private void btnLive_Click(object sender, EventArgs e)
{
    HTuple WindowID = hWindowControl2.HalconID;
    LVDEV = new LiveExport();
    LVDEV.InitHalconLive();
    LVDEV.RunHalconLive(WindowID);
    LVDEV.actionLive();
}

private void btnLiveStop_Click(object sender, EventArgs e)
{
    LiveExport LVDEVs = new LiveExport();
    LVDEVs.StopStart(1);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-07 01:03:33

这里有几件事需要解决。首先,“停止”图像抓取的方式是用"SetFramegrabberParam“调用运算符"do_abort_grab":

代码语言:javascript
复制
private void StopAcquisition(HTuple hv_AcqHandle)
{
    HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "do_abort_grab",1);
}

此操作对应于StartImageGrab操作。

尽管如此,要做到这一点,您还需要对体系结构进行更多的更改。除非您显式地需要连接和断开相机,否则应该只调用OpenFrameGrabber一次,并将变量hv_acqHandle持久化,并提取CloseFramegrabber运算符。

然后,start和stop应该在另一个线程中调用不同的while循环:

代码语言:javascript
复制
private CancellationTokenSource StartAcquire(HTuple hv_acqHandle)
{
    var tokenSource = new CancellationTokenSource();
    Task.Run(()=>{
        while(!tokenSource.Token.IsCancellationRequested)
        {
           ho_Image.Dispose();
           HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
           HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
        }, tokenSource.Token);
    return tokenSource;
}

public void StopContinuousAcquisition(HTuple hv_acqHandle, CancellationTokenSource tokenSource)
{
    if (tokenSource== null)
        return;
    tokenSource.Cancel();
    HOperatorSet.SetFramegrabberParam(_frameGrabber, "do_abort_grab", 1);
}

表单锁定的原因是您的while(true)循环不允许任何事件注册。在这种情况下,您必须使用多线程方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33821760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档