我正在使用新版本的 facetracker,它提供了一些我用来编写 dll 文件的头文件。此文件稍后用于 Unity 3D。因为我的 Unity 版本只能与 c# 一起使用,所以我必须编写一个 Wrapper,这就是麻烦的开始。我不知道为什么来自 facetracker 的公司决定更改某些功能,使其与以前的版本一样使用起来更加复杂。
以下是来自 c++ 标头的一个特定函数的声明:
virtual bool SetFromRawBuffer(const unsigned char * rawImageData, Format format, int width, int height, Origin origin) = 0;
cpp文件:
C_API bool IImage_SetFromRawBuffer(IImage *pObj, const unsigned char* rawImageData, IImage::Format format, int width, int height, IImage::Origin origin) {
if(pObj) {
return pObj->SetFromRawBuffer(rawImageData, format, width, height, origin);
}
return false;
}
c#:(因为我不知道如何处理枚举,所以我只是将它们从原始标题复制到我自己的 enumeration.cs 中。)
[DllImport(@"C:\Users\mad1Z\Desktop\LiveDriverNativeWrapper NEW\LiveDriveNativeWrapper_packed\Release\LiveDriverNativeWrapper.dll")]
static private extern bool IImage_SetFromRawBuffer(IntPtr pObj, byte[] data, Enumerations.Format format, int width, int height, Enumerations.Origin origin);
定义c#:
public bool SetFromRawBuffer(byte[] data, Enumerations.Format format, int width, int height, Enumerations.Origin picorigin)
{
return IImage_SetFromRawBuffer(m_pObj, data, format, width, height, picorigin);
}
这是使 Unity 3D 崩溃的函数调用:
if (inputFrame.SetFromRawBuffer(data, Enumerations.Format.BGRX8888, 640, 480, Enumerations.Origin.TopLeft))
我也不确定我是否使用了正确的格式。我只是从我的网络摄像头获取图像数据并将其存储在缓冲区(数据)中,然后将其发送到 FaceTracker。
这里是原始头文件中的格式定义:
/// @brief Each member of the following Format enum represents the order the channels
/// are encountered as one walks the memory, byte by byte, from lower to higher addresses.
///
/// So for example, RGBX8888 means that walking the memory byte by byte from lower to higher addresses,
/// one would expect to encounter R first, G next, and B and X afterwards. Equivalently, on little endian
/// machines, if the data is read in word-sized chunks, one would expect to find R in bits 0-7, B in 8-15,
/// G in 16-23, and X in 24-31.
///
/// Often you will see documentation stating that images are RGB. On Windows, however, these are actually laid
/// out in memory as BGR. For instance Windows bitmap BI_RGB format actually has data laid out as BGR in memory.
/// Similarly, in DirectShow, when the webcam format is RGB, the data is laid out BGR.
///
/// Finally, BGRX8888 is the preferred format performance-wise, as all code paths are heavily optimized internally
/// with that layout in mind. For best performance, prefer to provide images in BGRX8888 over other supported formats.
/// @if LIVE_DRIVER_SDK_FACEPAINT
/// In addition, all face painting operations happen on BGRX888 data. Therefore, the image returned to you in
/// IOutputFrameFacePaint::GetFacePaintImage will be in BGRX888 format.
/// @endif
enum Format
{
// RGB formats
BGRX8888,
RGBX8888,
BGR888,
RGB888,
// Grayscale formats
Intensity8,
// YUV 4:2:2 formats
YUV_UYVY, // YUV_Y422, YUV_UYNV
YUV_YUY2, // YUV_YUYV, YUV_YUNV
YUV_YVYU,
// YUV 4:2:0 formats
YUV_NV12,
YUV_NV21, // YUV_420sp
YUV_YV12, // YUV_420p
YUV_IYUV, // YUV_I420
FormatCount,
FORMATERROR = 0
};
如果您需要更多信息,请告诉我。