初学视觉学习笔记----用摄像头获取图片
?
?目標:
想要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;
}
}
控件截圖:
?
?
?
我的疑問:
接下來要做的就是把獲取到的圖片儲存起來。
?
轉載于:https://www.cnblogs.com/rockstarmaday/p/6673247.html
總結
以上是生活随笔為你收集整理的初学视觉学习笔记----用摄像头获取图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 未解决-hive之drop 表分区失败
- 下一篇: truncate