/// <summary> /// TextureReader callback handler. /// </summary> /// <param name="format">The format of the image.</param> /// <param name="width">Width of the image, in pixels.</param> /// <param name="height">Height of the image, in pixels.</param> /// <param name="pixelBuffer">Pointer to raw image buffer.</param> /// <param name="bufferSize">The size of the image buffer, in bytes.</param> public void OnImageAvailable(TextureReaderApi.ImageFormatType format, int width, int height, IntPtr pixelBuffer, int bufferSize) { if (format != TextureReaderApi.ImageFormatType.ImageFormatGrayscale) { Debug.Log("No edge detected due to incorrect image format."); return; } if (m_TextureToRender == null || m_EdgeImage == null || m_ImageWidth != width || m_ImageHeight != height) { m_TextureToRender = new Texture2D(width, height, TextureFormat.R8, false, false); m_EdgeImage = new byte[width * height]; m_ImageWidth = width; m_ImageHeight = height; } // Detect edges within the image. if (EdgeDetector.Detect(m_EdgeImage, pixelBuffer, width, height)) { // Update the rendering texture with the edge image. m_TextureToRender.LoadRawTextureData(m_EdgeImage); m_TextureToRender.Apply(); BackgroundRenderer.BackgroundMaterial.SetTexture("_ImageTex", m_TextureToRender); } }
/// <summary> /// Handles a new CPU image. /// </summary> /// <param name="format">The format of the image.</param> /// <param name="width">Width of the image, in pixels.</param> /// <param name="height">Height of the image, in pixels.</param> /// <param name="pixelBuffer">Pointer to raw image buffer.</param> /// <param name="bufferSize">The size of the image buffer, in bytes.</param> private void _OnImageAvailable(TextureReaderApi.ImageFormatType format, int width, int height, IntPtr pixelBuffer, int bufferSize) { if (format != TextureReaderApi.ImageFormatType.ImageFormatGrayscale) { Debug.Log("No edge detected due to incorrect image format."); return; } if (m_EdgeDetectionBackgroundTexture == null || m_EdgeDetectionResultImage == null || m_EdgeDetectionBackgroundTexture.width != width || m_EdgeDetectionBackgroundTexture.height != height) { m_EdgeDetectionBackgroundTexture = new Texture2D(width, height, TextureFormat.R8, false, false); m_EdgeDetectionResultImage = new byte[width * height]; _UpdateCameraImageToDisplayUVs(); } if (m_CachedOrientation != Screen.orientation || m_CachedScreenDimensions.x != Screen.width || m_CachedScreenDimensions.y != Screen.height) { _UpdateCameraImageToDisplayUVs(); m_CachedOrientation = Screen.orientation; m_CachedScreenDimensions = new Vector2(Screen.width, Screen.height); } // Detect edges within the image. if (EdgeDetector.Detect(m_EdgeDetectionResultImage, pixelBuffer, width, height)) { // Update the rendering texture with the edge image. m_EdgeDetectionBackgroundTexture.LoadRawTextureData(m_EdgeDetectionResultImage); m_EdgeDetectionBackgroundTexture.Apply(); EdgeDetectionBackgroundImage.material.SetTexture("_ImageTex", m_EdgeDetectionBackgroundTexture); const string TOP_LEFT_RIGHT = "_UvTopLeftRight"; const string BOTTOM_LEFT_RIGHT = "_UvBottomLeftRight"; EdgeDetectionBackgroundImage.material.SetVector(TOP_LEFT_RIGHT, new Vector4( m_CameraImageToDisplayUvTransformation.TopLeft.x, m_CameraImageToDisplayUvTransformation.TopLeft.y, m_CameraImageToDisplayUvTransformation.TopRight.x, m_CameraImageToDisplayUvTransformation.TopRight.y)); EdgeDetectionBackgroundImage.material.SetVector(BOTTOM_LEFT_RIGHT, new Vector4( m_CameraImageToDisplayUvTransformation.BottomLeft.x, m_CameraImageToDisplayUvTransformation.BottomLeft.y, m_CameraImageToDisplayUvTransformation.BottomRight.x, m_CameraImageToDisplayUvTransformation.BottomRight.y)); } }