如何从这个API类的对象中检索cv :: Mat对象?

时间:2016-02-08 17:54:34

标签: c++ opencv observers

我一直试图从另一个类(第三方代码)中获取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

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;

但它给了我以下错误:

  

类“FrameObserver”

没有默认构造函数

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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并重新实现上述两个函数。这意味着处理或提取这些框架的代码必须位于您要创建的子类中的那些例程中。

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