Harris角落使用Emgu CV

时间:2013-05-09 08:25:23

标签: c# opencv image-processing emgucv

我试图使用Emgu CV Wrapper应用Harris角落,我正在学习一本名为“Open CV 2,计算机视觉应用库克书”的书,书中的例子都是基于C ++,下面是他们在Harris之后的例子用emv MCvMat上的等效替换cv :: Mat,但是没有编译,所以我使用了MCvMat对象上的“数据”字段,它确实编译但是挂起,没有错误没有异常,但它只是挂起。

 MCvMat cornerStrength = new MCvMat(); ;
 CvInvoke.cvCornerHarris(Global.GrayImage.Ptr, cornerStrength.data, 3, 3, 0.1);

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

是的,我刚刚下载了本书的PDF,安装了Emgu CV,并按照与您相同的过程进行操作。除了我成功; - )

我认为你错过的是你需要创建一个空的32位浮点图像来接收角点强度才能调用cvCornerHarris。然后将Image个对象传递给它。

以下是我的代码的主要部分,我使用Visual Studio 2012在C#中的Windows窗体应用程序中开发。首先,我用来保存图像对象的一些成员变量:

// original source image as grayscale
private Image<Gray, Byte> m_SourceImage = null;

// raw corner strength image (must be 32-bit float)
private Image<Gray, float> m_CornerImage = null;

// inverted thresholded corner strengths (for display)
private Image<Gray, Byte> m_ThresholdImage = null;

现在,按钮单击处理程序提示从文件加载图像并显示它:

private void button1_Click(object sender, EventArgs e)
{
    // prompt for source image
    OpenFileDialog Openfile = new OpenFileDialog();
    if (Openfile.ShowDialog() == DialogResult.OK)
    {
        // create and show source image as grayscale
        m_SourceImage = new Image<Gray, byte>(Openfile.FileName);
        pictureBox1.Image = m_SourceImage.ToBitmap();
    }
}

最后,用于执行角点检测的按钮单击处理程序:

private void button2_Click(object sender, EventArgs e)
{
    // create corner strength image and do Harris
    m_CornerImage = new Image<Gray, float>(m_SourceImage.Size);
    CvInvoke.cvCornerHarris(m_SourceImage, m_CornerImage, 3, 3, 0.01);

    // create and show inverted threshold image
    m_ThresholdImage = new Image<Gray, Byte>(m_SourceImage.Size);
    CvInvoke.cvThreshold(m_CornerImage, m_ThresholdImage, 0.0001, 
        255.0, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY_INV);
    pictureBox1.Image = m_ThresholdImage.ToBitmap();
}

在上面的代码中,您可以看到我已经按照书中的示例对阈角图像应用了阈值并将结果反转以便于显示。您只需显示m_CornerImage即可。

以下是结果的一些截图 - 左侧加载的图像(灰度),右侧的角度强度反转阈值图像:

harris

如果您需要任何进一步的信息或帮助,请评论或编辑您的问题,我会尽力而为。