Home / Artikel / Computer Vision Series: API .NET untuk OpenCV AI Kit

Computer Vision Series: API .NET untuk OpenCV AI Kit

Hi Rekan Dev,

Pie kabare ? semoga sehat” ya. Kalau rekan-rekan salah satu yang tertarik dengan Computer Vision pasti pernah denger OpenCV ya ? Ya singkatan dari open source computer vision library, beberapa waktu yang lampau mereka itu bikin crowdfunding untuk projectnya yaitu OpenCV AI Kit, coba tengok link berikut : OpenCV AI Kit by OpenCV — Kickstarter

Nah cakep banget ya, Open CV AI Kit yang biasa disingkat dengan OAK ini punya banyak varian, ada OAK 1, OAK D. Bahkan mereka sekarang punya store di OPENCV.AI HARDWARE STORE– OpenCV.AI

OpenCV itu library berisi macam-macam fungsi untuk computer vision secara realtime.  Beberapa kemampuan OAK ini antara lain sebagai berikut:

Nah cakep bener ya, dari sisi hardware perbandingan OAK 1 dan OAK D sebagai berikut:

di belakangnya ada chipnya intel Myriad X dengan kemampuan proses 4T operation per second.

Ini salah satu chip tercepat untuk memproses model neural network khususnya untuk computer vision.

Nah, OAK 1 dan OAK D punya kemampuan khusus yaitu:

Nah pembuat hardwarenya itu Luxonis, mereka ini sudah sediakan API beserta dokumentasinya di DepthAI’s Documentation — DepthAI documentation | Luxonis

Nah buat developer .NET pasti aga sedih karena yang disupport dari bawaannya cuma python dan C++, no worry ok, disini kita bikin wrapper dari library C++ beserta contohnya penggunaannya.. Gimana ? asik yah.. uhuuyyy…

Tapi karena ini cuma side project jadi kita kerjain bertahap ya, saat ini baru bisa untuk deteksi pose kepala dan deteksi wajah dan lokasinya.

Nah, rekan-rekan bisa langsung coba project dan APInya dari repo berikut Gravicode/DepthAI-NET: This is experimental API wrapper for Luxonis Depth AI for .Net, supported device : OAK 1, OAK D (github.com)

Nah ini contoh saat dijalankan:

Contoh penggunaan di codingnya:

