# ly2能否合併alpr ## 套件Emgu.CV ![](https://i.imgur.com/VKqI9Qf.png) ## ly2是如何運行 * 產出網頁即時監看照片 ``` public void WebImage() { try { if (!Directory.Exists($"{output.ImageDir}")) { Directory.CreateDirectory($"{output.ImageDir}"); } procThumb.StartInfo.Arguments = $"-rtsp_transport tcp -stimeout 15000000 -i \"{source.Url}\" -y -s {new ScaleDict().scaleDic[source.Scale]} -r 1 -q:v 10 -update 1 \"{output.ImageDir}\\{output.ImageName}{(source.Id + 1)}.jpg\" -y"; Logger.Trace(procThumb.StartInfo.Arguments); Console.WriteLine(procThumb.StartInfo.Arguments); } catch (Exception e) { Logger.Error(e.ToString()); } } ``` 在使用FFmpeg時,這個函式的作用是產生Web監看的圖像。它會使用FFmpeg的命令行參數來產生圖像。 -rtsp_transport tcp:指定使用TCP傳輸RTSP流。 -stimeout 15000000:設定超時時間為15000000微秒。 -i:指定要播放的URL。 -y:強制覆蓋已存在的檔案。 -s:指定圖像大小。 -r:指定每秒顯示幀數。 -q:v:指定視訊品質。 -update 1:每次僅更新1個圖像。 "{output.ImageDir}\{output.ImageName}{(source.Id + 1)}.jpg":指定儲存圖像的路徑。 它會使用FFmpeg按照指定的參數從RTSP流中產生圖像,並儲存到指定的路徑。 * 車行軌跡 ``` public void CarTrack() { try { if (!Directory.Exists($"{output.TimelapseDir}") && output.AutoCreateCarTrackPath) { Directory.CreateDirectory($"{output.TimelapseDir}"); } procThumb.StartInfo.Arguments = $"-rtsp_transport tcp -stimeout 15000000 -i \"{source.Url}\" -f image2 -s 640x480 -r 1 -q:v 10 -strftime 1 \"{output.TimelapseDir}\\%Y-%m-%d_%H-%M-%S-000_{source.TimelapseId}.kmb\""; Logger.Trace(procThumb.StartInfo.Arguments); Console.WriteLine(procThumb.StartInfo.Arguments); } catch (Exception e) { Logger.Error(e.ToString()); } } ``` 在這段code,定義了一個名為 CarTrack 的方法,它負責將影片轉換為圖片序列。 procThumb 對象將用於執行影片到圖片。 procThumb.StartInfo.Arguments 屬性指定所執行命令的參數。具體來說,這些命令參數指定了影片的來源(使用 source.Url 屬性指定)、轉換後的圖像大小 (640x480)、幀速率(每秒 1 幀)、輸出圖片的分辨率(10)、和圖片的輸出 ## alpr是如何運行 1. 擷取圖片botton 2. 擷取到畫面觸發的事件 3. 壓縮圖檔 * 第一個:按下擷取button if (source != null) //如果有圖片 { source.Dispose(); //則清空該張圖片 } source = new Source(); //可以通過source來訪問新的對象 string url = textBoxURL.Text; //將文本框中的文本值給變量URL if (!new Regex(@"^rtsp://\S+:\S+@\d+.\d+.\d+.\d+:\S+").IsMatch(url)) { MessageBox.Show("rtsp位置錯誤"); return; } _capture = new VideoCapture(url); _capture.ImageGrabbed += capture_ImageGrabbed; _capture.Start(); enableDraw = false; source.Url = url; buttonDrawROI.Enabled = true; buttonCleanROI.Enabled = false; roiGroups.Clear(); //把picturbox上的存的點位清空 第二個:執行擷取到畫面 try { using (_capture) { using (Mat frame = new Mat()) { lock (lockObj) { if (_capture == null) { return; } if (!_capture.Retrieve(frame))//檢索影像框架 { frame.Dispose(); return; } if (frame.IsEmpty) { return; } CaptureImage(frame);//傳遞frame參數 _capture.Stop(); //停止捕捉視頻貞 _capture.ImageGrabbed -= capture_ImageGrabbed;//移除事件 } } } } 第三個:縮圖檔 using (Mat BackupMat = new Mat()) { CvInvoke.Resize(frame, BackupMat, new Size(pictureBox1.Width, pictureBox1.Height));//將原圖大小縮放成pictureBox1的大小 CvInvoke.PyrDown(BackupMat, BackupMat); //壓缩影像分辨率 if (source.BackupMat != null) { source.BackupMat.Dispose(); } source.BackupMat = BackupMat.Clone(); ///再次縮小並丟到mat中 Mat mat = new Mat(); CvInvoke.Resize(BackupMat, mat, new Size(pictureBox1.Width, pictureBox1.Height)); if (source.mat != null) { source.mat.Dispose(); } source.mat = mat.Clone(); ///計算縮放比例 source.Resolution = new PictureScale(frame.Size.Width, frame.Size.Height); source.Xscale = (float)frame.Size.Width / (float)pictureBox1.Width; source.Yscale = (float)frame.Size.Height / (float)pictureBox1.Height; Console.WriteLine($"Xscale: {source.Xscale}, Yscale: {source.Yscale}"); pictureGraphics.DrawImage(source.mat.ToBitmap(), 0, 0);//繪製到picturebox中 quadrilateral.Clear(); buttonDrawROI.Enabled = true; buttonCleanROI.Enabled = false; } ## 結論ly2可以合併到alpr ly2 可以合併到 alpr ly2是按下擷取button後會執行擷取畫面並壓縮圖檔顯示在pictureBox1中,alpr是按下button後會執行擷取畫面之後執行壓所圖檔並顯示在pictureBox1中