1
+ using OpenCVForUnity . CoreModule ;
2
+ using OpenCVForUnity . ImgprocModule ;
3
+ using OpenCVForUnity . UnityUtils ;
4
+ using OpenCVForUnity . UnityUtils . Helper ;
5
+ using UnityEngine ;
6
+ using UnityEngine . SceneManagement ;
7
+ using UnityEngine . UI ;
8
+ using static OpenCVForUnity . UnityUtils . Helper . MultiSource2MatHelper ;
9
+
10
+ namespace OpenCVForUnityExample
11
+ {
12
+ /// <summary>
13
+ /// MultiSource2MatHelper Example
14
+ ///
15
+ /// An example of image processing by switching between multiple input sources using MultiSource2MatHelper.
16
+ /// </summary>
17
+ [ RequireComponent ( typeof ( MultiSource2MatHelper ) ) ]
18
+ public class MultiSource2MatHelperExample : MonoBehaviour
19
+ {
20
+ enum Source2MatHelperClassNamePreset : int
21
+ {
22
+ WebCamTexture2MatHelper = 0 ,
23
+ VideoCapture2MatHelper ,
24
+ Image2MatHelper ,
25
+ }
26
+
27
+ Source2MatHelperClassNamePreset requestedSource2MatHelperClassName = Source2MatHelperClassNamePreset . WebCamTexture2MatHelper ;
28
+
29
+ /// <summary>
30
+ /// The change camera botton.
31
+ /// </summary>
32
+ public Button changeCameraBotton ;
33
+
34
+ /// <summary>
35
+ /// The requested source 2 mat helper class name dropdown.
36
+ /// </summary>
37
+ public Dropdown requestedSource2MatHelperClassNameDropdown ;
38
+
39
+ /// <summary>
40
+ /// The texture.
41
+ /// </summary>
42
+ Texture2D texture ;
43
+
44
+ /// <summary>
45
+ /// The multi source to mat helper.
46
+ /// </summary>
47
+ MultiSource2MatHelper multiSourceToMatHelper ;
48
+
49
+ /// <summary>
50
+ /// The FPS monitor.
51
+ /// </summary>
52
+ FpsMonitor fpsMonitor ;
53
+
54
+ // Use this for initialization
55
+ void Start ( )
56
+ {
57
+ fpsMonitor = GetComponent < FpsMonitor > ( ) ;
58
+
59
+ // Get the MultiSource2MatHelper component attached to the current game object
60
+ multiSourceToMatHelper = gameObject . GetComponent < MultiSource2MatHelper > ( ) ;
61
+
62
+ // Set the requested ColorFormat
63
+ multiSourceToMatHelper . requestedSource2MatHelperClassName = MultiSource2MatHelperClassName . WebCamTexture2MatHelper ;
64
+ multiSourceToMatHelper . outputColorFormat = Source2MatHelperColorFormat . RGBA ;
65
+
66
+ // Initialize the source to Mat helper.
67
+ multiSourceToMatHelper . Initialize ( ) ;
68
+
69
+ // Update GUI state
70
+ changeCameraBotton . interactable = multiSourceToMatHelper . source2MatHelper is ICameraSource2MatHelper ;
71
+ requestedSource2MatHelperClassNameDropdown . value = ( int ) multiSourceToMatHelper . GetCurrentSource2MatHelperClassName ( ) ;
72
+ }
73
+
74
+ /// <summary>
75
+ /// Raises the source to mat helper initialized event.
76
+ /// </summary>
77
+ public void OnSourceToMatHelperInitialized ( )
78
+ {
79
+ Debug . Log ( "OnSourceToMatHelperInitialized" ) ;
80
+
81
+ // Retrieve the current frame from the Source2MatHelper as a Mat object
82
+ Mat rgbaMat = multiSourceToMatHelper . GetMat ( ) ;
83
+
84
+ // Create a new Texture2D with the same dimensions as the Mat and RGBA32 color format
85
+ texture = new Texture2D ( rgbaMat . cols ( ) , rgbaMat . rows ( ) , TextureFormat . RGBA32 , false ) ;
86
+
87
+ // Convert the Mat to a Texture2D, effectively transferring the image data
88
+ Utils . matToTexture2D ( rgbaMat , texture ) ;
89
+
90
+ // Set the Texture2D as the main texture of the Renderer component attached to the game object
91
+ gameObject . GetComponent < Renderer > ( ) . material . mainTexture = texture ;
92
+
93
+ // Adjust the scale of the game object to match the dimensions of the texture
94
+ gameObject . transform . localScale = new Vector3 ( rgbaMat . cols ( ) , rgbaMat . rows ( ) , 1 ) ;
95
+ Debug . Log ( "Screen.width " + Screen . width + " Screen.height " + Screen . height + " Screen.orientation " + Screen . orientation ) ;
96
+
97
+
98
+ if ( fpsMonitor != null )
99
+ {
100
+ fpsMonitor . Add ( "deviceName" , multiSourceToMatHelper . GetDeviceName ( ) . ToString ( ) ) ;
101
+ fpsMonitor . Add ( "width" , multiSourceToMatHelper . GetWidth ( ) . ToString ( ) ) ;
102
+ fpsMonitor . Add ( "height" , multiSourceToMatHelper . GetHeight ( ) . ToString ( ) ) ;
103
+ fpsMonitor . Add ( "orientation" , Screen . orientation . ToString ( ) ) ;
104
+ fpsMonitor . Add ( "helperClassName" , multiSourceToMatHelper . GetCurrentSource2MatHelperClassName ( ) . ToString ( ) ) ;
105
+
106
+ switch ( multiSourceToMatHelper . source2MatHelper )
107
+ {
108
+ case ICameraSource2MatHelper helper :
109
+ fpsMonitor . Add ( "camera fps" , helper . GetFPS ( ) . ToString ( ) ) ;
110
+ fpsMonitor . Add ( "isFrontFacing" , helper . IsFrontFacing ( ) . ToString ( ) ) ;
111
+ break ;
112
+ case IVideoSource2MatHelper helper :
113
+ fpsMonitor . Add ( "video path" , helper . requestedVideoFilePath . ToString ( ) ) ;
114
+ fpsMonitor . Add ( "video fps" , helper . GetFPS ( ) . ToString ( ) ) ;
115
+ fpsMonitor . Add ( "loop" , helper . loop . ToString ( ) ) ;
116
+ break ;
117
+ case IImageSource2MatHelper helper :
118
+ fpsMonitor . Add ( "image path" , helper . requestedImageFilePath . ToString ( ) ) ;
119
+ fpsMonitor . Add ( "repeat" , helper . repeat . ToString ( ) ) ;
120
+ break ;
121
+ }
122
+
123
+ if ( multiSourceToMatHelper . source2MatHelper is WebCamTexture2MatHelper webCamHelper )
124
+ {
125
+ fpsMonitor . Add ( "rotate90Degree" , webCamHelper . rotate90Degree . ToString ( ) ) ;
126
+ fpsMonitor . Add ( "flipVertical" , webCamHelper . flipVertical . ToString ( ) ) ;
127
+ fpsMonitor . Add ( "flipHorizontal" , webCamHelper . flipHorizontal . ToString ( ) ) ;
128
+ }
129
+ }
130
+
131
+
132
+ // Get the width and height of the webCamTextureMat
133
+ float width = rgbaMat . width ( ) ;
134
+ float height = rgbaMat . height ( ) ;
135
+
136
+ // Calculate the scale factors for width and height based on the screen dimensions
137
+ float widthScale = ( float ) Screen . width / width ;
138
+ float heightScale = ( float ) Screen . height / height ;
139
+
140
+ // Adjust the orthographic size of the main Camera to fit the aspect ratio of the image
141
+ if ( widthScale < heightScale )
142
+ {
143
+ // If the width scale is smaller, adjust the orthographic size based on width and screen height
144
+ Camera . main . orthographicSize = ( width * ( float ) Screen . height / ( float ) Screen . width ) / 2 ;
145
+ }
146
+ else
147
+ {
148
+ // If the height scale is smaller or equal, adjust the orthographic size based on height
149
+ Camera . main . orthographicSize = height / 2 ;
150
+ }
151
+ }
152
+
153
+ /// <summary>
154
+ /// Raises the source to mat helper disposed event.
155
+ /// </summary>
156
+ public void OnSourceToMatHelperDisposed ( )
157
+ {
158
+ Debug . Log ( "OnSourceToMatHelperDisposed" ) ;
159
+
160
+ // Destroy the texture and set it to null
161
+ if ( texture != null )
162
+ {
163
+ Texture2D . Destroy ( texture ) ;
164
+ texture = null ;
165
+ }
166
+
167
+ if ( fpsMonitor != null )
168
+ fpsMonitor . Clear ( ) ;
169
+ }
170
+
171
+ /// <summary>
172
+ /// Raises the source to mat helper error occurred event.
173
+ /// </summary>
174
+ /// <param name="errorCode">Error code.</param>
175
+ /// <param name="message">Message.</param>
176
+ public void OnSourceToMatHelperErrorOccurred ( Source2MatHelperErrorCode errorCode , string message )
177
+ {
178
+ Debug . Log ( "OnSourceToMatHelperErrorOccurred " + errorCode + ":" + message ) ;
179
+
180
+ if ( fpsMonitor != null )
181
+ {
182
+ fpsMonitor . consoleText = "ErrorCode: " + errorCode + ":" + message ;
183
+ }
184
+ }
185
+
186
+ // Update is called once per frame
187
+ void Update ( )
188
+ {
189
+ // Check if the web camera is playing and if a new frame was updated
190
+ if ( multiSourceToMatHelper . IsPlaying ( ) && multiSourceToMatHelper . DidUpdateThisFrame ( ) )
191
+ {
192
+ // Retrieve the current frame as a Mat object
193
+ Mat rgbaMat = multiSourceToMatHelper . GetMat ( ) ;
194
+
195
+ // Add text overlay on the frame
196
+ //Imgproc.putText (rgbaMat, "W:" + rgbaMat.width () + " H:" + rgbaMat.height () + " SO:" + Screen.orientation, new Point (5, rgbaMat.rows () - 10), Imgproc.FONT_HERSHEY_SIMPLEX, 1.0, new Scalar (255, 255, 255, 255), 2, Imgproc.LINE_AA, false);
197
+
198
+ // Convert the Mat to a Texture2D to display it on a texture
199
+ Utils . matToTexture2D ( rgbaMat , texture ) ;
200
+ }
201
+ }
202
+
203
+ /// <summary>
204
+ /// Raises the destroy event.
205
+ /// </summary>
206
+ void OnDestroy ( )
207
+ {
208
+ // Dispose of the SourceToMatHelper object and release any resources held by it.
209
+ multiSourceToMatHelper . Dispose ( ) ;
210
+ }
211
+
212
+ /// <summary>
213
+ /// Raises the back button click event.
214
+ /// </summary>
215
+ public void OnBackButtonClick ( )
216
+ {
217
+ // Load the specified scene when the back button is clicked
218
+ SceneManager . LoadScene ( "OpenCVForUnityExample" ) ;
219
+ }
220
+
221
+ /// <summary>
222
+ /// Raises the play button click event.
223
+ /// </summary>
224
+ public void OnPlayButtonClick ( )
225
+ {
226
+ multiSourceToMatHelper . Play ( ) ;
227
+ }
228
+
229
+ /// <summary>
230
+ /// Raises the pause button click event.
231
+ /// </summary>
232
+ public void OnPauseButtonClick ( )
233
+ {
234
+ multiSourceToMatHelper . Pause ( ) ;
235
+ }
236
+
237
+ /// <summary>
238
+ /// Raises the stop button click event.
239
+ /// </summary>
240
+ public void OnStopButtonClick ( )
241
+ {
242
+ multiSourceToMatHelper . Stop ( ) ;
243
+ }
244
+
245
+ /// <summary>
246
+ /// Raises the change camera button click event.
247
+ /// </summary>
248
+ public void OnChangeCameraButtonClick ( )
249
+ {
250
+ multiSourceToMatHelper . requestedIsFrontFacing = ! multiSourceToMatHelper . requestedIsFrontFacing ;
251
+ }
252
+
253
+ /// <summary>
254
+ /// Raises the requested source 2 mat helper class name dropdown value changed event.
255
+ /// </summary>
256
+ public void OnRequestedSource2MatHelperClassNameDropdownValueChanged ( int result )
257
+ {
258
+ if ( ( int ) requestedSource2MatHelperClassName != result )
259
+ {
260
+ requestedSource2MatHelperClassName = ( Source2MatHelperClassNamePreset ) result ;
261
+
262
+ switch ( requestedSource2MatHelperClassName )
263
+ {
264
+ case Source2MatHelperClassNamePreset . WebCamTexture2MatHelper :
265
+ multiSourceToMatHelper . requestedSource2MatHelperClassName = MultiSource2MatHelperClassName . WebCamTexture2MatHelper ;
266
+ break ;
267
+ case Source2MatHelperClassNamePreset . VideoCapture2MatHelper :
268
+ multiSourceToMatHelper . requestedSource2MatHelperClassName = MultiSource2MatHelperClassName . VideoCapture2MatHelper ;
269
+ break ;
270
+ case Source2MatHelperClassNamePreset . Image2MatHelper :
271
+ multiSourceToMatHelper . requestedSource2MatHelperClassName = MultiSource2MatHelperClassName . Image2MatHelper ;
272
+ break ;
273
+ }
274
+
275
+ // Way to perform different processing depending on the interface inherited by the helper class.
276
+ changeCameraBotton . interactable = multiSourceToMatHelper . source2MatHelper is ICameraSource2MatHelper ;
277
+ }
278
+ }
279
+ }
280
+ }
0 commit comments