private unsafe static void computeColor(KernelThread thread, byte* frame, int frameStride, Gray<int>[,] orientationImage, Gray<int>[,] magnitudeSqrImage, int minSqrMagnitude)
        {
            frame = frame + frameStride * thread.Y + thread.X * 3 /*sizeof(Bgr<byte>)*/; 

            int maxMagSqr = 0, maxDx = 0, maxDy = 0;
            for (int ch = 0; ch < 3; ch++)
            {
                var srcPtr = frame + ch;

                int sumX = 0, sumY = 0;
                for (int r = 0; r < 3; r++)
                {
                    var chPtr = srcPtr;
                    for (int c = 0; c < 3; c++)
                    {
                        sumX += *chPtr * Sobel_3x3_X[r, c];
                        sumY += *chPtr * Sobel_3x3_Y[r, c];

                        chPtr += 3 * sizeof(byte);
                    }

                    srcPtr = (byte*)srcPtr + frameStride;
                }
                //sumX >>= 3; sumY >>= 3; //divide by 8 (normalize kernel)

                var grad = sumX * sumX + sumY * sumY;
                if (grad > maxMagSqr)
                {
                    maxMagSqr = grad;
                    maxDx = sumX;
                    maxDy = sumY;
                }
            }

            if (maxMagSqr < minSqrMagnitude)
            {
                //magnitudeSqrImage[thread.Y + kernelRadius, thread.X + kernelRadius] = 0;  //redundant
                orientationImage[thread.Y + kernelRadius, thread.X + kernelRadius] = FeatureMap.INVALID_ORIENTATION;
            }
            else
            {
                magnitudeSqrImage[thread.Y + kernelRadius, thread.X + kernelRadius] = maxMagSqr;
                orientationImage[thread.Y + kernelRadius, thread.X + kernelRadius] = MathExtensions.Atan2Aprox(maxDy, maxDx);
            }
        }
        private unsafe static void computeGray(KernelThread thread, byte *frame, int frameStride, Gray <int>[,] orientationImage, Gray <int>[,] magnitudeSqrImage, int minSqrMagnitude)
        {
            frame = frame + frameStride * thread.Y + thread.X;
            var srcPtr = frame;

            int sumX = 0, sumY = 0;

            for (int r = 0; r < 3; r++)
            {
                for (int c = 0; c < 3; c++)
                {
                    sumX += srcPtr[c] * Sobel_3x3_X[r, c];
                    sumY += srcPtr[c] * Sobel_3x3_Y[r, c];
                }

                srcPtr = (byte *)srcPtr + frameStride;
            }
            //sumX >>= 3; sumY >>= 3; //divide by 8 (normalize kernel) //without this

            var grad = sumX * sumX + sumY * sumY;

            if (grad < minSqrMagnitude)
            {
                //magnitudeSqrImage[thread.Y + kernelRadius, thread.X + kernelRadius] = 0;  //redundant
                orientationImage[thread.Y + kernelRadius, thread.X + kernelRadius] = FeatureMap.INVALID_ORIENTATION;
            }
            else
            {
                magnitudeSqrImage[thread.Y + kernelRadius, thread.X + kernelRadius] = grad;
                orientationImage[thread.Y + kernelRadius, thread.X + kernelRadius]  = MathExtensions.Atan2Aprox(sumY, sumX);
            }
        }
