如何获取Basler相机实时缓冲区计数并保留现有宽高显示代码?
问题
我正在编写代码以输出Basler相机实时图像的Width、Height和Real-time buffer count值,已成功实现Width、Height值的输出,但难以编写显示实时缓冲区计数的代码。
以下是我编写的可正常运行的代码:
#include "stdafx.h" #include "imageviewer12.h" #include "imageviewer12Dlg.h" #include "afxdialogex.h" void Cimageviewer12Dlg::OnMouseMove(UINT nFlags, CPoint point) { CString strX; strX.Format(_T("X: %d"), point.x); CString strY; strY.Format(_T("Y: %d"), point.y); SetDlgItemText(IDC_EDIT1, strX); SetDlgItemText(IDC_EDIT2, strY); CDialogEx::OnMouseMove(nFlags, point); }
不过我在搜索时找到了这段代码:
if (ptrGrabResult->GrabSucceeded()) { // Access the image data. cout << “SizeX: ” << ptrGrabResult->GetWidth() << endl; cout << “SizeY: ” << ptrGrabResult->GetHeight() << endl; const uint8_t* pImageBuffer = (uint8_t*) ptrGrabResult->GetBuffer(); cout << “Gray value of first pixel: ” << (uint32_t) pImageBuffer[0] << endl << endl; }
请问我是否应使用这段代码来显示缓冲区值?另外,我仍希望保留自己编写的宽高相关代码,是否有可行方法?
回答
你找到的这段代码无法直接获取实时缓冲区计数——它只是读取单帧图像的缓冲区指针和像素灰度值,和你需要的「实时待处理缓冲区数量」不是一个概念。
完全可以保留你现有代码,同时添加缓冲区计数的显示逻辑,具体方案如下:
- 要获取Basler相机的实时缓冲区计数,需调用Pylon SDK中
CInstantCamera对象的GetNumBuffersQueued()方法,该方法会返回当前队列中等待处理的缓冲区数量。 - 在相机帧抓取的回调函数或处理循环中,把获取到的缓冲区计数值格式化后,通过
SetDlgItemText显示到新增的编辑框控件(比如IDC_EDIT_BUFFER)中。
- 要获取Basler相机的实时缓冲区计数,需调用Pylon SDK中
整合示例代码(结合你的MFC框架逻辑):
// 假设你的类中已声明并初始化了CInstantCamera类型的成员变量m_camera void Cimageviewer12Dlg::OnFrameGrabbed(CGrabResultPtr ptrGrabResult) { if (ptrGrabResult->GrabSucceeded()) { // 保留原有宽高显示逻辑(如果需要显示相机图像的实际宽高,建议用帧数据的GetWidth/Height) CString strWidth; strWidth.Format(_T("Width: %d"), ptrGrabResult->GetWidth()); CString strHeight; strHeight.Format(_T("Height: %d"), ptrGrabResult->GetHeight()); SetDlgItemText(IDC_EDIT1, strWidth); // 复用你原有的编辑框,或新增对应控件 SetDlgItemText(IDC_EDIT2, strHeight); // 获取并显示实时缓冲区计数 int bufferCount = m_camera.GetNumBuffersQueued(); CString strBufferCount; strBufferCount.Format(_T("Buffer Count: %d"), bufferCount); SetDlgItemText(IDC_EDIT3, strBufferCount); // 新增的缓冲区计数显示控件 } }
- 注意事项:
- 你现有的
OnMouseMove代码仅显示鼠标坐标,若要显示相机采集图像的实际宽高,建议在帧抓取回调中使用ptrGrabResult->GetWidth()/GetHeight(),而非鼠标坐标值。 - 确保
CInstantCamera对象已正确初始化并启动流采集,否则无法获取有效的缓冲区计数。
- 你现有的
内容的提问来源于stack exchange,提问作者Sanghyeon Woo
相关产品推荐
相关产品推荐

