123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- #if ZED_OPENCV_FOR_UNITY
- using OpenCVForUnity.CoreModule;
- using OpenCVForUnity.ImgprocModule;
- using OpenCVForUnity.UnityUtils;
- using OpenCVForUnity.UtilsModule;
- using sl;
- using System.Collections.Generic;
- using UnityEngine;
- public class ZEDToOpenCVRetriever : MonoBehaviour
- {
- #region Singleton Implementation
- private static ZEDToOpenCVRetriever _instance;
-
-
-
-
-
- public static ZEDToOpenCVRetriever GetInstance()
- {
- if(!_instance)
- {
- GameObject go = new GameObject("ZED to OpenCV Retriever");
- _instance = go.AddComponent<ZEDToOpenCVRetriever>();
- }
- return _instance;
- }
- #endregion
-
-
-
-
- [Tooltip("ZEDManager in the scene used to grab the image." +
- "Note this script isn't currently designed for multiple ZEDs.")]
- public ZEDManager zedManager;
-
-
-
- private ZEDCamera zedCam;
-
-
-
- private Mat camMat;
- public delegate void ImageUpdatedEvent(Camera cam, Mat camMat, Mat imageMat);
-
-
-
- public event ImageUpdatedEvent OnImageUpdated_LeftBGRA;
-
-
-
- public event ImageUpdatedEvent OnImageUpdated_LeftBGR;
-
-
-
- public event ImageUpdatedEvent OnImageUpdated_LeftRGBA;
-
-
-
- public event ImageUpdatedEvent OnImageUpdated_LeftRGB;
-
-
-
- public event ImageUpdatedEvent OnImageUpdated_LeftGrayscale;
-
- private ZEDMat zedLeftBGRAMat;
- private ZEDMat zedLeftGrayMat;
-
-
-
-
- private Dictionary<int, Mat> openCVBufferMats = new Dictionary<int, Mat>();
- private Mat cvLeftBGRAMat;
- private Mat cvLeftBGRMat;
- private Mat cvLeftRGBAMat;
- private Mat cvLeftRGBMat;
- private Mat cvLeftGrayMat;
-
-
-
- private bool isInit = false;
- private void Awake()
- {
- _instance = this;
- if (!zedManager) zedManager = FindObjectOfType<ZEDManager>();
- }
-
- void Start ()
- {
-
-
- zedManager.OnZEDReady += Initialize;
-
- zedManager.OnGrab += OnZEDGrabbed;
- }
-
-
-
- private void Initialize()
- {
- zedCam = zedManager.zedCamera;
- sl.CameraParameters camparams = zedCam.CalibrationParametersRectified.leftCam;
-
- double fx = camparams.fx;
- double fy = camparams.fy;
- double cx = camparams.cx;
- double cy = camparams.cy;
-
- camMat = new Mat(3, 3, CvType.CV_64FC1);
- camMat.put(0, 0, fx);
- camMat.put(0, 1, 0);
- camMat.put(0, 2, cx);
- camMat.put(1, 0, 0);
- camMat.put(1, 1, fy);
- camMat.put(1, 2, cy);
- camMat.put(2, 0, 0);
- camMat.put(2, 1, 0);
- camMat.put(2, 2, 0.0f);
- Size imageSize = new Size(zedCam.ImageWidth, zedCam.ImageHeight);
-
-
-
-
-
- isInit = true;
- }
-
-
-
-
-
- private void OnZEDGrabbed()
- {
- if (!isInit) return;
- if(OnImageUpdated_LeftBGRA != null && OnImageUpdated_LeftBGRA.GetInvocationList().Length > 0)
- {
- DeployGrabbedEvent(zedManager.GetLeftCamera(), ref zedLeftBGRAMat, VIEW.LEFT, ZEDMat.MAT_TYPE.MAT_8U_C4, ref cvLeftBGRAMat, OnImageUpdated_LeftBGRA);
- }
- if (OnImageUpdated_LeftBGR != null && OnImageUpdated_LeftBGR.GetInvocationList().Length > 0)
- {
- DeployGrabbedEvent(zedManager.GetLeftCamera(), ref zedLeftBGRAMat, VIEW.LEFT, ZEDMat.MAT_TYPE.MAT_8U_C4, ref cvLeftBGRMat, OnImageUpdated_LeftBGR, OpenCVConversion.BGRA2BGR);
- }
- if (OnImageUpdated_LeftRGBA != null && OnImageUpdated_LeftRGBA.GetInvocationList().Length > 0)
- {
- DeployGrabbedEvent(zedManager.GetLeftCamera(), ref zedLeftBGRAMat, VIEW.LEFT, ZEDMat.MAT_TYPE.MAT_8U_C4, ref cvLeftRGBAMat, OnImageUpdated_LeftRGBA, OpenCVConversion.BGRA2RGBA);
- }
- if (OnImageUpdated_LeftRGB != null && OnImageUpdated_LeftRGB.GetInvocationList().Length > 0)
- {
- DeployGrabbedEvent(zedManager.GetLeftCamera(), ref zedLeftBGRAMat, VIEW.LEFT, ZEDMat.MAT_TYPE.MAT_8U_C4, ref cvLeftRGBMat, OnImageUpdated_LeftRGB, OpenCVConversion.BGRA2RGB);
- }
- if (OnImageUpdated_LeftGrayscale != null && OnImageUpdated_LeftGrayscale.GetInvocationList().Length > 0)
- {
- DeployGrabbedEvent(zedManager.GetLeftCamera(), ref zedLeftGrayMat, VIEW.LEFT_GREY, ZEDMat.MAT_TYPE.MAT_8U_C1, ref cvLeftGrayMat, OnImageUpdated_LeftGrayscale);
- }
- }
-
-
-
-
-
-
-
-
-
-
- private void DeployGrabbedEvent(Camera cam, ref ZEDMat zedmat, VIEW view, ZEDMat.MAT_TYPE mattype, ref Mat cvMat, ImageUpdatedEvent updateevent,
- OpenCVConversion conversionatend = OpenCVConversion.NONE)
- {
- if(zedmat == null)
- {
- zedmat = new ZEDMat();
- zedmat.Create(new sl.Resolution((uint)zedCam.ImageWidth, (uint)zedCam.ImageHeight), mattype);
- }
- ERROR_CODE err = zedManager.zedCamera.RetrieveImage(zedmat, view, ZEDMat.MEM.MEM_CPU, zedmat.GetResolution());
-
- if (err == ERROR_CODE.SUCCESS)
- {
- Mat buffermat = GetOpenCVBufferMat(zedCam.ImageHeight, zedCam.ImageWidth, SLMatType2CVMatType(mattype));
-
- Utils.copyToMat(zedmat.GetPtr(), buffermat);
- ConvertColorSpace(buffermat, ref cvMat, conversionatend);
-
-
- updateevent.Invoke(cam, camMat, cvMat);
- }
- }
-
-
-
-
-
-
-
-
-
-
- private static Mat SLMat2CVMat(sl.ZEDMat zedmat, ZEDMat.MAT_TYPE zedmattype)
- {
- int cvmattype = SLMatType2CVMatType(zedmattype);
- Mat cvmat = new Mat(zedmat.GetHeight(), zedmat.GetWidth(), cvmattype);
- return cvmat;
- }
-
-
-
- private static int SLMatType2CVMatType(ZEDMat.MAT_TYPE zedmattype)
- {
- switch (zedmattype)
- {
- case ZEDMat.MAT_TYPE.MAT_32F_C1:
- return CvType.CV_32FC1;
- case ZEDMat.MAT_TYPE.MAT_32F_C2:
- return CvType.CV_32FC2;
- case ZEDMat.MAT_TYPE.MAT_32F_C3:
- return CvType.CV_32FC3;
- case ZEDMat.MAT_TYPE.MAT_32F_C4:
- return CvType.CV_32FC4;
- case ZEDMat.MAT_TYPE.MAT_8U_C1:
- return CvType.CV_8UC1;
- case ZEDMat.MAT_TYPE.MAT_8U_C2:
- return CvType.CV_8UC2;
- case ZEDMat.MAT_TYPE.MAT_8U_C3:
- return CvType.CV_8UC3;
- case ZEDMat.MAT_TYPE.MAT_8U_C4:
- return CvType.CV_8UC4;
- case ZEDMat.MAT_TYPE.MAT_16U_C1:
- return CvType.CV_16UC1;
- default:
- return -1;
- }
- }
-
-
-
-
-
-
-
-
-
- private Mat GetOpenCVBufferMat(int height, int width, int cvtype)
- {
- if(!openCVBufferMats.ContainsKey(cvtype))
- {
- openCVBufferMats.Add(cvtype, new Mat(height, width, cvtype));
- }
- return openCVBufferMats[cvtype];
- }
-
-
-
-
- private void ConvertColorSpace(Mat source, ref Mat dest, OpenCVConversion converttype)
- {
- switch (converttype)
- {
- case OpenCVConversion.NONE:
- default:
- dest = source;
- break;
- case OpenCVConversion.BGRA2BGR:
-
- if(dest == null) dest = new Mat(source.rows(), source.cols(), CvType.CV_8UC3, new Scalar(0, 0, 0));
- Imgproc.cvtColor(source, dest, Imgproc.COLOR_BGRA2BGR);
- break;
- case OpenCVConversion.BGRA2RGB:
- if(dest == null) dest = new Mat(source.rows(), source.cols(), CvType.CV_8UC3, new Scalar(0, 0, 0));
- Imgproc.cvtColor(source, dest, Imgproc.COLOR_BGRA2RGB);
- break;
- case OpenCVConversion.BGRA2RGBA:
-
- if (dest == null) dest = new Mat(source.rows(), source.cols(), CvType.CV_8UC3, new Scalar(0, 0, 0));
- Imgproc.cvtColor(source, dest, Imgproc.COLOR_BGRA2RGBA);
- break;
- }
- }
-
-
-
-
- private enum OpenCVConversion
- {
- NONE,
- BGRA2BGR,
- BGRA2RGBA,
- BGRA2RGB
- }
- }
- #endif
|