Basler相机获取图像数据:CGrabResultData使用实例

//数据类

class PYLONBASE_API CGrabResultData

    {
    public: 
        bool GrabSucceeded() const;
        String_t GetErrorDescription() const;
        uint32_t GetErrorCode() const;
        EPayloadType GetPayloadType() const;
        EPixelType GetPixelType() const;
        uint32_t GetWidth() const;
        uint32_t GetHeight() const;
        uint32_t GetOffsetX() const;
        uint32_t GetOffsetY() const;
        uint32_t GetPaddingX() const;
        uint32_t GetPaddingY() const;
        void* GetBuffer() const;
        size_t GetPayloadSize() const;
        uint32_t GetFrameNumber() const;
        uint64_t GetTimeStamp() const;
        bool GetStride( size_t& strideBytes) const;
        size_t GetImageSize() const;
        intptr_t GetCameraContext() const;
        int64_t GetID() const;
        int64_t GetImageNumber() const;
        int64_t GetNumberOfSkippedImages() const;
        bool IsChunkDataAvailable() const;
        GenApi::INodeMap& GetChunkDataNodeMap() const;
        bool HasCRC() const;
        bool CheckCRC() const;
        intptr_t GetBufferContext() const;
        // Internal use only.
        class CGrabResultDataImpl;
        CGrabResultDataImpl* GetGrabResultDataImpl();
        virtual ~CGrabResultData();
    private:
        //The grab result data object can not be copied.
        CGrabResultData( const CGrabResultData&);
        //The grab result data object can not be copied.
        void operator = ( const CGrabResultData&);
    protected:
         friend class CInstantCamera;
        CGrabResultData();
    private:
        friend class CGrabResultDataFactory;
        virtual void Destroy();
        virtual void Initialize();
        CGrabResultDataImpl* m_pImpl;

        // The grab result data
        const void*& m_pBuffer;
        bool& m_grabSucceeded;
        uint32_t& m_frameNr;
        EPayloadType& m_payloadType;
        EPixelType& m_pixelType;
        uint64_t& m_timeStamp;
        uint32_t& m_width;
        uint32_t& m_height;
        uint32_t& m_offsetX;
        uint32_t& m_offsetY;
        uint32_t& m_paddingX;
        uint32_t& m_paddingY;
        uint64_t& m_payloadSize;
        uint32_t& m_errorCode;
        String_t& m_errorDescription;
        intptr_t& m_cameraContext;
        int64_t& m_ID;
        int64_t& m_imageNumber;
        int64_t& m_skippedImageCount;
        intptr_t& m_bufferContext;

    };

//指针类

    class PYLONBASE_API CGrabResultPtr
    {
    public:
        CGrabResultPtr();
        CGrabResultPtr( const CGrabResultPtr& rhs);
        CGrabResultPtr& operator = ( const CGrabResultPtr& rhs);
        ~CGrabResultPtr();
        CGrabResultData* operator->() const;
        bool IsValid() const;
        operator bool() const;
        void Release();
        operator IImage&() const;    
        bool IsUnique() const;
        class CGrabResultPtrImpl;
        CGrabResultPtr& operator = ( const CGrabResultPtrImpl& rhs);
    private:
        /// Internal use only.
        friend class PylonPrivate::CGrabResultDataConverter;
        CGrabResultData* GetPtr() const;
        mutable CGrabResultPtrImpl* m_pImpl;
        CGrabResultData* m_pGrabResultData;
    };

//例子,把图片保存到本地

void OnImageGrabbed( CInstantCamera& camera, const CGrabResultPtr& ptrGrabResult) 
{

    int m_iCount=0;
    if ( instant_camera.IsGrabbing())
    {
        strPicName.Format (bmp_path.c_str(),++m_iCount);
        CImagePersistence::Save(ImageFileFormat_Jpeg, (String_t)strPicName, ptrGrabResult);
    }
}

//对比直接通过InstantCamera获取图像,OnImageGrabbed函数是自动在拍摄循环中调用的

       while ( camera.IsGrabbing())
        {
            // Wait for an image and then retrieve it. A timeout of 5000 ms is used.
            camera.RetrieveResult( 5000, ptrGrabResult, TimeoutHandling_ThrowException);

            // Image grabbed successfully?
            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;
                // Display the grabbed image.
                Pylon::DisplayImage(1, ptrGrabResult);
            }
            else
            {
                cout << "Error: " << ptrGrabResult->GetErrorCode() << " " << ptrGrabResult->GetErrorDescription();
            }
        }

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用C++封装Basler相机SDK的实例: ```c++ #include <pylon/PylonIncludes.h> #include <iostream> using namespace Pylon; using namespace std; class BaslerCamera { public: BaslerCamera() { // 构造函中初始化相机 try { PylonInitialize(); IDeviceInfo info = CDeviceInfo().CreateFirstDevice(); camera.Attach(Device::CreateDevice(info)); camera.Open(); } catch (const GenericException &e) { cerr << "An exception occurred: " << e.GetDescription() << endl; } } ~BaslerCamera() { // 析构函中释放相机 camera.Close(); PylonTerminate(); } void startCapture() { // 开始捕获图像 camera.StartGrabbing(); } void stopCapture() { // 停止捕获图像 camera.StopGrabbing(); } bool retrieveImage(CGrabResultPtr &grabResult) { // 获取一帧图像 if (camera.IsGrabbing()) { camera.RetrieveResult(5000, grabResult, TimeoutHandling_ThrowException); return grabResult->GrabSucceeded(); } return false; } private: CInstantCamera camera; }; int main() { BaslerCamera camera; camera.startCapture(); for (int i = 0; i < 10; ++i) { CGrabResultPtr grabResult; if (camera.retrieveImage(grabResult)) { // 处理图像 cout << "Image #" << i << " grabbed successfully." << endl; } else { cout << "Failed to grab image #" << i << endl; } } camera.stopCapture(); return 0; } ``` 在上述代码中,我们定义了一个名为`BaslerCamera`的类,其中包含了相机的初始化、图像捕获和图像获取等方法。在主函中,我们创建了一个`BaslerCamera`对象,开启图像捕获并获取10帧图像。 需要注意的是,上述代码中只是一个简单的示例,实际应用中可能需要更加复杂的逻辑和处理。同时,还需要根据实际情况进行参配置和错误处理等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码猿杂谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值