Example #1
0
        void L1opticalFlowforPictures()
        {
            int i = 0;

            opticalFlow.Height   = inputImage_1.ImageHeight;
            opticalFlow.Width    = inputImage_1.ImageWidth;
            opticalFlow.Array    = new float[2][];
            opticalFlow.Array[0] = new float[opticalFlow.Width * opticalFlow.Height];
            opticalFlow.Array[1] = new float[opticalFlow.Width * opticalFlow.Height];

            sw.Start();
            opticalFlow = L1flow.TV_L1_opticalFlow(inputImage_1.Bitmap, inputImage_2.Bitmap, out i);
            sw.Stop();
            label10.Text    = String.Format("Run time: {0} [s]", Convert.ToString(sw.Elapsed.TotalSeconds));
            label10.Visible = true;
            float[] length = _CLProcessor.calcFlowLength(opticalFlow);
            label11.Text      = String.Format("Max value: {0} [pixel/frame transition]", Convert.ToString(length.Max()));
            OutputImage       = _CLProcessor.decorateFlowColor(inputImage_1.Bitmap, opticalFlow, L1flow.flowInterval, L1flow.threshold);
            pictureBox3.Image = OutputImage.Bitmap;
            sw.Reset();

            // label12.Text = String.Format(Convert.ToString(i));
            //label11.Visible = true;
            //label12.Visible = true;
            saveToolStripMenuItem.Enabled = true;
        }
Example #2
0
        private void flowToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();

            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                _ImageFileHandler.WriteFlowArrayToFloFile(FlowArray.ExpandForEvaluation(_SingleFlow, _LeftFlowImage.ImageWidth, _LeftFlowImage.ImageHeight), saveFileDialog.FileName);
            }
        }
Example #3
0
        private void Button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            string         Path;

            if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                Path        = ofd.FileName;
                groundtruth = fileHandler.convertFloToFlowArray(Path);
            }
        }
Example #4
0
        public FlowArray calcOpticalFlow(Bitmap image0, Bitmap image1, out int realiteration)

        {
            SimpleImage Image0      = new SimpleImage(image0);
            SimpleImage Image1      = new SimpleImage(image1);
            FlowArray   opticalFlow = new FlowArray();

            opticalFlow.Height   = Image1.ImageHeight;
            opticalFlow.Width    = Image1.ImageWidth;
            opticalFlow.Array    = new float[2][];
            opticalFlow.Array[0] = new float[opticalFlow.Width * opticalFlow.Height];
            opticalFlow.Array[1] = new float[opticalFlow.Width * opticalFlow.Height];


            float[][] J = new float[6][];
            J[0] = new float[opticalFlow.Width * opticalFlow.Height];
            J[1] = new float[opticalFlow.Width * opticalFlow.Height];
            J[2] = new float[opticalFlow.Width * opticalFlow.Height];
            J[3] = new float[opticalFlow.Width * opticalFlow.Height];
            J[4] = new float[opticalFlow.Width * opticalFlow.Height];



            float errorValue = threshold;
            int   i          = 0;

            if (sigma == 0)
            {
                while (!((i == iteration)))
                {
                    opticalFlow = calcLocalGlobalOpticalFlow(Image0, Image1, opticalFlow);

                    i++;
                }
            }

            if (sigma != 0)
            {
                J = calc_J(Image0, Image1);
                J = Gauss_J(J, Image0.ImageWidth, Image0.ImageHeight);


                while (!((i == iteration)))
                {
                    opticalFlow = calcLocalGlobalOpticalFlow_withSmoothed_J(J, opticalFlow);


                    i++;
                }
            }
            realiteration = i;
            return(opticalFlow);
        }
Example #5
0
        void HSopticalFlowwithPyramid()
        {
            sw.Start();
            opticalFlow = HornSchunck.HS_pyramidical_opticalFlow(inputImage_1, inputImage_2);
            sw.Stop();
            label9.Text    = String.Format("Run time: {0} [s]", Convert.ToString(sw.Elapsed.TotalSeconds));
            label9.Visible = true;
            float[] length = _CLProcessor.calcFlowLength(opticalFlow);
            label18.Text = String.Format("Max value: {0} [pixel/frame transition]", Convert.ToString(length.Max()));

            OutputImage       = _CLProcessor.decorateFlowColor(inputImage_1.Bitmap, opticalFlow, HornSchunck.flowInterval, HornSchunck.threshold);
            pictureBox3.Image = OutputImage.Bitmap;
            sw.Reset();
            saveToolStripMenuItem.Enabled = true;
        }
Example #6
0
        private void calcHornSchunck_video()
        {
            FlowArray opticalFlow = new FlowArray();

            opticalFlow.Height   = input1bitmap.Height;
            opticalFlow.Width    = input1bitmap.Width;
            opticalFlow.Array    = new float[2][];
            opticalFlow.Array[0] = new float[opticalFlow.Width * opticalFlow.Height];
            opticalFlow.Array[1] = new float[opticalFlow.Width * opticalFlow.Height];

            if (videoSelected)
            {
                while (!(image.Empty()))
                {
                    input1bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image);
                    sw.Start();
                    for (int i = 0; i < 1; i++)
                    {
                        opticalFlow = HornSchunck.calculateOpticalFlow(input1bitmap, input2bitmap, out int k, opticalFlow);
                    }


                    OutputVideo = _CLProcessor.decorateFlowColor(input1bitmap, opticalFlow, HornSchunck.flowInterval, HornSchunck.threshold);
                    pictureBox4.Image.Dispose();
                    pictureBox5.Image.Dispose();

                    pictureBox4.Image = OutputVideo.Bitmap;
                    pictureBox5.Image = input1bitmap;

                    Application.DoEvents();
                    pictureBox4.Refresh();
                    pictureBox5.Refresh();
                    sw.Stop();
                    runTime        = 1 / (float)sw.Elapsed.TotalSeconds;
                    label9.Text    = String.Format("Frame rate: {0} [fps]", Convert.ToString(runTime));
                    label9.Visible = true;
                    sw.Reset();
                    input2bitmap = input1bitmap;
                    capture.Read(image);
                }
            }
            videoSelected = false;
            capture.Dispose();
            image.Dispose();
            pictureBox4.Image.Dispose();
            pictureBox5.Image.Dispose();
        }
