如何在没有 I/O 的情况下从字节数组保存数据时使用 dlib 人脸检测?
Posted
技术标签:
【中文标题】如何在没有 I/O 的情况下从字节数组保存数据时使用 dlib 人脸检测?【英文标题】:How can I use dlib face detection without I/O on data saveload from byte array? 【发布时间】:2020-01-09 06:24:29 【问题描述】:我做过人脸检测代码:
var bytes = Convert.FromBase64String(image);
File.WriteAllBytes("testin.jpg", bytes);
var dmgreal = Dlib.LoadImage<RgbPixel>("testin.jpg");
using (var fd = Dlib.GetFrontalFaceDetector())
var faces = fd.Operator(dmgreal);
foreach (var face in faces)
Dlib.DrawRectangle(dmgreal, face, color: new RgbPixel(0, 255, 255), thickness: 4);
Dlib.SaveJpeg(dmgreal, "testout.jpg");
var imageArray = File.ReadAllBytes("testout.jpg");
var nImage = Convert.ToBase64String(imageArray, 0, imageArray.Length);
CoordStreamHub.WorkItem = "data:image/jpg;base64," + nImage;
但我想通过删除 IO 部分来加快速度:
File.WriteAllBytes("testin.jpg", bytes);
var dmgreal = Dlib.LoadImage<RgbPixel>("testin.jpg");
Dlib.SaveJpeg(dmgreal, "testout.jpg");
var imageArray = File.ReadAllBytes("testout.jpg");
我尝试使用 LoadImageData、Bitmap.ToArray2D、ToBytes 和其他选项,但是程序没有检测到人脸或没有得到我真正的字节。我应该如何使用它来获得正确的结果?
【问题讨论】:
【参考方案1】://var img = Dlib.LoadImage<RgbPixel>(inputFilePath);
Bitmap bitmap = (Bitmap)Bitmap.FromFile(inputFilePath);
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height);
System.Drawing.Imaging.BitmapData data = bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bitmap.PixelFormat);
var array = new byte[data.Stride * data.Height];
Marshal.Copy(data.Scan0, array, 0, array.Length);
Array2D<BgrPixel> img = Dlib.LoadImageData<BgrPixel>(array, (uint)bitmap.Height, (uint)bitmap.Width, (uint)data.Stride);
【讨论】:
以上是关于如何在没有 I/O 的情况下从字节数组保存数据时使用 dlib 人脸检测?的主要内容,如果未能解决你的问题,请参考以下文章
JSON.NET:如何在没有数组的情况下从DataTable对象中仅序列化一行?