安全環檢測核心思路與代碼詳解
項目目標
本項目的目標是檢測圖像中的安全環位置和方向。通過形狀匹配技術,從一張模型圖像中提取安全環的特征,并在后續圖像中識別多個實例,完成檢測和方向標定。
實現思路
安全環檢測分為以下核心步驟:
- 模型圖像加載與處理: 讀取包含安全環的模型圖像,并定義感興趣區域 (ROI),以減少背景干擾。
- 形狀模型創建: 基于感興趣區域提取特征,訓練通用形狀模型(Generic Shape Model)。
- 目標匹配檢測: 在待檢測圖像中搜索安全環,輸出位置、方向和檢測結果。
- 結果可視化: 通過繪制輪廓和方向箭頭,直觀展示安全環的位置和方向信息。
代碼講解
以下是完整代碼的逐步解析,重點放在每個步驟的核心功能和邏輯。
1. 初始化
* 關閉窗口更新以優化性能
dev_update_window ('off')* 加載模型圖像
read_image (ModelImage, 'image/rings_01')* 獲取圖像尺寸
get_image_size (ModelImage, Width, Height)* 打開窗口并設置顯示區域
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'white', WindowHandle)
dev_set_part (0, 0, Height - 1, Width - 1)* 顯示模型圖像
dev_display (ModelImage)
- 核心功能:
- 關閉窗口更新 (
dev_update_window ('off')
) 以提高運行性能。 - 讀取模型圖像并獲取圖像尺寸,為后續顯示做準備。
- 打開一個適配圖像尺寸的顯示窗口。
- 關閉窗口更新 (
2. 定義感興趣區域 (ROI)
* 設置安全環的ROI
Row := 251
Column := 196
Radius := 103* 創建圓形區域作為ROI
gen_circle (ModelROI, Row, Column, Radius)* 顯示ROI
dev_display (ModelROI)
- 核心功能:
- 使用
gen_circle
函數定義圓形區域,圈定包含安全環的區域。 - 通過 ROI 減少背景干擾,確保模型訓練的準確性。
- 使用
3. 檢查并創建形狀模型
檢查模型區域
* 裁剪圖像,僅保留ROI部分
reduce_domain (ModelImage, ModelROI, ImageROI)* 檢查ROI的形狀特征
inspect_shape_model (ImageROI, ShapeModelImage, ShapeModelRegion, 1, 30)* 顯示檢查結果
dev_clear_window ()
dev_display (ShapeModelRegion)
- 核心功能:
- 使用
reduce_domain
裁剪圖像,只保留 ROI。 - 調用
inspect_shape_model
檢查模型區域的形狀特征,確保模型質量。
- 使用
創建形狀模型
* 創建并訓練通用形狀模型
create_generic_shape_model (ModelID)
set_generic_shape_model_param (ModelID, 'metric', 'ignore_global_polarity')
train_generic_shape_model (ImageROI, ModelID)* 提取模型輪廓
get_generic_shape_model_object (ShapeModel, ModelID, 'contours')
- 核心功能:
- 調用
create_generic_shape_model
創建模型,隨后通過train_generic_shape_model
基于 ROI 圖像訓練模型。 - 設置模型參數
ignore_global_polarity
,忽略極性變化,增強魯棒性。
- 調用
4. 目標匹配與檢測
* 設置形狀匹配參數
set_generic_shape_model_param (ModelID, 'max_overlap', 0.55)
set_generic_shape_model_param (ModelID, 'min_score', 0.4)* 遍歷待檢測圖像
for i := 1 to 7 by 1read_image (SearchImage, 'image/rings_' + (i + 1)$'02')dev_display (SearchImage)* 進行形狀匹配find_generic_shape_model (SearchImage, ModelID, MatchResultID, NumMatchResult)* 如果檢測到物體if (NumMatchResult > 0)set_tposition (WindowHandle, 20, 24)write_string (WindowHandle, '檢測到目標數量:'+NumMatchResult)* 遍歷所有檢測結果for j := 0 to NumMatchResult - 1 by 1* 獲取目標輪廓get_generic_shape_model_result_object (Objects, MatchResultID, j, 'contours')dev_set_color ('cyan')dev_display (Objects)* 獲取位置和方向信息get_generic_shape_model_result (MatchResultID, j, 'row', Row)get_generic_shape_model_result (MatchResultID, j, 'column', Column)get_generic_shape_model_result (MatchResultID, j, 'hom_mat_2d', HomMat2D)* 計算方向箭頭終點affine_trans_pixel (HomMat2D, -120, 0, RowArrowHead, ColumnArrowHead)dev_set_color ('blue')disp_arrow (WindowHandle, Row, Column, RowArrowHead, ColumnArrowHead, 2)endforelse* 未檢測到目標set_tposition (WindowHandle, 20, 20)write_string (WindowHandle, '未檢測到物體!')endif
endfor
- 核心功能:
- 目標匹配:
- 使用
find_generic_shape_model
在每張圖像中搜索目標。 - 匹配結果包括目標數量、位置(行、列坐標)和方向(仿射矩陣)。
- 使用
- 顯示檢測結果:
- 高亮顯示目標輪廓,并繪制箭頭標注方向。
- 若檢測不到目標,則顯示“未檢測到物體”的提示。
-
- 目標匹配:
5. 清理資源與結束程序
* 恢復窗口更新
dev_update_window ('on')* 清理形狀模型
clear_shape_model (ModelID)
- 核心功能:
- 恢復窗口更新。
- 釋放形狀模型資源,避免內存占用。
項目核心思路總結
-
模型訓練:
使用感興趣區域提取安全環的形狀特征,生成通用形狀模型。 -
多圖像匹配:
遍歷多張待檢測圖像,利用形狀模型進行目標匹配,輸出目標位置和方向信息。 -
結果可視化:
通過高亮輪廓和繪制箭頭,直觀展示安全環的位置與方向。
適用場景
該項目適用于以下應用場景:
- 工業生產中的零件檢測: 如汽車輪轂、機械零件中的環狀目標檢測。
- 視覺質量控制: 檢測物體位置和方向是否符合預期。
代碼與資源
通過網盤分享的文件:安全環
鏈接: https://pan.baidu.com/s/1gAHHtwL53Sow00jUHD_Z2g?pwd=jkcf 提取碼: jkcf