Пример #1
0
        private Bitmap DoGaussian(OneEye eye)
        {
            LSD.doubleTupleList outList = LSD.doubleTupleList.newTupleList(7);
            image <double>      modgrad;
            List <coord>        list_p;
            // angle tolerance
            double quant  = 2.0;      // Bound to the quantization error on the gradient norm.
            double ang_th = 22.5;     // Gradient angle tolerance in degrees.
            int    n_bins = 1024;     // Number of bins in pseudo-ordering of gradient modulus.
            double prec   = Math.PI * ang_th / 180.0;
            double p      = ang_th / 180.0;
            double rho    = quant / Math.Sin(prec);
            //LSD.image<Double> scaled_image=LSD.gaussian_sampler(eye.imgDouble, 0.8, 0.6);
            image <Double> scaled_image = eye.imgDouble;
            image <Double> angles       = LSD.ll_angle(scaled_image, rho, (uint)n_bins, out modgrad, out list_p);
            image <double> img          = angles;
            int            w            = (int)img.width;
            int            h            = (int)img.height;

            //double normal = double.Epsilon;
            //for (int y = 0; y < h; y++)
            //    for (int x = 0; x < w; x++)
            //    {
            //        if (img.data[x, y] == LSD.NOTDEF) continue;
            //        if (normal < Math.Abs(img.data[x, y])) normal = Math.Abs(img.data[x, y]);
            //    }
            //normal /= 255;
            try
            {
                Bitmap     gaussian = new Bitmap(w, h, PixelFormat.Format24bppRgb);
                BitmapData dataOut  = gaussian.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                unsafe
                {
                    byte *pOut = (byte *)(dataOut.Scan0.ToPointer());
                    for (int y = 0; y < h; y++)
                    {
                        for (int x = 0; x < w; x++)
                        {
                            byte gr;
                            if (img.data[x, y] == LSD.NOTDEF)
                            {
                                gr = 0;
                            }
                            else
                            {
                                gr = 200;
                            }
                            pOut[0] = pOut[1] = pOut[2] = (byte)gr;
                            pOut   += 3;
                        }
                        pOut += dataOut.Stride - w * 3;
                    }
                }
                gaussian.UnlockBits(dataOut);
                gaussian.Save("gaussian.bmp");
                return(gaussian);
            }
            catch (Exception ex) { Message("Make Gaussian:" + ex.Message); }
            return(null);
        }
Пример #2
0
        private Bitmap DoLSD(OneEye eye)
        {
            image <int> img = new image <int>();   // 隨更new,只要不是null, 在LSD裏會重建

            LSD.doubleTupleList tupleList = LSD.lsd_scale_region(eye.imgDouble, 0.8, ref img);
            int w = (int)img.width;
            int h = (int)img.height;

            try
            {
                Bitmap     lineSegment = new Bitmap(w, h, PixelFormat.Format24bppRgb);
                BitmapData dataOut     = lineSegment.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                unsafe
                {
                    byte *pOut = (byte *)(dataOut.Scan0.ToPointer());
                    for (int y = 0; y < h; y++)
                    {
                        for (int x = 0; x < w; x++)
                        {
                            byte gr = (img.data[x, y] == 0) ? (byte)0 : (byte)200;
                            pOut[0] = pOut[1] = pOut[2] = gr;
                            pOut   += 3;
                        }
                        pOut += dataOut.Stride - w * 3;
                    }
                }
                lineSegment.UnlockBits(dataOut);
                lineSegment.Save("LSD.bmp");
                return(lineSegment);
            }
            catch (Exception ex) { Message("Make LSD:" + ex.Message); }
            return(null);
        }
Пример #3
0
 private void btnConnectRight_Click(object sender, EventArgs e)
 {
     if (mRightEye == null)
     {
         mRightEye             = new OneEye();
         mRightEye.pbxOriginal = pictureBoxRight;
         mRightEye.pbxGray     = pictureBoxGrayRight;
         mRightEye.endPoint    = new IPEndPoint(IPAddress.Parse("192.168.31.61"), 10086);
     }
     RunTcpThread(mRightEye);
 }
Пример #4
0
        private void toGray(Bitmap img, OneEye eye)
        {
            int h = img.Size.Height;
            int w = img.Size.Width;

            try
            {
                Bitmap gray = new Bitmap(w, h, PixelFormat.Format24bppRgb);
                eye.imgDouble = image <double> .newImage((uint)w, (uint)h);

                //Color c;
                byte       gr;
                BitmapData dataIn  = img.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                BitmapData dataOut = gray.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                unsafe
                {
                    byte *pIn  = (byte *)(dataIn.Scan0.ToPointer());
                    byte *pOut = (byte *)(dataOut.Scan0.ToPointer());
                    for (int y = 0; y < h; y++)
                    {
                        for (int x = 0; x < w; x++)
                        {
                            //c = img.GetPixel(x , y);
                            //gr = (byte)(c.R * 0.299 + c.G * 0.587 + c.B * 0.114);
                            //gray.SetPixel(x, y, Color.FromArgb(gr, gr, gr));
                            gr = (byte)(pIn[0] * 0.299 + pIn[1] * 0.587 + pIn[2] * 0.114);
                            eye.imgDouble.data[x, y] = gr;
                            pOut[0] = pOut[1] = pOut[2] = gr;
                            pIn    += 3;
                            pOut   += 3;
                        }
                        pIn  += dataIn.Stride - w * 3;
                        pOut += dataOut.Stride - w * 3;
                    }
                }
                gray.UnlockBits(dataOut);
                img.UnlockBits(dataIn);
                eye.imgGray       = gray;
                eye.pbxGray.Image = gray;
            }
            catch (Exception ex) { Message("Make Gray:" + ex.Message); }
        }