Пример #3
0
        private static void process(Action <KernelThread> kernel, int gridX, int gridY)
        {
            System.Threading.Tasks.Parallel.For(0, gridY, (j) =>
            {
                KernelThread th = new KernelThread();

                th.Y = j;
                for (int i = 0; i < gridX; i++)
                {
                    th.X = i;
                    kernel(th);
                }
            });
        }
        private unsafe static void computeColor(KernelThread thread, byte *frame, int frameStride, Gray <int>[,] orientationImage, Gray <int>[,] magnitudeSqrImage, int minSqrMagnitude)
        {
            frame = frame + frameStride * thread.Y + thread.X;

            int maxMagSqr = 0, maxDx = 0, maxDy = 0;

            for (int ch = 0; ch < 3; ch++)
            {
                var srcPtr = frame + ch;

                int sumX = 0, sumY = 0;
                for (int r = 0; r < 3; r++)
                {
                    var chPtr = srcPtr;
                    for (int c = 0; c < 3; c++)
                    {
                        sumX += *chPtr * Sobel_3x3_X[r, c];
                        sumY += *chPtr * Sobel_3x3_Y[r, c];

                        chPtr += 3 * sizeof(byte);
                    }

                    srcPtr = (byte *)srcPtr + frameStride;
                }
                //sumX >>= 3; sumY >>= 3; //divide by 8 (normalize kernel)

                var grad = sumX * sumX + sumY * sumY;
                if (grad > maxMagSqr)
                {
                    maxMagSqr = grad;
                    maxDx     = sumX;
                    maxDy     = sumY;
                }
            }

            if (maxMagSqr < minSqrMagnitude)
            {
                //magnitudeSqrImage[thread.Y + kernelRadius, thread.X + kernelRadius] = 0;  //redundant
                orientationImage[thread.Y + kernelRadius, thread.X + kernelRadius] = FeatureMap.INVALID_ORIENTATION;
            }
            else
            {
                magnitudeSqrImage[thread.Y + kernelRadius, thread.X + kernelRadius] = maxMagSqr;
                orientationImage[thread.Y + kernelRadius, thread.X + kernelRadius]  = MathExtensions.Atan2Aprox(maxDy, maxDx);
            }
        }
Пример #5
0
        private unsafe static void kernelConvolve(KernelThread thread, float[,] input, float[,] output, float[,] kernel, IntPoint offset)
        {
            float sum = 0;

            fixed(float *inputPtr = &input[thread.Y + offset.Y, thread.X + offset.X], kernelPtr = kernel)
            {
                for (int i = 0; i < 3; i++)
                {
                    var y = thread.Y + i;
                    for (int j = 0; j < 3; j++)
                    {
                        sum += inputPtr[y + thread.X + j] * kernelPtr[j + i];
                    }
                }
            }

            output[thread.Y, thread.X] = sum;
        }
        private static unsafe void computeGray(KernelThread thread, byte* frame, int frameStride, Gray<int>[,] orientationImage, Gray<int>[,] magnitudeSqrImage, int minSqrMagnitude)
        {
            frame = frame + frameStride * thread.Y + thread.X;
            var srcPtr = frame;

            int sumX = 0, sumY = 0;
            for (int r = 0; r < 3; r++)
            {
                for (int c = 0; c < 3; c++)
                {
                    sumX += srcPtr[c] * Sobel_3x3_X[r, c];
                    sumY += srcPtr[c] * Sobel_3x3_Y[r, c];
                }

                srcPtr = (byte*)srcPtr + frameStride;
            }
            //sumX >>= 3; sumY >>= 3; //divide by 8 (normalize kernel) //without this

            var grad = sumX * sumX + sumY * sumY;
            if (grad < minSqrMagnitude)
            {
                //magnitudeSqrImage[thread.Y + kernelRadius, thread.X + kernelRadius] = 0;  //redundant
                orientationImage[thread.Y + kernelRadius, thread.X + kernelRadius] = FeatureMap.INVALID_ORIENTATION;
            }
            else
            {
                magnitudeSqrImage[thread.Y + kernelRadius, thread.X + kernelRadius] = grad;
                orientationImage[thread.Y + kernelRadius, thread.X + kernelRadius] = MathExtensions.Atan2Aprox(sumY, sumX);
            }
        }
Пример #7
0
 private unsafe static void kernelConvert(KernelThread thread, float[,] input, float[,] output, float[,] kernel)
 {
     output[thread.Y, thread.X] = (float)Math.Sin(input[thread.Y, thread.X]) + 5;
 }