主題

【Unity + OpenCV (c++)】用臉移動物件,Unity C#使用指標與C++的溝通方法(unsafe/fixed)

給你加油 %%鼠 | 2021-12-21 16:45:09 | 巴幣 1320 | 人氣 429


成果:

前言:
覺得上篇自己摸索的有很多地方都做得不太好。


extern 方法定義
編譯器在產生dll檔案時會打亂method名稱,為讓方法保持原名稱,則extern "C"。
(原:)Normally, the C++ compiler will mangle the method names when packaging them into a .dll. Therefore, we instruct it to use the classic “C” style of signatures, which leaves the method names just as you wrote them.
範例
extern "C" int __declspec(dllexport) __stdcall  Init()


宣告C++與C#互相溝通用的資料結構
注意變數宣告順序、型態要一致。

  • CascadeClassifier :做檢測的分類器。 特徵演算法有Haar和LBP。()(lbp明顯快於haar格式,但較不準確。)
  • StructLayout:  定義對齊位元,例char型資料,對齊值為1,對於short型為2,對於int,float,double型別,其對齊值為4,單位位元組。 ()


初始化鏡頭大小
鏡頭大小的變數使用傳址呼叫,讓c++開啟鏡頭後順便設定好大小。使C#和c++使用相同的變數。



傳遞參數
scale用作壓縮大小的係數


辨識人臉
影像處理步驟:灰階→縮小解析度→直方圖均衡化→偵測


直方圖均衡化(equalizeHist):
將拉伸數值分佈範圍從0-255。假設影像過曝(如藍色曲線),則直方圖均衡化能將其值範圍拉伸0-255區間內,使黑白更分明。

人臉偵測 (detectMultiScale)
大概意思是Haar cascade的工作原理是一種"滑動視窗"的方法,通過在圖像中不斷的"滑動檢測視窗"來匹配人臉。
因為圖像的圖元有大有小,圖像中的人臉因為遠近不同也會有大有小,所以需要通過scaleFactor參數設置一個縮小的比例,對圖像進行逐步縮小來檢測,這個參數設置的越大,計算速度越快,但可能會錯過了某個大小的人臉。
其實可以根據圖像的圖元值來設置此參數,圖元大縮小的速度就可以快一點,通常在1~1.5之間。
那麼,經過多次的反覆運算,實際會檢測出很多很多個人臉,這一點可以通過把minNeighbors 設為0來驗證。
所以呢,minNeighbors參數的作用就來了,只有其"鄰居"大於等於這個值的結果才認為是正確結果。
方法:
CascadeClassifier.detectMultiScale(輸入圖片, 輸出向量, scaleFactor=1.1 , minNeighbor=3);
  • 輸入圖片: 只接受灰階
  • scaleFactor:每次圖像縮小的比例。
  • minNeighbor:每個候選矩形有多少個"鄰居",我的理解是:一個滑動窗口中的圖元需要符合幾個條件才能判斷為真。
  • 返回Rect 型態,其包含<x,y,w,h>參數


Unsafe 和 Fixed 用法
在fixed區塊中,傳入結果陣列的指標(指向該陣列第一個元素),c++端會直接將變數寫入CvCircle結構陣列中,而省去copy的成本。
  • unsafe:讓你在C#能使用指標。
  • fixed:使編譯器讓該變數記憶體位置不被garbage collector處理掉。

注意fixed中只接受:
  • The address operator & applied to a variable reference.
  • An array
  • A string
  • A fixed-size buffer.


後記:晚點寫Haar和lbp筆記。
送禮物贊助創作者 !
0
留言

創作回應

樂小呈
我彷彿看到那個廣告會追著臉跑的未來[e21]
2021-12-21 17:28:54
給你加油 %%鼠
SAO畫面上有一半都是廣告
2021-12-22 20:57:13
給你加油 %%鼠
XD
2021-12-22 20:57:22
追蹤 創作集

作者相關創作

相關創作

更多創作