【问题标题】:Harris corner using Emgu CV使用 Emgu CV 的哈里斯角
【发布时间】:2017-11-08 01:56:54
【问题描述】:

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

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

任何帮助将不胜感激

【问题讨论】:

    标签: c# opencv image-processing emgucv


    【解决方案1】:

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

    我认为您错过的只是在致电cvCornerHarris 之前,您需要创建一个空的 32 位浮动图像来接收角点强度。然后将 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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2017-12-18
    相关资源
    最近更新 更多