Halcon联合C#编程相机打开及拍照

Halcon联合C#编程一般是需要进行相机的连接,可以是普通的USB摄像头或工业相机都是可以的,甚至手机相机也是可以的。首先要通过Halcon助手查自己的相机是属于哪一种参数的。

在C#的项目中新建几个按钮如,相机打开,相机关闭,单次拍照,连续拍照等,并关联其相应的事件。如,打开相机功能代码如下:

 private void halconToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if (hv_CamHandle==null )
     {
         m_threadCamera = new Thread(new ThreadStart(CameraProce)); //因为是循环操作的是不能放在主线程下,否则会卡;
         m_threadCamera.Start();
     }
     else
     {
         MessageBox.Show("相机已打开!");
     }
 }

 //相机的多线程,相机打开以后,一般都是时实采集的,时实采集是一个循环的过程。所以就不能放在主线程下。
 //放在主线程下这个界面就会卡顿,对界面的操作就会无法响应,把实时采集放在多线程下。

HTuple ht_CamHandle = new HTuple(); //相机句柄halcon模式
private void CameraProce()
{
    HOperatorSet.OpenFramegrabber("MindVision17_X64", 1, 1, 0, 0, 0, 0, "progressive", 8, "BGR24", -1, "false", "auto", "MS-UBS130RC-T", 0, -1,out hv_CamHandle);
    HOperatorSet.GrabImageStart(hv_CamHandle, -1);
    while (true)
    {
        HOperatorSet.GrabImageAsync(out ho_Image, ht_CamHandle, -1);
        HOperatorSet.GetImageSize(ho_Image, out HTuple w, out HTuple h);
        HOperatorSet.MirrorImage(ho_Image, out ho_Image, "row");
        HOperatorSet.SetPart(hv_handle, 0, 0, h, w);

        HOperatorSet.DispObj(ho_Image, hv_handle);
    }
}

注意:OpenFramegrabber打开采集设备的参数是Halcon助手自动生成的。

关闭相机的实现代码:

// 相机停止采集图像
private void 断开ToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (hv_CamHandle != null )
    {
        if (m_threadCamera != null)   //如果相机的多线程是打开的,则关闭掉,并以命令行形式打印线程状态信息。
        {
            m_threadCamera.Abort();
            Console.WriteLine(m_threadCamera.ThreadState.ToString());
        }
        HOperatorSet.CloseFramegrabber(hv_CamHandle); //关闭相机采集设备
        ho_Image.Dispose();
        hv_CamHandle = null;
    }
    txtBox_RunRecord.Text = txtBox_RunRecord.Text.Insert(0, DateTime.Now.ToString() + " 相机关闭成功 \r\n");
}

如果工程中有多台相机就要用到搜索相机的功能了,在C#中搜索相机的功能有代码:

private void searchCam(boject sender,EventArgs e)
{
    HOperatorSet.InfoFramegrabber("MindVision17_X64","device",out information,out valueList);
    for(int i=0; i < valueList.Length; i++)
    {
        combox1.Items.Add(valueList.SArr[0]);
    }
}

相机的单次抓取,也就是拍照。

 //抓拍并保存图片
string strTime = System.DateTime.Now.ToString("yyyyMMddHHmmss");
private void 拍照ToolStripMenuItem_Click(object sender, EventArgs e)
{

    if (hv_CamHandle == null) //如果相机的句柄为空则创打开采集设备
    {
        HOperatorSet.OpenFramegrabber("MindVision17_X64", 1, 1, 0, 0, 0, 0, "progressive", 8, "BGR24", -1, "false", "auto", "MS-UBS130RC-T", 0, -1, out ht_CamHandle);
        if (m_tCamera != null) //如果相机的多线程不为空则,关掉此线程。
        {
            m_threadCamera.Abort();
            HOperatorSet.GrabImageAsync(out ho_Image, hv_CamHandle,-1); //让其工作在异步模式
            HOperatorSet.DispObj(ho_Image, hv_handle);
        }
    }
    string str = "H:\\视觉\\ImagePIC\\" + strTime + ".bmp";
    HOperatorSet.WriteImage(ho_Image, "bmp",0, str);
    txtBox_RunRecord.Text = txtBox_RunRecord.Text.Insert(0, DateTime.Now.ToString()+ " 相机拍照成功 " + str+ "\r\n");
}

对于连拍功能与打开的代码基本上是一致的,就不再赘述。

private void button1_Click(object sender,EventArgs e)
{
       if (hv_CamHandle == null )//如果相机的句柄为空则创打开采集设备
       {
           m_threadCamera = new Thread(new ThreadStart(CameraProce));  //因为是循环操作的是不能放在主线程下,否则会卡;
           m_threadCamera.Start();
           txtBox_RunRecord.Text = txtBox_RunRecord.Text.Insert(0, DateTime.Now.ToString() + " 相机打开成功 \r\n");
           }
        else
        {
            MessageBox.Show("相机已打开!");
        }
}
转载请注明出处:  https://www.cntworld.cn
智能工控 » Halcon联合C#编程相机打开及拍照

发表回复

提供最优质的资源集合

立即查看 了解详情