如何从此 API 类的对象中检索 cv::Mat 对象

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

本文关键字:对象 检索 cv Mat API      更新时间:2023-10-16

我试图将另一个类(第三方代码(中的cv::Mat对象获取到我的主函数中。

我有一堂课:

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

帧观察者.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
}

然后我有主要.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;

但它给了我以下错误:

类"FrameObserver"不存在默认构造函数

谢谢。

就C++而言,您的错误是类FrameObserver没有默认构造函数(即可以在没有参数的情况下调用的构造函数(。它没有显式定义,也不会生成,因为已经定义了另一个构造函数(请参阅此处(。因此,你不能写

FrameObserver fo;

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

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

重要编辑:

在这里,看看标题:

// 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);

从外观上看,您应该对FrameObserver进行子类化并重新实现上述两个函数。这意味着用于处理或提取这些帧的代码必须驻留在要创建的子类中的这些例程中。

无论如何,虽然细节可能会有所不同,但概念仍然存在:观察者将自行调用一些方法。您只能等待它调用这些方法并做出相应的反应。更准确地说,在观察者对象中注册类对象或函数,然后让观察者自动调用这些方法。(据说您"订阅了观察者提供的通知"(。