如何从 API class 的对象中检索 cv::Mat 对象?

How to retrieve a cv::Mat object from an object of this API class?

我一直在尝试从另一个 class(第三方代码)获取一个 cv::Mat 对象到我的主函数中。

我有一个 class:

FrameObserver.h

class FrameObserver : virtual public IFrameObserver
{
public:

    FrameObserver( CameraPtr pCamera, FrameInfos eFrameInfos, ColorProcessing eColorProcessing );
    cv::Mat m_ConvertImage;
    // This is our callback routine that will be executed on every received frame
    virtual void FrameReceivedLeft( const FramePtr pFrame );
    virtual void FrameReceivedRight(const FramePtr pFrame);
    void ProcessCvLeft(const FramePtr pFrame);
    void ProcessCvRight(const FramePtr pFrame);
    static cv::Mat FrameObserver::getCurrentFrame() { return currentFrame; }

private:
    static cv::Mat currentFrame;

#ifdef WIN32
    double      m_dFrequency;
#endif //WIN32
};

}}} // namespace AVT::VmbAPI::Examples

FrameObserver.cpp

void FrameObserver::ProcessCvLeft(const FramePtr pFrame)
{
    VmbUchar_t *pBuffer;
    VmbUint32_t FrameWidth;
    VmbUint32_t FrameHeight;

    pFrame->GetWidth(FrameWidth);
    pFrame->GetHeight(FrameHeight);
    pFrame->GetImage(pBuffer);

    ShowFrameInfos(pFrame);

    IplImage *img1 = cvCreateImageHeader(cvSize(
        FrameWidth,
        FrameHeight),
        IPL_DEPTH_8U,
        1);
    cvSetData(img1, pBuffer, img1->widthStep);

    cv::Mat copyimageL = cv::cvarrToMat(img1);

    currentFrame = copyimageL;  //copies to currentFrame here
}

那我有main.cpp:

cv::Mat Mainframe;

int main( int argc, char* argv[] )
{
//I need to pull the currentFrame Mat stream into the frame Mat above.
}

最好的方法是什么?我试过:

FrameObserver fo;
cv::Mat test = fo.currentFrame;

但它给我以下错误:

no default constructor exists for class "FrameObserver"

谢谢。

就 C++ 而言,您的错误是 class FrameObserver 没有默认构造函数(即可以不带参数调用的构造函数)。它没有明确定义,也不会生成,因为已经定义了另一个构造函数(参见 here)。因此,你不能写

FrameObserver fo;

因为这会调用默认构造函数 FrameObserver::FrameObserver()(见上文)不存在。因此,您应该使用带有参数 FrameObserver::FrameObserver( CameraPtr pCamera, FrameInfos eFrameInfos, ColorProcessing eColorProcessing );

的现有构造函数创建 FrameObserver object

现在进入实际问题。由于此 class 是提供的 API 的一部分,您不应尝试更改它,而应学会正确使用它。从它的名字来看,它似乎是一个观察者。因此,您需要创建它的一个实例(一个实例),然后仔细阅读文档,了解它应该如何以矩阵形式为您提供帧数据。我不知道它究竟是如何工作的,但根据常识,因为它是一个 "observer",它应该会自动为您提供有关传入帧的通知。再次,仔细查看文档。

重要编辑:

给你看header:

// This is our callback routine that will be executed on every received frame
virtual void FrameReceivedLeft( const FramePtr pFrame );
virtual void FrameReceivedRight(const FramePtr pFrame);

看起来,你应该subclass FrameObserver 并重新实现上面的两个函数。这意味着处理或提取这些帧的代码必须驻留在您要创建的 subclass 中的那些例程中。

无论如何,虽然细节可能有所不同,但概念不变:观察者将自行调用一些方法。您只能等待它调用这些方法并做出相应的反应。更准确地说,您在观察者 object 中注册您的 class object 或函数,然后让观察者自动调用这些方法。 (据说你"subscribe to the notifications"由观察者提供)