我正在尝试使用 openni 编写一个用于从 ASUS Xtion PRO LIVE 返回 RGB 图像流的插件。因此,在我的 Dll 程序中,我实现了 VideoFrameRef 类的 getdata() 函数以从图像数据中返回指针。当我从我的测试程序中调用这个函数时,它会抛出一个异常。
听到是我的 dll 代码
void* MyRgbStrem::GetStream()
{
Device device;
VideoStream color;
VideoFrameRef vframeRef;
VideoMode vmode;
Status status = STATUS_OK;
status = openni::OpenNI::initialize ();
status = device.open(openni::ANY_DEVICE);
status = color.create (device, SENSOR_COLOR);
status = color.start();
while (true)
{
if (device.getSensorInfo(SENSOR_COLOR) != NULL)
{
status = color. readFrame(&vframeRef);
if (vframeRef.isValid())
{
return ( uint16_t*) vframeRef.getData();
}
}
}
}
and in the header file i declar class MyRgbStrem
namespace Rgbstream
{
class MyRgbStrem
{
public:
static __declspec(dllexport) void* GetStream();
};
}
在我的测试程序中,我使用 opencv 进行图像处理并获取帧宽度、高度和大小,我在 dll 程序中声明了更多函数并在测试应用程序中调用它们
这是我用来调用 dll 的程序
{
Mat rgb,bgr;
int height, width, size;
height = Rgbstream::MyRgbStrem::GetFrameSize_H();
width = Rgbstream::MyRgbStrem::GetFrameSize_W();
size = Rgbstream::MyRgbStrem::getSizeOfData();
bgr.create ( height,width, CV_8UC3);
rgb.create (height,width, CV_8UC3);
while (true)
{
const void* imgbuff = Rgbstream::MyRgbStrem::GetStream();
memcpy (bgr.data, imgbuff, size );
cvtColor(rgb,bgr, CV_RGB2BGR);
namedWindow ("Color Video",CV_WINDOW_AUTOSIZE);
imshow ("Color Video", bgr);
char key = waitKey (10);
if (key == 27) break;
}
return 0;
}
当我运行这个程序时,它会抛出这样的异常
CallRgbStream.exe 中 0x0F97E89A (msvcr110d.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00268000。程序“[9544] CallRgbStream.exe”已退出,代码为 0 (0x0)。
任何帮助表示赞赏。谢谢