發表文章

目前顯示的是有「opencv」標籤的文章

rPPG訊號(脈搏波)獲取測試程式_透過臉部影片額頭部位亮度變化_來擷取生理訊號以測量心率

圖片
  脈搏波是隨心臟跳動而變化的血流量。回憶過去若曾去過醫院做健檢,你應該有看過類似感測器夾在手指上,測量出像山峰一般的波形,那就是脈搏波。脈搏波是利用血液中的血紅素會大量吸收綠光的特性。 市面上很多運動手錶,如今也已涵蓋心律、血氧測量等諸多身體指數量測,多半採用到所謂脈搏感測技術,常見的rPPG藉由反射行脈波測量手段。 用綠光的原因在於能被淺層靜脈中的血紅素部分吸收,剩餘沒被吸收的綠光則會反射回來,有利於被手錶感測器量測。 至於紅光部分則穿透能力較強,能反射回來被感測器分析的比例較少,而不利於運動時全程心率量測。 運動手錶主要就是利用血紅素密度變化,去間接推斷人體心率變化。每當人體心臟收縮跟舒張,血管中的血紅素密度就會有密度起伏。若經過手錶等感測裝置的血紅素密度高,被偵測到的綠光就少。反之,若經過的血紅素密度低,則被偵測到的綠光就多。 而從視訊或是影片中測量脈搏波的原理也是一樣的。一般電腦中視訊、影片有分為RGB三種顏色通道不同的光線強度,以 0 到 255 個階度的亮度值進行記錄。 我們可以拍攝或擷取皮膚表面ROI所得視訊影像中的綠色成分光線強度,根據心臟跳動引起的血紅素變化量而產生變化。 同理可得知,拍攝皮膚表面的視訊影像中,綠色成分的變動即為脈搏波。 為了讓血紅素增加時訊號隨之變大,脈搏波訊號會使用從最大亮度值(255)來減去綠色亮度值後所得的數值。透過計算一分鐘內出現多少次脈搏波,也就是測量一分鐘內心臟跳動的次數,就能從視訊影像中測量出心率。 拿一個10秒的公開測試影片作測試 Stage1.先定位額頭部位ROI import cv2 import numpy as np from scipy import signal import matplotlib.pyplot as plt movie = "face.mp4" video_path = ( "C:/img/{}" .format(movie)) cap = cv2.VideoCapture(video_path) cap.set(cv2.CAP_PROP_POS_FRAMES, 0 ) roi = ( 147 , 69 , 340 , 178 ) ret, frame_bgr = cap.read() #先只讀取第一frame i...

MediaPipe Face Mesh_標記左右臉頰、人中ROI

圖片
  參考paper https://www.techscience.com/cmc/v79n3/57116/html 採用Python版本3.11.9 搭配 opencv-python 4.11.0.86 mediapipe 0.10.21 使用舊版Face Mesh 468個特徵點 測試資料集韓國的KoDF 測試程式 import cv2 import mediapipe as mp import numpy as np #初始化MediaPipe Face Mesh mp_face_mesh = mp.solutions.face_mesh mp_drawing = mp.solutions.drawing_utils # 開啟視訊鏡頭 # cap = cv2.VideoCapture(0) # 開啟指定目錄中的影片檔 #原始影片中目標人員:24c360f9f54e7cb0001d #F:\KoDF\downsized\original_videos\original_videos\24c360f9f54e7cb0001d #被偽造的影片目錄-fsgan偽造方式 #F:\KoDF\downsized\synthesized_videos\synthesized_videos\fsgan\20201005\24c360f9f54e7cb0001d video_path = r"F:\KoDF\downsized\synthesized_videos\synthesized_videos\fsgan\20201005\24c360f9f54e7cb0001d\24c360f9f54e7cb0001d_19ea0e3a2325e8edce70_3_0010.mp4" cap = cv2.VideoCapture(video_path) # 確認影片是否成功開啟 if not cap.isOpened(): print ( f"無法開啟影片:{ video_path }" ) raise SystemExit # 自訂 ROI 的 Face Mesh landmark 編號 # left / right 是以「影片中人物本身」的左右側為準,不是以觀看畫面的左右側。...

