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); }
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); }
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); }
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); } }
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!"); } }
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); } }
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; }