主頁 > .NET開發 > unity接入實作人臉識別應用-基于虹軟人臉識別演算法4.0

unity接入實作人臉識別應用-基于虹軟人臉識別演算法4.0

2021-04-03 06:03:23 .NET開發

一、準備作業

1、下載虹軟人臉識別增值版SDK 4.0

1)注冊并登錄開發者中心

訪問https://www.arcsoft.com.cn/登錄后創建新應用并添加SDK

2)下載虹軟人臉識別SDK

點擊上圖中V4.0版本的下載箭頭可以下載SDK

2、安裝Unity3D及Visual Studio 2019開發環境

1)安裝Unity Hub

訪問https://unity.cn/并下載安裝Unity Hub

2)安裝Unity 2020.3.1f1c1

Unity Hub安裝完成后打開,依據下圖內容安裝Unity 2020.3.1f1c1,注意:勾選Visual Studio可以下載VS開發環境!

二、創建DEMO工程

1、創建Unity工程

Unity Hub-》專案-》新建-》創建即可完成unity工程的創建

2、引入虹軟人臉識別SDK

下載完成虹軟人臉識別SDK后解壓-》lib-》X64即可看到libarcsoft_face.dll和libarcsoft_face_engine.dll兩個動態庫檔案

注意:在unity工程的下圖中紅色箭頭標注,32位和64位的Arcface SDK需要分別勾選x86和x64,libarcsoft_face.dll和libarcsoft_face_engine.dll兩個檔案都需要此操作!

 

 

3、專案工程目錄說明

下圖中1、2部分取自官網的VS表單Demo,3部分取自虹軟人臉識別SDK,4部分是在VS表單Demo的基礎上進行修改的類,

三、運行除錯程式

1、虹軟人臉識別SDK在線激活

2、可以進行人臉識別

四、核心代碼說明

1、關于System.Drawing.dll缺失的問題說明

注意:如果代碼中只引入libarcsoft_face.dll和libarcsoft_face_engine.dll會報錯System.Drawing.dll檔案丟失

可以在unity的安裝目錄~\2020.3.1f1c1\Editor\Data\MonoBleedingEdge\lib\mono\4.7.1-api\下找到該檔案并復制進入工程內

2、關于Unity中使用選擇.NET版本的說明

在unity工程的player設定中選擇Scripting Backend位Mono,Api Compatibility Level*為.NET 4.x

3、人臉識別核心代碼分析

1)攝像頭初始化  WebCamTexture.devices

 1 public RawImage rawimage;
 2     WebCamTexture webCamTexture;
 3 
 4     public Text webCamDisplayText;
 5 
 6     void Start()
 7     {
 8         WebCamDevice[] cam_devices = WebCamTexture.devices;
 9         // for debugging purposes, prints available devices to the console
10         for (int i = 0; i < cam_devices.Length; i++)
11         {
12             print("Webcam available: " + cam_devices[i].name);
13         }
14 
15         GoWebCam01();
16 
17         InitEngines();
18 
19         btnStartVideo_Click(new object(), new EventArgs());
20     }
21 
22     //CAMERA 01 SELECT
23     public void GoWebCam01()
24     {
25         WebCamDevice[] cam_devices = WebCamTexture.devices;
26         // for debugging purposes, prints available devices to the console
27         for (int i = 0; i < cam_devices.Length; i++)
28         {
29             print("Webcam available: " + cam_devices[i].name);
30         }
31 
32         webCamTexture = new WebCamTexture(cam_devices[0].name, 1280, 720, 30);
33         rawimage.texture = webCamTexture;
34         if (webCamTexture != null)
35         {
36             //webCamTexture.Play();
37             Debug.Log("Web Cam Connected : " + webCamTexture.deviceName + "\n");
38         }
39         webCamDisplayText.text = "Camera Type: " + cam_devices[0].name.ToString();
40     }

