(C#)本操作说明将介绍如何将图像从堡盟GAPI帧缓冲区传输至OpenCV,以便进一步处理。
首先,使用堡盟GAPI SDK设置堡盟相机,并将图像采集到内存,然后将内存中的图像传输至OpenCV,以便将其保存到硬盘上。图像传输到OpenCV后,即可根据需要使用该视觉库进一步处理图像。
将堡盟GAPI缓冲区克隆、复制并转换为OpenCV矩阵
如需获取堡盟GAPI缓冲区中数据的副本,可以使用OpenCV的Clone()、Copy()或ConvertTo()函数。复制后,可以重新对堡盟GAPI缓冲区进行排序,复制的数据也可以通过OpenCV进一步处理。
请注意,OpenCV矩阵中的信息包括图像的宽度、高度和类型(CV_8UC1、CV_8UC3、CV_16UC1、CV_16UC3),而堡盟GAPI缓冲区提供Buffer.FrameID、Buffer.PixelFormat、Buffer.XOffset、Buffer.YOffset以及数据块数据等更多有用的信息。如有必要,您还需复制如下信息。
mDevice.RemoteNodeList["PixelFormat"].Value = "Mono8"; BGAPI2.Buffer mBufferFilled = mDataStream.GetFilledBuffer(1000); if (mBufferFilled.PixelFormat == "Mono8") { Emgu.CV.Mat imOriginal = new Emgu.CV.Mat((int)mBufferFilled.Height, (int)mBufferFilled.Width, Emgu.CV.CvEnum.DepthType.Cv8U, 1, (IntPtr)mBufferFilled.MemPtr, (int)mBufferFilled.Width * 1); //3 methods to copy Emgu.CV.Mat imClone = imOriginal.Clone(); Emgu.CV.Mat imCopy = new Emgu.CV.Mat((int)mBufferFilled.Height, (int)mBufferFilled.Width, Emgu.CV.CvEnum.DepthType.Cv8U, 1); imOriginal.CopyTo(imCopy); Emgu.CV.Mat imConvert = new Emgu.CV.Mat((int)mBufferFilled.Height, (int)mBufferFilled.Width, Emgu.CV.CvEnum.DepthType.Cv8U, 1); imOriginal.ConvertTo(imConvert, Emgu.CV.CvEnum.DepthType.Cv8U, 1.0); mBufferFilled.QueueBuffer(); //use copied image Emgu.CV.CvInvoke.Imwrite("cv_image_Clone.png", imClone); Emgu.CV.CvInvoke.Imwrite("cv_image_Copy.png", imCopy); Emgu.CV.CvInvoke.Imwrite("cv_image_Convert.png", imConvert); }
注意:这是Baumer SDK和EmguCV的C#的图像数据转换