C# 使用Emgu CV的Harris角点
我尝试使用EGGU CV包装器来使用Harris角,我从一本叫做“开放CV 2,计算机视觉应用程序库克”的书中学习到,书中的例子是基于C++的,下面是他们在替换CV::Harris的例子中用等效于EGU-MVVMAT的例子,但是没有编译,所以我使用了“数据”。字段,它确实编译了,但挂起了,没有错误,没有异常,只是挂起了C# 使用Emgu CV的Harris角点,c#,opencv,image-processing,emgucv,C#,Opencv,Image Processing,Emgucv,我尝试使用EGGU CV包装器来使用Harris角,我从一本叫做“开放CV 2,计算机视觉应用程序库克”的书中学习到,书中的例子是基于C++的,下面是他们在替换CV::Harris的例子中用等效于EGU-MVVMAT的例子,但是没有编译,所以我使用了“数据”。字段,它确实编译了,但挂起了,没有错误,没有异常,只是挂起了 MCvMat cornerStrength = new MCvMat(); ; CvInvoke.cvCornerHarris(Global.GrayImage.Ptr, c
MCvMat cornerStrength = new MCvMat(); ;
CvInvoke.cvCornerHarris(Global.GrayImage.Ptr, cornerStrength.data, 3, 3, 0.1);
任何帮助都将不胜感激是的,我刚刚下载了本书的PDF,安装了Emgu CV,并遵循了与您相同的流程。除非我成功了;-) 我认为您所遗漏的是,在调用
cvCornerHarris
之前,您需要创建一个空的32位浮点图像来接收拐角强度。然后将图像
对象传递给它
下面是我的代码的主要部分,我使用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;
//原始源图像为灰度
私有映像m_SourceImage=null;
//原始角强度图像(必须是32位浮点)
私有映像m_CornerImage=null;
//反向阈值拐角强度(用于显示)
私有图像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按钮1\u单击(对象发送者,事件参数e)
{
//提示输入源图像
OpenFileDialog Openfile=新建OpenFileDialog();
if(Openfile.ShowDialog()==DialogResult.OK)
{
//创建源图像并将其显示为灰度
m_SourceImage=新图像(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();
}
private void按钮2\u单击(对象发送者,事件参数e)
{
//创建角强度图像并执行以下操作:
m_CornerImage=新图像(m_SourceImage.Size);
CvInvoke.cvCornerHarris(m_SourceImage,m_CornerImage,3,3,0.01);
//创建并显示反转阈值图像
m_ThresholdImage=新图像(m_SourceImage.Size);
CvInvoke.cvThreshold(m_CornerImage,m_ThresholdImage,0.0001,
255.0,Emgu.CV.CvEnum.THRESH.CV\u THRESH\u BINARY\u INV);
pictureBox1.Image=m_ThresholdImage.ToBitmap();
}
在上面的代码中,您可以看到我遵循了书中的示例,对角图像应用了阈值,并反转了结果以便于显示。您可以只显示m_CornerImage
以下是结果的一些屏幕截图-左侧是加载的图像(灰度),右侧是显示拐角强度的反转阈值图像:
如果您需要任何进一步的信息或帮助,请评论或编辑您的问题,我会尽我所能。谢谢,我使用的是字节而不是浮点,赏金将在20小时内获得奖励,我会确保这样做it@Musaab-我的荣幸-非常感谢你的赏金,我很期待:-)在最新版本的中找不到Emgucv@ehsanwwe嗯,它在文档中-。