如何从 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"由观察者提供)
我一直在尝试从另一个 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"由观察者提供)