1

我正在尝试使用 Emgu CV Wrapper 应用 Harris 角,我正在从一本名为“Open CV 2, Computer Vision Application Cook Book”的书中学习,书中的示例基于 C++,下面是他们在替换 cv 后关于 Harris 的示例: :Mat 与 Emgu MCvMat 上的等价物,但是它没有编译,所以我使用了 MCvMat 对象上的“数据”字段,它确实编译但它挂起,没有错误也没有例外,但它只是挂起。

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

任何帮助将不胜感激

4

1 回答 1

2

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

我认为您错过的只是在调用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

以下是结果的一些屏幕截图 - 左侧是加载的图像(灰度),右侧是显示角强度的倒置阈值图像:

哈里斯

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

于 2013-05-11T12:51:23.623 回答