void Run() { //人脸68关键点定位 sp_human_face_68_dat_filepath = DlibFaceLandmarkDetector.Utils.getFilePath("sp_human_face_68.dat"); FaceLandmarkDetector faceLandmarkDetector = new FaceLandmarkDetector(sp_human_face_68_dat_filepath); Mat imgMat = Imgcodecs.imread(Application.dataPath + "/Textures/face.jpg"); Imgproc.cvtColor(imgMat, imgMat, Imgproc.COLOR_BGR2RGB); FaceSwapperExample.OpenCVForUnityUtils.SetImage(faceLandmarkDetector, imgMat); //detect face rectdetecton List <FaceLandmarkDetector.RectDetection> detectResult = faceLandmarkDetector.DetectRectDetection(); foreach (var result in detectResult) { Debug.Log("rect : " + result.rect); Debug.Log("detection_confidence : " + result.detection_confidence); Debug.Log("weight_index : " + result.weight_index); //Debug.Log ("face : " + rect); Imgproc.putText(imgMat, "" + result.detection_confidence, new Point(result.rect.xMin, result.rect.yMin - 20), Core.FONT_HERSHEY_SIMPLEX, 0.5, new Scalar(255, 255, 255, 255), 1, Imgproc.LINE_AA, false); Imgproc.putText(imgMat, "" + result.weight_index, new Point(result.rect.xMin, result.rect.yMin - 5), Core.FONT_HERSHEY_SIMPLEX, 0.5, new Scalar(255, 255, 255, 255), 1, Imgproc.LINE_AA, false); //detect landmark points List <Vector2> points = faceLandmarkDetector.DetectLandmark(result.rect); Debug.Log("face points count : " + points.Count); //draw landmark points FaceSwapperExample.OpenCVForUnityUtils.DrawFaceLandmark(imgMat, points, new Scalar(0, 255, 0, 255), 1); //线,不是点 //draw face rect FaceSwapperExample.OpenCVForUnityUtils.DrawFaceRect(imgMat, result.rect, new Scalar(255, 0, 0, 255), 1); } faceLandmarkDetector.Dispose(); Texture2D t2d = new Texture2D(imgMat.cols(), imgMat.rows(), TextureFormat.RGBA32, false); OpenCVForUnity.Utils.matToTexture2D(imgMat, t2d); Sprite sp = Sprite.Create(t2d, new UnityEngine.Rect(0, 0, t2d.width, t2d.height), Vector2.zero); m_srcImage.sprite = sp; m_srcImage.preserveAspect = true; }
// Use this for initialization void Run(Mat imgMat) { Utils.setDebugMode(true); if (string.IsNullOrEmpty(dlibShapePredictorFilePath)) { Debug.LogError("shape predictor file does not exist. Please copy from “DlibFaceLandmarkDetector/StreamingAssets/” to “Assets/StreamingAssets/” folder. "); } FaceLandmarkDetector faceLandmarkDetector = new FaceLandmarkDetector(dlibShapePredictorFilePath); OpenCVForUnityUtils.SetImage(faceLandmarkDetector, imgMat); //detect face rectdetecton List <FaceLandmarkDetector.RectDetection> detectResult = faceLandmarkDetector.DetectRectDetection(); foreach (var result in detectResult) { Debug.Log("rect : " + result.rect); Debug.Log("detection_confidence : " + result.detection_confidence); Debug.Log("weight_index : " + result.weight_index); //detect landmark points List <Vector2> points = faceLandmarkDetector.DetectLandmark(result.rect); Debug.Log("face points count : " + points.Count); //draw landmark points OpenCVForUnityUtils.DrawFaceLandmark(imgMat, points, new Scalar(0, 255, 0, 255), 2, true); //draw face rect OpenCVForUnityUtils.DrawFaceRect(imgMat, result, new Scalar(255, 0, 0, 255), 2); } faceLandmarkDetector.Dispose(); Utils.setDebugMode(false); }
void OnPhotoCaptured(PhotoCapture.PhotoCaptureResult result, PhotoCaptureFrame photoCaptureFrame) { Matrix4x4 cameraToWorldMatrix; photoCaptureFrame.TryGetCameraToWorldMatrix(out cameraToWorldMatrix); Matrix4x4 worldToCameraMatrix = cameraToWorldMatrix.inverse; Matrix4x4 projectionMatrix; photoCaptureFrame.TryGetProjectionMatrix(out projectionMatrix); photoCaptureFrame.UploadImageDataToTexture(m_Texture); OpenCVForUnity.Utils.texture2DToMat(m_Texture, rgbaMat); // fill all black. // Imgproc.rectangle (rgbaMat, new Point (0, 0), new Point (rgbaMat.width (), rgbaMat.height ()), new Scalar (0, 0, 0, 0), -1); // draw an edge lines. Imgproc.rectangle(rgbaMat, new Point(0, 0), new Point(rgbaMat.width(), rgbaMat.height()), new Scalar(255, 0, 0, 255), 2); // draw a diagonal line. // Imgproc.line (rgbaMat, new Point (0, 0), new Point (rgbaMat.cols (), rgbaMat.rows ()), new Scalar (255, 0, 0, 255)); OpenCVForUnityUtils.SetImage(faceLandmarkDetector, rgbaMat); //detect face List <FaceLandmarkDetector.RectDetection> detectResult = faceLandmarkDetector.DetectRectDetection(); foreach (var r in detectResult) { Debug.Log("rect : " + r.rect); //detect landmark points List <Vector2> points = faceLandmarkDetector.DetectLandmark(r.rect); Debug.Log("face points count : " + points.Count); //draw landmark points OpenCVForUnityUtils.DrawFaceLandmark(rgbaMat, points, new Scalar(0, 255, 0, 255), 2); //draw face rect OpenCVForUnityUtils.DrawFaceRect(rgbaMat, r.rect, new Scalar(255, 0, 0, 255), 2); } Imgproc.putText(rgbaMat, "W:" + rgbaMat.width() + " H:" + rgbaMat.height() + " SO:" + Screen.orientation, new Point(5, rgbaMat.rows() - 10), Core.FONT_HERSHEY_SIMPLEX, 1.5, new Scalar(0, 255, 0, 255), 2, Imgproc.LINE_AA, false); OpenCVForUnity.Utils.matToTexture2D(rgbaMat, m_Texture, colors); m_Texture.wrapMode = TextureWrapMode.Clamp; m_CanvasRenderer.enabled = true; m_CanvasRenderer.sharedMaterial.SetTexture("_MainTex", m_Texture); m_CanvasRenderer.sharedMaterial.SetMatrix("_WorldToCameraMatrix", worldToCameraMatrix); m_CanvasRenderer.sharedMaterial.SetMatrix("_CameraProjectionMatrix", projectionMatrix); m_CanvasRenderer.sharedMaterial.SetFloat("_VignetteScale", 0.0f); // Position the canvas object slightly in front // of the real world web camera. Vector3 position = cameraToWorldMatrix.GetColumn(3) - cameraToWorldMatrix.GetColumn(2); // Rotate the canvas object so that it faces the user. Quaternion rotation = Quaternion.LookRotation(-cameraToWorldMatrix.GetColumn(2), cameraToWorldMatrix.GetColumn(1)); m_Canvas.transform.position = position; m_Canvas.transform.rotation = rotation; Debug.Log("Took picture!"); Debug.Log("projectionMatrix:\n" + projectionMatrix.ToString()); m_CapturingPhoto = false; }
private void Run() { if (string.IsNullOrEmpty(dlibShapePredictorFilePath)) { Debug.LogError("shape predictor file does not exist. Please copy from “DlibFaceLandmarkDetector/StreamingAssets/” to “Assets/StreamingAssets/” folder. "); } Mat imgMat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC4); // Convert Unity Texture2D to OpenCV Mat. OpenCVForUnity.UnityUtils.Utils.texture2DToMat(imgTexture, imgMat); Debug.Log("imgMat dst ToString " + imgMat.ToString()); gameObject.transform.localScale = new Vector3(imgTexture.width, imgTexture.height, 1); Debug.Log("Screen.width " + Screen.width + " Screen.height " + Screen.height + " Screen.orientation " + Screen.orientation); float width = imgMat.width(); float height = imgMat.height(); float widthScale = (float)Screen.width / width; float heightScale = (float)Screen.height / height; if (widthScale < heightScale) { Camera.main.orthographicSize = (width * (float)Screen.height / (float)Screen.width) / 2; } else { Camera.main.orthographicSize = height / 2; } FaceLandmarkDetector faceLandmarkDetector = new FaceLandmarkDetector(dlibShapePredictorFilePath); OpenCVForUnityUtils.SetImage(faceLandmarkDetector, imgMat); //detect face rectdetecton List <FaceLandmarkDetector.RectDetection> detectResult = faceLandmarkDetector.DetectRectDetection(); foreach (var result in detectResult) { Debug.Log("rect : " + result.rect); Debug.Log("detection_confidence : " + result.detection_confidence); Debug.Log("weight_index : " + result.weight_index); //detect landmark points List <Vector2> points = faceLandmarkDetector.DetectLandmark(result.rect); Debug.Log("face points count : " + points.Count); //draw landmark points OpenCVForUnityUtils.DrawFaceLandmark(imgMat, points, new Scalar(0, 255, 0, 255), 2, true); //draw face rect OpenCVForUnityUtils.DrawFaceRect(imgMat, result, new Scalar(255, 0, 0, 255), 2); } faceLandmarkDetector.Dispose(); Texture2D texture = new Texture2D(imgMat.cols(), imgMat.rows(), TextureFormat.RGBA32, false); // Convert OpenCV Mat to Unity Texture2D. OpenCVForUnity.UnityUtils.Utils.matToTexture2D(imgMat, texture); gameObject.GetComponent <Renderer> ().material.mainTexture = texture; if (fpsMonitor != null) { fpsMonitor.Add("dlib shape predictor", dlibShapePredictorFileName); fpsMonitor.Add("width", width.ToString()); fpsMonitor.Add("height", height.ToString()); fpsMonitor.Add("orientation", Screen.orientation.ToString()); } }
private void Run() { Mat imgMat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC4); // Convert Unity Texture2D to OpenCV Mat. OpenCVForUnity.Utils.texture2DToMat(imgTexture, imgMat); Debug.Log("imgMat dst ToString " + imgMat.ToString()); gameObject.transform.localScale = new Vector3(imgTexture.width, imgTexture.height, 1); Debug.Log("Screen.width " + Screen.width + " Screen.height " + Screen.height + " Screen.orientation " + Screen.orientation); float width = imgMat.width(); float height = imgMat.height(); float widthScale = (float)Screen.width / width; float heightScale = (float)Screen.height / height; if (widthScale < heightScale) { Camera.main.orthographicSize = (width * (float)Screen.height / (float)Screen.width) / 2; } else { Camera.main.orthographicSize = height / 2; } FaceLandmarkDetector faceLandmarkDetector = new FaceLandmarkDetector(sp_human_face_68_dat_filepath); OpenCVForUnityUtils.SetImage(faceLandmarkDetector, imgMat); //detect face rectdetecton List <FaceLandmarkDetector.RectDetection> detectResult = faceLandmarkDetector.DetectRectDetection(); foreach (var result in detectResult) { Debug.Log("rect : " + result.rect); Debug.Log("detection_confidence : " + result.detection_confidence); Debug.Log("weight_index : " + result.weight_index); // Debug.Log ("face : " + rect); Imgproc.putText(imgMat, "" + result.detection_confidence, new Point(result.rect.xMin, result.rect.yMin - 20), Core.FONT_HERSHEY_SIMPLEX, 0.5, new Scalar(255, 255, 255, 255), 1, Imgproc.LINE_AA, false); Imgproc.putText(imgMat, "" + result.weight_index, new Point(result.rect.xMin, result.rect.yMin - 5), Core.FONT_HERSHEY_SIMPLEX, 0.5, new Scalar(255, 255, 255, 255), 1, Imgproc.LINE_AA, false); //detect landmark points List <Vector2> points = faceLandmarkDetector.DetectLandmark(result.rect); Debug.Log("face points count : " + points.Count); //draw landmark points OpenCVForUnityUtils.DrawFaceLandmark(imgMat, points, new Scalar(0, 255, 0, 255), 2); //draw face rect OpenCVForUnityUtils.DrawFaceRect(imgMat, result.rect, new Scalar(255, 0, 0, 255), 2); } faceLandmarkDetector.Dispose(); Texture2D texture = new Texture2D(imgMat.cols(), imgMat.rows(), TextureFormat.RGBA32, false); // Convert OpenCV Mat to Unity Texture2D. OpenCVForUnity.Utils.matToTexture2D(imgMat, texture); gameObject.GetComponent <Renderer> ().material.mainTexture = texture; }