形狀匹配原理:模板創建后,會根據模板中的邊緣等關系去圖像中進行搜索,可以理解成提取模板中的灰度發生變化的那些點,然后再去圖像中匹配,這樣的效果是對干擾比較穩定,匹配速度快,並且即使邊緣發生部分遮擋,匹配效果依舊較好
定位對象內部的灰度值可以有變化,但對象邊緣輪廓必須清晰平滑的場合
在HDevelop中
dev_close_window () read_image (Image, 'D:/bb/tu/3.jpg') rgb1_to_gray (Image, GrayImage) ****截取模板圖像:B字母**** gen_rectangle1 (Rectangle, 16, 120, 69, 172) reduce_domain (GrayImage, Rectangle, ImageReduced) get_image_size (ImageReduced, Width, Height) dev_open_window(10,100,Width, Height,'black',WindowHandle1) *顯示模板圖像 dev_display(ImageReduced) inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 4, 30) *預覽金字塔 *金字塔多少層比較合適,可以通過ModelRegions觀看--為后面創建模板做准備 *參數1:輸入模板圖像 *參數2:輸出的金字塔圖像 *參數3:金字塔區域 *參數4:金字塔層數 *參數5:圖像中物體對比度的閾值或滯后閾值,以及可選的物體部分的最小尺寸 create_shape_model (ImageReduced, 'auto', -0.2, 0.2, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID) *創建形狀模板 *參數1:模板圖像(reduce_domain后) *參數2:金字塔的最大層級--層級越高搜索越快 * 值列表:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'auto' *參數3:模板旋轉的起始角度--弧度 *參數4:模板旋轉的終止角度--弧度 *參數5:角度步長 * 限制:角度步長>=0和角度步長<=pi/16 *參數6:設置模板優化和模板創建方法 * 'auto' * 'no_pregeneration' * 'none', 'point_reduction_high', 'point_reduction_low', 'point_reduction_medium', 'pregeneration' *參數7:匹配方法設置 * 'ignore_color_polarity' 即使顏色對比度在局部發生變化,也會找到模型--可用於具有任意數量通道的圖像 * 'ignore_global_polarity' 如果對比度(比如亮背景暗前景)全局反轉,也會在圖像中找到對象--只能應用於單通道圖像 * 'ignore_local_polarity' 即使對比度在局部發生變化,也會找到模型--只能應用於單通道圖像 * 'use_polarity' 則圖像中的對象和模型必須具有相同的對比度。例如,如果模型是暗背景上的明亮對象,則僅當該對象也比背景亮時,才能找到該對象--只能應用於單通道圖像 * 如果多通道圖像用作模型圖像或搜索圖像,則只會使用第一個通道(並且不會返回錯誤消息) *參數8:設置對比度 *參數9:設置最小對比度 *參數10:模板句柄 find_shape_model (GrayImage, ModelID, -0.2, 0.2, 0.5, 6, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score) *形狀模板匹配 *參數1:輸入圖像 *參數2:模板句柄 *參數3:搜索時的起始角度 *參數4:搜索時的終止角度,必須與創建模板時的有交集 *參數5:被找到的模板最小分數--大於等於這個值才能被匹配 * 默認值:0.5 建議值:0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0 * 典型值范圍:0≤MinScore ≤ 1 * 最小增量:0.01 建議增量:0.05 *參數6:要找到的模板最大實例數 * 0 不限制 *參數7:要找到的模型實例的最大重疊比例 * 默認值:0.5 建議值:0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0 * 典型值范圍:0≤ MaxOverlap≤ 1 最小增量:0.01 建議增量:0.05 * 0 表示不允許重疊 *參數8:計算精度的設置 * 'none' 不適用亞像素,最大誤差為半個像素 * 'interpolation' 差值得到亞像素精度 * 'least_squares', 'least_squares_high', 'least_squares_very_high' * 'max_deformation 1', 'max_deformation 2', 'max_deformation 3', 'max_deformation 4' * 'max_deformation 5', 'max_deformation 6' *參數9:搜索時金字塔的層級 *參數10:貪婪度,搜索啟發式,一般都設為0.8,越高速度快,容易出現找不到的情況 * 0≤ Greediness ≤ 1 *最后4個:輸出匹配位置的行和列坐標、角度、得分 【中心坐標】
在QtCreator中
HObject ho_Image, ho_GrayImage, ho_Rectangle;
HObject ho_ImageReduced, ho_ModelImages, ho_ModelRegions;
HTuple hv_Width, hv_Height, hv_WindowHandle1;
HTuple hv_ModelID, hv_Row, hv_Column, hv_Angle, hv_Score;
ReadImage(&ho_Image, "D:/bb/tu/3.jpg"); Rgb1ToGray(ho_Image, &ho_GrayImage); //***截取模板圖像:B字母**** GenRectangle1(&ho_Rectangle, 16, 120, 69, 172); ReduceDomain(ho_GrayImage, ho_Rectangle, &ho_ImageReduced); GetImageSize(ho_ImageReduced, &hv_Width, &hv_Height); SetWindowAttr("background_color","black"); OpenWindow(10,100,hv_Width,hv_Height,0,"visible","",&hv_WindowHandle1); HDevWindowStack::Push(hv_WindowHandle1); //顯示模板圖像 if (HDevWindowStack::IsOpen()) DispObj(ho_ImageReduced, HDevWindowStack::GetActive()); InspectShapeModel(ho_ImageReduced, &ho_ModelImages, &ho_ModelRegions, 4, 30); //預覽金字塔 //金字塔多少層比較合適,可以通過ModelRegions觀看--為后面創建模板做准備 //參數1:輸入模板圖像 //參數2:輸出的金字塔圖像 //參數3:金字塔區域 //參數4:金字塔層數 //參數5:圖像中物體對比度的閾值或滯后閾值,以及可選的物體部分的最小尺寸 CreateShapeModel(ho_ImageReduced, "auto", -0.2, 0.2, "auto", "auto", "use_polarity", "auto", "auto", &hv_ModelID); //創建形狀模板 //參數1:模板圖像(reduce_domain后) //參數2:金字塔的最大層級--層級越高搜索越快 // 值列表:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'auto' //參數3:模板旋轉的起始角度--弧度 //參數4:模板旋轉的終止角度--弧度 //參數5:角度步長 // 限制:角度步長>=0和角度步長<=pi/16 //參數6:設置模板優化和模板創建方法 // 'auto' // 'no_pregeneration' // 'none', 'point_reduction_high', 'point_reduction_low', 'point_reduction_medium', 'pregeneration' //參數7:匹配方法設置 // 'ignore_color_polarity' 即使顏色對比度在局部發生變化,也會找到模型--可用於具有任意數量通道的圖像 // 'ignore_global_polarity' 如果對比度(比如亮背景暗前景)全局反轉,也會在圖像中找到對象--只能應用於單通道圖像 // 'ignore_local_polarity' 即使對比度在局部發生變化,也會找到模型--只能應用於單通道圖像 // 'use_polarity' 則圖像中的對象和模型必須具有相同的對比度。例如,如果模型是暗背景上的明亮對象,則僅當該對象也比背景亮時,才能找到該對象--只能應用於單通道圖像 // 如果多通道圖像用作模型圖像或搜索圖像,則只會使用第一個通道(並且不會返回錯誤消息) //參數8:設置對比度 //參數9:設置最小對比度 //參數10:模板句柄 FindShapeModel(ho_GrayImage, hv_ModelID, -0.2, 0.2, 0.5, 6, 0.5, "least_squares", 0, 0.9, &hv_Row, &hv_Column, &hv_Angle, &hv_Score); //形狀模板匹配 //參數1:輸入圖像 //參數2:模板句柄 //參數3:搜索時的起始角度 //參數4:搜索時的終止角度,必須與創建模板時的有交集 //參數5:被找到的模板最小分數--大於等於這個值才能被匹配 // 默認值:0.5 建議值:0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0 // 典型值范圍:0≤MinScore ≤ 1 // 最小增量:0.01 建議增量:0.05 //參數6:要找到的模板最大實例數 // 0 不限制 //參數7:要找到的模型實例的最大重疊比例 // 默認值:0.5 建議值:0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0 // 典型值范圍:0≤ MaxOverlap≤ 1 最小增量:0.01 建議增量:0.05 // 0 表示不允許重疊 //參數8:計算精度的設置 // 'none' 不適用亞像素,最大誤差為半個像素 // 'interpolation' 差值得到亞像素精度 // 'least_squares', 'least_squares_high', 'least_squares_very_high' // 'max_deformation 1', 'max_deformation 2', 'max_deformation 3', 'max_deformation 4' // 'max_deformation 5', 'max_deformation 6' //參數9:搜索時金字塔的層級 //參數10:貪婪度,搜索啟發式,一般都設為0.8,越高速度快,容易出現找不到的情況 // 0≤ Greediness ≤ 1 //最后4個:輸出匹配位置的行和列坐標、角度、得分 【中心坐標】