Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Harris角点检测突出显示所有边而非角点_C#_Image Processing_Machine Learning_Computer Vision - Fatal编程技术网

C# Harris角点检测突出显示所有边而非角点

C# Harris角点检测突出显示所有边而非角点,c#,image-processing,machine-learning,computer-vision,C#,Image Processing,Machine Learning,Computer Vision,我需要实现Harris角点检测,它应该只有正R值。如果我使用R>0的阈值,它不会突出显示任何内容,如果R

我需要实现Harris角点检测,它应该只有正R值。如果我使用
R>0
的阈值,它不会突出显示任何内容,如果
R<0
但是,从偶数
-0.00001
-1000000
它输出完美的边缘检测,但没有角点

输入和输出: \

主要代码:

 Bitmap b = (Bitmap)pictureBox1.Image;
 var i = IntensityMat(b);
 var n = Mask(i,-0.00000001);
 var ty = ToBit(n);
 pictureBox1.Image = ty;
职能:

    public double Intensity(Color c)
    {
        int x = c.R;
        int y = c.G;
        int z = c.B;
        return Math.Sqrt(x * x + y * y + z * z);
    }

    public double Trace(double[,] m)
    {
        double sum = 0;

        for (int i = 0; i < m.GetLength(0); i++)
        {
            sum += m[i, i];
        }

        return sum;
    }

    public double[,] M(double ix,double iy)
    {
        double[,] m = new double[2, 2];

        m[0, 0] = ix*ix;
        m[1, 1] = iy*iy;
        m[0, 1] = ix * iy;
        m[1, 0] = ix * iy;

        return m;
    }

    public double Det(double[,] m)
    {
        return m[1, 1] * m[0, 0] - m[0, 1] * m[1, 0];
    }

    public double R(double[,] m,double k=0.04)
    {
        var t = Trace(m);
        return Det(m) - k * t * t;
    }

    int[,] IntensityMat(Bitmap b)
    {
        int[,] n = new int[b.Width, b.Height];

        for (int i = 0; i < b.Width; i++)
        {
            for (int j = 0; j < b.Height; j++)
            {
                Color c = b.GetPixel(i, j);
                n[i, j] = (int)Intensity(c);
            }
        }

        return n;
    }

    Bitmap ToBit(int[,] bd)
    {
        Bitmap b = new Bitmap(bd.GetLength(0), bd.GetLength(1));
        for (int i = 0; i < b.Width; i++)
        {
            for (int j = 0; j < b.Height; j++)
            {
                var t = bd[i, j];
                b.SetPixel(i, j, Color.FromArgb(t, t, t));
            }
        }

        return b;
    }

    int[,] Mask(int[,] m,double thresh)// m matrix of I
    {
        int[,] n = new int[m.GetLength(0), m.GetLength(1)];

        for (int i = 1; i < m.GetLength(0); i++)
        {
            for (int j = 1; j < m.GetLength(1); j++)
            {
                double ix = Math.Abs(m[i-1,j]-m[i,j]);
                double iy = Math.Abs(m[i , j-1] - m[i, j]);

                var lap = M(ix, iy);
                var r = R(lap);

                if (r > thresh)
                {
                    n[i, j] = 255;
                }
            }
        }

        return n;
    }
公共双亮度(c色)
{
INTX=c.R;
int y=c.G;
intz=c.B;
返回Math.Sqrt(x*x+y*y+z*z);
}
公共双道(双[,]m)
{
双和=0;
for(int i=0;ithresh)
{
n[i,j]=255;
}
}
}
返回n;
}

是否需要在c#中实现?应该有python和matlab的在线实现。OpenCV有一个用于角点检测的内置库。你应该试试看。它也适用于C#