快訊!我的新書今天開始可以在天瓏網路書店預購啦!歡迎大家前往訂購!

 >>>> AI 職場超神助手:ChatGPT 與生成式 AI 一鍵搞定工作難題 <<<<

  • ,

    點到多邊形的最短距離

    cv2.pointPolygonTest是OpenCV中的一個函數,用於計算點到多邊形的最短距離或點是否在多邊形內。 函數的語法如下: 相關函數請參考: cv2.distanceTransform 另外要畫出多邊形可使用cv2.polylines,如以下範例

    Continue Reading…: 點到多邊形的最短距離

  • ,

    使用OpenCV將圖形轉正

    旋轉圖片的方法 若是單純只是要把圖片做角度的旋轉,可以直接使用OpenCV 的 cv2.rotate() 函数。可按指定的方向旋轉圖像。如下: 翻轉圖片的方法 cv2.flip() 是 OpenCV 中用於圖像翻轉的函數。它可以在水平、垂直或兩個方向上翻轉圖像。該函數接受三個參數:輸入圖像、翻轉的模式和輸出圖像的可選參數。 flipCode:翻轉的模式。可以是以下值之一: cv2.flip() 函數和 cv2.rotate() 函數都可以用於實現圖像的旋轉和翻轉,但它們的效果是不同的。 cv2.flip() 函數可以在水平和垂直方向上翻轉圖像,包括水平翻轉、垂直翻轉和同時在水平和垂直方向上翻轉。例如,使用 cv2.flip(image, -1) 可以同時在水平和垂直方向上翻轉圖像。 cv2.rotate() 函數用於對圖像進行旋轉。通過指定旋轉的角度和旋轉中心點,可以實現不同角度的旋轉。例如,使用 cv2.rotate(image, cv2.ROTATE_180_CLOCKWISE) 可以將圖像順時針旋轉180度。 雖然cv2.flip(image, -1) 和 cv2.rotate(image, cv2.ROTATE_180_CLOCKWISE) 可以實現類似的效果,將圖像翻轉或旋轉180度,但它們的內部操作是不同的。 cv2.flip() 是基於軸對稱翻轉實現的,而 cv2.rotate() 是基於旋轉變換實現的。 針對形狀做角度校正 在許多圖像偵測的狀況,我們仍然會需要針對物件去做旋轉,首先我們一定是先用cv2.findContours取得輪廓,然後取得該物件輪廓的角度。這邊很重要的,就是要取得物件輪廓的角度,要取得角度,首先就要先去做輪廓擬合(請參考: OpenCV裡面形狀擬合的幾種方法)。 這邊我大推使用橢圓去做輪廓擬合並且取得軸心的角度,為什麼呢? 雖然cv2.minAreaRect() 可計算最小擬合矩形,但是這個矩形會非常容易受到輪廓的些微影響而改變擬合的方式,例如以下圖為例,就有可能有黑框、紅色框兩種的最小擬合矩形(會視當下輪廓取得的細微變化而改變)。也因此所取得的角度會非常多變,後續的辨識也會更困難…

    Continue Reading…: 使用OpenCV將圖形轉正

  • 限制ffmpeg初始連接的時間

    ffmpeg中的analyzeduration和probesize 在FFmpeg中,-analyzeduration和-probesize是用於設置媒體分析的參數。 -analyzeduration參數用於指定分析媒體文件的持續時間。當你在FFmpeg中打開一個媒體文件時,它需要一些時間來分析文件的內容,以確定其格式、編解碼器和其他相關的信息。這個參數設置了分析的時間長度。較長的-analyzeduration值可能會導致更準確的分析結果,但同時也會增加打開文件的時間。預設值為5,000,000微秒(5秒)。 -probesize參數用於指定分析媒體文件時讀取的數據大小。當FFmpeg分析媒體文件時,它會從文件中讀取一些數據並進行分析。這個參數設置了從媒體文件中讀取的數據大小。較大的-probesize值可能會導致更準確的分析結果,但同時也會增加分析的時間和記憶體使用量。預設值為50,000字節。 前置metadata 播放器在網絡點播場景下去請求MP4 視頻數據,需要先獲取到文件的metadata,解析出該文件的編碼、幀率等信息後才能開始邊下邊播。如果MP4 的metadata 數據塊被編碼在文件尾部,這種情況會導致播放器只有下載完整個文件後才能成功解析並播放這個視頻。對於這種視頻,我們最好能夠在服務端將其重新編碼,將metadata 數據塊轉移到靠近文件頭部的位置,保證播放器在線請求時能較快播放。比如FFmpeg 的下列命令就可以支持這個操作: 控制讀取的數據量大小 在外部可以通過設置 probesize 和 analyzeduration 兩個參數來控制該函數讀取的數據量大小和分析時長為比較小的值來降低 avformat_find_stream_info 的耗時,從而優化播放器首屏秒開。但是,需要注意的是這兩個參數設置過小時,可能會造成預讀數據不足,無法解析出碼流信息,從而導致播放失敗、無音頻或無視頻的情況。所以,在服務端對視頻格式進行標準化轉碼,從而確定視頻格式,進而再去推算 avformat_find_stream_info 分析碼流信息所兼容的最小的 probesize 和analyzeduration,就能在保證播放成功率的情況下最大限度地區優化首屏秒開。 probesize 和 analyzeduration太短的可能影響 如果將-probesize和-analyzeduration設置得太短,可能會導致以下問題:

    Continue Reading…: 限制ffmpeg初始連接的時間

  • 為影片產生會議紀錄及重點擷取

    將影片轉為MP3 先照這篇的方式安裝FFMPEG,接著就可以使用ffmpeg將影片轉成mp3檔案 在上述命令中,input.mp4是輸入的MP4文件路徑,output.mp3是輸出的MP3文件路徑。 從語音檔案使用AI提取文字 這個功能在WORD就有了,若是沒有WORD,GOOGLE文件也有相似的聽寫功能,以下為我使用Office內建聽寫功能的示範 先使用轉錄功能 接著選擇輸入語言為台灣國語,並上傳剛剛擷取出來的mp3檔案 選擇完檔案會開始上傳MP3並且擷取音檔內的文字,這也是為什麼一開始我會希望將mp4轉成mp3,因為含影像的檔案較大,純音檔較小,上傳較小的檔案這邊所花費的時間會少一點 當節錄文字完成後,選擇將文字加到檔案內,就會出現如下的語音謄錄文字 讓文字更易懂 使用工具: ChatGPT 一直到這邊所產生的文字,都很不容易讓人理解,因為所擷取出的文字很容易會有錯別字,例如: 【視障小孩】可能會被聽寫成【師丈小孩】,根本意義完全不同,讓人難以理解。 但是ChatGPT對於理解這樣的錯別字,比對上下文去猜出正確辭意的能力頗強,所以可以使用ChatGPT請他幫忙整理內容 例如上面的文字GTP所整理出的內容如下 接著再重複使用上面產生的內容,請GPT產生摘要、標題,我們只需要作內容審核、確認、修正即可,可以大幅節省人力唷! 另外,對CHATGPT所下的指令也會影響到產出,例如上面我使用【順成文章】的指令,所以最後面CHATGPT就自己唬爛了一些不相關的內容(甚麼不僅僅是個人問題之類的老師根本沒有講)。這時候就可以改使用【順過讓文字更好讀】這樣的指令,就比較不會產生不相關的內容。 建議可以多嘗試幾種不同的指令,直接針對他所整理過的不滿意的方向請她重新整理,直到CHATGPT給出較滿意的產出後,再自行做驗證/整理

    Continue Reading…: 為影片產生會議紀錄及重點擷取

  • 使用OBS做會議錄影

    使用OBS把線上會議錄起來 若是線上會議,推薦使用OBS可以很方便的對所有類型的會議做錄影。 這邊是OBS的下載位置: https://obsproject.com/ OBS可以擷取視窗螢幕,只要是可以在桌面上執行的軟體,都可以從【+】 ->【 Window Capture】去獲取該程式的畫面並放置於OBS畫面上。使用這個方式錄影的優點是,我們可以在錄影的時候同時使用其他的軟體,並且不會被錄到除了你所選擇的應用程式以外的電腦上的操作,OBS只會持續的錄該程式的畫面。 例如下面這樣子就只會錄到所選擇的Chrome的視窗,我們在電腦上回Line訊息、開別的Chrome瀏覽網頁,都不會被錄進去 這樣的方式在Window上直接就會可以錄到畫面+聲音,但是若你的電腦是Mac,則需要另外做額外的設定,才能夠讓OBS取得電腦內部的聲音。這邊為教學文章: https://www.casper.tw/life/2021/06/13/mac-reacord-by-soundflower/ 開始錄影 在上面設定完之後,按下右下的【開始錄製】並在會議結束時按下【結束錄製】,就可以在本機>影片找到錄好的影片,檔名會是錄影的時間 安裝FFMPEG 接著則要做影片的剪裁+合成,以下是一些簡單的影片操作指令 首先,下載別人已經Build好的ffmpeg: https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-5.1.2-full_build.7z 接著,把ffmpeg.exe丟到系統的路徑裡面,如C:\Windows\System32,或者將ffmpeg的路徑加到環境變數的Path裡面,讓系統能夠找的到ffmpeg的位置。 驗證方式: 開啟命令提示字元,輸入ffmpeg,如果能出現以下畫面,代表設定成功 做一些簡單的影片操作 擷取影片片段 在上述命令中,input.mp4是輸入的視頻文件路徑,output.mp4是輸出的視頻文件路徑。 00:12表示起始時間,00:15:30表示結束時間。 刪除影片片段 在上述命令中,input.mp4是輸入的視頻文件路徑,output.mp4是輸出的視頻文件路徑。 0:4表示要刪除的起始時間範圍,8表示要刪除的結束時間。 合併多個影片檔案 為影片加上浮水印 在上述命令中,input.mp4是輸入的視頻文件路徑,watermark.png是水印圖片文件的路徑,output.mp4是輸出的帶有水印的視頻文件路徑。 -filter_complex “overlay=W-w-10:H-h-10″:使用filter_complex選項應用複雜的過濾器。 overlay過濾器用於將水印圖像疊加在視頻上。 W-w-10表示水印圖像的水平位置,H-h-10表示水印圖像的垂直位置。在這個示例中,水印位於視頻的右下角,並與邊緣保持10像素的間距。

    Continue Reading…: 使用OBS做會議錄影

  • ,

    Ubuntu 18.04的apt update更新失敗

    錯誤訊息 W: Failed to fetch http://repo.mysql.com/apt/ubuntu/dists/bionic/InRelease The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 467B942D3A79BD29 W: Some index files failed to download. They have been ignored, or old ones used instead. 問題原因 這個錯誤訊息是說您的系統在嘗試從 http://repo.mysql.com/apt/ubuntu/dists/bionic/…

    Continue Reading…: Ubuntu 18.04的apt update更新失敗

  • ,

    wordpress 永久連結設定失效

    故障的可能原因 在Apache2支持永久連結 要啟用 Apache2 的 mod_rewrite 模組,您需要將以下內容添加到 Apache2 的設定檔案中: 這個設定通常會加入到 mods-enabled 目錄中的一個設定檔案中。例如,您可以創建一個名為 rewrite.load 的檔案,並將上面的設定添加到這個檔案中。請按照以下步驟進行操作: 啟用rewrite功能 若您的 /etc/apache2/mods-available 目錄下已經有了 rewrite.load 設定檔案,您可以透過建立符號連結方式來啟用 mod_rewrite 模組。 請按照以下步驟: 執行完上述步驟後,Apache2 的 mod_rewrite 模組即會啟用。您可以再次檢查 /etc/apache2/mods-enabled 目錄,確保 rewrite.load 的符號連結已經建立。若您需要停用 mod_rewrite,則可以刪除這個符號連結即可。

    Continue Reading…: wordpress 永久連結設定失效

  • ,

    在K8S內ksoftirqd耗費大量CPU

    問題描述 我們在K8S內架設串流伺服器,在做loadtest時發現,當流量變高之後,K8S用來管理線程的cadvisor所調用的ksoftirqd會占掉非常大的CPU使用率,並導致整個worker node變得緩慢。 相關的問題說明請見: Debugging network stalls on Kubernetes 形成原因 這是因為當使用 Kubernetes 的 NodePort 來公開一個服務時,它將在每個工作節點上開放一個端口,以便外部可以連接到該端口,並將流量轉發到服務的後端 Pod 上。當流量高峰期間,可能會導致節點的 CPU 負載增加,並導致大量的 IRQ 請求,這是因為每個數據包都會觸發一次 IRQ 請求。 IRQ是甚麼 IRQ 是中斷請求的簡寫,是一種處理設備 I/O 操作的機制。當設備有 I/O 操作時,它會觸發一個中斷請求,通知操作系統或應用程序需要處理這個 I/O 操作。在網絡通信中,每個數據包都會觸發一次 IRQ 請求,因此當流量高峰期間,大量的 IRQ 請求可能會導致節點的 CPU 負載增加,從而影響應用程序的性能。中斷請求通常由外部設備發出,例如鍵盤、鼠標、網卡、磁盤控制器等,這些設備需要與 CPU 進行通信,以便進行數據傳輸、讀寫、處理等操作。…

    Continue Reading…: 在K8S內ksoftirqd耗費大量CPU

  • 最大子序列和問題

    概念解釋 最大子序列和問題(Maximum Slice Problem)是指在一個給定的整數序列中,找到一個連續子序列,使得子序列的和最大。 例如,在序列[-2, 1, -3, 4, -1, 2, 1, -5, 4]中,最大的子序列為[4, -1, 2, 1],其和為6。 這個問題在實際應用中經常出現,比如在股票交易中,尋找一段時間內股票價格的最大漲幅,或者在信號處理中,尋找一段時間內信號的最大能量。 最大子序列和問題可以通過暴力枚舉和動態規劃兩種方法解決。暴力枚舉的時間複雜度為O(n^2),動態規劃的時間複雜度為O(n)。其中,動態規劃是更加高效和常用的方法。 下面介紹一下動態規劃的解法思路: 設f[i]表示以第i個元素結尾的最大子序列和,那麼有: f[i] = max(f[i-1] + nums[i], nums[i]) 其中,nums是原始的整數序列,可以看出,f[i]的值只與f[i-1]和nums[i]有關。 狀態轉移方程表示以第i個元素結尾的最大子序列和要么是以第i-1個元素結尾的最大子序列和加上nums[i]得到,要么是只包含第i個元素。 最終的結果就是max(f[0], f[1], …, f[n-1])。 這個算法只需要遍歷一遍整個序列,時間複雜度為O(n),是一個線性算法。因此,在解決最大子序列和問題時,動態規劃是一個高效的解法。 解題思路 假設我們有一個整數序列 nums = [-2, 1, -3,…

    Continue Reading…: 最大子序列和問題

  • Leader – Dominator解題紀錄

    題目內容 題目頁面: https://app.codility.com/programmers/lessons/8-leader/dominator/ Leader概念教學 在LeetCode中,”Leader”通常指的是一個數組中出現次數超過數組長度一半的元素。因為這種元素在數組中出現的次數比其他元素都多,所以被稱為”Leader”。 LeetCode中的一些問題會要求你尋找數組中的Leader或者判斷數組中是否存在Leader。解決這些問題的一種常見方法是使用摩爾投票算法(Moore Voting Algorithm)。 摩爾投票算法的基本思想是遍歷數組,對於當前遍歷到的元素,如果它和當前候選元素相同,則將計數器加一,否則將計數器減一。當計數器為零時,更換當前的候選元素。最後剩下的候選元素就是可能的Leader,需要再次遍歷數組來驗證它是否真的是Leader。 需要注意的是,摩爾投票算法的前提是數組中一定存在Leader,如果數組中不存在Leader,那麼算法得出的結果可能是錯誤的。 摩爾投票算法 摩爾投票算法是一種快速尋找數組中出現次數超過一半的元素的方法,其基本思想已經在之前的回答中進行了介紹。這裡再介紹一下摩爾投票算法的實現方法。 假設我們要在數組中尋找出現次數超過一半的元素,可以使用一個計數器count和一個候選元素candidate來輔助實現。初始時,將count和candidate分別設為0和null。 遍歷數組,對於每一個元素: 它的時間複雜度是O(n) 解題紀錄 https://app.codility.com/demo/results/trainingNPG8GS-3QA/ EquiLeader題目內容 題目連結: https://app.codility.com/programmers/lessons/8-leader/equi_leader/ 解題想法 我的解題

    Continue Reading…: Leader – Dominator解題紀錄


17年資歷女工程師,專精於動畫、影像辨識以及即時串流程式開發。經常組織活動,邀請優秀的女性分享她們的技術專長,並在眾多場合分享自己的技術知識,也活躍於非營利組織,辦理活動來支持特殊兒及其家庭。期待用技術改變世界。

如果你認同我或想支持我的努力,歡迎請我喝一杯咖啡!讓我更有動力分享知識!