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