【C#】人臉識別 調用2.0的arcface

記錄下使用虹軟技術的過程中的問題

1.初始化
[DllImport("libarcsoft_face_engine.dll", EntryPoint = "ASFInitEngine", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern int ASFInitEngine(uint detectMode, int orientPriority, int scale, int maxFaceNumber, uint combinedMask, out IntPtr pEngine);
開始時,寫了個long detectMode,返回錯誤信息是:0x16004,(detectFaceScaleVal 不支持)正式鬼扯,害我各種調整scale。
改成uint就ok了。
話說就一個mode,您弄
const uint ASF_DETECT_MODE_VIDEO = 0x00000000; //Video模式,一般用於多幀連續檢測
const uint ASF_DETECT_MODE_IMAGE = 0xFFFFFFFF; //Image模式,一般用於靜態圖的單次檢測

這兩寶貝,我也是醉了。0/1不行嗎?

2.人臉檢測
[DllImport("libarcsoft_face_engine.dll", EntryPoint = "ASFDetectFaces", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern int ASFDetectFaces(IntPtr pEngine, int width, int height, int format, IntPtr pImageData, out ASF_MultiFaceInfo faceInfo);

開始時,弄了張身份證照片,102的寬度,不是4的倍數,返回0x1600F,手動編輯圖片,拉伸成104的寬度便告成功。
最終寫了個方法,自動設成4的倍數,如下:

private (int W, int H, IntPtr PImageData) GetImageData(Bitmap bitmap)
    {

        var bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
        int width = (bitmap.Width + 3) / 4 * 4;

        var bytesCount = bmpData.Height * width * 3;
        IntPtr pImageData = Marshal.AllocCoTaskMem(bytesCount);
        if (width == bitmap.Width)
            CopyMemory(pImageData, bmpData.Scan0, bytesCount);
        else
            for (int i = 0; i < bitmap.Height; i++)
                CopyMemory(IntPtr.Add(pImageData, i * width * 3), IntPtr.Add(bmpData.Scan0, i * bmpData.Stride), bmpData.Stride);
        bitmap.UnlockBits(bmpData);
        return new ValueTuple<int, int, IntPtr>(width, bitmap.Height, pImageData);
    }

踩了這兩個坑後,便愉快的運行了。

話說2.0的優點也不少:
1.特徵值縮小了,由原來的20多K變成1032字節(咱就不能變成1024?)
2.比對速度快了很多很多,四線程10萬次的比對也只要3秒多鍾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章