# 智動擬真標記式AR引擎 技術文件 Document
###### tags: `畢業專題`
程式庫:https://github.com/54bp6cl6/SmartAutoAR
使用教學 Tutorial:https://hackmd.io/MzwI6hvPRUKN1vdY6TrseA
技術文件 Document:https://hackmd.io/8NsHfsW2QfqYN-4aqOfTlg
撰文:鄭人豪 - 2020 / 11 / 8
## 目錄
* [ArWorkflow 類別](#ArWorkflow類別)
* [ColorCalculation 類別](#ColorCalculation類別)
* [ColorHarmonization 類別](#ColorHarmonization類別)
* [LightSourceTracker 類別](#LightSourceTracker類別)
* Marker 類別
* MarkerDetector 類別
* MarkerTrackingInfo 類別
* Scene 類別
* [InputSource 命名空間](#InputSource命名空間)
* [IInputSource 介面](#IInputSource介面)
* [ImageSource 類別](#ImageSource類別)
* [VideoSource 類別](#VideoSource類別)
* [StreamSource 類別](#StreamSource類別)
* V[irtualObject 命名空間](#VirtualObject命名空間)
* [Model 類別](#Model類別)
* Background 類別
* Base 命名空間
* Material 類別
* Mesh 類別
* Shader 類別
* Texture 類別
* Vertex 類別
* Cameras 命名空間
* ICamera 介面
* ArCamera 類別
* [Lights 命名空間](#VirtualObject.Lights命名空間)
* [ILight 介面](#ILight介面)
* [AmbientLight 類別](#AmbientLight類別)
* [PointLight 類別](#PointLight類別)
* [DirectionalLight 類別](#DirectionalLight類別)
-------------------------------------------------------
## SmartAutoAR命名空間
### ArWorkflow類別
整合各種功能,能夠快速製作AR的類別。
| 名稱 | 型別 | 說明 |
| - | - | - |
| InputSource | IInputSource | 取得輸入影像的來源 |
| MarkerPairs | Dictionary<Bitmap, Scene> | 紀錄 Marker 與虛擬場景的對應關係 |
| EnableLightTracking | bool | 是否啟用光源追蹤 |
| EnableColorHarmonizing | bool | 是否啟用色彩調和 |
| WindowAspectRatio | float | 取得輸出影像的長寬比 |
| ArWorkflow(IInputSource) | Constructor | 以指定的影像輸入物件初始化物件 |
| ClearState() | void | 清除用於優化下一幀的暫存資料,於重播影片、切換輸入來源前使用|
| TrainMarkers() | void | 使 MarkerPairs 的設定生效 |
| Show() | void | 於目前綁定的 OpenGL Context 上渲染 AR 畫面 |
### ColorCalculation類別
提供影像色彩處理功能的類別。
| 名稱 | 型別 | 說明 |
| - | - | - |
| GetLabChennel(Mat) | Mat[] | 將 RGB 影像轉為 L、a、b 三個頻道(Chennel) |
### ColorHarmonization類別
透過深度學習,提供對影像做色彩調合的功能。
| 名稱 | 型別 | 說明 |
| - | - | - |
| IsDisposed | bool | 指出神經網路資源是否已經釋放 |
| FirstForward(string) | void | 使用指定路徑的圖片,預先使模型進行第一次運算,以加速未來的運算速度 |
| InputImgProcess(Mat) | Mat | 將指定的影像資料轉為適合模型的輸入 |
| MaskImgProcess(Mat) | Mat | 將虛擬物體遮罩處理為適合模型輸入的格式 |
| NetForwardProcess(Mat, Mat) | Mat | 進行模型前向傳播 |
| OutputImgProcess(Mat, int, int) | Mat | 將模型的輸出處理為影像資料 |
| Dispose | void | 釋放物件相關之記憶體 |
### LightSourceTracker類別
提供光源追蹤功能的類別。
| 名稱 | 型別 | 說明 |
| - | - | - |
| PredictLightSource(Mat, MarkerTrackingInfo) | ILight[] | 根據 MarkerTrackingInfo 中的 Marker 偵測結果,計算與真實環境類似的模擬光源 |
-------------------------------------------------------
## InputSource命名空間
### IInputSource介面
描述影像來源的統一行為與屬性。
| 名稱 | 型別 | 說明 |
| - | - | - |
| LastFrame | Bitmap | 取得的最後一張影像 |
| OutputWidth | int | 目前影像的寬度 |
| OutputHeight | int | 目前影像的高度 |
| AspectRatio | float | 目前影像的長寬比 |
| GetNextFrame() | Bitmap | 呼叫物件取得新影像 |
### ImageSource類別
實作 [IInputSource](#IInputSource介面) 介面,用於取得圖片輸入的類別。
| 名稱 | 型別 | 說明 |
| - | - | - |
| ImageSource(Bitmap) | Constructor | 將指定的Bitmap作為影像輸入來源 |
| ImageSource(string) | Constructor | 將指定路徑的圖片檔案作為影像輸入來源 |
### VideoSource類別
實作 [IInputSource](#IInputSource介面) 介面,用於取得影片輸入的類別。
| 名稱 | 型別 | 說明 |
| - | - | - |
| EndOfVideo | bool | 指出影片是否已撥放至結尾 |
| VideoSource(string) | Constructor | 將指定路徑的影片檔案作為影像輸入來源 |
| Replay() | void | 重新讀取影片,下一次呼叫 GetNextFrame() 時將返回第一幀影像|
### StreamSource類別
實作 [IInputSource](#IInputSource介面) 介面,用於取得鏡頭串流的類別。
| 名稱 | 型別 | 說明 |
| - | - | - |
| StreamSource(int) | Constructor | 接收指定鏡頭編號的串流影像作為輸入來源 |
-------------------------------------------------------
## VirtualObject命名空間
### Model類別
儲存模型的各項資料,並提供匯入、縮放、移動、旋轉、渲染等功能。
| 名稱 | 型別 | 說明 |
| - | - | - |
| Meshes | List\<Mesh\> | 儲存模型各個部位的資料 |
| ModelMatrix | Matrix4 | 模型的 Model Matrix,在渲染時描述模型額外的旋轉與位移 |
| Rotation(float, float, float) | void | 分別以 x, y, z 軸使模型旋轉 (0~360) 度 |
| Move(float, float, float) | void | 使模型沿 x, y, z 軸位移 |
| Resize(float) | void | 依倍率縮放模型大小 |
| Render(Shader) | void | 使用指定的著色器渲染模型 |
| LoadModel(string) | Model | 從指定的路徑匯入模型 |
| Dispose() | void | 釋放資源 |
-------------------------------------------------------
## VirtualObject.Lights命名空間
### ILight介面
描述虛擬光源的統一行為與屬性。
| 名稱 | 型別 | 說明 |
| - | - | - |
| SetShader(Shader, int) | void | 將光照屬性綁定至指定著色器中相對應燈光陣列的index |
### AmbientLight類別
實作 [ILight](#ILight介面) 介面,作為環境光為虛擬場景提高整體亮度的類別。
| 名稱 | 型別 | 說明 |
| - | - | - |
| Color | Color4 | 描述光的顏色 |
| Main_strength | float | 描述光的強度(0~1) |
| AmbientLight(Color4, float) | Constructor | |
### PointLight類別
實作 [ILight](#ILight介面) 介面,作為點光源使虛擬物件產生光影變化的類別。
| 名稱 | 型別 | 說明 |
| - | - | - |
| Color | Color4 | 描述光的顏色 |
| Position | Vector3 | 描述光源的位置 |
| Main_strength | float | 描述光的強度(0~1) |
| Specular_strength | float | 描述鏡面反射的強度(0~1) |
| PointLight(Color4, Vector3, float, float) | Constructor | |
### DirectionalLight類別
實作 [ILight](#ILight介面) 介面,作為平行光使虛擬物件產生光影變化的類別。
| 名稱 | 型別 | 說明 |
| - | - | - |
| Color | Color4 | 描述光的顏色 |
| Direction | Vector3 | 描述光相對於原點的方向 |
| Main_strength | float | 描述光的強度(0~1) |
| Specular_strength | float | 描述鏡面反射的強度(0~1) |
| PointLight(Color4, Vector3, float, float) | Constructor | 以指定的位置計算相對於原點的方向 |