【发布时间】:2018-09-29 07:21:54
【问题描述】:
在这种情况下,ShapePredictor 的灰度 Array2D。
这是我正在尝试的,但没有太大成功。
using DlibDotNet;
using Rectangle = System.Drawing.Rectangle;
using System.Runtime.InteropServices;
public static class Extension
{
public static Array2D<byte> ToArray2D(this Bitmap bitmap)
{
var bits = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppPArgb);
var length = bits.Stride * bits.Height;
var data = new byte[length];
Marshal.Copy(bits.Scan0, data, 0, length);
bitmap.UnlockBits(bits);
var array = new Array2D<byte>(bitmap.Width, bitmap.Height);
for (var x = 0; x < bitmap.Width; x++)
for (var y = 0; y < bitmap.Height; y++)
{
var offset = x * 4 + y * bitmap.Width * 4;
array[x][y] = data[offset];
}
return array;
}
我已经搜索过,但还没有找到明确的答案。
【问题讨论】:
-
您正在以 32bpp 的速度访问数据,但试图将其放入
Byte的 Array2D 中。您可能需要Aray2D<Int32>,并且每 4 个字节读取一次。 -
请注意,出于同样的原因,我正在使用偏移量
offset = x * 4 + y * bitmap.Width。 -
是的,但是如果您的二维数组的每个条目中只有一个字节,您的返回类型是否错误?对于 32bpp 像素,您需要完整的
Int32(可能是UInt32)。我不知道ShapePredictor,所以不知道它期望什么样的数据,但是你不能把四个字节的数据放在一个字节中。 -
返回类型没问题。 ShapePredictor 适用于灰度(8 位)。从文件加载的
Array2D<byte> array = Dlib.LoadPng<byte>("file.png")按预期工作,但我真正需要的是能够将位图转换为 Array2D,以便我可以处理已加载到内存中的数据。 -
您需要的不止这些。您还需要代码来实际将您的图像转换为灰度。您的代码中没有这样的东西;您正在以 32bpp alpha 的 1600 万色数据的形式访问它。这种转换最好在之前作为字节访问它。