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

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

  • ,

    拆分相黏的正方形

    原始圖片 在寫純OpenCV的圖像辨識上,最困難的是當要找尋的目標的邊界因為模糊或相黏,而無法抓出正確的邊界的狀況 因為一般使用OpenCV做圖像辨識,我們都會需要先抓到例如說畫面中的某種色塊、再找尋某種符合某條件的形狀之類的 例如以修圖軟體而言,可能會需要先抓取膚色,然後轉換膚色的灰度階層取得面部的高低起伏,再根據灰度階層去抓取符合某種形狀的高低(如鼻子)或顏色差(如嘴巴、眼睛) 也因此,抓取正確的形狀在純粹的圖像辨識(沒有機器學習)的狀況下非常重要,而拆分相黏的形狀(如手放在臉前面),仍然要正確的辨識目標物件,也成了圖像辨識的一大挑戰 關於這一系列的其他文章,請見: 分水嶺演算法-偵測相連區域形狀 如何檢測畫面中可能的正方形 以下為這次我們要挑戰的目標,就是將這兩個黏在一起的正方形拆分為兩個正方形 解決問題的思考方向 首先我先參考官網的分水嶺演算法介紹:Image Segmentation with Watershed Algorithm 這邊的狀況和我們的需求很類似,都是將相黏的物件拆分開來 下面是在stackoverflow裡一位大大分享的他使用分水嶺演算法的範例程式: 在這篇文章裡有幾個函數需要我們去理解: cv.distanceTransform OpenCV的distanceTransform是一個圖像處理功能,可以計算圖像中每個像素到最近的零值像素之間的歐幾里德距離。distanceTransform功能可以在圖像分割、形狀檢測、物體識別等應用中使用。 在OpenCV中,distanceTransform有三種不同的實現方式:cv2.DIST_L1、cv2.DIST_L2和cv2.DIST_C。cv2.DIST_L1使用曼哈頓距離,cv2.DIST_L2使用歐幾里德距離,而cv2.DIST_C使用切比雪夫距離。 使用distanceTransform功能需要先將圖像二值化,然後計算圖像中每個像素到最近的零值像素之間的距離。distanceTransform返回的結果是一個浮點型的圖像,每個像素值表示該像素到最近的零值像素之間的距離。 以下是distanceTransform的Python程式碼示例: 以下為對上圖做cv.distanceTransform的結果 cv.threshold 將距離變換圖像dt進行歸一化處理,將其轉換成0-255之間的整數型圖像,並使用threshold函數將其二值化,生成一個二值化圖像dt。這個二值化圖像dt中的像素值只有0和255兩種,用來表示圖像中物體和背景之間的分界線。 在這邊我使用了0.9*dist_transform.max()來做為閥值,確認兩個方形之間可以不相連 結果如下: cv2.connectedComponents 在圖像處理和計算機視覺中,常常需要將圖像分割成多個不同的區域,然後對每個區域進行不同的分析和處理。圖像分割的第一步就是對圖像進行連通區域標記,將相連的像素點標記為同一個區域,以便後續處理。 程式碼使用OpenCV中的label函數對二值化圖像dt進行連通區域標記,生成一個標記圖像lbl和連通區域數量ncc。標記圖像lbl中的每個像素點都標記了其所屬的連通區域編號。 OpenCV中提供了幾個函數可以實現連通區域標記,其中最常用的是cv2.connectedComponents和cv2.connectedComponentsWithStats函數,這些函數會將每個連通區域分配一個唯一的標籤(編號),並返回每個區域的一些統計信息,如面積、重心等。 scipy.ndimage.label和cv2.connectedComponents都是對二值化圖像中的連通區域進行標記的函數,但在實現和用法上有所不同。 scipy.ndimage.label是Scipy中的一個函數,用於對二值化圖像進行連通區域標記,它的使用方式如下: 其中,binary_image是二值化的圖像,labels是與原始圖像大小相同的數組,其中每個像素點都標記了其所屬的連通區域編號,num_features是圖像中連通區域的數量。 cv2.connectedComponents是OpenCV中的一個函數,用於對二值化圖像進行連通區域標記,它的使用方式如下: binary_image是二值化的圖像,num_labels是圖像中連通區域的數量,labels是與原始圖像大小相同的數組,其中每個像素點都標記了其所屬的連通區域編號。 兩個函數的返回值不同,scipy.ndimage.label返回的是每個像素點所屬的連通區域編號,而cv2.connectedComponents返回的是每個連通區域的編號。另外,cv2.connectedComponents還可以通過修改設置參數來指定標記的種類,例如指定為4或8連通等。 cv2.watershed 程式碼將標記圖像lbl轉換成整數型數組,並使用OpenCV中的watershed函數進行分水嶺分割,生成一個分割圖像lbl。分割圖像lbl中的像素點表示原始圖像中的每個像素點所屬的區域編號。…

    Continue Reading…: 拆分相黏的正方形

  • ,

    如何檢測畫面中可能的正方形

    最簡單-使用findContours OpenCV 中有一個名為 findContours 的函數,可以用來查找圖像中的輪廓。一旦你找到了圖像中的輪廓,你可以使用 approxPolyDP 函數來近似地計算輪廓的形狀。如果你要查找正方形,你可以在這些形狀中尋找具有 4 個頂點的多邊形,這些多邊形應該有相近的邊長和角度。如果你要檢測的正方形不是水平的或垂直的,你可能需要使用角度信息來確定它的方向。 當我們可以取得相黏物件邊緣時 – 分水嶺演算法 分水嶺演算法-偵測相連區域形狀 當形狀邊緣不清楚時-使用霍夫找線 使用霍夫變換檢測直線。因為正方形的四條邊是直線,因此可以通過檢測這四條直線來確定正方形。 具體來說,可以使用 OpenCV 中的 HoughLinesP 函數來檢測直線。該函數會返回一組檢測到的線段,這些線段可以是任意方向和長度的線段,因此我們需要對這些線段進行篩選,只保留長度、方向和相對位置都符合要求的線段。接著,我們可以將這些線段按照一定的規則組合成四條邊,從而確定正方形。 以下是一個示例代碼,演示如何使用霍夫變換檢測正方形: 基於角點的角點檢測 哈里斯角點檢測器簡介 Harris Corner Detector 是一種角點檢測算子,常用於計算機視覺算法中以提取角點並推斷圖像的特徵。它由 Chris Harris 和 Mike Stephens 於 1988 年在 Moravec 的角檢測器改進後首次提出。Harris 角點檢測器相比之前的角點檢測器,直接考慮了角點分數的差異,直接參考方向,而不是每 45 度角使用…

    Continue Reading…: 如何檢測畫面中可能的正方形

  • 分水嶺演算法-偵測相連區域形狀

    官方教學 Image Segmentation with Watershed Algorithm 官方的範例是一群黏在一起的硬幣 分割出黏在一起的長方形 這篇文章是在討論如何分割出一群黏在一起的長方形 給定一個二值圖像,我們可以應用距離變換 (DT) 並從中獲得分水嶺的標記。理想情況下,會有一個現成的函數來查找區域最小值/最大值,但由於它不存在,我們可以對如何設置 DT 閾值做出一個不錯的猜測。基於標記,我們可以使用 Watershed 進行分割,問題就解決了。現在您可以擔心區分矩形組件和非矩形組件了。 OpenCV的distanceTransform是一個圖像處理功能,可以計算圖像中每個像素到最近的零值像素之間的歐幾里德距離。distanceTransform功能可以在圖像分割、形狀檢測、物體識別等應用中使用。 在OpenCV中,distanceTransform有三種不同的實現方式:cv2.DIST_L1、cv2.DIST_L2和cv2.DIST_C。cv2.DIST_L1使用曼哈頓距離,cv2.DIST_L2使用歐幾里德距離,而cv2.DIST_C使用切比雪夫距離。 曼哈頓距離也稱為城市區塊距離或L1距離。它是兩點之間水平和垂直距離的總和。如果p1和p2是兩個二維坐標點,則曼哈頓距離可以通過以下公式計算: d(p1, p2) = |p1.x – p2.x| + |p1.y – p2.y| 歐幾里德距離是兩個點之間的直線距離。如果p1和p2是兩個二維坐標點,則歐幾里德距離可以通過以下公式計算: d(p1, p2) = sqrt((p1.x – p2.x)^2 + (p1.y – p2.y)^2)…

    Continue Reading…: 分水嶺演算法-偵測相連區域形狀

  • ,

    The TechGiCS Forum

    Experience Sharing This morning, I attended a rare technology forum where all the speakers were women. Some were founders, and some were executives of internationally renowned companies, all of them outstanding and talented women. These women also have families and…

    Continue Reading…: The TechGiCS Forum

  • 使用OBS來推流H265

    使用OBS來推流H265 OBS也在v29板之後支持了HEVC推流,支持利用RTMP的封裝方式來推送H265編碼的串流格式,若電腦沒有可支持硬編碼的GPU,其CPU編碼所採取的編碼方案是QuickSync HEVC。 若是電腦有可支持硬編碼的GPU,則下拉選單會增加該硬件編碼的編碼選項 並且可以錄製SVT-AV1、AOM-AV1和HEVC的格式的影片

    Continue Reading…: 使用OBS來推流H265

  • 高壓縮比編碼格式的介紹 – HEVC

    HEVC(H265)介紹 HEVC(High Efficiency Video Coding),也稱為H.265,是一種先進的視頻編解碼標準,是H.264/MPEG-4 AVC的後繼者。相較於H.264,HEVC可以提供更高的視頻質量、更少的碼率和更高的壓縮效率。 HEVC採用更高級的壓縮算法,通過增加更多的預測模式、增加更多的參考幀以及使用更高級別的變換和量化技術,實現了更高的壓縮比。在同樣的視頻質量下,HEVC可以減少50%以上的比特率。 HEVC支持分辨率高達8192×4320的超高清視頻,可以處理各種類型的視頻內容,包括高速運動、低比特率和高動態範圍內容。 HEVC還可以支持多種顏色空間、高級色彩映射和多視點視頻。 由於HEVC壓縮效率高,可以在更低的比特率下提供更高的視頻質量,因此被廣泛用於高清和超高清視頻的傳輸和存儲,例如藍光光盤、在線視頻流媒體、視頻會議等。 瀏覽器對於HEVC的支持 上面若有不支持的瀏覽器,只要支持webassembly,就可以透過webassembly來實現解碼的部分 使用webassembly來達成全平台HEVC的播放器 EasyPlayer.js h265web.js – 适配浏览器HEVC硬解码 支持推流端的HEVC透過RTMP推流 OBS在版本29版之後增加的新的編碼支持(H265及AV1) 現在可以透過OBS來推送HEVC格式的流了。 https://blog.csdn.net/karamos/article/details/103508790 FLV規範不支持HEVC(H.265)/AV1,FFmpeg社區對FLV的新視頻編碼算法CodecID也沒有新增定義支持,騰訊視頻雲T-FFmpeg(騰訊視頻雲的FFmpeg維護版本)正在推動社區支持封裝/解封H.265/AV1的FLV的補丁。目前,國內各直播CDN廠商基本支持H.265的封裝和解封,而騰訊視頻雲則針對FLV支持AV1進行了一系列優化。 go2rtc go2rtc 因為WebRTC是一個非常低延遲的封裝格式,有人寫了這個工具,可以把所有封裝格式的串流轉為WebRTC格式,但是現在WEBRTC對H265的支持仍不高 以下為支持表 Safari 支持 WebRTC,如果您通過以下方式啟用它: 英文版:Develop > Experimental Features > WebRTC H265 codec 中文版:开发 > 实验性功能…

    Continue Reading…: 高壓縮比編碼格式的介紹 – HEVC

  • 高壓縮比編碼格式的介紹 – AV1

    高壓縮比編碼格式AV1介紹 AV1是一種免費、開源的視頻編解碼器,由Alliance for Open Media(AOMedia)聯盟開發。它是H.265(HEVC)的競爭對手,旨在提供更高的壓縮效率和更好的視頻質量。 AV1使用了許多新技術來提高壓縮效率,例如可變帶寬預測、可變塊大小和可變熵編碼等。與H.265相比,AV1在相同的比特率下可以提供更高的視頻質量。同時,AV1還具有更好的自適應流媒體性能,可以更好地適應網絡帶寬的變化。 AV1可以支持多種分辨率和色彩空間,包括8位、10位和12位色彩深度。此外,它還可以支持HDR(高動態範圍)和WCG(廣色域)等高級視頻格式,以提供更真實的圖像質量。 由於AV1是一種開放標準,並且沒有專利費用,因此它被廣泛用於在線視頻流媒體服務和其他應用,例如YouTube、Netflix、Amazon Prime Video等。同時,AV1還適用於各種類型的視頻內容,包括電影、電視節目、動畫和遊戲。 常見的編碼器 SVT-AV1和AOM-AV1 SVT-AV1和AOM-AV1都是AV1編碼器,不過它們有幾個不同之處: 開發者:SVT-AV1是由英特爾開發的,而AOM-AV1是由Alliance for Open Media(AOM)開發的。 編碼質量:SVT-AV1相對於AOM-AV1來說,可以提供更高的編碼質量,尤其是在高比特率下。 編碼速度:AOM-AV1的編碼速度相對於SVT-AV1來說更快,這對於需要實時編碼的場景非常重要。 適用範圍:SVT-AV1更適用於需要高質量視頻編碼的場景,如影片後期製作等;而AOM-AV1更適用於實時編碼的場景,如視頻通話、視頻會議等。 甚麼是AV1 SVC AV1 SVC中的SVC是指可伸縮視頻編碼(Scalable Video Coding)。可伸縮視頻編碼是一種視頻編碼技術,可以將視頻數據分成多個層級,每個層級可以根據不同的要求進行編碼和解碼。這種編碼技術可以在不同的設備和網絡帶寬上提供不同的視頻質量和分辨率。在AV1 SVC中,視頻數據被分成多個空間和時間層級。空間層級是根據空間分辨率進行編碼的,例如低分辨率圖像和高分辨率圖像。時間層級是根據時間分辨率進行編碼的,例如低幀率和高幀率圖像。這些層級可以按需選擇和合併,以提供適合設備和網絡帶寬的最佳視頻質量。+ AV1 SVC可以提供更高的編碼效率和更好的視頻質量,同時可以適應不同的設備和網絡環境。這使得它非常適合用於實時視頻流傳輸、視頻會議和移動通信等應用場景。AV1是第一個支持SVC的編解碼器。對於那些對關於SVC是如何發揮作用的更多細節感興趣的人,Alex E.博士在2016年寫了一篇很好的解釋性博文。寫的是關於VP9,大多數點對AV1有效的內容。 SVT-AV1和AOM-AV1都支持可伸縮視頻編碼(SVC),但是它們支持的SVC規格略有不同。具體而言: SVT-AV1支持SVC的規格是MPEG-5 Part 2 LCEVC(Low Complexity Enhancement Video Coding),這是一種用於增強現有編碼器的規格,可以提高編碼效率和視頻質量。 AOM-AV1支持的SVC規格是AV1…

    Continue Reading…: 高壓縮比編碼格式的介紹 – AV1

  • OBS在版本29版之後增加的新的編碼支持(H265及AV1)

    OBS支持HEVC推流 OBS在v29版本之後支持了HEVC推流,支持利用RTMP的封裝方式來推送H265編碼的串流格式,若電腦沒有可支持硬編碼的GPU,其CPU編碼所採取的編碼方案是QuickSync HEVC。 若是電腦有可支持硬編碼的GPU,則下拉選單會增加該硬件編碼的編碼選項 支持AV1及HEVC的錄影格式 並且可以錄製SVT-AV1、AOM-AV1和HEVC的格式的影片

    Continue Reading…: OBS在版本29版之後增加的新的編碼支持(H265及AV1)

  • 為SRS6編譯支持HTTP-FLV的FFMPEG檔案

    SRS介紹 SRS是一個簡單高效的實時視頻服務器,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181。是一個運營級的互聯網直播服務器集群並發7.5k+,支持多種轉碼,RTMP->HLS,RTMP->FLV等,支持HTTP回調,RTMP0.1s延時在HTTP-FLV的低延遲實踐方案上,可以說是繼FMS之後,非常有用心地在更新、維護的一個開源專案 主要開發者很熱心地回答問題,相關的文件也隨著時間越來越完整,使用的人數也越來越多,是一個高效能且穩定的開源串流服務器。 SRS6.0已支持H.265編碼格式 在SRS 6.0之中,很開心我們終於看到SRS支持H265了,這其中很重要的一個工作就是我們需要在推流端能夠讓RTMP的FLV格式推流能夠支持H265。但是,若我們使用從FFMPEG官網下載的.EXE檔案,即便我們使用ffmpeg -version顯示支持H265,在實際推H265的流時仍然會發生錯誤。錯誤訊息如下圖這個錯誤代表說,官方所提供的版本雖然支持H.265,但是卻不支持使用FLV來封裝H.265的編碼格式。 為FFmpeg增加支持HEVC over RTMP的補丁 對於SRS6.0支持HEVC over RTMP的詳細說明於此: https://github.com/ossrs/srs/issues/465 支持 HEVC over RTMP 或 FLV 的規範和用法。runner365為FFmpeg提供了FFmpeg 4.1/5.1/6.0 的補丁,以支持通過 RTMP 或 FLV 的 HEVC。Intel也有針對此功能的補丁。 這裡面提到說,SRS 6之所以能夠支持H265 over RTMP是因為使用了runner365自己為ffmpeg所增加的補丁功能。官方的版本並不支持HEVC over RTMP,若我們希望使用RTMP來推流H265,則需要重新編譯包含這份補丁的FFMPEG執行檔案。 另外要注意的是,雖然,但是應該是它們採用HEVC支持RTMP的實作方式與SRS6.0使用的FFMPEG方案並不一致,若是使用OBS的v29.0.2推H265的流到SRS伺服器,伺服器並沒有辦法正確的解析串流內容,因此,在推流時,一定要使編譯過的(runner365的補丁版本)、可支援HEVC over RTMP的FFMPEG來推流,才可以正確把H265的流推送到SRS。 這邊是官方如何編譯ffmpeg的教學:https://github.com/ossrs/srs/issues/465#ffmpeg-tools 使用ffmpeg推流HEVC格式的影片,其重點在於將vcodec指定為libx265 以下指令可推送極低延遲的H.265影片…

    Continue Reading…: 為SRS6編譯支持HTTP-FLV的FFMPEG檔案

  • ,

    使用OpenCV判別圖像清晰度

    3種清晰度評價方法 Tenengrad梯度方法: Tenengrad梯度方法利用Sobel算子分別計算水平和垂直方向的梯度,同一場景下梯度值越高,圖像越清晰。以下是具體實現,這裡衡量的指標是經過Sobel算子處理後的圖像的平均灰度值,值越大,代表圖像越清晰。 Laplacian梯度方法: Laplacian()變換不需要區分圖像的x和y方向計算梯度,從上圖的2種kernel也可以看到其x和y方向是對稱的。 方差方法: 方差是概率論中用來考察一組離散數據和其期望(即數據的均值)之間的離散(偏離)成都的度量方法。方差較大,表示這一組數據之間的偏差就較大,組內的數據有的較大,有的較小,分佈不均衡;方差較小,表示這一組數據之間的偏差較小,組內的數據之間分佈平均,大小相近。 圖像清晰度識別之Laplacian算子 Laplacce算子是一種各向同性算子,二階微分算子,在只關心邊緣的位置而不考慮其周圍的像素灰度差值時比較合適。Laplace算子對孤立像素的響應要比對邊緣或線的響應要更強烈,因此只適用於無噪聲圖像。存在噪聲情況下,使用Laplacian算子檢測邊緣之前需要先進行低通濾波。所以,通常的分割算法都是把Laplacian算子和平滑算子結合起來生成一個新的模板。 從模板形式容易看出,如果在圖像中一個較暗的區域中出現了一個亮點,那麼用拉普拉斯運算就會使這個亮點變得更亮。因為圖像中的邊緣就是那些灰度發生跳變的區域,所以拉普拉斯銳化模板在邊緣檢測中很有用。一般增強技術對於陡峭的邊緣和緩慢變化的邊緣很難確定其邊緣線的位置。但此算子卻可用二次微分正峰和負峰之間的過零點來確定,對孤立點或端點更為敏感,因此特別適用於以突出圖像中的孤立點、孤立線或線端點為目的的場合。 在圖像處理中,圖像的清晰程度可以被表示為圖像的邊緣和顏色變化的強度。圖像的清晰度越強,邊緣和顏色變化的強度就越高。因此,通過評估圖像的清晰度,可以檢測圖像是否模糊。 使用範例和結果 import numpy as np import cv2 from os import listdir import re files = [f for f in listdir(‘./wrong2/’) if re.match(r’.*\.jpg’, f)] for i in range(len(files)): image =…

    Continue Reading…: 使用OpenCV判別圖像清晰度


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

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