Example #7
0
        void LGopticalFlowforPictures()
        {
            int i = 0;

            sw.Start();
            opticalFlow = LGflow.calcOpticalFlow(inputImage_1.Bitmap, inputImage_2.Bitmap, out i);
            sw.Stop();
            label9.Text    = String.Format("Run time: {0} [s]", Convert.ToString(sw.Elapsed.TotalSeconds));
            label9.Visible = true;
            float[] length = _CLProcessor.calcFlowLength(opticalFlow);
            label17.Text      = String.Format("Max value: {0} [pixel/frame transition]", Convert.ToString(length.Max()));
            OutputImage       = _CLProcessor.decorateFlowColor(inputImage_1.Bitmap, opticalFlow, LGflow.flowInterval, LGflow.threshold);
            pictureBox3.Image = OutputImage.Bitmap;
            sw.Reset();



            saveToolStripMenuItem.Enabled = true;
        }
Example #8
0
        private void CalcOpticalFlowBase(Bitmap leftInput, Bitmap rightInput, Func <SimpleImage, SimpleImage, int, FlowArray> flowCalcFunc, int pyramidLevel = 4)
        {
            SimpleImage left  = new SimpleImage(leftInput);
            SimpleImage right = new SimpleImage(rightInput);


            System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
            watch.Start();
            _SingleFlow = flowCalcFunc(left, right, pyramidLevel);
            watch.Stop();

            this.CalculationTimeText.Text = watch.Elapsed.Milliseconds.ToString();

            SimpleImage demonstrator = _CLProcessor.ModifyImageWithFlow(left, null, _SingleFlow);

            _LeftFlowImage  = left;
            _RightFlowImage = right;
            _DIsplayedImage = _LeftFlowImage;
            _ModifiedImage  = demonstrator;
        }
Example #9
0
        public FlowArray LG_pyramidical_opticalFlow(SimpleImage Image0, SimpleImage Image1)
        {
            SimpleImage[][] pyramids     = cLProcessor.CreatePyramids(Image0, Image1, pyramidLevel);
            SimpleImage[]   leftPyramid  = pyramids[0];
            SimpleImage[]   rightPyramid = pyramids[1];

            FlowArray[] flows = new FlowArray[pyramidLevel];

            flows[pyramidLevel - 1] = calcOpticalFlow(leftPyramid[pyramidLevel - 1].Bitmap, rightPyramid[pyramidLevel - 1].Bitmap, out int k);

            SimpleImage warpImage = new SimpleImage();

            for (int i = 1; i < pyramidLevel; i++)
            {
                flows[pyramidLevel - (i + 1)] = FlowArray.Expand(flows[pyramidLevel - i], leftPyramid[pyramidLevel - (i + 1)].ImageWidth, leftPyramid[pyramidLevel - (i + 1)].ImageHeight);
                warpImage = cLProcessor.pushImagewithFlow(leftPyramid[pyramidLevel - (i + 1)], flows[pyramidLevel - (i + 1)]);
                FlowArray correction = calcOpticalFlow(warpImage.Bitmap, rightPyramid[pyramidLevel - (i + 1)].Bitmap, out k);
                flows[pyramidLevel - (i + 1)] = flows[pyramidLevel - (i + 1)] + correction;
            }

            return(flows[0]);
        }
Example #10
0
        private void calcL1_video()
        {
            if (videoSelected)
            {
                while (!(image.Empty()))
                {
                    input1bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image);
                    sw.Start();

                    opticalFlow = L1flow.TV_L1_opticalFlow(input1bitmap, input2bitmap, out int k);



                    OutputVideo = _CLProcessor.decorateFlowColor(input1bitmap, opticalFlow, L1flow.flowInterval, L1flow.threshold);
                    pictureBox4.Image.Dispose();
                    pictureBox5.Image.Dispose();

                    pictureBox4.Image = OutputVideo.Bitmap;
                    pictureBox5.Image = input1bitmap;

                    Application.DoEvents();
                    pictureBox4.Refresh();
                    pictureBox5.Refresh();
                    sw.Stop();
                    runTime         = 1 / (float)sw.Elapsed.TotalSeconds;
                    label10.Text    = String.Format("Frame rate: {0} [fps]", Convert.ToString(runTime));
                    label10.Visible = true;
                    sw.Reset();
                    input2bitmap = input1bitmap;
                    capture.Read(image);
                }
            }
            videoSelected = false;
            capture.Dispose();
            image.Dispose();
            pictureBox4.Image.Dispose();
            pictureBox5.Image.Dispose();
        }
Example #11
0
        private void playVideowithSaving()
        {
            Mat        save = new Mat();
            FileDialog ofd  = new SaveFileDialog();

            string imagePath;

            OpenCvSharp.FourCC codec = OpenCvSharp.FourCC.Default;
            OpenCvSharp.CvSize size;
            size.Height = input1bitmap.Height;
            size.Width  = input1bitmap.Width;


            FlowArray opticalFlow = new FlowArray();

            opticalFlow.Height   = input1bitmap.Height;
            opticalFlow.Width    = input1bitmap.Width;
            opticalFlow.Array    = new float[2][];
            opticalFlow.Array[0] = new float[opticalFlow.Width * opticalFlow.Height];
            opticalFlow.Array[1] = new float[opticalFlow.Width * opticalFlow.Height];
            if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                imagePath = ofd.FileName;



                videofilename = String.Format("{0}.avi", imagePath);
            }


            VideoWriter savevid = new VideoWriter();

            savevid.Open(videofilename, codec, 24, size, true);

            if (videoSelected)
            {
                while (!(image.Empty()))
                {
                    input1bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image);
                    sw.Start();
                    for (int i = 0; i < 1; i++)
                    {
                        opticalFlow = HornSchunck.calculateOpticalFlow(input1bitmap, input2bitmap, out int k, opticalFlow);
                    }


                    OutputVideo = _CLProcessor.decorateFlowColor(input1bitmap, opticalFlow, HornSchunck.flowInterval, HornSchunck.threshold);
                    save        = OpenCvSharp.Extensions.BitmapConverter.ToMat(OutputVideo.Bitmap);

                    savevid.Write(save);
                    pictureBox4.Image.Dispose();
                    pictureBox5.Image.Dispose();

                    pictureBox4.Image = OutputVideo.Bitmap;
                    pictureBox5.Image = input1bitmap;

                    Application.DoEvents();
                    pictureBox4.Refresh();
                    pictureBox5.Refresh();
                    sw.Stop();
                    runTime        = 1 / (float)sw.Elapsed.TotalSeconds;
                    label9.Text    = String.Format("Frame rate: {0} [fps]", Convert.ToString(runTime));
                    label9.Visible = true;
                    sw.Reset();
                    input2bitmap = input1bitmap;
                    capture.Read(image);
                }
            }
            videoSelected = false;
            capture.Dispose();
            image.Dispose();
            savevid.Release();
            //savevid.Dispose();
            pictureBox4.Image.Dispose();
            pictureBox5.Image.Dispose();
        }
