{
//1.灰度化,豎向邊緣檢測
//2.自適應二值化處理
//3.形態學處理(膨脹和腐蝕)
//4.輪廓查找與篩選
? ? ? ? ? ? Image<Bgr, byte> simage = OriImage; ? ?//new Image<Bgr, byte>("license-plate.jpg");
? ? ? ? ? ? //Image<Bgr, Byte> simage = sizeimage.Resize(400, 300, Emgu.CV.CvEnum.INTER.CV_INTER_NN);
? ? ? ? ? ? Image<Gray, byte> GrayImg = new Image<Gray, byte>(simage.Width, simage.Height);
? ? ? ? ? ? IntPtr GrayImg1 = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
? ? ? ? ? ? //灰度化
? ? ? ? ? ? CvInvoke.cvCvtColor(simage.Ptr, GrayImg1, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2GRAY);
? ? ? ? ? ? //首先創建一張16深度有符號的圖像區域
? ? ? ? ? ? IntPtr Sobel = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_16S, 1);
? ? ? ? ? ? //X方向的Sobel算子檢測
? ? ? ? ? ? CvInvoke.cvSobel(GrayImg1, Sobel, 2, 0, 3);
? ? ? ? ? ? IntPtr temp = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
? ? ? ? ? ? CvInvoke.cvConvertScale(Sobel, temp, 0.00390625, 0);
? ? ? ? ? ? int it = ComputeThresholdValue(GrayImg.ToBitmap());
? ? ? ? ? ? 二值化處理
? ? ? ? ? ? Image<Gray, Byte> dest = GrayImg.ThresholdBinary(new Gray(it), new Gray(255));
? ? ? ? ? ? Image<Gray, byte> dest = new Image<Gray, byte>(simage.Width, simage.Height);
? ? ? ? ? ? //二值化處理
? ? ? ? ? ? CvInvoke.cvThreshold(temp, dest, 0, 255, Emgu.CV.CvEnum.THRESH.CV_THRESH_OTSU);
? ? ? ? ? ? IntPtr temp1 = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
? ? ? ? ? ? Image<Gray, Byte> dest1 = new Image<Gray, byte>(simage.Width, simage.Height);
? ? ? ? ? ? CvInvoke.cvCreateStructuringElementEx(3, 1, 1, 0, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT, temp1);
? ? ? ? ? ? CvInvoke.cvDilate(dest, dest1, temp1, 6);
? ? ? ? ? ? CvInvoke.cvErode(dest1, dest1, temp1, 7);
? ? ? ? ? ? CvInvoke.cvDilate(dest1, dest1, temp1, 1);
? ? ? ? ? ? CvInvoke.cvCreateStructuringElementEx(1, 3, 0, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT, temp1);
? ? ? ? ? ? CvInvoke.cvErode(dest1, dest1, temp1, 2);
? ? ? ? ? ? CvInvoke.cvDilate(dest1, dest1, temp1, 2);
? ? ? ? ? ? IntPtr dst = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 3);
? ? ? ? ? ? CvInvoke.cvZero(dst);
? ? ? ? ? ? //dest.Dilate(10);
? ? ? ? ? ? //dest.Erode(5);
? ? ? ? ? ? using (MemStorage stor = new MemStorage())
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Contour<Point> contours = dest1.FindContours(
? ? ? ? ? ? ? ? ? ? Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
? ? ? ? ? ? ? ? ? ? Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_CCOMP,
? ? ? ? ? ? ? ? ? ? stor);
? ? ? ? ? ? ? ? for (; contours != null; contours = contours.HNext)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Rectangle box = contours.BoundingRectangle;
? ? ? ? ? ? ? ? ? ? Image<Bgr, byte> test = simage.CopyBlank();
? ? ? ? ? ? ? ? ? ? test.SetValue(255.0);
? ? ? ? ? ? ? ? ? ? double whRatio = (double)box.Width / box.Height;
? ? ? ? ? ? ? ? ? ? int area = (int)box.Width * box.Height;
? ? ? ? ? ? ? ? ? ? if (area > 1000 && area < 10000)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? if ((3.0 < whRatio && whRatio < 6.0))
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? test.Draw(box, new Bgr(Color.Red), 2);
? ? ? ? ? ? ? ? ? ? ? ? ? ? simage.Draw(box, new Bgr(Color.Red), 2);//CvInvoke.cvNamedWindow("dst");
? ? ? ? ? ? ? ? ? ? ? ? ? ? //CvInvoke.cvShowImage("dst", dst);
? ? ? ? ? ? ? ? ? ? ? ? ? ? imageBox2.Image = simage;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
//1.灰度化,豎向邊緣檢測
//2.自適應二值化處理
//3.形態學處理(膨脹和腐蝕)
//4.輪廓查找與篩選
? ? ? ? ? ? Image<Bgr, byte> simage = OriImage; ? ?//new Image<Bgr, byte>("license-plate.jpg");
? ? ? ? ? ? //Image<Bgr, Byte> simage = sizeimage.Resize(400, 300, Emgu.CV.CvEnum.INTER.CV_INTER_NN);
? ? ? ? ? ? Image<Gray, byte> GrayImg = new Image<Gray, byte>(simage.Width, simage.Height);
? ? ? ? ? ? IntPtr GrayImg1 = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
? ? ? ? ? ? //灰度化
? ? ? ? ? ? CvInvoke.cvCvtColor(simage.Ptr, GrayImg1, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2GRAY);
? ? ? ? ? ? //首先創建一張16深度有符號的圖像區域
? ? ? ? ? ? IntPtr Sobel = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_16S, 1);
? ? ? ? ? ? //X方向的Sobel算子檢測
? ? ? ? ? ? CvInvoke.cvSobel(GrayImg1, Sobel, 2, 0, 3);
? ? ? ? ? ? IntPtr temp = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
? ? ? ? ? ? CvInvoke.cvConvertScale(Sobel, temp, 0.00390625, 0);
? ? ? ? ? ? int it = ComputeThresholdValue(GrayImg.ToBitmap());
? ? ? ? ? ? 二值化處理
? ? ? ? ? ? Image<Gray, Byte> dest = GrayImg.ThresholdBinary(new Gray(it), new Gray(255));
? ? ? ? ? ? Image<Gray, byte> dest = new Image<Gray, byte>(simage.Width, simage.Height);
? ? ? ? ? ? //二值化處理
? ? ? ? ? ? CvInvoke.cvThreshold(temp, dest, 0, 255, Emgu.CV.CvEnum.THRESH.CV_THRESH_OTSU);
? ? ? ? ? ? IntPtr temp1 = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
? ? ? ? ? ? Image<Gray, Byte> dest1 = new Image<Gray, byte>(simage.Width, simage.Height);
? ? ? ? ? ? CvInvoke.cvCreateStructuringElementEx(3, 1, 1, 0, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT, temp1);
? ? ? ? ? ? CvInvoke.cvDilate(dest, dest1, temp1, 6);
? ? ? ? ? ? CvInvoke.cvErode(dest1, dest1, temp1, 7);
? ? ? ? ? ? CvInvoke.cvDilate(dest1, dest1, temp1, 1);
? ? ? ? ? ? CvInvoke.cvCreateStructuringElementEx(1, 3, 0, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT, temp1);
? ? ? ? ? ? CvInvoke.cvErode(dest1, dest1, temp1, 2);
? ? ? ? ? ? CvInvoke.cvDilate(dest1, dest1, temp1, 2);
? ? ? ? ? ? IntPtr dst = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 3);
? ? ? ? ? ? CvInvoke.cvZero(dst);
? ? ? ? ? ? //dest.Dilate(10);
? ? ? ? ? ? //dest.Erode(5);
? ? ? ? ? ? using (MemStorage stor = new MemStorage())
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Contour<Point> contours = dest1.FindContours(
? ? ? ? ? ? ? ? ? ? Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
? ? ? ? ? ? ? ? ? ? Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_CCOMP,
? ? ? ? ? ? ? ? ? ? stor);
? ? ? ? ? ? ? ? for (; contours != null; contours = contours.HNext)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Rectangle box = contours.BoundingRectangle;
? ? ? ? ? ? ? ? ? ? Image<Bgr, byte> test = simage.CopyBlank();
? ? ? ? ? ? ? ? ? ? test.SetValue(255.0);
? ? ? ? ? ? ? ? ? ? double whRatio = (double)box.Width / box.Height;
? ? ? ? ? ? ? ? ? ? int area = (int)box.Width * box.Height;
? ? ? ? ? ? ? ? ? ? if (area > 1000 && area < 10000)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? if ((3.0 < whRatio && whRatio < 6.0))
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? test.Draw(box, new Bgr(Color.Red), 2);
? ? ? ? ? ? ? ? ? ? ? ? ? ? simage.Draw(box, new Bgr(Color.Red), 2);//CvInvoke.cvNamedWindow("dst");
? ? ? ? ? ? ? ? ? ? ? ? ? ? //CvInvoke.cvShowImage("dst", dst);
? ? ? ? ? ? ? ? ? ? ? ? ? ? imageBox2.Image = simage;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }