Проблема глубины изображения в EmguCV с помощью Code Laboratory Kinect Calibration - PullRequest
2 голосов
/ 03 мая 2011

Я использую оболочку Emgu для OpenCV в C #, и у меня возникает следующая неприятная проблема.

Я использую API-интерфейс Code Laboratories Kinect, и код для получения изображения из 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, все еще имеет свои собственные свойства глубины в битах.

  • Uint [], который я использую в качестве массива данных для Kinect, остается 32-битным массивом, что приводит к тому, что все изображение становится 32-битным. Это все еще не так вероятно, хотя возможно.

Я застрял на этом некоторое время, поэтому любые предложения будут действительно полезны. Большое спасибо!

РЕДАКТИРОВАТЬ - Я думаю, что я понял это - некоторые вещи, которые я изначально не понимал в Эмгу. Я скоро опубликую код решения, если кому-то все-таки придется посмотреть на это.

...