Example #12
0
        public FlowArray calculateOpticalFlow(Bitmap image0, Bitmap image1, out int realIteration, FlowArray opticalFlow)


        {
            SimpleImage inputImage_1 = new SimpleImage(image0);
            SimpleImage inputImage_2 = new SimpleImage(image1);

            opticalFlow = new FlowArray();
            FlowArray   opticalFlowNext = new FlowArray();
            FlowArray   finalFlow       = new FlowArray();
            FlowArray   medFlow         = new FlowArray();
            FlowArray   tempFlow        = new FlowArray();
            FlowArray   flowError       = new FlowArray();
            SimpleImage Id = new SimpleImage();

            if (opticalFlow == null)
            {
                opticalFlow          = new FlowArray();
                opticalFlow.Height   = inputImage_1.ImageHeight;
                opticalFlow.Width    = inputImage_1.ImageWidth;
                opticalFlow.Array    = new float[2][];
                opticalFlow.Array[0] = new float[opticalFlow.Width * opticalFlow.Height];
                opticalFlow.Array[1] = new float[opticalFlow.Width * opticalFlow.Height];
            }

            opticalFlowNext          = opticalFlow;
            opticalFlowNext.Height   = inputImage_1.ImageHeight;
            opticalFlowNext.Width    = inputImage_1.ImageWidth;
            opticalFlowNext.Array    = new float[2][];
            opticalFlowNext.Array[0] = new float[opticalFlowNext.Width * opticalFlowNext.Height];
            opticalFlowNext.Array[1] = new float[opticalFlowNext.Width * opticalFlowNext.Height];

            tempFlow.Array    = new float[2][];
            tempFlow.Height   = inputImage_1.ImageHeight;
            tempFlow.Width    = inputImage_1.ImageWidth;
            tempFlow.Array[0] = new float[medFlow.Width * medFlow.Height];
            tempFlow.Array[1] = new float[medFlow.Width * medFlow.Height];


            flowError.Array    = new float[1][];
            flowError.Height   = inputImage_1.ImageHeight;
            flowError.Width    = inputImage_1.ImageWidth;
            flowError.Array[0] = new float[flowError.Width * flowError.Height];



            float thresholdin = eps * eps;
            float errorValue  = thresholdin;

            int i = 0;

            //if (pyramidOn == 1)
            //{
            //while (!((i == maxIteration) || (thresholdin > errorValue)))
            while (!((i == maxIteration)))
            {
                tempFlow    = opticalFlow;
                opticalFlow = HS_OpticalFlow(inputImage_1.Bitmap, inputImage_2.Bitmap, opticalFlow, alpha);
                //float [] error= cLProcessor.calcFlowDist(opticalFlow, tempFlow);
                // errorValue = (error.Average());
                // Console.WriteLine(errorValue);
                i++;
            }
            realIteration = i;


            return(opticalFlow);
        }
