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) で終了しました。
どんな助けでも大歓迎です。ありがとう