opencv4.12_C++進行人臉檢測(Viola-Jones 人臉偵測法)

圖片
Opencv人臉檢測內建的是CascadeClassifier (級聯檢測),採用Haar特徵。 透過正負樣本訓練得到級聯方程式 Haar-like Features 是一種量化描述影像特徵的方法,藉由定義不同的模板實踐邊緣特徵、線性特徵、中心或對角線特徵的計算。 例如人臉影像中,可直觀去感受到眼睛比雙頰顏色在深色一些,鼻樑兩側要比鼻樑顏色更深。 嘴巴比周圍顏色深諸如此類。如此我們可設計不同尺寸、角度的特徵模板進行計算。 在人臉偵測中Haar-like Features,它不直接判斷一個像素的顏色,而是比較影像中相鄰矩形區域的亮度差異,藉此描述人臉的局部結構。 例如,人臉通常具有以下明暗規律: 眼睛區域通常比臉頰暗。 眉毛通常比額頭暗。 鼻樑通常比鼻子兩側亮。 嘴巴通常比周圍皮膚暗。 一個 Haar 特徵通常由白色與黑色矩形區域組成,其特徵值可表示為: Haar特徵值=白色區域像素總和−黑色區域像素總和 如果這個差值符合訓練時所學到的人臉明暗關係,就可能被判定為人臉特徵。 Viola-Jones 人臉偵測法使用 積分影像,讓任意矩形區域的像素總和只需要查詢四個位置。 也就是從影像左上角到目前位置之間,所有像素值的總和。 對一個矩形區域,假設四個角的積分影像值為 A、B、C、D,矩形內像素總和可快速計算為: 矩形總和=D−B−C+A 因此,不論矩形有多大,都只需要少量加減法,這也是 Haar Cascade 能在 CPU 上快速執行的重要原因。 Haar 特徵與 AdaBoost 的關係 AdaBoost 的任務就是從大量 Haar 特徵中,挑選最有用的特徵。 每一個 Haar 特徵可以形成一個簡單的弱分類器: Haar Cascade 人臉偵測流程 將影像轉換為灰階影像。 建立積分影像。 使用不同大小的視窗掃描整張影像。 在每個視窗中計算 Haar 特徵。 使用 AdaBoost 選出的弱分類器進行判斷。 將弱分類器安排成多階段級聯結構。 任一階段未通過,就排除該視窗。 通過全部階段的區域,視為可能的人臉。 合併彼此重疊的人臉框,得到最終偵測結果。 C++程式碼 #include <opencv2/opencv.hpp> #include <iostream> #include <direct.h> // _getc...

Visual Studio2022配置opencv4.12方法

圖片
  首先到opencv org官方網站 https://opencv.org/releases/ 去下載解壓安裝包 執行安裝精靈程式後會自動解壓到指定目錄 先將bin目錄複製起來 E:\Libraries\opencv\build\x64\vc16\bin 開啟設定=>【系統資訊】 =>點選【進階系統設定】=>點選【環境變數】 到下方【系統變數】=>點選【Path】=>之後再點選【編輯】=>開啟【編輯環境變數】跳窗 =>新增貼上 後續再連點3次確定關閉視窗返回主畫面。 開啟Visual Studio 2022 新增主控台應用程式專案 配置include目錄 E:\Libraries\opencv\build\x64\vc16\lib 配置連結器 => 其他程式庫目錄 配置連結器 =>輸入=>打上  opencv_world4120d.lib 測試程式碼 #include <opencv2/opencv.hpp> #include <iostream> using namespace cv ; int main () { std::cout << "OpenCV: " << CV_VERSION << std::endl; Mat img = cv::imread( "C:/img/Bike_Unbrella.jpg" ); namedWindow( "First OpenCV Application" , WINDOW_AUTOSIZE); cv::imshow( "First OpenCV Application" , img); cv::moveWindow( "First OpenCV Application" , 0 , 45 ); cv::waitKey( 0 ); cv::destroyAllWindows(); return 0 ; } 執行效果 Ref: OpenCV C++ on Windows — Visual Studi...

