使用工業相機獲取圖片——利用Sapera文件
通過Sapera LT庫用相機獲取圖片。
一、首先配置動態連結庫;
1. 使用Basic Classes:
1.在專案|屬性|配置屬性|C/C++|常規|附加包含目錄中新增Sapera\Classes\Gui和Sapera\Classes\Basic和Sapera\include。
2.在專案|屬性|配置屬性|連結器|附加依賴項中新增Lib\Win32\SapClassBasic.lib.和Lib\Win32\VS2013\SapClassGuiD.lib
和Lib\Win32\VS2013\SapClassGui.lib。
3.在標頭檔案中加入SapClassBasic.h和SapClassGui.h
注意:剛裝上SDK時,檔案中沒有SapClassGuiD.lib。需要先開啟所有的DEMO然後生成解決方案,才會在檔案中生成SapClassGuiD.lib;
二.開發的一般步驟:
1.為物件分配記憶體
2.為物件建立資源
3.釋放物件資源
4.釋放物件記憶體
三、具體步驟
1.在標頭檔案中宣告物件
CImageExWnd m_ImageWnd;
SapAcqDevice
*m_AcqDevice;
SapBuffer
*m_Buffers;
SapTransfer
*m_Xfer;
SapView *m_View;
2.在OnInitDialog()中為物件分配記憶體,例項化
m_AcqDevice
= new SapAcqDevice(dlg.GetLocation(), dlg.GetConfigFile());
m_Buffers
= new SapBufferWithTrash(2, m_AcqDevice);
m_Xfer
= new SapAcqDeviceToBuf(m_AcqDevice, m_Buffers, XferCallback, this);
m_View = new SapView(m_Buffers);
這裡的m_AcqDevice物件直接呼叫了Sapera庫中的對話方塊資源獲取地址和檔案;
3.建立資源
if (m_AcqDevice && !*m_AcqDevice && !m_AcqDevice->Create())
{
DestroyObjects();
return FALSE;
}
// Create buffer object
if (m_Buffers && !*m_Buffers)
{
if( !m_Buffers->Create())
{
DestroyObjects();
return FALSE;
}
// Clear all buffers
m_Buffers->Clear();
}
// Create view object
if (m_View && !*m_View && !m_View->Create())
{
DestroyObjects();
return FALSE;
}
// Set next empty with trash cycle mode for transfer
if (m_Xfer && m_Xfer->GetPair(0))
{
if (!m_Xfer->GetPair(0)->SetCycleMode(SapXferPair::CycleNextWithTrash))
{
DestroyObjects();
return FALSE;
}
}
// Create transfer object
if (m_Xfer && !*m_Xfer && !m_Xfer->Create())
{
DestroyObjects();
return FALSE;
}
利用庫中自帶的Creat()建立;
4.在自己的事件處理函式中新增函式
如Grab();Snap();Freeze();系統自動呼叫m_Xfeer的回撥函式顯示影象
void CGigeCameraDemoDlg::XferCallback(SapXferCallbackInfo *pInfo)
{
CGigeCameraDemoDlg *pDlg= (CGigeCameraDemoDlg *) pInfo->GetContext();
int staticCount;
BYTE pData;
void *pDataAddr = &pData;
// If grabbing in trash buffer, do not display the image, update the
// appropriate number of frames on the status bar instead
if (pInfo->IsTrash())
{
CString str;
str.Format(_T("Frames acquired in trash buffer: %d"), pInfo->GetEventCount());
pDlg->m_statusWnd.SetWindowText(str);
}
// Refresh view
else
{
pDlg->m_View->Show();
}
}
至於buff資料的傳遞,demo中使用了DDX機制將m_ImageWnd與picture control控制元件繫結;有利用CImageExWnd類中的AttachSapView()函式將m_View的資料床底給m_ImageWnd;實現buff影象資料的顯示。
5.釋放資源