很多情況下,我們在使用工業相機時,不能使用相機自帶的SDK(或者是我們太懶了,不希望寫SDK這么麻煩),所以很多人會選擇halcon的Image Acquisition助手,簡單,通用,速度快,簡直是神器.
//獲取相機句柄
HOperatorSet.OpenFramegrabber("GigEVision", 0, 0, 0, 0, 0, 0, "progressive", -1, "default", -1,"false", "default", "00111cf59efc_TeledyneDALSA_SpyderGigEColourCame", 0, -1,out AcqHandle);
//幀觸發模式(獲取開始采集的時間)
HOperatorSet.SetFramegrabberParam(AcqHandle,"FrameStartTriggerMode","On");
HOperatorSet.SetFramegrabberParam(AcqHandle,"grab_timeout",100);
HOperatorSet.SetFramegrabberParam(AcqHandle,"LineSelector","Line1");
HOperatorSet.SetFramegrabberParam(AcqHandle,"LineFormat","TTL");
HOperatorSet.GrabImageStart(AcqHandle, -1);
//開一個線程等待采集
Thread thre = new Thread(loopGrab);
thre.Start();
}
}
//等待采集線程
private void loopGrab()
{
while (true)
{
try
{
HOperatorSet.GrabImageAsync(out img, AcqHandle, -1);
//如果采集到圖像,執行以下
HOperatorSet.DispObj(img, mainWindow);
halconExecute(true);
}
catch (Exception ex)
{
continue;
}
}
}
但是在實際的應用中,會發現一個嚴重的問題,如果需要使用相機的外部觸發,那么會出現什么情況呢?
,毫無疑問,會超時.
分析一下,默認的grab_timeout值為5000,那么如果設置了外部觸發,當grab_image_async (Image, AcqHandle, -1)在5s內沒有采集到圖像的話,就會拋出異常,顯而易見,這是不應該發生的.
那么如何處理這個問題呢?直接先上代碼和結果
(由於測試的時候用的是線陣相機,所有是這樣的效果,但是結果ok)
附上關鍵代碼
while (true)
try
grab_image_async (Image, AcqHandle, -1)
* Image Acquisition 01: Do something
catch(exception)
continue
endtry
endwhile
這里最好再設置一下超時的值,最好設置小一點,這樣觸發后采集的精度高一些.設想如果超時5s,那么有可能剛循環開始采集時,觸發了外部信號,那么必須要等到異常(5s后)才執行采集,顯然是不合理了.
在C#中,為了防止主程序假死,最好開個線程執行循環.

//獲取相機句柄
HOperatorSet.OpenFramegrabber("GigEVision", 0, 0, 0, 0, 0, 0, "progressive", -1, "default", -1,"false", "default", "00111cf59efc_TeledyneDALSA_SpyderGigEColourCame", 0, -1,out AcqHandle);
//幀觸發模式(獲取開始采集的時間)
HOperatorSet.SetFramegrabberParam(AcqHandle,"FrameStartTriggerMode","On");
HOperatorSet.SetFramegrabberParam(AcqHandle,"grab_timeout",100);
HOperatorSet.SetFramegrabberParam(AcqHandle,"LineSelector","Line1");
HOperatorSet.SetFramegrabberParam(AcqHandle,"LineFormat","TTL");
HOperatorSet.GrabImageStart(AcqHandle, -1);
//開一個線程等待采集
Thread thre = new Thread(loopGrab);
thre.Start();
}
}
//等待采集線程
private void loopGrab()
{
while (true)
{
try
{
HOperatorSet.GrabImageAsync(out img, AcqHandle, -1);
//如果采集到圖像,執行以下
HOperatorSet.DispObj(img, mainWindow);
halconExecute(true);
}
catch (Exception ex)
{
continue;
}
}
}