如何使用emgu 锐化 图像CV找到与图像中的任意角度的旋转一个黑色的方形

下次自动登录
现在的位置:
& 综合 & 正文
Emgu CV Lesson 1
配置EMGU CV C#
一:示例代码
下述文章是为初学者介绍一步步搭建EMGUcv开发环境而设置的,这篇文章会让你配置过程更加简单化。EMGU是用更加安全的纯C#写的对OpenCV的一层包装。EMGU是针对C#开发者的针对机器视觉的的开放了OpenCV库。OpenCV最初由Intel开发,现在由Willow Garage维护。
x86和x64版本的EMGUcv都可以在SourceForge上可以下载。
EMGU是对c++代码的包装,因此有两种DLL‘s的可以使用。即EMGU表达法的引用和可变的OpenCv的DLL。因此设置第一个工程时初学者常常会感到迷惑。
如果你已经下载了EMGU源码包的话,你首先应该阅读“A Basic Program”这篇文章。你拿到EMGU的代码可能会遇到The EMGU.CV.Invoke Exception and Troubleshooting的错误。
三:储备知识
假设你已经有了基本的C#编程经验并可以创建C#工程。并且你也已经下载了最新的包含了HelloWorld示例的EMGU平台
四:基本要求
你的工程需要引用你需要的一切DLL引用的库。创建一个任意命名的C# 的Windows Form Application程序,所有提到的DLL文件都在X:\bin文件夹目录下。(X是指你安装EMGU所在的目录)
下面是三个你需要引用的三个DLL文件:Emgu.CV.dll、Emgu.CV.UI.dll、Emgu.Util.dll
可以通过右键点击你的工程或者在解决方法上添加引用。
或者使用menu 选项中的Project -》Add Referrence,选择所需的DLL后单击OK选项
这时你会在解决方案中的Reference文件夹看见你添加的DLL引用库,上述提到的三个EMGU C#引用。这并不需要你有任何的图像处理方面的额知识。
现在你可以使用任何在这些DLL中的类了。这些引用取决于你需要用于做什么样的图像处理。看这个例子你需要将一下的代码添加到Form1.cs的代码最上面的引用语句前。
using Emgu.CV;
using Emgu.U
using Emgu.CV.S
五:首选的方法
相对于对于复杂的C++库,加载、显示、获取图像数据可以变得更加简单,你只需要添加两个文件即可。
opencv_core220.dll
opencv_imgproc220.dll
Note:220代表的是你的EMGU的版本号,可能或由你的版本号的不同而不一样。
这两个文件你不能直接像EMGU库文件那样引用。你需要将这两个文件添加到你的工程中。有两种方法,右键点击在解决方法中的你的工程名字通过Add-》Existing Item选中上述两个文件,这两个文件位于EMGU解压后的\bin目录下。
提示:如果你发现不好找这两个文件,可以使用文件过滤的方法
现在你可以在你的解决方案中看见这两个文件了。你可以通过Ctrl+鼠标左键选择这两个文件改变他们的属性(或者单独拷贝),你可以看到属性里面的Copy to Output Directory.将”Do not copy“属性改成“Copy always”。
如果你使用x64兼容模式来编译你需要在你进行图像处理前将编译模式选择成x64的模式。这样是首选的方法,这对于你从Debug改到Release时同样有效,保证没有错误发生。你可以跳转到“A Basic Program”小结查看图示。
六:其次可选的方法
虽然不是首选的方法往往是最简单的,如果你有一个复杂的工程结构,这样可以防止你的解决方案资源管理器看起来非常混乱。只需要将上述的opencv_core220.dll 和opencv_imgproc220.dll文件直接拷贝到你的工程文件项目的\bin\Debug或者\bin\Release文件夹。虽然目前的好处在这里可能你不太清楚,想象一下你的解决方案管理器中添加了另外34个DLL文件的情形这是很稀少的情况。
七:x64架构和EMGU.CV.Invoke异常
如果你的系统是x64架构,你必须下载单独相应的DLL文件,建立工程的步骤和上述的步骤一样,但你需要一个额外的编译参数。右键单击解决方案的中的项目文件,并在地步选择“属性”,将生成选项卡中下拉菜单从x86换到x64。
提示:如果你用的是Visual Studio Express版本,你可能会看不到这个选项,你可以通过菜单栏的“工具-》选项”,在里面找到Project and solution中找到Show advanced build configuration勾选项。
如果你不这么做的话,你会遇到EMGU.CV.Invoke异常。
八:A Basic Program
EMGU为你提供了一种简单的方式加载图像并在一个图片框中显示出来,并将展示如何获取图像数据和图像格式的转换。
当你下载x86格式示例代码时,你会发现在你的解决方案资源管理器中发现三个黄色的引用警告,你需要重新添加对他们的引用,怎么引用可以参考”基本要求“小节,
现已有一个Button 、PictureBox添加到main Form上,默认名称并没有改变,功能是当我们点击Button,我们打开一个文件对话框,选择图像,并加载显示到PictureBox上。
private void button1_Click(object sender, EventArgs e)
OpenFileDialog Openfile = new OpenFileDialog();
if (Openfile.ShowDialog() == DialogResult.OK)
Image&Bgr, Byte& My_Image = new Image&Bgr, byte&(Openfile.FileName);
pictureBox1.Image = My_Image.ToBitmap();
这段代码非常简单,主要是通过名为Openfile的OpenFileDialog用于选择图像文件。图像被一个名为My_Image的色彩Image对象读取。这要求图像时Bitmap格式,所以通过My_Image对象的.ToBitmap()方法来实现。
九:一个小的图像处理的例子
这个小的稍高级的工程可能会遇到像“A Basic Program”那样的警告。引用需要重新替换。在这个程序中演示的是将一个Image从彩色变成灰阶,通过处理每个单元的图像像素。而这个压缩图像光谱数据并不是最有效的,但是却是一个获取图像数据属性的一个很好地例子。
一个小的图像变换
图像变换在EMGU里是复杂的。在这个例子中一个Bgr彩色图像将或被转换灰色的灰阶图像。
Image&gray,byte& gray_image = My_Image.Convert&gray,byte&();
尽管如此你可以逐渐利用不同的图像的深度(Tdepth)还不是Byte。这个方法的问题是你每次调用只能转换一个depth。假如说我们希望从Image&bgr,byte&转换到Image&gray,double&,你可以利用下列代码
Image&Gray,byte& gray_image = My_Image.Convert&Gray,byte&();
Image&Gray,double& gray_image = My_Image.Convert&Gray,double&();
//or alternatively in one line
Image&Gray,& gray_image = My_Image.Convert&Gray,byte&().Convert&Gray,double&();
//alternatively
Image&Gray,Byte& gray_image = My_Image.Convert&Bgr,double&().Convert&Gray,double&();
获取图像数据
有几种不同的方法获取图像数据并赋值给他。有两种可用的方法,直接通过图像数据的属性获取。下面将演示这两种方法。当获取图像属性时,需要考虑图像的光谱深度,灰阶图像将会有1个深度的Image spectrum depth,用[x,y,0]来表示,case图像有三个深度,[x,y,0],[x,y,1],[x,y,2]分别代表蓝、绿、红
假设我们希望对一个坐标为[0,0]像素赋值。
//Colour Image
My_Image[0, 0] = new Bgr(Color.Red);
//Gray Image
gray_image[0, 0] = new Gray(200);
或者使用数据属性
//Colour Image
Color R = Color.R
My_Image.Data[0,0,2] = R.R; //Write to the Red Spectrum
My_Image.Data[0,0,1] = R.G; //Write to the Green Spectrum
My_Image.Data[0,0,0] = R.B; //Write to the Blue Spectrum
//Gray Image
gray_image[0, 0] = new Gray(200);
写数据到一个像素相对简单但是读取一个像素
//Colour Image
Bgr my_Bgr = My_Image[0, 0];
//Gray Image
Gray my_Gray = gray_image[0, 0];
现在在许多情况下不能使用Bgr和Gray,所以需要转换
//BGR to Color
Color my_colour = Color.FromArgb((int)value.Red, (int)value.Blue, (int)value.Green);
//Gray to int
int my_intensity = (int) my_Gray.I
你可能会注意到每个值都会出现数据丢失,因为默认是以double型存储的。尽管对于这个例子更好的方法是通过图像属性来获取数据。如果你想读取图像数据,并没有要求在灰阶和整数之间转换。你可以直接读取图像数据并使用。
Color my_colour = Color.FromArgb(My_Image.Data[0, 0, 0],
My_Image.Data[0, 0, 1], My_Image.Data[0, 0, 2]);
//Gray Image
int my_intensity = gray_image.Data[0, 0, 0];
再循环中处理图像会更加方便,要研究如何通过循环实现图像处理,请下载Little More Image Processing代码。
DLLNotFound Exception and Troubleshooting 0x8007007E异常
cudart64_32_16.dll
cufft64_32_16.dll
cvextern.dll
npp64_32_16.dll
opencv_calib3d220.dll
opencv_contrib220.dll
opencv_core220.dll
opencv_features2d220.dll
opencv_flann220.dll
opencv_gpu220.dll
opencv_highgui220.dll
opencv_imgproc220.dll
opencv_legacy220.dll
opencv_ml220.dll
opencv_objdetect220.dll
opencv_video220.dll
任何类似的错误你都可以通过上述方法来解决,如果你仍然没有解决你可以向论坛求助。
*表示相关的图像深度或者数据类型,这个错误是在2.3.*版本中出现的,拷贝了 opencv_imgproc***.dll或者opencv_core***.dll到项目的输出文件中。
&&&&推荐文章:
【上篇】【下篇】图像处理(1)
SIFT算法大家都比较熟悉,网上的版本很多,刚开始接触时我主要研究的是C++,因为相对于C#,基于OPEN CV C++的SIFT算法资料更多,但是由于想要实现较为理想的界面效果,最终还是放弃了使用C++转而使用C#。
C#中SIFT算法主要分为三种:
1)脱离Emgu cv平台,完全手动实现所有SIFT算法函数,这样的程序虽然实现有些困难,但是完全可借助已有的C++程序做更改,而且这样做最大的好处就是对SIFT算法的原理有更深的理解。
2)实现时使用少量Emgu cv函数(例如影像的读取,灰度值获得等),但是大部分工作还是依赖于.net平台自行完成。
3)基本上程序完全借助于Emgu cv提供的接口,核心函数完全由Emgu cv提供。
前两类程序资源较多,大家也很容易下载,第三类程序资源相对较少,因此我今天简单为大家介绍第三类算法的实现方法,首先回顾一下SIFT算法计算步骤:
1.&尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。
2.&关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。
3.&方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
4.&关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。
使用Emgu cv实现上述步骤非常简单,程序如下:
//确定匹配图像
Bitmap bt1 = new Bitmap(@&C:UsersGAOXIANGDesktopI.jpg&);
Bitmap bt2 = new Bitmap(@&C:UsersGAOXIANGDesktop?.jpg&);
//将图像转为Emgu cv的处理格式
Image&Gray, byte& img1 = new Image&Gray, byte&(bt1);
Image&Gray, byte& img2 = new Image&Gray, byte&(bt2);
//使用Emgu cv探测图片特征点
SIFTDetector sift = new SIFTDetector();
var f1 = sift.DetectFeatures(img1, null);
var f2 = sift.DetectFeatures(img2, null);
到此已经获得了两张相片的特征点f1,f2,接下来就是将相互匹配的特征点相连:
for (int i = 0; i & f1.L i++)
double[] dist = new double[f2.Length];
int n = 0;
int index = 0;
for (int j = 0; j & f2.L j++)
//计算待比较特征点描述子的欧式距离
dist[n++] = diedai(f1[i].Descriptor, f2[j].Descriptor);
//排序,获得欧式距离最近点以及次近点
for (int k = 0; k & 2; k++)
for (int k1 = k+1; k1 & dist.L k1++)
if (dist[k] & dist[k1])
double temp = dist[k];
dist[k] = dist[k1];
dist[k1] =
//记录最近点在相片2中的序列
if (k == 0)
{ index = k1; } } } }
//若最近点与次近点比值小于阈值0.49,绘制特征点连线
if (dist[0]/dist[1] & 0.49)
PointF point1 = f1[i].KeyPoint.P
PointF point2 = f2[index].KeyPoint.P
Graphics g = this.CreateGraphics();
Pen p1 = new Pen(Color.Blue, 3);
g.DrawLine(p1, point1,
//注意:point1,point2位置与具体控件,图像布局有关,请自行调整 }}
//描述子距离计算函数
private double diedai(float[] p1, float[] p2)
double sub=0; double sqrt=0;for (int i = 0; i & p1.L i++)
sub += Math.Pow(p1[i] - p2[i], 2);
sqrt = Math.Sqrt(sub);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:45171次
排名:千里之外
原创:26篇
(1)(2)(1)(1)(3)(1)(3)(8)(1)(1)(9)(3)OpenCV&OpenCV是一个开源的计算机视觉库。OpenCV采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上。OpenCV还提供了Python、Ruby、MATLAB以及其他语言的接口。
OpenCV的一个目标是构建一个简单易用的计算机视觉框架,以帮助开发人员更便捷地设计更复杂得计算机视觉相关应用程序。OpenCV包含的函数有500多个,覆盖了计算机视觉的许多应用
领域,如工厂产品检测、医学成像、信息安全、用户界面、摄像机标定、立体视觉和机器人等。&&&《学习OpenCV(中文版)》
Emgu CV是将OpenCV使用.net编程语言(C#)封装成的.net库,使用Emgu CV就可以在.net平台上调用OpenCV的功能,同时,Emgu CV也是开源的。
Emgu CV官网:
从官网上你可以找到Emgu的最新版本、基础教程和在线API文档。在我写这篇文章时,Emgu发布的最新版本为Emgu.CV-3.0.0,如果从官方网站下载速度较慢,你可以从我的网盘下载,地
址为:。下载得到的是一个名称为libemgucv-windows-universal-3.0.0.2157.exe的安装程序,安装完成后,在安装目录内如如图:
在Solution文件夹中有Visual Studio的项目文件,其中Example项目包括了Emgu的源代码和例程,这些例程包括形状检测、脸部检测、车牌检测、SURF特性匹配等非常丰富的示例,
具体示例项目如图:
创建项目&&我使用的Visual Studio Community 2015,因为是示例程序,所以在Visual Studio中创建一个简单的控制台项目,项目为Demo。
添加Emgu引用&&从Emgu安装目录下的bin文件夹中添加库引用:
  添加完成后,再在程序中(Program.cs)引用命名空间:
1 using Emgu.CV;
2 using Emgu.CV.CvE
3 using Emgu.U
添加OpenCV库&&从Emgu安装目录下的bin\x86(32位系统)文件夹中添加OpenCV库:
       
  添加完成后需选中它们,然后右击设置其属性,将&复制到输出目录&属性为:如果较新则复制。
  至此,我们就创建了一个可以使用Emgu的项目,在Program.cs中输入以下代码试试看是否能正常运行。
static void Main(string[] args)
var image = CvInvoke.Imread(@"D:\a.jpg", LoadImageType.Color); //从文件中读取图像
CvInvoke.NamedWindow("AJpg", NamedWindowType.Normal); //创建一个显示窗口
CvInvoke.Imshow("AJpg", image); //显示图片
CvInvoke.WaitKey(0); //等待按键输入
CvInvoke.DestroyWindow("AJpg");
image.Dispose();
  运行效果:
阅读(...) 评论()}

我要回帖

更多关于 emgu 锐化 图像 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信