Example #13
0
        private FlowArray HS_OpticalFlow(Bitmap input1, Bitmap input2, FlowArray inputFlow, float alpha)
        {
            SimpleImage left  = new SimpleImage(input1);
            SimpleImage right = new SimpleImage(input2);



            try
            {
                if (left.ImageHeight != right.ImageHeight || left.ImageWidth != right.ImageWidth)
                {
                    throw (new ArgumentException("The size of the left and right images are not the same!"));
                }

                ErrorCode error;


                FlowArray resultFlowArray = new FlowArray();
                resultFlowArray.Array    = new float[2][];
                resultFlowArray.Width    = input1.Width;
                resultFlowArray.Height   = input1.Height;
                resultFlowArray.Array[0] = new float[resultFlowArray.Width * resultFlowArray.Height];
                resultFlowArray.Array[1] = new float[resultFlowArray.Width * resultFlowArray.Height];

                Kernel flowKernel = Cl.CreateKernel(program, "hornSchunck", out error);

                Mem leftImageMemObject = (Mem)Cl.CreateImage2D(context, MemFlags.ReadOnly | MemFlags.CopyHostPtr, SimpleImage.clImageFormat, (IntPtr)left.ImageWidth, (IntPtr)left.ImageHeight, (IntPtr)0, left.ByteArray, out error);

                Mem rightImageMemObject = (Mem)Cl.CreateImage2D(context, MemFlags.ReadOnly | MemFlags.CopyHostPtr, SimpleImage.clImageFormat, (IntPtr)right.ImageWidth, (IntPtr)right.ImageHeight, (IntPtr)0, right.ByteArray, out error);



                IMem <float> uInputFlowMemObject = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, inputFlow.Width * inputFlow.Height * sizeof(float), out error);

                IMem <float> vInputFlowMemObject = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, inputFlow.Width * inputFlow.Height * sizeof(float), out error);

                IMem <float> uOutputFlowMemObject = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, resultFlowArray.Width * resultFlowArray.Height * sizeof(float), out error);

                IMem <float> vOutputlowMemObject = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, resultFlowArray.Width * resultFlowArray.Height * sizeof(float), out error);

                error  = Cl.SetKernelArg(flowKernel, 0, leftImageMemObject);
                error |= Cl.SetKernelArg(flowKernel, 1, rightImageMemObject);
                error |= Cl.SetKernelArg <float>(flowKernel, 2, uInputFlowMemObject);
                error |= Cl.SetKernelArg <float>(flowKernel, 3, vInputFlowMemObject);
                error |= Cl.SetKernelArg <float>(flowKernel, 4, uOutputFlowMemObject);
                error |= Cl.SetKernelArg <float>(flowKernel, 5, vOutputlowMemObject);
                error |= Cl.SetKernelArg <float>(flowKernel, 6, alpha);
                error |= Cl.SetKernelArg <float>(flowKernel, 7, threshold);
                error |= Cl.SetKernelArg(flowKernel, 8, inputFlow.Width);
                error |= Cl.SetKernelArg(flowKernel, 9, inputFlow.Height);


                Event clEvent;

                IntPtr[] originPtr        = new IntPtr[] { (IntPtr)0, (IntPtr)0, (IntPtr)0 };
                IntPtr[] regionPtr        = new IntPtr[] { (IntPtr)left.ImageWidth, (IntPtr)left.ImageHeight, (IntPtr)1 };
                IntPtr[] workGroupSizePtr = new IntPtr[] { (IntPtr)(inputFlow.Height * inputFlow.Width) };

                error = Cl.EnqueueWriteImage(commandQueue, leftImageMemObject, Bool.True, originPtr, regionPtr, (IntPtr)0, (IntPtr)0, left.ByteArray, 0, null, out clEvent);

                error = Cl.EnqueueWriteImage(commandQueue, rightImageMemObject, Bool.True, originPtr, regionPtr, (IntPtr)0, (IntPtr)0, right.ByteArray, 0, null, out clEvent);


                error = Cl.EnqueueWriteBuffer <float>(commandQueue, uInputFlowMemObject, Bool.True, inputFlow.Array[0], 0, null, out clEvent);

                error = Cl.EnqueueWriteBuffer <float>(commandQueue, vInputFlowMemObject, Bool.True, inputFlow.Array[1], 0, null, out clEvent);


                // Enqueueing the kernel
                error = Cl.EnqueueNDRangeKernel(commandQueue, flowKernel, 1, null, workGroupSizePtr, null, 0, null, out clEvent);

                error = Cl.Finish(commandQueue);

                Cl.EnqueueReadBuffer <float>(commandQueue, uOutputFlowMemObject, Bool.True, 0, (resultFlowArray.Width * resultFlowArray.Height), resultFlowArray.Array[0], 0, null, out clEvent);
                error = Cl.Finish(commandQueue);

                Cl.EnqueueReadBuffer <float>(commandQueue, vOutputlowMemObject, Bool.True, 0, (resultFlowArray.Width * resultFlowArray.Height), resultFlowArray.Array[1], 0, null, out clEvent);
                error = Cl.Finish(commandQueue);


                Cl.ReleaseMemObject(leftImageMemObject);
                Cl.ReleaseMemObject(rightImageMemObject);
                Cl.ReleaseMemObject(uInputFlowMemObject);
                Cl.ReleaseMemObject(vInputFlowMemObject);
                Cl.ReleaseMemObject(uOutputFlowMemObject);
                Cl.ReleaseMemObject(vOutputlowMemObject);
                Cl.ReleaseKernel(flowKernel);


                return(resultFlowArray);
            }
            catch (Exception e)
            {
                throw (new Exception("Flow calculation error", e));
            }
        }
Example #14
0
        public float[][] calc_grad_rho_c(SimpleImage I0, SimpleImage I1d, FlowArray Flow)

        {
            float[][] arrays = new float[4][];

            arrays[0] = new float[I0.ImageHeight * I0.ImageWidth];
            arrays[1] = new float[I0.ImageHeight * I0.ImageWidth];
            arrays[2] = new float[I0.ImageHeight * I0.ImageWidth];
            arrays[3] = new float[I0.ImageHeight * I0.ImageWidth];


            Mem leftImageMemObject = (Mem)Cl.CreateImage2D(context, MemFlags.ReadOnly | MemFlags.CopyHostPtr, SimpleImage.clImageFormat, (IntPtr)I0.ImageWidth, (IntPtr)I0.ImageHeight, (IntPtr)0, I0.ByteArray, out error);

            Mem rightImageMemObject = (Mem)Cl.CreateImage2D(context, MemFlags.ReadOnly | MemFlags.CopyHostPtr, SimpleImage.clImageFormat, (IntPtr)I1d.ImageWidth, (IntPtr)I1d.ImageHeight, (IntPtr)0, I1d.ByteArray, out error);

            IMem <float> uInputFlowMemObject = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> vInputFlowMemObject = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> gradXBuf  = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, Flow.Height * Flow.Width * sizeof(float), out error);
            IMem <float> gradYBuf  = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, Flow.Height * Flow.Width * sizeof(float), out error);
            IMem <float> grad_2Buf = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, Flow.Height * Flow.Width * sizeof(float), out error);
            IMem <float> rho_cBuf  = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, Flow.Height * Flow.Width * sizeof(float), out error);

            Kernel _Kernel = Cl.CreateKernel(program, "gradRho", out error);

            error |= Cl.SetKernelArg(_Kernel, 0, leftImageMemObject);
            error |= Cl.SetKernelArg(_Kernel, 1, rightImageMemObject);
            error |= Cl.SetKernelArg <float>(_Kernel, 2, uInputFlowMemObject);
            error |= Cl.SetKernelArg <float>(_Kernel, 3, vInputFlowMemObject);
            error |= Cl.SetKernelArg <float>(_Kernel, 4, gradXBuf);
            error |= Cl.SetKernelArg <float>(_Kernel, 5, gradYBuf);
            error |= Cl.SetKernelArg <float>(_Kernel, 6, grad_2Buf);
            error |= Cl.SetKernelArg <float>(_Kernel, 7, rho_cBuf);
            error |= Cl.SetKernelArg(_Kernel, 8, I0.ImageWidth);
            error |= Cl.SetKernelArg(_Kernel, 9, I0.ImageHeight);

            Event _event;

            IntPtr[] originPtr        = new IntPtr[] { (IntPtr)0, (IntPtr)0, (IntPtr)0 };
            IntPtr[] regionPtr        = new IntPtr[] { (IntPtr)I0.ImageWidth, (IntPtr)I0.ImageHeight, (IntPtr)1 };
            IntPtr[] workGroupSizePtr = new IntPtr[] { (IntPtr)(Flow.Height * Flow.Width) };


            error = Cl.EnqueueWriteImage(commandQueue, leftImageMemObject, Bool.True, originPtr, regionPtr, (IntPtr)0, (IntPtr)0, I0.ByteArray, 0, null, out _event);

            error = Cl.EnqueueWriteImage(commandQueue, rightImageMemObject, Bool.True, originPtr, regionPtr, (IntPtr)0, (IntPtr)0, I1d.ByteArray, 0, null, out _event);



            error = Cl.EnqueueWriteBuffer <float>(commandQueue, uInputFlowMemObject, Bool.True, Flow.Array[0], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, vInputFlowMemObject, Bool.True, Flow.Array[1], 0, null, out _event);

            error = Cl.EnqueueNDRangeKernel(commandQueue, _Kernel, 1, null, workGroupSizePtr, null, 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, gradXBuf, Bool.True, 0, (Flow.Width * Flow.Height), arrays[0], 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, gradYBuf, Bool.True, 0, (Flow.Width * Flow.Height), arrays[1], 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, grad_2Buf, Bool.True, 0, (Flow.Width * Flow.Height), arrays[2], 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, rho_cBuf, Bool.True, 0, (Flow.Width * Flow.Height), arrays[3], 0, null, out _event);
            error = Cl.Finish(commandQueue);


            Cl.ReleaseMemObject(uInputFlowMemObject);
            Cl.ReleaseMemObject(vInputFlowMemObject);
            Cl.ReleaseMemObject(leftImageMemObject);
            Cl.ReleaseMemObject(rightImageMemObject);
            Cl.ReleaseMemObject(gradXBuf);
            Cl.ReleaseMemObject(gradYBuf);
            Cl.ReleaseMemObject(grad_2Buf);
            Cl.ReleaseMemObject(rho_cBuf);
            Cl.ReleaseKernel(_Kernel);


            return(arrays);
        }
