C# で OpenCV 用の Emgu ラッパーを使用していますが、次の厄介な問題があります。
Code Laboratories Kinect API を使用しています。Kinect から画像を取得するコードは次のようになります。
//Forms the array to store the image data in.
uint[] imageSource = new uint[640 * 480];
//EmguCV needs everything to be IntPtrs, so wrapping the array in one.
GCHandle handle1 = GCHandle.Alloc(imageSource, GCHandleType.Pinned);
try
{
imageSourcePointer = handle1.AddrOfPinnedObject();
}
finally
{
if (handle1.IsAllocated)
{
handle1.Free();
}
}
imagePointer = IntPtr.Zero;
//Getting the camera information.
IntPtr camera = CLNUIDevice.CreateCamera(CLNUIDevice.GetDeviceSerial(0));
//Pulling from the image.
CLNUIDevice.GetCameraColorFrameRGB24(camera, imageSourcePointer, 0);
imagePointer = CvInvoke.cvCreateImageHeader(new Size(640, 480), IPL_DEPTH.IPL_DEPTH_8S, 1);
//TODO change the widtstep to be generic based on the camera.
MIplImage image = (MIplImage) Marshal.PtrToStructure(imagePointer, typeof(MIplImage));
//Connecting the data array to the image definition's header.
CvInvoke.cvSetData(imagePointer, imageSourcePointer, image.widthStep);
現在、すべての IntPtr ラッピングが機能しているように見えます。これは、それらが指すデータが正常に更新されるためです。
関数を使用しようとすると問題が発生します。
//For finding the corners of a chessboard in the given image.
int found = CvInvoke.cvFindChessboardCorners(imagePointer, board_sz, cornerPointer, ref corner_count, Emgu.CV.CvEnum.CALIB_CB_TYPE.ADAPTIVE_THRESH | Emgu.CV.CvEnum.CALIB_CB_TYPE.FILTER_QUADS);
そして、実行時例外が発生します
「OpenCV: 8 ビットのグレースケールまたはカラー画像のみがサポートされています」
Code Laboratory Kinect のすべてのカラー プル メソッド (RGB24、RGB32、および RAW プル コマンド) を試しましたが、例外が残っています。イメージ (imageSource) を 8 ビットの符号付き整数イメージとして宣言しましたが、エラーが発生するとは予想していませんでした。
なぜこれが起こっているのかを絞り込もうとしましたが、考えました-
Kinect から取得した画像は、8 ビットの OpenCV 画像ヘッダーに格納されているにもかかわらず、独自のビット深度プロパティを保持しています。
Kinect のデータ配列として使用している uint[] は 32 ビット配列のままで、画像全体が 32 ビット画像になります。可能ではありますが、これはまだ可能性が低いようです。
私はしばらくこれにこだわっていたので、どんな提案も本当に役に立ちます。本当にありがとう!
編集-私はこれを理解したと思います-Emguについて最初に理解できなかったいくつかのこと。誰かがこれを見る必要がある場合は、すぐにソリューション コードを投稿します。