123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937 |
- using System;
- using System.Collections;
- using UnityEngine;
- using UnityEngine.Events;
- using UnityEngine.Serialization;
- using OpenCVForUnity.CoreModule;
- using OpenCVForUnity.UnityUtils;
- namespace OpenCVForUnity.UnityUtils.Helper
- {
- /// <summary>
- /// WebcamTexture to mat helper.
- /// v 1.1.0
- /// </summary>
- public class WebCamTextureToMatHelper : MonoBehaviour
- {
- /// <summary>
- /// Set the name of the camera device to use. (or device index number)
- /// </summary>
- [SerializeField, FormerlySerializedAs ("requestedDeviceName"), TooltipAttribute ("Set the name of the device to use. (or device index number)")]
- protected string _requestedDeviceName = null;
- public virtual string requestedDeviceName {
- get { return _requestedDeviceName; }
- set {
- _requestedDeviceName = value;
- if (hasInitDone) {
- Initialize ();
- }
- }
- }
- /// <summary>
- /// Set the width of camera.
- /// </summary>
- [SerializeField, FormerlySerializedAs ("requestedWidth"), TooltipAttribute ("Set the width of camera.")]
- protected int _requestedWidth = 640;
- public virtual int requestedWidth {
- get { return _requestedWidth; }
- set {
- _requestedWidth = (int)Mathf.Clamp (value, 0f, float.MaxValue);
- if (hasInitDone) {
- Initialize ();
- }
- }
- }
- /// <summary>
- /// Set the height of camera.
- /// </summary>
- [SerializeField, FormerlySerializedAs ("requestedHeight"), TooltipAttribute ("Set the height of camera.")]
- protected int _requestedHeight = 480;
- public virtual int requestedHeight {
- get { return _requestedHeight; }
- set {
- _requestedHeight = (int)Mathf.Clamp (value, 0f, float.MaxValue);
- if (hasInitDone) {
- Initialize ();
- }
- }
- }
- /// <summary>
- /// Set whether to use the front facing camera.
- /// </summary>
- [SerializeField, FormerlySerializedAs ("requestedIsFrontFacing"), TooltipAttribute ("Set whether to use the front facing camera.")]
- protected bool _requestedIsFrontFacing = false;
- public virtual bool requestedIsFrontFacing {
- get { return _requestedIsFrontFacing; }
- set {
- _requestedIsFrontFacing = value;
- if (hasInitDone) {
- Initialize (_requestedIsFrontFacing, requestedFPS, rotate90Degree);
- }
- }
- }
- /// <summary>
- /// Set the frame rate of camera.
- /// </summary>
- [SerializeField, FormerlySerializedAs ("requestedFPS"), TooltipAttribute ("Set the frame rate of camera.")]
- protected float _requestedFPS = 30f;
- public virtual float requestedFPS {
- get { return _requestedFPS; }
- set {
- _requestedFPS = Mathf.Clamp (value, -1f, float.MaxValue);
- if (hasInitDone) {
- bool isPlaying = IsPlaying ();
- Stop ();
- webCamTexture.requestedFPS = _requestedFPS;
- if (isPlaying)
- Play ();
- }
- }
- }
- /// <summary>
- /// Sets whether to rotate camera frame 90 degrees. (clockwise)
- /// </summary>
- [SerializeField, FormerlySerializedAs ("rotate90Degree"), TooltipAttribute ("Sets whether to rotate camera frame 90 degrees. (clockwise)")]
- protected bool _rotate90Degree = false;
- public virtual bool rotate90Degree {
- get { return _rotate90Degree; }
- set {
- _rotate90Degree = value;
- if (hasInitDone) {
- Initialize ();
- }
- }
- }
- /// <summary>
- /// Determines if flips vertically.
- /// </summary>
- [SerializeField, FormerlySerializedAs ("flipVertical"), TooltipAttribute ("Determines if flips vertically.")]
- protected bool _flipVertical = false;
- public virtual bool flipVertical {
- get { return _flipVertical; }
- set { _flipVertical = value; }
- }
- /// <summary>
- /// Determines if flips horizontal.
- /// </summary>
- [SerializeField, FormerlySerializedAs ("flipHorizontal"), TooltipAttribute ("Determines if flips horizontal.")]
- protected bool _flipHorizontal = false;
- public virtual bool flipHorizontal {
- get { return _flipHorizontal; }
- set { _flipHorizontal = value; }
- }
- /// <summary>
- /// The number of frames before the initialization process times out.
- /// </summary>
- [SerializeField, FormerlySerializedAs ("timeoutFrameCount"), TooltipAttribute ("The number of frames before the initialization process times out.")]
- protected int _timeoutFrameCount = 300;
- public virtual int timeoutFrameCount {
- get { return _timeoutFrameCount; }
- set { _timeoutFrameCount = (int)Mathf.Clamp (value, 0f, float.MaxValue); }
- }
- /// <summary>
- /// UnityEvent that is triggered when this instance is initialized.
- /// </summary>
- public UnityEvent onInitialized;
- /// <summary>
- /// UnityEvent that is triggered when this instance is disposed.
- /// </summary>
- public UnityEvent onDisposed;
- /// <summary>
- /// UnityEvent that is triggered when this instance is error Occurred.
- /// </summary>
- public ErrorUnityEvent onErrorOccurred;
- /// <summary>
- /// The active WebcamTexture.
- /// </summary>
- protected WebCamTexture webCamTexture;
- /// <summary>
- /// The active WebcamDevice.
- /// </summary>
- protected WebCamDevice webCamDevice;
- /// <summary>
- /// The frame mat.
- /// </summary>
- protected Mat frameMat;
- /// <summary>
- /// The rotated frame mat
- /// </summary>
- protected Mat rotatedFrameMat;
- /// <summary>
- /// The buffer colors.
- /// </summary>
- protected Color32[] colors;
- /// <summary>
- /// Indicates whether this instance is waiting for initialization to complete.
- /// </summary>
- protected bool isInitWaiting = false;
- /// <summary>
- /// Indicates whether this instance has been initialized.
- /// </summary>
- protected bool hasInitDone = false;
- /// <summary>
- /// The initialization coroutine.
- /// </summary>
- protected IEnumerator initCoroutine;
- /// <summary>
- /// The orientation of the screen.
- /// </summary>
- protected ScreenOrientation screenOrientation;
- /// <summary>
- /// The width of the screen.
- /// </summary>
- protected int screenWidth;
- /// <summary>
- /// The height of the screen.
- /// </summary>
- protected int screenHeight;
- /// <summary>
- /// Indicates whether this instance avoids the front camera low light issue that occurs in only some Android devices (e.g. Google Pixel, Pixel2).
- /// Sets compulsorily the requestedFPS parameter to 15 (only when using the front camera), to avoid the problem of the WebCamTexture image becoming low light.
- /// https://forum.unity.com/threads/android-webcamtexture-in-low-light-only-some-models.520656/
- /// https://forum.unity.com/threads/released-opencv-for-unity.277080/page-33#post-3445178
- /// </summary>
- public bool avoidAndroidFrontCameraLowLightIssue = false;
- [System.Serializable]
- public enum ErrorCode : int
- {
- UNKNOWN = 0,
- CAMERA_DEVICE_NOT_EXIST = 1,
- TIMEOUT = 2,
- }
- [System.Serializable]
- public class ErrorUnityEvent : UnityEngine.Events.UnityEvent<ErrorCode>
- {
- }
- protected virtual void OnValidate ()
- {
- _requestedWidth = (int)Mathf.Clamp (_requestedWidth, 0f, float.MaxValue);
- _requestedHeight = (int)Mathf.Clamp (_requestedHeight, 0f, float.MaxValue);
- _requestedFPS = Mathf.Clamp (_requestedFPS, -1f, float.MaxValue);
- _timeoutFrameCount = (int)Mathf.Clamp (_timeoutFrameCount, 0f, float.MaxValue);
- }
- // Update is called once per frame
- protected virtual void Update ()
- {
- if (hasInitDone) {
- // Catch the orientation change of the screen and correct the mat image to the correct direction.
- if (screenOrientation != Screen.orientation && (screenWidth != Screen.width || screenHeight != Screen.height)) {
- if (onDisposed != null)
- onDisposed.Invoke ();
- if (frameMat != null) {
- frameMat.Dispose ();
- frameMat = null;
- }
- if (rotatedFrameMat != null) {
- rotatedFrameMat.Dispose ();
- rotatedFrameMat = null;
- }
- frameMat = new Mat (webCamTexture.height, webCamTexture.width, CvType.CV_8UC4, new Scalar (0, 0, 0, 255));
- screenOrientation = Screen.orientation;
- screenWidth = Screen.width;
- screenHeight = Screen.height;
- bool isRotatedFrame = false;
- #if !UNITY_EDITOR && !(UNITY_STANDALONE || UNITY_WEBGL)
- if (screenOrientation == ScreenOrientation.Portrait || screenOrientation == ScreenOrientation.PortraitUpsideDown)
- {
- if (!rotate90Degree)
- isRotatedFrame = true;
- }
- else if (rotate90Degree)
- {
- isRotatedFrame = true;
- }
- #else
- if (rotate90Degree)
- isRotatedFrame = true;
- #endif
- if (isRotatedFrame)
- rotatedFrameMat = new Mat (webCamTexture.width, webCamTexture.height, CvType.CV_8UC4, new Scalar (0, 0, 0, 255));
- if (onInitialized != null)
- onInitialized.Invoke ();
- } else {
- screenWidth = Screen.width;
- screenHeight = Screen.height;
- }
- }
- }
- /// <summary>
- /// Raises the destroy event.
- /// </summary>
- protected virtual void OnDestroy ()
- {
- Dispose ();
- }
- /// <summary>
- /// Initializes this instance.
- /// </summary>
- public virtual void Initialize ()
- {
- if (isInitWaiting) {
- CancelInitCoroutine ();
- ReleaseResources ();
- }
- if (onInitialized == null)
- onInitialized = new UnityEvent ();
- if (onDisposed == null)
- onDisposed = new UnityEvent ();
- if (onErrorOccurred == null)
- onErrorOccurred = new ErrorUnityEvent ();
- initCoroutine = _Initialize ();
- StartCoroutine (initCoroutine);
- }
- /// <summary>
- /// Initializes this instance.
- /// </summary>
- /// <param name="requestedWidth">Requested width.</param>
- /// <param name="requestedHeight">Requested height.</param>
- public virtual void Initialize (int requestedWidth, int requestedHeight)
- {
- if (isInitWaiting) {
- CancelInitCoroutine ();
- ReleaseResources ();
- }
- this._requestedWidth = requestedWidth;
- this._requestedHeight = requestedHeight;
- if (onInitialized == null)
- onInitialized = new UnityEvent ();
- if (onDisposed == null)
- onDisposed = new UnityEvent ();
- if (onErrorOccurred == null)
- onErrorOccurred = new ErrorUnityEvent ();
- initCoroutine = _Initialize ();
- StartCoroutine (initCoroutine);
- }
- /// <summary>
- /// Initializes this instance.
- /// </summary>
- /// <param name="requestedIsFrontFacing">If set to <c>true</c> requested to using the front camera.</param>
- /// <param name="requestedFPS">Requested FPS.</param>
- /// <param name="rotate90Degree">If set to <c>true</c> requested to rotate camera frame 90 degrees. (clockwise)</param>
- public virtual void Initialize (bool requestedIsFrontFacing, float requestedFPS = 30f, bool rotate90Degree = false)
- {
- if (isInitWaiting) {
- CancelInitCoroutine ();
- ReleaseResources ();
- }
- _requestedDeviceName = null;
- this._requestedIsFrontFacing = requestedIsFrontFacing;
- this._requestedFPS = requestedFPS;
- this._rotate90Degree = rotate90Degree;
- if (onInitialized == null)
- onInitialized = new UnityEvent ();
- if (onDisposed == null)
- onDisposed = new UnityEvent ();
- if (onErrorOccurred == null)
- onErrorOccurred = new ErrorUnityEvent ();
- initCoroutine = _Initialize ();
- StartCoroutine (initCoroutine);
- }
- /// <summary>
- /// Initializes this instance.
- /// </summary>
- /// <param name="deviceName">Device name.</param>
- /// <param name="requestedWidth">Requested width.</param>
- /// <param name="requestedHeight">Requested height.</param>
- /// <param name="requestedIsFrontFacing">If set to <c>true</c> requested to using the front camera.</param>
- /// <param name="requestedFPS">Requested FPS.</param>
- /// <param name="rotate90Degree">If set to <c>true</c> requested to rotate camera frame 90 degrees. (clockwise)</param>
- public virtual void Initialize (string deviceName, int requestedWidth, int requestedHeight, bool requestedIsFrontFacing = false, float requestedFPS = 30f, bool rotate90Degree = false)
- {
- if (isInitWaiting) {
- CancelInitCoroutine ();
- ReleaseResources ();
- }
- this._requestedDeviceName = deviceName;
- this._requestedWidth = requestedWidth;
- this._requestedHeight = requestedHeight;
- this._requestedIsFrontFacing = requestedIsFrontFacing;
- this._requestedFPS = requestedFPS;
- this._rotate90Degree = rotate90Degree;
- if (onInitialized == null)
- onInitialized = new UnityEvent ();
- if (onDisposed == null)
- onDisposed = new UnityEvent ();
- if (onErrorOccurred == null)
- onErrorOccurred = new ErrorUnityEvent ();
- initCoroutine = _Initialize ();
- StartCoroutine (initCoroutine);
- }
- /// <summary>
- /// Initializes this instance by coroutine.
- /// </summary>
- protected virtual IEnumerator _Initialize ()
- {
- if (hasInitDone) {
- ReleaseResources ();
- if (onDisposed != null)
- onDisposed.Invoke ();
- }
- isInitWaiting = true;
- float requestedFPS = this.requestedFPS;
- // Creates the camera
- if (!String.IsNullOrEmpty (requestedDeviceName)) {
- int requestedDeviceIndex = -1;
- if (Int32.TryParse (requestedDeviceName, out requestedDeviceIndex)) {
- if (requestedDeviceIndex >= 0 && requestedDeviceIndex < WebCamTexture.devices.Length) {
- webCamDevice = WebCamTexture.devices [requestedDeviceIndex];
- if (avoidAndroidFrontCameraLowLightIssue && webCamDevice.isFrontFacing == true)
- requestedFPS = 15f;
- if (requestedFPS < 0) {
- webCamTexture = new WebCamTexture (webCamDevice.name, requestedWidth, requestedHeight);
- } else {
- webCamTexture = new WebCamTexture (webCamDevice.name, requestedWidth, requestedHeight, (int)requestedFPS);
- }
- }
- } else {
- for (int cameraIndex = 0; cameraIndex < WebCamTexture.devices.Length; cameraIndex++) {
- if (WebCamTexture.devices [cameraIndex].name == requestedDeviceName) {
- webCamDevice = WebCamTexture.devices [cameraIndex];
- if (avoidAndroidFrontCameraLowLightIssue && webCamDevice.isFrontFacing == true)
- requestedFPS = 15f;
- if (requestedFPS < 0) {
- webCamTexture = new WebCamTexture (webCamDevice.name, requestedWidth, requestedHeight);
- } else {
- webCamTexture = new WebCamTexture (webCamDevice.name, requestedWidth, requestedHeight, (int)requestedFPS);
- }
- break;
- }
- }
- }
- if (webCamTexture == null)
- Debug.Log ("Cannot find camera device " + requestedDeviceName + ".");
- }
- if (webCamTexture == null) {
- // Checks how many and which cameras are available on the device
- for (int cameraIndex = 0; cameraIndex < WebCamTexture.devices.Length; cameraIndex++) {
- if (WebCamTexture.devices [cameraIndex].isFrontFacing == requestedIsFrontFacing) {
- webCamDevice = WebCamTexture.devices [cameraIndex];
- if (avoidAndroidFrontCameraLowLightIssue && webCamDevice.isFrontFacing == true)
- requestedFPS = 15f;
- if (requestedFPS < 0) {
- webCamTexture = new WebCamTexture (webCamDevice.name, requestedWidth, requestedHeight);
- } else {
- webCamTexture = new WebCamTexture (webCamDevice.name, requestedWidth, requestedHeight, (int)requestedFPS);
- }
- break;
- }
- }
- }
- if (webCamTexture == null) {
- if (WebCamTexture.devices.Length > 0) {
- webCamDevice = WebCamTexture.devices [0];
- if (avoidAndroidFrontCameraLowLightIssue && webCamDevice.isFrontFacing == true)
- requestedFPS = 15f;
- if (requestedFPS < 0) {
- webCamTexture = new WebCamTexture (webCamDevice.name, requestedWidth, requestedHeight);
- } else {
- webCamTexture = new WebCamTexture (webCamDevice.name, requestedWidth, requestedHeight, (int)requestedFPS);
- }
- } else {
- isInitWaiting = false;
- if (onErrorOccurred != null)
- onErrorOccurred.Invoke (ErrorCode.CAMERA_DEVICE_NOT_EXIST);
- yield break;
- }
- }
- // Starts the camera
- webCamTexture.Play ();
- int initFrameCount = 0;
- bool isTimeout = false;
- while (true) {
- if (initFrameCount > timeoutFrameCount) {
- isTimeout = true;
- break;
- }
- // If you want to use webcamTexture.width and webcamTexture.height on iOS, you have to wait until webcamTexture.didUpdateThisFrame == 1, otherwise these two values will be equal to 16. (http://forum.unity3d.com/threads/webcamtexture-and-error-0x0502.123922/)
- #if UNITY_IOS && !UNITY_EDITOR && (UNITY_4_6_3 || UNITY_4_6_4 || UNITY_5_0_0 || UNITY_5_0_1)
- else if (webCamTexture.width > 16 && webCamTexture.height > 16) {
- #else
- else if (webCamTexture.didUpdateThisFrame) {
- #if UNITY_IOS && !UNITY_EDITOR && UNITY_5_2
- while (webCamTexture.width <= 16) {
- if (initFrameCount > timeoutFrameCount) {
- isTimeout = true;
- break;
- }else {
- initFrameCount++;
- }
- webCamTexture.GetPixels32 ();
- yield return new WaitForEndOfFrame ();
- }
- if (isTimeout) break;
- #endif
- #endif
- Debug.Log ("WebCamTextureToMatHelper:: " + "devicename:" + webCamTexture.deviceName + " name:" + webCamTexture.name + " width:" + webCamTexture.width + " height:" + webCamTexture.height + " fps:" + webCamTexture.requestedFPS
- + " videoRotationAngle:" + webCamTexture.videoRotationAngle + " videoVerticallyMirrored:" + webCamTexture.videoVerticallyMirrored + " isFrongFacing:" + webCamDevice.isFrontFacing);
- if (colors == null || colors.Length != webCamTexture.width * webCamTexture.height)
- colors = new Color32[webCamTexture.width * webCamTexture.height];
- frameMat = new Mat (webCamTexture.height, webCamTexture.width, CvType.CV_8UC4);
- screenOrientation = Screen.orientation;
- screenWidth = Screen.width;
- screenHeight = Screen.height;
- bool isRotatedFrame = false;
- #if !UNITY_EDITOR && !(UNITY_STANDALONE || UNITY_WEBGL)
- if (screenOrientation == ScreenOrientation.Portrait || screenOrientation == ScreenOrientation.PortraitUpsideDown)
- {
- if (!rotate90Degree)
- isRotatedFrame = true;
- }
- else if (rotate90Degree)
- {
- isRotatedFrame = true;
- }
- #else
- if (rotate90Degree)
- isRotatedFrame = true;
- #endif
- if (isRotatedFrame)
- rotatedFrameMat = new Mat (webCamTexture.width, webCamTexture.height, CvType.CV_8UC4);
- isInitWaiting = false;
- hasInitDone = true;
- initCoroutine = null;
- if (onInitialized != null)
- onInitialized.Invoke ();
- break;
- } else {
- initFrameCount++;
- yield return null;
- }
- }
- if (isTimeout) {
- webCamTexture.Stop ();
- webCamTexture = null;
- isInitWaiting = false;
- initCoroutine = null;
- if (onErrorOccurred != null)
- onErrorOccurred.Invoke (ErrorCode.TIMEOUT);
- }
- }
- /// <summary>
- /// Indicates whether this instance has been initialized.
- /// </summary>
- /// <returns><c>true</c>, if this instance has been initialized, <c>false</c> otherwise.</returns>
- public virtual bool IsInitialized ()
- {
- return hasInitDone;
- }
- /// <summary>
- /// Starts the camera.
- /// </summary>
- public virtual void Play ()
- {
- if (hasInitDone)
- webCamTexture.Play ();
- }
- /// <summary>
- /// Pauses the active camera.
- /// </summary>
- public virtual void Pause ()
- {
- if (hasInitDone)
- webCamTexture.Pause ();
- }
- /// <summary>
- /// Stops the active camera.
- /// </summary>
- public virtual void Stop ()
- {
- if (hasInitDone)
- webCamTexture.Stop ();
- }
- /// <summary>
- /// Indicates whether the active camera is currently playing.
- /// </summary>
- /// <returns><c>true</c>, if the active camera is playing, <c>false</c> otherwise.</returns>
- public virtual bool IsPlaying ()
- {
- return hasInitDone ? webCamTexture.isPlaying : false;
- }
- /// <summary>
- /// Indicates whether the active camera device is currently front facng.
- /// </summary>
- /// <returns><c>true</c>, if the active camera device is front facng, <c>false</c> otherwise.</returns>
- public virtual bool IsFrontFacing ()
- {
- return hasInitDone ? webCamDevice.isFrontFacing : false;
- }
- /// <summary>
- /// Returns the active camera device name.
- /// </summary>
- /// <returns>The active camera device name.</returns>
- public virtual string GetDeviceName ()
- {
- return hasInitDone ? webCamTexture.deviceName : "";
- }
- /// <summary>
- /// Returns the active camera width.
- /// </summary>
- /// <returns>The active camera width.</returns>
- public virtual int GetWidth ()
- {
- if (!hasInitDone)
- return -1;
- return (rotatedFrameMat != null) ? frameMat.height () : frameMat.width ();
- }
- /// <summary>
- /// Returns the active camera height.
- /// </summary>
- /// <returns>The active camera height.</returns>
- public virtual int GetHeight ()
- {
- if (!hasInitDone)
- return -1;
- return (rotatedFrameMat != null) ? frameMat.width () : frameMat.height ();
- }
- /// <summary>
- /// Returns the active camera framerate.
- /// </summary>
- /// <returns>The active camera framerate.</returns>
- public virtual float GetFPS ()
- {
- return hasInitDone ? webCamTexture.requestedFPS : -1f;
- }
- /// <summary>
- /// Returns the active WebcamTexture.
- /// </summary>
- /// <returns>The active WebcamTexture.</returns>
- public virtual WebCamTexture GetWebCamTexture ()
- {
- return hasInitDone ? webCamTexture : null;
- }
- /// <summary>
- /// Returns the active WebcamDevice.
- /// </summary>
- /// <returns>The active WebcamDevice.</returns>
- public virtual WebCamDevice GetWebCamDevice ()
- {
- return webCamDevice;
- }
- /// <summary>
- /// Returns the camera to world matrix.
- /// </summary>
- /// <returns>The camera to world matrix.</returns>
- public virtual Matrix4x4 GetCameraToWorldMatrix ()
- {
- return Camera.main.cameraToWorldMatrix;
- }
- /// <summary>
- /// Returns the projection matrix matrix.
- /// </summary>
- /// <returns>The projection matrix.</returns>
- public virtual Matrix4x4 GetProjectionMatrix ()
- {
- return Camera.main.projectionMatrix;
- }
- /// <summary>
- /// Indicates whether the video buffer of the frame has been updated.
- /// </summary>
- /// <returns><c>true</c>, if the video buffer has been updated <c>false</c> otherwise.</returns>
- public virtual bool DidUpdateThisFrame ()
- {
- if (!hasInitDone)
- return false;
- #if UNITY_IOS && !UNITY_EDITOR && (UNITY_4_6_3 || UNITY_4_6_4 || UNITY_5_0_0 || UNITY_5_0_1)
- if (webCamTexture.width > 16 && webCamTexture.height > 16) {
- return true;
- } else {
- return false;
- }
- #else
- return webCamTexture.didUpdateThisFrame;
- #endif
- }
- /// <summary>
- /// Gets the mat of the current frame.
- /// The Mat object's type is 'CV_8UC4' (RGBA).
- /// </summary>
- /// <returns>The mat of the current frame.</returns>
- public virtual Mat GetMat ()
- {
- if (!hasInitDone || !webCamTexture.isPlaying) {
- return (rotatedFrameMat != null) ? rotatedFrameMat : frameMat;
- }
- Utils.webCamTextureToMat (webCamTexture, frameMat, colors, false);
- #if !UNITY_EDITOR && !(UNITY_STANDALONE || UNITY_WEBGL)
- if (rotatedFrameMat != null)
- {
- if (screenOrientation == ScreenOrientation.Portrait || screenOrientation == ScreenOrientation.PortraitUpsideDown)
- {
- // (Orientation is Portrait, rotate90Degree is false)
- if (webCamDevice.isFrontFacing)
- {
- FlipMat (frameMat, !flipHorizontal, !flipVertical);
- }
- else
- {
- FlipMat (frameMat, flipHorizontal, flipVertical);
- }
- }
- else
- {
- // (Orientation is Landscape, rotate90Degrees=true)
- FlipMat (frameMat, flipVertical, flipHorizontal);
- }
- Core.rotate (frameMat, rotatedFrameMat, Core.ROTATE_90_CLOCKWISE);
- return rotatedFrameMat;
- }
- else
- {
- if (screenOrientation == ScreenOrientation.Portrait || screenOrientation == ScreenOrientation.PortraitUpsideDown)
- {
- // (Orientation is Portrait, rotate90Degree is ture)
- if (webCamDevice.isFrontFacing)
- {
- FlipMat (frameMat, flipHorizontal, flipVertical);
- }
- else
- {
- FlipMat (frameMat, !flipHorizontal, !flipVertical);
- }
- }
- else
- {
- // (Orientation is Landscape, rotate90Degree is false)
- FlipMat (frameMat, flipVertical, flipHorizontal);
- }
- return frameMat;
- }
- #else
- FlipMat (frameMat, flipVertical, flipHorizontal);
- if (rotatedFrameMat != null) {
- Core.rotate (frameMat, rotatedFrameMat, Core.ROTATE_90_CLOCKWISE);
- return rotatedFrameMat;
- } else {
- return frameMat;
- }
- #endif
- }
- /// <summary>
- /// Flips the mat.
- /// </summary>
- /// <param name="mat">Mat.</param>
- protected virtual void FlipMat (Mat mat, bool flipVertical, bool flipHorizontal)
- {
- //Since the order of pixels of WebCamTexture and Mat is opposite, the initial value of flipCode is set to 0 (flipVertical).
- int flipCode = 0;
- if (webCamDevice.isFrontFacing) {
- if (webCamTexture.videoRotationAngle == 0) {
- flipCode = -1;
- } else if (webCamTexture.videoRotationAngle == 90) {
- flipCode = -1;
- }
- if (webCamTexture.videoRotationAngle == 180) {
- flipCode = int.MinValue;
- } else if (webCamTexture.videoRotationAngle == 270) {
- flipCode = int.MinValue;
- }
- } else {
- if (webCamTexture.videoRotationAngle == 180) {
- flipCode = 1;
- } else if (webCamTexture.videoRotationAngle == 270) {
- flipCode = 1;
- }
- }
- if (flipVertical) {
- if (flipCode == int.MinValue) {
- flipCode = 0;
- } else if (flipCode == 0) {
- flipCode = int.MinValue;
- } else if (flipCode == 1) {
- flipCode = -1;
- } else if (flipCode == -1) {
- flipCode = 1;
- }
- }
- if (flipHorizontal) {
- if (flipCode == int.MinValue) {
- flipCode = 1;
- } else if (flipCode == 0) {
- flipCode = -1;
- } else if (flipCode == 1) {
- flipCode = int.MinValue;
- } else if (flipCode == -1) {
- flipCode = 0;
- }
- }
- if (flipCode > int.MinValue) {
- Core.flip (mat, mat, flipCode);
- }
- }
- /// <summary>
- /// Gets the buffer colors.
- /// </summary>
- /// <returns>The buffer colors.</returns>
- public virtual Color32[] GetBufferColors ()
- {
- return colors;
- }
- /// <summary>
- /// Cancel Init Coroutine.
- /// </summary>
- protected virtual void CancelInitCoroutine ()
- {
- if (initCoroutine != null) {
- StopCoroutine (initCoroutine);
- ((IDisposable)initCoroutine).Dispose ();
- initCoroutine = null;
- }
- }
- /// <summary>
- /// To release the resources.
- /// </summary>
- protected virtual void ReleaseResources ()
- {
- isInitWaiting = false;
- hasInitDone = false;
- if (webCamTexture != null) {
- webCamTexture.Stop ();
- WebCamTexture.Destroy (webCamTexture);
- webCamTexture = null;
- }
- if (frameMat != null) {
- frameMat.Dispose ();
- frameMat = null;
- }
- if (rotatedFrameMat != null) {
- rotatedFrameMat.Dispose ();
- rotatedFrameMat = null;
- }
- }
- /// <summary>
- /// Releases all resource used by the <see cref="WebCamTextureToMatHelper"/> object.
- /// </summary>
- /// <remarks>Call <see cref="Dispose"/> when you are finished using the <see cref="WebCamTextureToMatHelper"/>. The
- /// <see cref="Dispose"/> method leaves the <see cref="WebCamTextureToMatHelper"/> in an unusable state. After
- /// calling <see cref="Dispose"/>, you must release all references to the <see cref="WebCamTextureToMatHelper"/> so
- /// the garbage collector can reclaim the memory that the <see cref="WebCamTextureToMatHelper"/> was occupying.</remarks>
- public virtual void Dispose ()
- {
- if (colors != null)
- colors = null;
- if (isInitWaiting) {
- CancelInitCoroutine ();
- ReleaseResources ();
- } else if (hasInitDone) {
- ReleaseResources ();
- if (onDisposed != null)
- onDisposed.Invoke ();
- }
- }
- }
- }
|