1. 程式人生 > >使用工業相機獲取圖片——利用Sapera文件

使用工業相機獲取圖片——利用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.釋放資源