1

我正在尝试使用 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)。

任何帮助表示赞赏。谢谢

4

0 回答 0