2)圖片格式轉換 Texture2D to Image

 1     public static Image Texture2Image(Texture2D texture)
 2     {
 3         if (texture == null)
 4         {
 5             return null;
 6         }
 7         //Save the texture to the stream.
 8         byte[] bytes = texture.EncodeToPNG();
 9 
10         //Memory stream to store the bitmap data.
11         MemoryStream ms = new MemoryStream(bytes);
12 
13         //Seek the beginning of the stream.
14         ms.Seek(0, SeekOrigin.Begin);
15 
16         //Create an image from a stream.
17         Image bmp2 = Bitmap.FromStream(ms);
18 
19         //Close the stream, we nolonger need it.
20         ms.Close();
21         ms = null;
22 
23         return bmp2;
24     }

 3)初始化人臉識別庫

注意:此代碼片段中appId sdkKey64 sdkKey32 activeKey64 activeKey32的值需要根據虹軟開發者中心的實際數值進行填寫
  1 private void InitEngines()
  2     {
  3         try
  4         {
  5             webCamDisplayText.text += "測驗";
  6 
  7             //讀取組態檔
  8             //AppSettingsReader reader = new AppSettingsReader();
  9             //rgbCameraIndex = (int)reader.GetValue("RGB_CAMERA_INDEX", typeof(int));
 10             //irCameraIndex = (int)reader.GetValue("IR_CAMERA_INDEX", typeof(int));
 11             //frMatchTime = (int)reader.GetValue("FR_MATCH_TIME", typeof(int));
 12             //liveMatchTime = (int)reader.GetValue("LIVENESS_MATCH_TIME", typeof(int));
 13 
 14             AppSettingsReader reader = new AppSettingsReader();
 15             rgbCameraIndex = 0;
 16             irCameraIndex = 1;
 17             frMatchTime = 20;
 18             liveMatchTime = 20;
 19 
 20             int retCode = 0;
 21             bool isOnlineActive = true;//true(在線激活) or false(離線激活)
 22             try
 23             {
 24                 if (isOnlineActive)
 25                 {
 26                     #region 讀取在線激活配置資訊
 27                     //string appId = (string)reader.GetValue("APPID", typeof(string));
 28                     //string sdkKey64 = (string)reader.GetValue("SDKKEY64", typeof(string));
 29                     //string sdkKey32 = (string)reader.GetValue("SDKKEY32", typeof(string));
 30                     //string activeKey64 = (string)reader.GetValue("ACTIVEKEY64", typeof(string));
 31                     //string activeKey32 = (string)reader.GetValue("ACTIVEKEY32", typeof(string));
 32 
 33                     string appId = "";
 34                     string sdkKey64 = "";
 35                     string sdkKey32 = "";
 36                     string activeKey64 = "";
 37                     string activeKey32 = "";
 38 
 39                     webCamDisplayText.text += "111111";
 40 
 41                     //判斷CPU位數
 42                     var is64CPU = Environment.Is64BitProcess;
 43                     if (string.IsNullOrWhiteSpace(appId) || string.IsNullOrWhiteSpace(is64CPU ? sdkKey64 : sdkKey32) || string.IsNullOrWhiteSpace(is64CPU ? activeKey64 : activeKey32))
 44                     {
 45                         Debug.LogError(string.Format("請在App.config組態檔中先配置APP_ID和SDKKEY{0}、ACTIVEKEY{0}!", is64CPU ? "64" : "32"));
 46                         //MessageBox.Show(string.Format("請在App.config組態檔中先配置APP_ID和SDKKEY{0}、ACTIVEKEY{0}!", is64CPU ? "64" : "32"));
 47 
 48                         //System.Environment.Exit(0);
 49                         Quit();
 50                     }
 51                     #endregion
 52 
 53                     webCamDisplayText.text += "準備激活";
 54 
 55                     //在線激活引擎    如出現錯誤,1.請先確認從官網下載的sdk庫已放到對應的bin中,2.當前選擇的CPU為x86或者x64
 56                     retCode = imageEngine.ASFOnlineActivation(appId, is64CPU ? sdkKey64 : sdkKey32, is64CPU ? activeKey64 : activeKey32);
 57 
 58                     webCamDisplayText.text += "激活完成";
 59                 }
 60                 else
 61                 {
 62                     #region 讀取離線激活配置資訊
 63                     string offlineActiveFilePath = (string)reader.GetValue("OfflineActiveFilePath", typeof(string));
 64                     if (string.IsNullOrWhiteSpace(offlineActiveFilePath) || !File.Exists(offlineActiveFilePath))
 65                     {
 66                         string deviceInfo;
 67                         retCode = imageEngine.ASFGetActiveDeviceInfo(out deviceInfo);
 68                         if (retCode != 0)
 69                         {
 70                             Debug.LogError("獲取設備資訊失敗,錯誤碼:" + retCode);
 71                             //MessageBox.Show("獲取設備資訊失敗,錯誤碼:" + retCode);
 72                         }
 73                         else
 74                         {
 75                             File.WriteAllText("ActiveDeviceInfo.txt", deviceInfo);
 76                             Debug.LogError("獲取設備資訊成功,已保存到運行根目錄ActiveDeviceInfo.txt檔案,請在官網執行離線激活操作,將生成的離線授權檔案路徑在App.config里配置后再重新運行");
 77                             //MessageBox.Show("獲取設備資訊成功,已保存到運行根目錄ActiveDeviceInfo.txt檔案,請在官網執行離線激活操作,將生成的離線授權檔案路徑在App.config里配置后再重新運行");
 78                         }
 79                         //System.Environment.Exit(0);
 80                         Quit();
 81                     }
 82                     #endregion
 83                     //離線激活
 84                     retCode = imageEngine.ASFOfflineActivation(offlineActiveFilePath);
 85                 }
 86                 if (retCode != 0 && retCode != 90114)
 87                 {
 88                     Debug.LogError("激活SDK失敗,錯誤碼:" + retCode);
 89                     //MessageBox.Show("激活SDK失敗,錯誤碼:" + retCode);
 90                     //System.Environment.Exit(0);
 91                     Quit();
 92                 }
 93 
 94                 webCamDisplayText.text += retCode.ToString();
 95             }
 96             catch (Exception ex)
 97             {
 98                 if (ex.Message.Contains("無法加載 DLL"))
 99                 {
100                     Debug.LogError("請將SDK相關DLL放入bin對應的x86或x64下的檔案夾中!");
101                     //MessageBox.Show("請將SDK相關DLL放入bin對應的x86或x64下的檔案夾中!");
102                 }
103                 else
104                 {
105                     Debug.LogError("激活SDK失敗,請先檢查依賴環境及SDK的平臺、版本是否正確!");
106                     //MessageBox.Show("激活SDK失敗,請先檢查依賴環境及SDK的平臺、版本是否正確!");
107                 }
108                 //System.Environment.Exit(0);
109                 Quit();
110             }
111 
112             //初始化引擎
113             DetectionMode detectMode = DetectionMode.ASF_DETECT_MODE_IMAGE;
114             //Video模式下檢測臉部的角度優先值
115             ASF_OrientPriority videoDetectFaceOrientPriority = ASF_OrientPriority.ASF_OP_ALL_OUT;
116             //Image模式下檢測臉部的角度優先值
117             ASF_OrientPriority imageDetectFaceOrientPriority = ASF_OrientPriority.ASF_OP_ALL_OUT;
118             //最大需要檢測的人臉個數
119             int detectFaceMaxNum = 6;
120             //引擎初始化時需要初始化的檢測功能組合
121             int combinedMask = FaceEngineMask.ASF_FACE_DETECT | FaceEngineMask.ASF_FACERECOGNITION | FaceEngineMask.ASF_AGE | FaceEngineMask.ASF_GENDER | FaceEngineMask.ASF_FACE3DANGLE | FaceEngineMask.ASF_IMAGEQUALITY | FaceEngineMask.ASF_MASKDETECT;
122             //初始化引擎,正常值為0,其他回傳值請參考http://ai.arcsoft.com.cn/bbs/forum.php?mod=viewthread&tid=19&_dsign=dbad527e
123             retCode = imageEngine.ASFInitEngine(detectMode, imageDetectFaceOrientPriority, detectFaceMaxNum, combinedMask);
124             Console.WriteLine("InitEngine Result:" + retCode);
125             AppendText((retCode == 0) ? "圖片引擎初始化成功!" : string.Format("圖片引擎初始化失敗!錯誤碼為:{0}", retCode));
126             if (retCode != 0)
127             {
128                 //禁用相關功能按鈕
129                 //ControlsEnable(false, chooseMultiImgBtn, matchBtn, btnClearFaceList, chooseImgBtn);
130             }
131 
132             //初始化視頻模式下人臉檢測引擎
133             DetectionMode detectModeVideo = DetectionMode.ASF_DETECT_MODE_VIDEO;
134             int combinedMaskVideo = FaceEngineMask.ASF_FACE_DETECT | FaceEngineMask.ASF_FACERECOGNITION | FaceEngineMask.ASF_FACELANDMARK;
135             retCode = videoEngine.ASFInitEngine(detectModeVideo, videoDetectFaceOrientPriority, detectFaceMaxNum, combinedMaskVideo);
136             AppendText((retCode == 0) ? "視頻引擎初始化成功!" : string.Format("視頻引擎初始化失敗!錯誤碼為:{0}", retCode));
137             if (retCode != 0)
138             {
139                 //禁用相關功能按鈕
140                 //ControlsEnable(false, chooseMultiImgBtn, matchBtn, btnClearFaceList, chooseImgBtn);
141             }
142 
143             //RGB視頻專用FR引擎
144             combinedMask = FaceEngineMask.ASF_FACE_DETECT | FaceEngineMask.ASF_FACERECOGNITION | FaceEngineMask.ASF_LIVENESS | FaceEngineMask.ASF_MASKDETECT;
145             retCode = videoRGBImageEngine.ASFInitEngine(detectMode, videoDetectFaceOrientPriority, detectFaceMaxNum, combinedMask);
146             AppendText((retCode == 0) ? "RGB處理引擎初始化成功!" : string.Format("RGB處理引擎初始化失敗!錯誤碼為:{0}", retCode));
147             if (retCode != 0)
148             {
149                 //禁用相關功能按鈕
150                 //ControlsEnable(false, chooseMultiImgBtn, matchBtn, btnClearFaceList, chooseImgBtn);
151             }
152             //設定活體閾值
153             videoRGBImageEngine.ASFSetLivenessParam(thresholdRgb);
154 
155             //IR視頻專用FR引擎
156             combinedMask = FaceEngineMask.ASF_FACE_DETECT | FaceEngineMask.ASF_FACERECOGNITION | FaceEngineMask.ASF_IR_LIVENESS;
157             retCode = videoIRImageEngine.ASFInitEngine(detectModeVideo, videoDetectFaceOrientPriority, detectFaceMaxNum, combinedMask);
158             AppendText((retCode == 0) ? "IR處理引擎初始化成功!\r\n" : string.Format("IR處理引擎初始化失敗!錯誤碼為:{0}\r\n", retCode));
159             if (retCode != 0)
160             {
161                 //禁用相關功能按鈕
162                 //ControlsEnable(false, chooseMultiImgBtn, matchBtn, btnClearFaceList, chooseImgBtn);
163             }
164             //設定活體閾值
165             videoIRImageEngine.ASFSetLivenessParam(thresholdRgb, thresholdIr);
166 
167             initVideo();
168         }
169         catch (Exception ex)
170         {
171             LogUtil.LogInfo(GetType(), ex);
172             Debug.LogError("程式初始化例外,請在App.config中修改日志配置,根據日志查找原因!");
173             //MessageBox.Show("程式初始化例外,請在App.config中修改日志配置,根據日志查找原因!");
174 
175             Quit();
176             //System.Environment.Exit(0);
177         }
178     }

五、DEMO原始碼下載

鏈接:https://pan.baidu.com/s/1FXs94jbAEseoERpVDzysFA
提取碼:iabc
復制這段內容后打開百度網盤手機App,操作更方便哦

 

注意:DEMO工程只是實作了攝像頭初始化、采集圖片格式轉換、虹軟人臉在線注冊和人臉特征值實時提取等功能,在使用圖片進行人臉注冊功能時會報錯,未解決!

提供思路:可以將人臉注冊的功能單獨提取并將特征值存入資料庫,然后從unity中讀取特征值進行人臉資料的比對,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/271798.html

標籤:C#

上一篇:C#中的MySqlHelper工具類及使用方法

下一篇:abp加DDD開發:低耦合、可復用、可擴展的【工單】業務模塊-簡介和集成

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more