Example #15
0
        public FlowArray TV_L1_opticalFlow(Bitmap image0, Bitmap image1, out int realIteration)

        {
            SimpleImage Image0 = new SimpleImage(image0);
            SimpleImage Image1 = new SimpleImage(image1);

            float[][]   flowDatas   = new float[4][];
            SimpleImage Id          = new SimpleImage();
            FlowArray   opticalFlow = new FlowArray();
            FlowArray   P1          = new FlowArray();
            FlowArray   P2          = new FlowArray();

            opticalFlow.Height   = Image1.ImageHeight;
            opticalFlow.Width    = Image1.ImageWidth;
            opticalFlow.Array    = new float[2][];
            opticalFlow.Array[0] = new float[opticalFlow.Width * opticalFlow.Height];
            opticalFlow.Array[1] = new float[opticalFlow.Width * opticalFlow.Height];
            P1.Height            = Image1.ImageHeight;
            P1.Width             = Image1.ImageWidth;
            P1.Array             = new float[2][];
            P1.Array[0]          = new float[P1.Width * P1.Height];
            P1.Array[1]          = new float[P1.Width * P1.Height];

            P2.Height   = Image1.ImageHeight;
            P2.Width    = Image1.ImageWidth;
            P2.Array    = new float[2][];
            P2.Array[0] = new float[P2.Width * P2.Height];
            P2.Array[1] = new float[P2.Width * P2.Height];
            FlowArray[] P = new FlowArray[2];


            int i = 0;

            Id = Image0;

            for (int j = 0; j < warps; j++)
            {
                if (warps > 1)
                {
                    // Id = cLProcessor.pushImagewithFlow(Image0, opticalFlow);
                }


                flowDatas = calc_grad_rho_c(Id, Image1, opticalFlow);
                float[] I1dx        = flowDatas[0];
                float[] I1dy        = flowDatas[1];
                float[] grad_2      = flowDatas[2];
                float[] rho_c       = flowDatas[3];
                float   thresholdin = this.epsilon * this.epsilon;
                float   errorValue  = threshold;


                while (!((i == this.maxiter)))
                {
                    opticalFlow = calc_divP_Flow(flowDatas[0], flowDatas[1], flowDatas[2], flowDatas[3], opticalFlow, P1, P2);

                    P  = calc_P_field(opticalFlow, P1, P2);
                    P1 = P[0];
                    P2 = P[1];
                    i++;
                }
            }
            realIteration = i;
            return(opticalFlow);
        }
