發表文章

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

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二值化要去分割指針線 會有較長那端點誤判問題 使演算法較為不穩定 就用簡易版的原始影像通道分割後各自做值方圖均衡 再合併回來即可 原始灰度圖值方圖分布 補償後的效果

標籤消除演算處裡_使用通道分割與二值處裡

圖片
  由於標籤遮蔽導致指針線段偵測失真 只能先補預處裡 進行BGR顏色通道分割 紅色通道 藍色通道 綠色通道 Mat only_blue_label, only_red_label; only_red_label = gray_ori + blue; only_blue_label = gray_ori + red; Mat only_blue_label, only_red_label; //only_red_label = gray_ori + blue; //only_blue_label = gray_ori + red; only_red_label = gray_ori - blue; only_blue_label = gray_ori - red;

Yolo刻度訓練_搭配霍夫圓霍夫直線獲取_遮罩ROI二次擷取

圖片
 

Harris角點檢測

圖片
  程式碼 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 #include "opencv2/opencv.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/core.hpp" #include "opencv2/dnn.hpp" #include "opencv2/xfeatures2d/nonfree.hpp" #include "opencv2/features2d/features2d.hpp" #include <iostream> #include <fstream> #include<cmath> #include<string> #include <algorithm> using namespace std; using namespace cv; using namespace cv :: dnn; using namespace cv :: xfeatures2d; Mat src, gray_src, dst; int thrCornor = 140 ; int thrMax = 255 ; const char * output_title = "HarrisCorner Detect Result" ; void Harris_Process ( int , void * ); int main () { src = imread( "C:/img/2393662_orig.jpg" ); namedWindow( "src" , WINDOW_NOR...

Homography投影轉換

圖片
  程式碼 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 #include "opencv2/opencv.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/core.hpp" #include "opencv2/dnn.hpp" #include "opencv2/xfeatures2d/nonfree.hpp" #include "opencv2/features2d/features2d.hpp" #include <iostream> #include <fstream> #include<cmath> #include<string> #include <algorithm> using namespace std; using namespace cv; using namespace cv :: dnn; using namespace cv :: xfeatures2d; int main () { Mat img1 = imread( "C:/img/box.png" ,...