使用工业相机获取图片——利用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.释放资源

转:https://blog.csdn.net/qq_24919107/article/details/77247616

猜你喜欢

转载自blog.csdn.net/eric_e/article/details/82934370