Example #16
0
        public FlowArray[] calc_P_field(FlowArray Flow, FlowArray P1, FlowArray P2)
        {
            ErrorCode error;

            FlowArray outputFlow1 = new FlowArray();

            outputFlow1.Array    = new float[2][];
            outputFlow1.Width    = P1.Width;
            outputFlow1.Height   = P1.Height;
            outputFlow1.Array[0] = new float[outputFlow1.Width * outputFlow1.Height];
            outputFlow1.Array[1] = new float[outputFlow1.Width * outputFlow1.Height];

            FlowArray outputFlow2 = new FlowArray();

            outputFlow2.Array    = new float[2][];
            outputFlow2.Width    = P2.Width;
            outputFlow2.Height   = P2.Height;
            outputFlow2.Array[0] = new float[outputFlow2.Width * outputFlow2.Height];
            outputFlow2.Array[1] = new float[outputFlow2.Width * outputFlow2.Height];


            IMem <float> uInputFlowMemObject = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> vInputFlowMemObject = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> P11_input = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, P1.Width * P1.Height * sizeof(float), out error);

            IMem <float> P12_input = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, P1.Width * P1.Height * sizeof(float), out error);

            IMem <float> P21_input = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, P2.Width * P2.Height * sizeof(float), out error);

            IMem <float> P22_input = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, P2.Width * P2.Height * sizeof(float), out error);



            IMem <float> P11_output = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, outputFlow1.Width * outputFlow1.Height * sizeof(float), out error);

            IMem <float> P12_output = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, outputFlow1.Width * outputFlow1.Height * sizeof(float), out error);

            IMem <float> P21_output = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, outputFlow2.Width * outputFlow2.Height * sizeof(float), out error);

            IMem <float> P22_output = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, outputFlow2.Width * outputFlow2.Height * sizeof(float), out error);


            Kernel _Kernel = Cl.CreateKernel(program, "calcP", out error);

            error |= Cl.SetKernelArg <float>(_Kernel, 0, uInputFlowMemObject);
            error |= Cl.SetKernelArg <float>(_Kernel, 1, vInputFlowMemObject);
            error |= Cl.SetKernelArg <float>(_Kernel, 2, this.tau);
            error |= Cl.SetKernelArg <float>(_Kernel, 3, this.theta);
            error |= Cl.SetKernelArg <float>(_Kernel, 4, P11_input);
            error |= Cl.SetKernelArg <float>(_Kernel, 5, P12_input);
            error |= Cl.SetKernelArg <float>(_Kernel, 6, P21_input);
            error |= Cl.SetKernelArg <float>(_Kernel, 7, P22_input);
            error |= Cl.SetKernelArg <float>(_Kernel, 8, P11_output);
            error |= Cl.SetKernelArg <float>(_Kernel, 9, P12_output);
            error |= Cl.SetKernelArg <float>(_Kernel, 10, P21_output);
            error |= Cl.SetKernelArg <float>(_Kernel, 11, P22_output);
            error |= Cl.SetKernelArg(_Kernel, 12, Flow.Width);
            error |= Cl.SetKernelArg(_Kernel, 13, Flow.Height);

            Event _event;

            IntPtr[] workGroupSizePtr = new IntPtr[] { (IntPtr)(outputFlow1.Height * outputFlow1.Width) };

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, uInputFlowMemObject, Bool.True, Flow.Array[0], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, vInputFlowMemObject, Bool.True, Flow.Array[1], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, P11_input, Bool.True, P1.Array[0], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, P12_input, Bool.True, P1.Array[1], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, P21_input, Bool.True, P2.Array[0], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, P22_input, Bool.True, P2.Array[1], 0, null, out _event);

            error = Cl.EnqueueNDRangeKernel(commandQueue, _Kernel, 1, null, workGroupSizePtr, null, 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, P11_output, Bool.True, 0, (outputFlow1.Width * outputFlow1.Height), outputFlow1.Array[0], 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, P12_output, Bool.True, 0, (outputFlow1.Width * outputFlow1.Height), outputFlow1.Array[1], 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, P21_output, Bool.True, 0, (outputFlow2.Width * outputFlow2.Height), outputFlow2.Array[0], 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, P22_output, Bool.True, 0, (outputFlow2.Width * outputFlow2.Height), outputFlow2.Array[1], 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.ReleaseMemObject(uInputFlowMemObject);
            Cl.ReleaseMemObject(vInputFlowMemObject);
            Cl.ReleaseMemObject(P11_input);
            Cl.ReleaseMemObject(P12_input);
            Cl.ReleaseMemObject(P21_input);
            Cl.ReleaseMemObject(P22_input);
            Cl.ReleaseMemObject(P11_output);
            Cl.ReleaseMemObject(P12_output);
            Cl.ReleaseMemObject(P21_output);
            Cl.ReleaseMemObject(P22_output);
            Cl.ReleaseKernel(_Kernel);

            FlowArray[] OutputFlows = new FlowArray[2];
            OutputFlows[0] = outputFlow1;
            OutputFlows[1] = outputFlow2;
            return(OutputFlows);
        }