DaiFaceDetector face;
        DaiStreams stream;
        DaiObjectDetector objdet;
        DaiBodyPose pose;
        public Form1()
        {
            InitializeComponent();
            Setup();
        }

        record analysistype (string name, string value);

        void Clear()
        {
            PicBox1.Image = null;
            PicBox2.Image = null;
            PicBox3.Image = null;
            PicBox4.Image = null;
            PicBox5.Image = null;
            PicBox6.Image = null;
            TxtInfo.Clear();
        }
        void Setup()
        {
            var listAnalysis = new List<analysistype>() { 
             new analysistype ("face","face"),
             new analysistype ("body pose","body-pose"),
             new analysistype ("object detector","object-detector"),
             new analysistype ("streams","streams"),
            };
            CmbType.DataSource = listAnalysis;
            CmbType.DisplayMember = "name";
            CmbType.ValueMember = "value";
            
            var manager = new OAKDeviceManager();
            var list = manager.GetAvailableDevices();

           
           
            //stream = new();
            BtnStart.Click += (a,b) => {
                Clear();
                var selItem = CmbType.SelectedItem as analysistype;
                var device = list.First();
                switch (selItem.value)
                {
                    case "face":
                        face = new DaiFaceDetector();

                        face.FaceDetected += (_, o) => {
                            if (InvokeRequired)
                            {
                                this.BeginInvoke((MethodInvoker)delegate ()
                                {
                                    PicBox1.Image = o.NewImage;
                                    TxtInfo.Clear();
                                    TxtInfo.Text = $"center X: {o.valueCenterX}\ncenter Y: {o.valueCenterY}";
                                });
                            }
                            else
                            {
                                PicBox1.Image = o.NewImage;
                                TxtInfo.Clear();
                                TxtInfo.Text = $"center X: {o.valueCenterX}\ncenter Y: {o.valueCenterY}";
                            }
                        };

                        face.device = new();
                        face.device.deviceId = device.deviceId;
                        face.ConnectDevice();
                       
                        face.StartAnalysis();
                        break;  
                    case "streams":
                        stream = new();

                        stream.FrameReceived += (_, o) => {
                            if (InvokeRequired)
                            {
                                this.BeginInvoke((MethodInvoker)delegate ()
                                {
                                    PicBox1.Image = o.ColorImage;
                                    PicBox2.Image = o.MonoLImage;
                                    PicBox3.Image = o.MonoRImage;
                                    PicBox4.Image = o.DepthImage;
                                    PicBox5.Image = o.DisparityImage;
                                    TxtInfo.Clear();
                                });
                            }
                            else
                            {
                                PicBox1.Image = o.ColorImage;
                                PicBox2.Image = o.MonoLImage;
                                PicBox3.Image = o.MonoRImage;
                                PicBox4.Image = o.DepthImage;
                                PicBox5.Image = o.DisparityImage;
                                TxtInfo.Clear();
                            }
                        };

                        stream.device = new();
                        stream.device.deviceId = device.deviceId;
                        stream.ConnectDevice();
                        stream.StartAnalysis();
                        break;
                    case "object-detector":
                        objdet = new ();

                        objdet.ObjectDetected += (_, o) => {
                            if (InvokeRequired)
                            {
                                this.BeginInvoke((MethodInvoker)delegate ()
                                {
                                    PicBox1.Image = o.NewImage;
                                    TxtInfo.Clear();
                                    foreach(var obj in o.DetectedObjects)
                                    {
                                        TxtInfo.Text += $"label: {obj.Label}, score: {obj.Score}, pos: ({obj.Position.X},{obj.Position.Y},{obj.Position.Z})\n";
                                    }
                                    
                                });
                            }
                            else
                            {
                                PicBox1.Image = o.NewImage;
                                TxtInfo.Clear();
                                foreach (var obj in o.DetectedObjects)
                                {
                                    TxtInfo.Text += $"label: {obj.Label}, score: {obj.Score}, pos: ({obj.Position.X},{obj.Position.Y},{obj.Position.Z})\n";
                                }
                            }
                        };

                        objdet.device = new();
                        objdet.device.deviceId = device.deviceId;
                        objdet.ConnectDevice();

                        objdet.StartAnalysis();
                        break;
                    case "body-pose":
                        pose = new();

                        pose.PoseChanged += (_, o) => {
                            if (InvokeRequired)
                            {
                                this.BeginInvoke((MethodInvoker)delegate ()
                                {
                                    PicBox1.Image = o.NewImage;
                                    TxtInfo.Clear();
                                    var counter = 0;
                                    TxtInfo.Text = "skeletons:\n";
                                    foreach (var obj in o.Skeletons)
                                    {
                                        if(obj.IsActive)
                                            TxtInfo.Text += $"ID: {counter++}, pos: {obj.Position} \n";
                                    }
                                    TxtInfo.Text += "heads:\n";
                                    foreach (var obj in o.Heads)
                                    {
                                        if (obj.IsActive)
                                            TxtInfo.Text += $"ID: {counter++}, pos: {obj.Position} \n";
                                    }
                                });
                            }
                            else
                            {
                                PicBox1.Image = o.NewImage;
                                TxtInfo.Clear();
                                var counter = 0;
                                TxtInfo.Text = "skeletons:\n";
                                foreach (var obj in o.Skeletons)
                                {
                                    if (obj.IsActive)
                                        TxtInfo.Text += $"ID: {counter++}, pos: {obj.Position} \n";
                                }
                                TxtInfo.Text += "heads:\n";
                                foreach (var obj in o.Heads)
                                {
                                    if (obj.IsActive)
                                        TxtInfo.Text += $"ID: {counter++}, pos: {obj.Position} \n";
                                }
                            }
                        };

                        pose.device = new();
                        pose.device.deviceId = device.deviceId;
                        pose.ConnectDevice();

                        pose.StartAnalysis();
                        break;
                    default:
                        break;
                }
                CmbType.Enabled = false;
            };
            BtnStop.Click += (a,b) => {
                var selItem = CmbType.SelectedItem as analysistype;
                switch (selItem.value)
                {
                    case "face":
                        face.FinishDevice();
                        face.Dispose();
                        break;
                    case "streams":
                        stream.FinishDevice();
                        stream.Dispose();
                        break;
                    case "object-detector":
                        objdet.FinishDevice();
                        objdet.Dispose();
                        break;
                    case "body-pose":
                        pose.FinishDevice();
                        pose.Dispose();
                        break;
                    default:
                        break;
                }
                CmbType.Enabled = true;

            };
            
           
        }

Nah yang rekan-rekan perlu siapkan itu cuma:

  1. Download .NET (Linux, macOS, and Windows) (microsoft.com)
  2. Download Visual Studio Tools – Install Free for Windows, Mac, Linux (microsoft.com)

Selamat berkreasi yah..

Salam Dev

1,280 total views, 2 views today

About Muhammad Ibnu Fadhil

Penulis kode, pedagang aplikasi perkantoran, implementator integrasi sistem, memiliki UKM yaitu gravicode.com, mendirikan komunitas kecil gadgeteer Indonesia, mendedikasikan diri untuk membangun produk dan jasa yang bermanfaat untuk ummat terutama di bidang teknologi informasi.

Check Also

Web Series: Crawling Isi Website

Hi Rekan Devs, Pa kabar ? sebentar lagi puasa, pada jaga kesehatan yo..  Nah, kali …