初学视觉学习笔记----用摄像头获取图片

 

 目标:

想要A,B两个窗口,A窗口实时显示相机的画面,当我按下照相按钮的时候,B窗口显示我捕获到的图片。

遇到的问题:

在A窗口 实时显示的时候 用到了while (true){ //视频显示}

因为要一直在A窗口显示画面,所以这个视频显示的循环永远跳不出去,此时我的 “获取图片”这个按钮是按不了的(此时程序一直都在执行while循环)

 

解决方法:

用多线程来解决。(在下还是个新手,是一边百度一遍自学,难免会有问题,请多包含,有问题欢迎提出批评)

 

我设置了一个"标志位" grabImg,当 grabImg为ture时,窗口B显示那一瞬间的图像,其余的时候都在窗口A显示图像。

这样就可以实现我的目标要求。

 

 

代码:

public partial class Form1 : Form
{
public delegate void FlushClient(); //创建一个委托线程
FlushClient fc;
public bool grabImg = false;
public int flag=0;

//halcon变量
public HTuple hv_ExpDefaultWinHandle1;
public HTuple hv_ExpDefaultWinHandle2;
public HObject ho_Image = null;
public HTuple hv_AcqHandle = null;
public HTuple hv_Width = new HTuple();
public HTuple hv_Height = new HTuple();

public Form1()
{
InitializeComponent();
}


//初始化相机
public void InitCamera()
{
hv_ExpDefaultWinHandle1 = hWindowControl1.HalconWindow; //显示窗口一
hv_ExpDefaultWinHandle2 = hWindowControl2.HalconWindow; //显示抓拍的窗口
HOperatorSet.GenEmptyObj(out ho_Image);
HOperatorSet.CloseAllFramegrabbers();  //在打开相机前最好先关闭所有相机,保证相机处于闲置状态。
HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb",
-1, "false", "default", "[1] USB Camera", 0, -1, out hv_AcqHandle);
hv_Height =480; //相机参数(我的USB相机是640X480的分辨率)
hv_Width =640 ;
HOperatorSet.SetPart(hv_ExpDefaultWinHandle1, 0, 0, hv_Height, hv_Width); //让图片完全占满控件的窗口 
HOperatorSet.SetPart(hv_ExpDefaultWinHandle2, 0, 0, hv_Height, hv_Width);

}

//实时检测
public void ThreadFuntion()
{
HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
while (flag==0)
{
try
{
ho_Image.Dispose();
HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);

HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle1); //视频显示
if (grabImg == true)
{
grabImg = false;
HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle2); //抓拍图显示
}
}
catch
{
continue;
}
}
}


private void button1_Click_1(object sender, EventArgs e)
{
fc = new FlushClient(ThreadFuntion);
try
{
InitCamera(); //初始化相机
}
catch
{
MessageBox.Show("打开相机失败", "请重试");
}

//开始委托的线程
fc.BeginInvoke(null, null);
}

private void button2_Click_1(object sender, EventArgs e)
{
grabImg = true;
}
}

控件截图:

 

 

 

我的疑问:

接下来要做的就是把获取到的图片储存起来。

 

posted @ 2017-04-06 14:17  八十岁的演唱会  阅读(647)  评论(2编辑  收藏  举报