2

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について最初に理解できなかったいくつかのこと。誰かがこれを見る必要がある場合は、すぐにソリューション コードを投稿します。

4

0 に答える 0