C#下用Emgucv对图片进行灰度化、二值化、边缘检测、膨胀腐蚀运算、霍夫变换进行表格识别



其中每个部分的原理相信在各种书籍和网站上都容易找到,这里是C#下用Emgucv实现以上相关操作的源代码全部,转载请注明http://write.blog.csdn.net/postlist

http://blog.csdn.net/yimingsilence/article/details/50382295

http://blog.csdn.net/yimingsilence/article/details/50382295

http://blog.csdn.net/yimingsilence/article/details/50382295
            IntPtr original_ptr = CvInvoke.cvLoadImage(filename, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR);
            if (original_ptr == null)
            {
                MessageBox.Show("没有此图像");
                return;
            }
            /*图像灰度化*/
            IntPtr gray_ptr = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(original_ptr), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
            CvInvoke.cvCvtColor(original_ptr, gray_ptr, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2GRAY);

            /*灰度图片二值化*/
            IntPtr byte_ptr = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(gray_ptr), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
            CvInvoke.cvAdaptiveThreshold(gray_ptr, byte_ptr, 255, Emgu.CV.CvEnum.ADAPTIVE_THRESHOLD_TYPE.CV_ADAPTIVE_THRESH_GAUSSIAN_C, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY, 23, 5);
     
            /*图像显示*/
            MIplImage mipimage1 = (MIplImage)Marshal.PtrToStructure(byte_ptr, typeof(MIplImage));
            Image image = new Image(mipimage1.width, mipimage1.height, mipimage1.widthStep, mipimage1.imageData);

           
          
            //this.pictureBox1.Image = image.ToBitmap();

            ///*检测直线坐标集*/
            IntPtr midImage = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(byte_ptr), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
            //边缘检测和膨胀及腐蚀
            CvInvoke.cvCanny(byte_ptr, midImage, 90, 120, 3);
            CvInvoke.cvDilate(midImage, midImage, IntPtr.Zero, 1);
            CvInvoke.cvErode(midImage, midImage, IntPtr.Zero, 1);
            //霍夫变换
            MemStorage storage = new MemStorage();
            IntPtr intPtrHoughLines = CvInvoke.cvHoughLines2(midImage, storage, HOUGH_TYPE.CV_HOUGH_PROBABILISTIC, 1, Math.PI / 180, 50, 100, 10);
            Seq lineSegment = new Seq(intPtrHoughLines, storage);
            //画出检测结果
            unsafe
            {
                for (int i = 0; i < lineSegment.Total; ++i)
                {
                    Point* point = (Point*)CvInvoke.cvGetSeqElem(intPtrHoughLines, i);
                    CvInvoke.cvLine(original_ptr, point[0], point[1], new MCvScalar(255, 0, 0), 2, LINE_TYPE.CV_AA, 0);//在原图像中画线
                }
            }
           // MIplImage resultHough = (MIplImage)Marshal.PtrToStructure(original_ptr, typeof(MIplImage));
            CvInvoke.cvNamedWindow("result");
            CvInvoke.cvShowImage("result", original_ptr);

关于opencv在不同语言(c,c++,c#)中的各种函数及类型的对应关系见:

http://blog.csdn.net/yimingsilence/article/details/50382349

http://blog.csdn.net/yimingsilence/article/details/50382349

提一点基础问题,要在C#中使用指针需要在项目的->属性->生成中选上 允许不安全代码,然后用指针的代码段要写在unsafe{}里面



你可能感兴趣的:(C#,CV)