---
# System prepended metadata

title: ly2能否合併alpr

---

#    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中




