如何在没有 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 人脸检测?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不引用文件的情况下从图像中获取字节数据

如何在没有任何循环php的情况下从数组中随机获取项目

VB如何读取一个图片,保存到字节数组中

JSON.NET:如何在没有数组的情况下从DataTable对象中仅序列化一行?

如何在不写入输出流的情况下从 ZipInputStream 获取每个 ZipFile 条目的字节/内容?

如何在不重新保存的情况下从 iCloud 下载图像?