You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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;
}

请问我是否应使用这段代码来显示缓冲区值?另外,我仍希望保留自己编写的宽高相关代码,是否有可行方法?


回答
  1. 你找到的这段代码无法直接获取实时缓冲区计数——它只是读取单帧图像的缓冲区指针和像素灰度值,和你需要的「实时待处理缓冲区数量」不是一个概念。

  2. 完全可以保留你现有代码,同时添加缓冲区计数的显示逻辑,具体方案如下:

    • 要获取Basler相机的实时缓冲区计数,需调用Pylon SDK中CInstantCamera对象的GetNumBuffersQueued()方法,该方法会返回当前队列中等待处理的缓冲区数量。
    • 在相机帧抓取的回调函数或处理循环中,把获取到的缓冲区计数值格式化后,通过SetDlgItemText显示到新增的编辑框控件(比如IDC_EDIT_BUFFER)中。
  3. 整合示例代码(结合你的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); // 新增的缓冲区计数显示控件
    }
}
  1. 注意事项:
    • 你现有的OnMouseMove代码仅显示鼠标坐标,若要显示相机采集图像的实际宽高,建议在帧抓取回调中使用ptrGrabResult->GetWidth()/GetHeight(),而非鼠标坐标值。
    • 确保CInstantCamera对象已正确初始化并启动流采集,否则无法获取有效的缓冲区计数。

内容的提问来源于stack exchange,提问作者Sanghyeon Woo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:41:10