转自:http://www.cnblogs.com/maiye/archive/2010/06/19/1761075.html
首先介绍一下自己的情况,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 = new IntPtr();//存放检测到的图像块的首地址 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= new Seq<Point>(Dyncontour, null);//方便对IntPtr类型进行操作 Seq<Point> DyncontourTemp=DyncontourTemp1; 7.对第五步检测出的区域的坐标提取,通过cvFindContours函数的调用在 Dyncontour中存放的是不为零区域坐标的值存储在内存中的首地址指针。 seq<Point> DyncontourTemp1= new Seq<Point>(Dyncontour, null); //方便对IntPtr类型进行操作 int total=contourImg.Total;//contourImg包含的元素的总数 { |
详细解决方案
C#nbsp;中使用OPenCV(Emgu)心得
热度:90 发布时间:2024-01-06 02:46:17.0
相关解决方案
- javax.microedition.io.ConnectionNotFoundException: TCP
- java.lang.Error: Unresolved compilation
- javax.microedition.io.ConnectionNotFoundException:
- javax.mail.SendFailedException: Invalid Addresses;
- java.lang.SecurityException: Application not
- java.io.IOException: storageOpen(): No such
- java.io.UTFDataFormatException: invalid first byte
- java.lang.NullPointerException:
- Caused by: java.util.jar.JarException: Cannot
- --- Cause: java.sql.SQLException: 列名无效
- Error 500--Internal Server Error
- java.security.AccessControlContext.checkPermission:access denied
- 2000,连接的时候总是报错:在建立与服务器的连接时出错。
- error C2059: 语法错误 : “<”
- 请检查下列特定分析错误详细信息并适当地修改源文件。
四、总结
- 在IE浏览器中为什么会显示出小矩形?该如何处理
- 空数据在GridView下显示 
- 代码 <a href="uppic/<%=nfn %>" target=“_blank”>下载</a> 可以实现下载,该怎么解决
- 从客户端 (msg= <img alt="微笑" src="")中检测到有潜在威胁的Request.QueryString值,该如何解决?
- 请问CKEditor编辑时自动加上 的有关问题
- 空格在textBox上显示 的值,如何避免
- str1.Replace(CrLf, "<br>").Replace(" " " ")为什么只有起作用:str1.Replace(" " " ")解决方法
- 求个正则表达式,将" "轮换为空字符串
- gridview中 " " 取出为" "该如何解决
- 怎么替换字符串中空格为 \n为<br>注:html元素中的不替换
- 异常详细信息: System.Web.HttpRequestValidationException:
- 用uc浏览器,&nbsp;不显示空格,<br/>不换行,求解决方法!