Example #17
0
        public FlowArray calc_divP_Flow(float[] Idx, float[] Idy, float[] grad_2, float[] rho_c, FlowArray inFlow, FlowArray P1, FlowArray P2)

        {
            FlowArray outFlow = new FlowArray();

            outFlow.Array    = new float[2][];
            outFlow.Width    = inFlow.Width;
            outFlow.Height   = inFlow.Height;
            outFlow.Array[0] = new float[outFlow.Width * outFlow.Height];
            outFlow.Array[1] = new float[outFlow.Width * outFlow.Height];


            IMem <float> grad_2Buf = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, inFlow.Width * inFlow.Height * sizeof(float), out error);

            IMem <float> rho_cBuf = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, inFlow.Width * inFlow.Height * sizeof(float), out error);

            IMem <float> IdxBuf = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, inFlow.Width * inFlow.Height * sizeof(float), out error);

            IMem <float> IdyBuf = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, inFlow.Width * inFlow.Height * sizeof(float), out error);

            IMem <float> InFlow_U = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, inFlow.Width * inFlow.Height * sizeof(float), out error);

            IMem <float> InFlow_V = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, inFlow.Width * inFlow.Height * sizeof(float), out error);

            IMem <float> divP11 = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, inFlow.Width * inFlow.Height * sizeof(float), out error);
            IMem <float> divP12 = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, inFlow.Width * inFlow.Height * sizeof(float), out error);
            IMem <float> divP21 = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, inFlow.Width * inFlow.Height * sizeof(float), out error);
            IMem <float> divP22 = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, inFlow.Width * inFlow.Height * sizeof(float), out error);

            IMem <float> OutFlow_U = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, inFlow.Height * inFlow.Width * sizeof(float), out error);
            IMem <float> OutFlow_V = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, inFlow.Height * inFlow.Width * sizeof(float), out error);


            Kernel _Kernel = Cl.CreateKernel(program, "divP_Flow", out error);

            error |= Cl.SetKernelArg(_Kernel, 0, rho_cBuf);
            error |= Cl.SetKernelArg(_Kernel, 1, IdxBuf);
            error |= Cl.SetKernelArg <float>(_Kernel, 2, IdyBuf);
            error |= Cl.SetKernelArg <float>(_Kernel, 3, InFlow_U);
            error |= Cl.SetKernelArg <float>(_Kernel, 4, InFlow_V);
            error |= Cl.SetKernelArg <float>(_Kernel, 5, OutFlow_U);
            error |= Cl.SetKernelArg <float>(_Kernel, 6, OutFlow_V);
            error |= Cl.SetKernelArg <float>(_Kernel, 7, this.theta);
            error |= Cl.SetKernelArg <float>(_Kernel, 8, this.lambda);
            error |= Cl.SetKernelArg <float>(_Kernel, 9, grad_2Buf);
            error |= Cl.SetKernelArg <float>(_Kernel, 10, divP11);
            error |= Cl.SetKernelArg <float>(_Kernel, 11, divP12);
            error |= Cl.SetKernelArg <float>(_Kernel, 12, divP21);
            error |= Cl.SetKernelArg <float>(_Kernel, 13, divP22);
            error |= Cl.SetKernelArg <float>(_Kernel, 14, threshold);
            error |= Cl.SetKernelArg(_Kernel, 15, inFlow.Width);
            error |= Cl.SetKernelArg(_Kernel, 16, inFlow.Height);

            Event _event;

            IntPtr[] workGroupSizePtr = new IntPtr[] { (IntPtr)(inFlow.Height * inFlow.Width) };

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, rho_cBuf, Bool.True, rho_c, 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, IdxBuf, Bool.True, Idx, 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, IdyBuf, Bool.True, Idy, 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, grad_2Buf, Bool.True, grad_2, 0, null, out _event);


            error = Cl.EnqueueWriteBuffer <float>(commandQueue, InFlow_U, Bool.True, inFlow.Array[0], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, InFlow_V, Bool.True, inFlow.Array[1], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, divP11, Bool.True, P1.Array[0], 0, null, out _event);
            error = Cl.EnqueueWriteBuffer <float>(commandQueue, divP12, Bool.True, P1.Array[1], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, divP21, Bool.True, P2.Array[0], 0, null, out _event);
            error = Cl.EnqueueWriteBuffer <float>(commandQueue, divP22, Bool.True, P2.Array[1], 0, null, out _event);



            error = Cl.EnqueueNDRangeKernel(commandQueue, _Kernel, 1, null, workGroupSizePtr, null, 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, OutFlow_U, Bool.True, 0, (outFlow.Width * outFlow.Height), outFlow.Array[0], 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, OutFlow_V, Bool.True, 0, (outFlow.Width * outFlow.Height), outFlow.Array[1], 0, null, out _event);
            error = Cl.Finish(commandQueue);



            Cl.ReleaseMemObject(grad_2Buf);
            Cl.ReleaseMemObject(rho_cBuf);
            Cl.ReleaseMemObject(IdxBuf);
            Cl.ReleaseMemObject(IdyBuf);
            Cl.ReleaseMemObject(InFlow_U);
            Cl.ReleaseMemObject(InFlow_V);
            Cl.ReleaseMemObject(divP11);
            Cl.ReleaseMemObject(divP12);
            Cl.ReleaseMemObject(divP21);
            Cl.ReleaseMemObject(divP22);
            Cl.ReleaseMemObject(OutFlow_U);
            Cl.ReleaseMemObject(OutFlow_V);



            Cl.ReleaseKernel(_Kernel);


            return(outFlow);
        }
Example #18
0
        private FlowArray calcLocalGlobalOpticalFlow_withSmoothed_J(float[][] J, FlowArray Flow)
        {
            FlowArray resultFlowArray = new FlowArray();

            resultFlowArray.Array    = new float[2][];
            resultFlowArray.Width    = Flow.Width;
            resultFlowArray.Height   = Flow.Height;
            resultFlowArray.Array[0] = new float[resultFlowArray.Width * resultFlowArray.Height];
            resultFlowArray.Array[1] = new float[resultFlowArray.Width * resultFlowArray.Height];


            IMem <float> uInputFlowMemObject = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> vInputFlowMemObject = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> J1in = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> J2in = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> J3in = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> J4in = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> J5in = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> J6in = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> OutFlow_U = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, Flow.Height * Flow.Width * sizeof(float), out error);
            IMem <float> OutFlow_V = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, Flow.Height * Flow.Width * sizeof(float), out error);

            Kernel currentKernel = Cl.CreateKernel(program, "localGlobalFlow3", out error);

            // Kernel arguiment declaration
            error |= Cl.SetKernelArg <float>(currentKernel, 0, J1in);
            error |= Cl.SetKernelArg <float>(currentKernel, 1, J2in);
            error |= Cl.SetKernelArg <float>(currentKernel, 2, J3in);
            error |= Cl.SetKernelArg <float>(currentKernel, 3, J4in);
            error |= Cl.SetKernelArg <float>(currentKernel, 4, J5in);
            error |= Cl.SetKernelArg <float>(currentKernel, 5, J6in);
            error |= Cl.SetKernelArg <float>(currentKernel, 6, uInputFlowMemObject);
            error |= Cl.SetKernelArg <float>(currentKernel, 7, vInputFlowMemObject);
            error |= Cl.SetKernelArg <float>(currentKernel, 8, OutFlow_U);
            error |= Cl.SetKernelArg <float>(currentKernel, 9, OutFlow_V);
            error |= Cl.SetKernelArg <float>(currentKernel, 10, alpha);
            error |= Cl.SetKernelArg <float>(currentKernel, 11, threshold);
            error |= Cl.SetKernelArg(currentKernel, 12, Flow.Width);
            error |= Cl.SetKernelArg(currentKernel, 13, Flow.Height);



            Event _event;

            IntPtr[] originPtr        = new IntPtr[] { (IntPtr)0, (IntPtr)0, (IntPtr)0 };
            IntPtr[] workGroupSizePtr = new IntPtr[] { (IntPtr)(Flow.Height * Flow.Width) };

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, uInputFlowMemObject, Bool.True, Flow.Array[0], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, vInputFlowMemObject, Bool.True, Flow.Array[1], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, J1in, Bool.True, J[0], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, J2in, Bool.True, J[1], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, J3in, Bool.True, J[2], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, J4in, Bool.True, J[3], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, J5in, Bool.True, J[4], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, J6in, Bool.True, J[5], 0, null, out _event);



            error = Cl.EnqueueNDRangeKernel(commandQueue, currentKernel, 1, null, workGroupSizePtr, null, 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, OutFlow_U, Bool.True, 0, (resultFlowArray.Width * resultFlowArray.Height), resultFlowArray.Array[0], 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, OutFlow_V, Bool.True, 0, (resultFlowArray.Width * resultFlowArray.Height), resultFlowArray.Array[1], 0, null, out _event);
            error = Cl.Finish(commandQueue);


            Cl.ReleaseMemObject(uInputFlowMemObject);
            Cl.ReleaseMemObject(vInputFlowMemObject);
            Cl.ReleaseMemObject(J1in);
            Cl.ReleaseMemObject(J2in);
            Cl.ReleaseMemObject(J3in);
            Cl.ReleaseMemObject(J4in);
            Cl.ReleaseMemObject(J5in);
            Cl.ReleaseMemObject(J6in);
            Cl.ReleaseMemObject(OutFlow_U);
            Cl.ReleaseMemObject(OutFlow_V);
            Cl.ReleaseKernel(currentKernel);


            return(resultFlowArray);
        }
