通过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