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{}裡面