Emgu.CV 學習筆記 (二) 入門

  • 22157
  • 0
  • 2012-03-26

Emgu.CV
灰階
二值化
边缘检测

 

    public void TestRun(Bitmap bitmap)
        {
            Image<Bgr, Byte> img = new Image<Bgr, Byte>(bitmap);
            //灰階
            Image<Gray, Byte> gray = img.Convert<Gray, Byte>().PyrDown().PyrUp();
            //二值化
            Image<Gray, Byte> gray1 = gray.ThresholdToZero(new Gray(Settings.ThresholdToZero));
            //http://www.cnblogs.com/xrwang/archive/2010/03/03/ImageFeatureDetection.html.
            //Canny算子也可以用作边缘检测
            Image<Gray, Byte> gray2 = gray1.Canny(new Gray(Settings.LowThresh), new Gray(Settings.HighThresh));
 
            int iiW = CurrentImage.Width;
            int iiH = CurrentImage.Height;
            Bitmap image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            using (Graphics g = Graphics.FromImage(image))
            {
                Rectangle rct1 = new Rectangle(new Point(0, 0), new Size(iiW / 2, iiH / 2));
                g.DrawImage(img.Bitmap, rct1, new Rectangle(new Point(0, 0), new Size(iiW, iiH)), GraphicsUnit.Pixel);
                g.DrawRectangle(new Pen(Color.Black), rct1);
 
                Rectangle rct2 = new Rectangle(new Point(0, iiW / 2), new Size(iiW / 2, iiH / 2));
                g.DrawImage(gray.Bitmap, rct2, new Rectangle(new Point(0, 0), new Size(iiW, iiH)), GraphicsUnit.Pixel);
                g.DrawRectangle(new Pen(Color.Black), rct2);
 
                Rectangle rct3 = new Rectangle(new Point(iiH / 2, 0), new Size(iiW / 2, iiH / 2));
                g.DrawImage(gray1.Bitmap, rct3, new Rectangle(new Point(0, 0), new Size(iiW, iiH)), GraphicsUnit.Pixel);
                g.DrawRectangle(new Pen(Color.Black), rct3);
 
                Rectangle rct4 = new Rectangle(new Point(iiH / 2, iiW / 2), new Size(iiW / 2, iiH / 2));
 
                g.DrawImage(gray2.Bitmap, rct4, new Rectangle(new Point(0, 0), new Size(iiW, iiH)), GraphicsUnit.Pixel);
                g.DrawRectangle(new Pen(Color.Black), rct4);
            }
            pictureBox1.Image = image;
 
        }
 
找出你個大叉叉、就能關閉了
 
 
 
怎麼找點?
一種是整張圖掃描、慢但是有效、
另一種事先用內建的功能找線、在透過每條線間拼成一個rect
 
 LineSegment2D[] lines = gray2.HoughLinesBinary(
               1, //Distance resolution in pixel-related units
               Math.PI / 45.0, //Angle resolution measured in radians.
               5, //threshold
               5, //min Line width
               5 //gap between lines
               )[0]; //Get the lines from the first channel

因為點很小、所以參數都要設小、

在把每條線轉換成框框、把相交的框框合併成一個大框框、就會抓到類似叉叉的框

                        //        //抓出资料
                        //        MCvBox2D box1 = new MCvBox2D(new PointF(rct.X + rct.Width / 2, rct.Y + rct.Height / 2), rct.Size, 0);
                        //        Image<Gray, byte> img2 = gray2.Copy(box1);
 
如何比对?
最简单的方式、用md5算出那张图罗、只有一个问题、错位就完全不一样了、
另一种方式、算x轴跟y轴的点数量、转换成12345.56786、就可以比对相似度了、
 
針對正常字型的數字、計算X軸直方圖、搭配Y軸直方圖、可以找出跟計算出相似度、就可以猜了、
 
 
 
聯合利華公司引進了一條香皂包裝生產線, 
結果發現這條生產線有個缺陷:常常會有盒子沒裝入香皂。 

總不能把空盒子賣給顧客啊, 
他們只得請了一個學自動化的博士後設計一個方案 
來分揀空的香皂盒。 

博士後拉起了一個十幾人的科研公關小組,綜合採用了機械、微電子、自動化、X光探測等技術, 花了幾十萬,成功解決了問題。 

每當生產線上有空香皂盒通過,兩旁的探測器會檢測到,並且驅動一隻機械手把空皂盒推走。 

中國南方有個鄉鎮企業也買了同樣的一條香皂包裝生產線,老闆發現這個問題後大為發火,找了個小工來說:「你他媽給老子把這個搞定,不然你給老子滾蛋~。」

小工很快想出了辦法:他在生產線旁邊放了台風扇猛吹,空皂盒自然會被吹走。 

 

在我搞了一堆辨識、計算後............................................

我最後的方案是:

放了個瀏覽器、計時器、然後固定分鐘重刷、

我要的目的就達到的、facebook遊戲掛線、

只要VPN不要斷、

真他嗎的簡單....................................orz

 
機車、出現了ImageCode、e04
 
 
圖形縮放
 
 
 
  • CV_INTER_NN - 最近邻插值,
  • CV_INTER_LINEAR - 双线性插值 (缺省使用)
  • CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法..
  • CV_INTER_CUBIC - 立方插值.  
 
 

===================

搞了C#

現在來學學維修筆電