C# 中使用OPenCV(Emgu)心得
来源:互联网 发布:新疆大学网络管理系统 编辑:程序博客网 时间:2024/05/20 14:40
首先介绍一下自己的情况,2010年的3月份开始接触学习C#编程,之前C#和OpenCV都是零基础,由于全都是自学进度比较慢,中间也走了不少弯路。进过三个月自己的学习与探索,对C#中使用OpenCV也算是有点心得,希望对初学者有所帮助,也希望大牛们进行指点。我使用的编程环境是VS2005,使用的Emgucv 2.1.0.793版 本。
1.先是在程序中图像的导入,我是根据图像路径实现,其中path是string类型,是图像路径。
IntPtr img=CvInvoke.cvLoadImage(path,Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR);
2.图像灰度化处理,先创建一幅尺寸大小为为原图的8位图像GrayImg1:
Rectangle cr = CvInvoke.cvGetImageROI(img1);
IntPtr GrayImg1 = CvInvoke.cvCreateImage(cr.Size,Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
现在就能使用cvCvtColor函数实现灰度化:
CvInvoke.cvCvtColor(img1, GrayImg1,Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2GRAY);
3.直方图的创建,并获取数据
int[] hist_size = new int[1] { 256 };//建一个数组来存放直方图数据
IntPtr HistImg=CvInvoke.cvCreateHist(1, hist_size,Emgu.CV.CvEnum.HIST_TYPE.CV_HIST_ARRAY, null, 1);//创建了一个空的直方图
CvInvoke.cvCalcHist(inPtr1,HistImg,false,System.IntPtr.Zero);//计算inPtr1指向图像的数据,并传入Histimg中,其中IntPtr[] inPtr1 = new IntPtr[1] { SubImg}。
现在要获取Histimg中的具体数据:
for (int i = 0; i < 256; i++)
这样在数组temphist中保存了直方图数据。
4.对第一步中由cvLoadImage导入的图像进行像素点的操作。由于img是IntPtr类型无法直接进行操作,所以首先要进行格式的转化,把IntPtr型转换成MIplImage:
Emgu.CV.Structure.MIplImage MIpImg =
(Emgu.CV.Structure.MIplImage)System.Runtime.InteropServices.Marshal.PtrToStructure(img,typeof(Emgu.CV.Structure.MIplImage));
然后再C#中使用unsafe中指针操作:npixel = (int)((byte*)img.imageData +img.widthStep * i)[j];
5.在二值话的图像,对不为零的区域经行检测。
IntPtr Dyncontour = newIntPtr();//存放检测到的图像块的首地址
IntPtr Dynstorage = CvInvoke.cvCreateMemStorage(0);开辟内存区域
int n= CvInvoke.cvFindContours(tempimg, Dynstorage,ref Dyncontour, StructSize.MCvContour,Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_CCOMP,Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE,new Point(0, 0));
n表示检测到不为零区域的个数。
6.对第五步检测到的区域绘制轮廓
for(;DyncontourTemp!=null&&DyncontourTemp.Ptr.ToInt32()!=0;DyncontourTemp=DyncontourTemp.HNext)
{
CvInvoke.cvDrawContours(tempContImg,DyncontourTemp,new MCvScalar(255, 255, 255),new MCvScalar(255, 255,255), 0, 1, Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, new Point(0,0));
其中的DyncontourTemp为
Seq<Point>DyncontourTemp1= newSeq<Point>(Dyncontour,null);//方便对IntPtr类型进行操作
Seq<Point>DyncontourTemp=DyncontourTemp1;
7.对第五步检测出的区域的坐标提取,通过cvFindContours函数的调用在Dyncontour中存放的是不为零区域坐标的值存储在内存中的首地址指针。
seq<Point>DyncontourTemp1= newSeq<Point>(Dyncontour, null);//方便对IntPtr类型进行操作
int total=contourImg.Total;//contourImg包含的元素的总数
{
- C# 中使用OPenCV(Emgu)心得
- C# 中使用OPenCV(Emgu)心得
- C# 中使用OPenCV(Emgu)心得
- C# 中使用OPenCV(Emgu)心得
- C# 中使用OPenCV(Emgu)心得
- C# 中使用OPenCV(Emgu)心得
- C# 中使用OPenCV(Emgu)心得
- C# 中使用OPenCV(Emgu)心得
- VS2010、C#、Emgu CV配置 ; 在C#下使用OpenCV ; C#中使用OpenCV(Emgu CV); 配置全程截图
- VS2010、C#、Emgu CV配置 ; 在C#下使用OpenCV ; C#中使用OpenCV(Emgu CV); 配置全程截图
- VS2010、C#、Emgu CV配置 ; 在C#下使用OpenCV ; C#中使用OpenCV(Emgu CV)
- VS2010、C#、Emgu CV配置 ; 在C#下使用OpenCV ; C#中使用OpenCV(Emgu CV); 配置全程截图,不能请留言!
- C#下使用openCV(Emgu CV)
- Emgu CV(OpenCV for C#)学习笔记(1)
- Emgu CV(OpenCV for C#)学习笔记(2)
- Emgu CV(OpenCV for C#)学习笔记(3)
- c# OpenCV Emgu学习
- openCV使用心得
- VS2008的动、静态编译
- opencv静态编译
- opencv静态编译
- 如何在一个完全没有安装vs2008和op…
- 如何在一个完全没有安装vs2008和op…
- C# 中使用OPenCV(Emgu)心得
- C# 中使用OPenCV(Emgu)心得
- opencv 任意角度旋转图像
- opencv 任意角度旋转图像
- 2011年09月29日
- 2011年09月29日
- 2011年09月29日
- 2011年09月29日
- opencv 任意角度旋转图像