1. 程式人生 > >C#下用Emgucv對圖片進行灰度化、二值化、邊緣檢測、膨脹腐蝕運算、霍夫變換進行表格識別

C#下用Emgucv對圖片進行灰度化、二值化、邊緣檢測、膨脹腐蝕運算、霍夫變換進行表格識別



其中每個部分的原理相信在各種書籍和網站上都容易找到,這裡是C#下用Emgucv實現以上相關操作的原始碼全部,轉載請註明http://write.blog.csdn.net/postlist

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<Gray, Byte> image = new Image<Gray, Byte>(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<LineSegment2D> lineSegment = new Seq<LineSegment2D>(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#)中的各種函式及型別的對應關係見:

提一點基礎問題,要在C#中使用指標需要在專案的->屬性->生成中選上 允許不安全程式碼,然後用指標的程式碼段要寫在unsafe{}裡面