Example #19
0
        private FlowArray calcLocalGlobalOpticalFlow(SimpleImage Image0, SimpleImage Image1, FlowArray Flow)
        {
            FlowArray resultFlowArray = new FlowArray();

            resultFlowArray.Array    = new float[2][];
            resultFlowArray.Width    = Flow.Width;
            resultFlowArray.Height   = Flow.Height;
            resultFlowArray.Array[0] = new float[resultFlowArray.Width * resultFlowArray.Height];
            resultFlowArray.Array[1] = new float[resultFlowArray.Width * resultFlowArray.Height];



            Mem leftImageMemObject = (Mem)Cl.CreateImage2D(context, MemFlags.ReadOnly | MemFlags.CopyHostPtr, SimpleImage.clImageFormat, (IntPtr)Image0.ImageWidth, (IntPtr)Image0.ImageHeight, (IntPtr)0, Image0.ByteArray, out error);

            Mem rightImageMemObject = (Mem)Cl.CreateImage2D(context, MemFlags.ReadOnly | MemFlags.CopyHostPtr, SimpleImage.clImageFormat, (IntPtr)Image1.ImageWidth, (IntPtr)Image1.ImageHeight, (IntPtr)0, Image1.ByteArray, out error);

            IMem <float> uInputFlowMemObject = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> vInputFlowMemObject = Cl.CreateBuffer <float>(context, MemFlags.ReadOnly, Flow.Width * Flow.Height * sizeof(float), out error);

            IMem <float> OutFlow_U = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, Flow.Height * Flow.Width * sizeof(float), out error);
            IMem <float> OutFlow_V = Cl.CreateBuffer <float>(context, MemFlags.WriteOnly, Flow.Height * Flow.Width * sizeof(float), out error);

            Kernel currentKernel = Cl.CreateKernel(program, "localGlobalFlow1", out error);

            // Kernel arguiment declaration
            error  = Cl.SetKernelArg(currentKernel, 0, SimpleImage.intPtrSize, leftImageMemObject);
            error |= Cl.SetKernelArg(currentKernel, 1, SimpleImage.intPtrSize, rightImageMemObject);
            error |= Cl.SetKernelArg <float>(currentKernel, 2, uInputFlowMemObject);
            error |= Cl.SetKernelArg <float>(currentKernel, 3, vInputFlowMemObject);
            error |= Cl.SetKernelArg <float>(currentKernel, 4, OutFlow_U);
            error |= Cl.SetKernelArg <float>(currentKernel, 5, OutFlow_V);
            error |= Cl.SetKernelArg <float>(currentKernel, 6, alpha);

            error |= Cl.SetKernelArg <float>(currentKernel, 7, threshold);
            error |= Cl.SetKernelArg(currentKernel, 8, Flow.Width);
            error |= Cl.SetKernelArg(currentKernel, 9, Flow.Height);



            Event _event;

            IntPtr[] originPtr        = new IntPtr[] { (IntPtr)0, (IntPtr)0, (IntPtr)0 };
            IntPtr[] regionPtr        = new IntPtr[] { (IntPtr)Image0.ImageWidth, (IntPtr)Image0.ImageHeight, (IntPtr)1 };
            IntPtr[] workGroupSizePtr = new IntPtr[] { (IntPtr)(Flow.Height * Flow.Width) };


            error = Cl.EnqueueWriteImage(commandQueue, leftImageMemObject, Bool.True, originPtr, regionPtr, (IntPtr)0, (IntPtr)0, Image0.ByteArray, 0, null, out _event);

            error = Cl.EnqueueWriteImage(commandQueue, rightImageMemObject, Bool.True, originPtr, regionPtr, (IntPtr)0, (IntPtr)0, Image1.ByteArray, 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, uInputFlowMemObject, Bool.True, Flow.Array[1], 0, null, out _event);

            error = Cl.EnqueueWriteBuffer <float>(commandQueue, vInputFlowMemObject, Bool.True, Flow.Array[0], 0, null, out _event);

            error = Cl.EnqueueNDRangeKernel(commandQueue, currentKernel, 1, null, workGroupSizePtr, null, 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, OutFlow_U, Bool.True, 0, (resultFlowArray.Width * resultFlowArray.Height), resultFlowArray.Array[0], 0, null, out _event);
            error = Cl.Finish(commandQueue);

            Cl.EnqueueReadBuffer <float>(commandQueue, OutFlow_V, Bool.True, 0, (resultFlowArray.Width * resultFlowArray.Height), resultFlowArray.Array[1], 0, null, out _event);
            error = Cl.Finish(commandQueue);


            Cl.ReleaseMemObject(leftImageMemObject);
            Cl.ReleaseMemObject(rightImageMemObject);
            Cl.ReleaseMemObject(uInputFlowMemObject);
            Cl.ReleaseMemObject(vInputFlowMemObject);
            Cl.ReleaseMemObject(OutFlow_U);
            Cl.ReleaseMemObject(OutFlow_V);
            Cl.ReleaseKernel(currentKernel);


            return(resultFlowArray);
        }