Esempio n. 1
0
        public object[] PerformRotationCompareCuda(double angulo, double scalex, double scaley, int tx, int ty, double skX = 0, double skY = 0)
        {
            Image <Rgba, byte> two       = null;
            Image <Rgba, byte> one       = null;
            GpuMat             resultMat = new GpuMat();
            GpuMat             destiny   = null;
            GpuMat             compare   = null;

            object[] array   = null;
            GpuMat   sumaImg = new GpuMat();

            try
            {
                //   tx += imgUtil.TX/2;


                //make one from all tranformations
                // one = imgUtil.expandedOne[0];
                one = UIOne;
                double raidus;
                int    newWidth  = Convert.ToInt32(UIOne.Width * scalex);
                int    newHeight = Convert.ToInt32(UIOne.Height * scaley);


                GpuMat gOne = new GpuMat(one.Mat);
                GpuMat gNew = new GpuMat();



                CudaInvoke.Rotate(gOne, gNew, gOne.Size, angulo, tx, ty);

                gOne.Dispose();
                gOne = new GpuMat();

                CudaInvoke.Resize(gNew, gOne, new Size(newWidth, newHeight));

                // one = one.Rotate(angulo, imgUtil.pitchBlack).Resize(newWidth, newHeight, Emgu.CV.CvEnum.Inter.Cubic);

                one = gOne.ToMat().ToImage <Rgba, byte>();

                //gNew.Dispose();

                //  gOne.Dispose();


                if (skX != 0 && skY != 0)
                {
                    //comparison
                    int rows       = one.Rows;
                    int cols       = one.Cols;
                    int maxXOffset = Convert.ToInt32(Math.Abs(cols * skX));
                    int maxYOffset = Convert.ToInt32(Math.Abs(rows * skY));

                    CudaImage <Rgba, byte> sheared = new CudaImage <Rgba, byte>(rows + maxYOffset, cols + maxXOffset, true);
                    try
                    {
                        for (int r = 0; r < sheared.Bitmap.Height; r++)
                        {
                            for (int c = 0; c < sheared.Bitmap.Width; c++)
                            {
                                int newR = r + Convert.ToInt32(c * skY) - maxYOffset / 2;
                                int newC = c + Convert.ToInt32(r * skX) - maxXOffset / 2;
                                if (newR >= 0 && newR < rows && newC >= 0 && newC < cols)
                                {
                                    sheared.Bitmap.SetPixel(r, c, one.Bitmap.GetPixel(newR, newC));
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                    //    one.Dispose();
                    one.Dispose();
                    one = sheared.ToMat().ToImage <Rgba, byte>();
                    sheared.Dispose();
                }


                //   ty += imgUtil.TY/2;

                // MakeCanvas(ref one, out raidus);


                // int newWidth = Convert.ToInt32(imgUtil.expandedOne[0].Width*scalex);
                // int newHeight = Convert.ToInt32(imgUtil.expandedOne[0].Height*scaley);
                //    int newWidth = Convert.ToInt32(UIOne.Width * scalex);
                //    int newHeight = Convert.ToInt32(UIOne.Height * scaley);
                //    int newWidth = Convert.ToInt32(one.Width * scalex);
                //   int newHeight = Convert.ToInt32(one.Height * scaley);

                //  CvInvoke.MinAreaRect(UITwo.Bitmap.GetBounds().)


                //   int area = (UITwo).Height * (UITwo).Width;
                //  area/=3;

                //  int area = Convert.ToInt32( 4e5);
                //determine bigger between one and two
                Image <Rgba, byte>[] biggerSmaller = GetBiggerSmallerImages(ref UITwo, ref one);

                //make canvas from bigger and copy the smaller into this canvas

                //int area = (biggerSmaller[0]).Height * (biggerSmaller[0]).Width;


                two = MakeCanvas(ref biggerSmaller[0], out raidus);
                ///CAMBIE ESTO
                Point middle = GetMiddlePointCanvas(raidus, ref biggerSmaller[1]);
                //  middle.X += tx;
                //  middle.Y += ty;


                ///////////// // Point middle = GetMiddlePointCanvas(raidus, ref biggerSmaller[0]);
                Copy(ref middle, ref two, ref biggerSmaller[1]);

                //get Mat
                destiny = new GpuMat(two.Mat);
                two     = two.CopyBlank();
                // two.Dispose();

                //make canvas from bigger again
                //   two = MakeCanvas(ref biggerSmaller[0], out raidus);//;.Width, expandedEscaledUIToCompare[1].Height, pitchWhite);

                // Copy the bigger into the canvas
                middle = GetMiddlePointCanvas(raidus, ref biggerSmaller[0]);

                Copy(ref middle, ref two, ref biggerSmaller[0]);


                compare = new GpuMat(two.Mat); //two.Mat.Clone();

                two.Dispose();

                object result = null;


                CudaInvoke.BitwiseXor(compare, destiny, resultMat, null);// Emgu.CV.CvEnum.CmpType.Equal);
                //  CudaInvoke.Subtract(compare, destiny, resultMat);


                // CudaInvoke.Pow(resultMat, 2, resultMat);


                //   CvInvoke.Compare(compare, destiny, resultMat, Emgu.CV.CvEnum.CmpType.Equal);
                CudaInvoke.Add(compare, destiny, sumaImg);//.ass.ToImage<Rgba,byte>().Add(destiny.ToImage<Rgba,byte>()).Mat;

                result = resultMat.ToMat();

                two = resultMat.ToMat().ToImage <Rgba, byte>();

                object suma = null;

                object count = null;

                suma  = two.GetSum();
                count = two.CountNonzero();
                int area = Convert.ToInt32(2e5);

                (count as int[])[3] = area;
                //   result = two.Mat.Clone();


                //  CvInvoke.Subtract(compare, destiny, resultMat);


                array = new object[] { result, count, suma };
            }
            catch (Exception ex)
            {
            }
            destiny?.Dispose();
            compare?.Dispose();
            resultMat?.Dispose();
            two?.Dispose();
            one?.Dispose();
            sumaImg?.Dispose();
            return(array);
        }