【YOLOv8】姿態(動作)識別_俯臥撐計數

圖片
  用 Ultralytics YOLOv8 Pose 模型(yolov8x-pose.pt)搭配 AIGym 解決方案模組,對影片中的人物進行姿態辨識與伏地挺身(push-up)動作計數。 up_angle:如果角度超過這個值,代表身體在「上推」階段 down_angle:如果角度低於這個值,代表身體在「下壓」階段 kpts=[5, 7, 9],分別是左肩(left shoulder)、左肘(left elbow)、左手腕(left wrist) 用這三個點計算手臂夾角,以判斷 push-up 是否完成一個動作。 偵測深蹲的話kpts 就可以類似改成 [11,13,15] https://github.com/Alimustoofaa/YoloV8-Pose-Keypoint-Classification?tab=readme-ov-file 測試程式 import cv2 from ultralytics import solutions MODEL_PATH = "yolov8x-pose.pt" #yolov8x-pose.pt , yolo11n-pose.pt VIDEO_PATH = "fuwocheng.mp4" gym = solutions . AIGym( model = MODEL_PATH, kpts = [ 5 , 7 , 9 ], # 指定關鍵點:左肩-左肘-左手 up_angle = 100 , down_angle = 80 , line_width = 2 , show = False ) cap = cv2 . VideoCapture(VIDEO_PATH) if not cap . isOpened(): print ( "Error: Could not open video." ) exit () # ===== 新增:控制視窗大小與位置 ===== window_name = "Processed Frame" cv2 . namedWindow(window_name, cv2 . WINDOW_NORMAL) cv...

【YOLOv8】物件偵測與識別測試

圖片
  Yolo V8使用 pytorch 開發的,因此這邊採用Pycharm Community開發工具。 並進行Pytorch下載引入 開發測試環境Windows 11 電腦 Acer Predator PH315-54-72VQ 電競筆記型電腦 https://store.acer.com/zh-tw/ph315-54-72vq 處理器:Intel® Core™ i7-11800H 記憶體:32GB DDR4 3200MHz Memory 硬碟:512GB PCIe NVMe SSD 顯卡:NVIDIA® GeForce RTX™ 3070 記得先在Pycharm創建好Project-based的venv,這邊採用Python3.8。 之後依序執行已下指令把Pytorch需要的給裝一裝,安裝對應 CUDA 11.8 的 PyTorch 套件。 不要採用Anaconda內建虛擬環境提供的不支援GPU的Pytorch。 電腦有GPU顯卡用這下載方式的指令 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 --no-cache-dir 電腦無GPU顯卡只能用CPU跑用這下載方式的指令 pip install torch torchvision torchaudio --no-cache-dir YOLO在演進到6之後版本就交由ultralytics這間公司團隊繼續精進研發。 到了第八版算是成熟也十分多產品在使用的版本。(目前最新還有出到11的樣子) pip install ultralytics CUDA 與 cuDNN 的關係與角色 CUDA(Compute Unified Device Architecture) 是 NVIDIA 開發的一套平行運算平台與程式設計模型,底層是用 C/C++ 所實作,允許開發者撰寫程式碼,並將運算密集的任務交由 GPU(圖形處理器) 處理。 CUDA 提供一組 API,可以讓像 Python、C++ 等高階語言編寫的程式,透過 CUDA 將資料與任務分派到 GPU 執行。 當 Python 呼叫如 TensorFlow、PyTorch 等深度學習框架中的 GPU 運算時,其實是透過這些框架內部...

光照補償演算法

圖片
  由於光罩反光導致在OTSU二值化要去分割指針線 會有較長那端點誤判問題 使演算法較為不穩定 就用簡易版的原始影像通道分割後各自做值方圖均衡 再合併回來即可 原始灰度圖值方圖分布 補償後的效果