Пример #5
0
        void RunTcpThread(OneEye eye)
        {
            if (eye.mRemainConnect)
            {
                Message("己連線... 請先斷線!");
                return;
            }

            eye.mStream    = null;
            eye.mTcpClient = new TcpClient();
            try
            {
                eye.mTcpClient.Connect(eye.endPoint);
                //mTcpClient.Connect(IPAddress.Parse("127.0.0.1"), 12580);
            }
            catch (Exception ex)
            {
                Message("連線失敗:" + ex.Message);
                return;
            }
            if (eye.mTcpClient != null)
            {
                eye.mStream = eye.mTcpClient.GetStream();
            }
            else
            {
                eye.mStream = null;
            }
            if (eye.mTcpClient != null && eye.mStream != null)
            {
                Message("Connect " + eye.mTcpClient.Client.RemoteEndPoint.ToString() + " Success!");
                eye.mRemainConnect = true;
                ParameterizedThreadStart parameterRun = new ParameterizedThreadStart(Run);
                Thread thread = new Thread(parameterRun);
                thread.Start(eye);
            }
            else
            {
                Message("Connect Fail!");
            }
        }
Пример #6
0
        private void ShowImageAndTime(DateTime t1, MemoryStream imageStream, double kb, string msg, OneEye eye)
        {
            double span = Math.Round((DateTime.Now - t1).TotalSeconds, 2);

            Message(span.ToString() + " sec:" + msg + "=" + kb.ToString() + "k");
            try
            {
                Bitmap img = (Bitmap)Bitmap.FromStream(imageStream);
                eye.img = img;
                eye.pbxOriginal.Image = img;
                Message("Image " + kb.ToString() + "k Width=" + img.Size.Width.ToString() + " Height=" + img.Size.Height.ToString());
                toGray(img, eye);
            }
            catch (Exception ex)
            {
                Message("不是有效的圖形:" + ex.Message);
            }
        }
Пример #7
0
        private void Run(object obj)
        {
            OneEye    eye     = (OneEye)obj;
            DateTime  t1      = new DateTime(1999, 1, 1);
            const int bufSize = 8192000;

            byte[] buffer = new byte[bufSize];
            int    len = 0, l = 0;
            string msg = "";

            eye.mRemainConnect = true;
            eye.mAlreadExit    = false;
            bool waitHeader = true;
            int  expectLen  = 0;

            while (eye.mRemainConnect)
            {
                try
                {
                    for (int i = 0; i < 100; i++)
                    {
                        Thread.Sleep(10);
                        if (!eye.mStream.DataAvailable)
                        {
                            if (eye.mTcpClient.Client.Connected)
                            {
                                continue;
                            }
                            eye.mRemainConnect = false;
                            Message("Socket Connect broken!");
                            break;
                        }
                        if (waitHeader)
                        {
                            t1 = DateTime.Now;                 // 開始計時
                        }
                        l = eye.mStream.Read(buffer, len, bufSize - len);
                        if (l == 0)
                        {
                            continue;
                        }
                        msg += " " + l.ToString();
                        len += l;
                        if (waitHeader)
                        {
                            if (HeaderFound(buffer, ref len, out expectLen))
                            {
                                waitHeader = false;
                            }
                        }
                        if (expectLen > 0 && len >= expectLen)
                        {
                            break;
                        }
                        i = 0;   // 剛讀一筆要等1秒沒資料才換下圖
                    }
                    if (!eye.mRemainConnect)
                    {
                        break;                       // while
                    }
                    if (len == 0)
                    {
                        continue;
                    }
                    MemoryStream memStream;
                    double       kb;
                    if (len > expectLen)
                    {
                        memStream = new MemoryStream(expectLen);
                        memStream.Write(buffer, 0, expectLen);
                        for (int i = expectLen; i < len; i++)
                        {
                            buffer[i - expectLen] = buffer[i];
                        }
                        kb = Math.Round((double)expectLen / 1024, 1);
                    }
                    else
                    {
                        memStream = new MemoryStream(len);
                        memStream.Write(buffer, 0, len);
                        kb = Math.Round((double)len / 1024, 1);
                    }


                    ShowImageAndTime(t1, memStream, kb, msg, eye);
                    len        = 0;
                    msg        = "";
                    waitHeader = true;
                    expectLen  = 0;
                }
                catch (Exception ex) { Message(ex.Message); }
            }
            eye.mAlreadExit = true;
        }