當前位置: 妍妍網 > 碼農

多角度、多尺度、多目標的邊緣樣版匹配

2024-02-11碼農

點選上方 藍字 關註我們

微信公眾號: OpenCV學堂

關註獲取更多電腦視覺與深度學習知識

演算法說明

OpenCV中內建的樣版匹配演算法,完全是像素基本的樣版匹配,特別容易受到光照影響,光照稍微有所不同,該方法就會歇菜了!搞得很多OpenCV初學者剛學習到該方法時候很開心,一用該方法馬上很傷心,悲喜交加,充分感受到了理想與現實的距離,不過沒關系,這裏介紹一種新的樣版匹配演算法,主要是基於影像邊緣梯度,它對影像光照與像素遷移都有很強的抗幹擾能力,在工業套用場景中已經得到廣泛使用。基本原理主要是基於梯度跟邊緣實作NCC計算與匹配,首先計算梯度:

然後計算NCC開啟匹配搜尋:

程式碼實作與演示

說實話我也不是從零開始的,之前我寫過一個版本,但是我發現一個別人寫好的一個原始版本,好像是這個演算法的作者自己寫,基於OpenCV3.x版本完成的,連結如下:

https://github.com/daxiaHuang/edge-template-match/tree/master

同時原始版本不支持多角度、多物件、多尺度,所以我在這個上面一通狂改,就讓它各種支持了,這個大概花了我三天時間。最終我給他們封裝成兩個類,配合上Qt C++ 的一個界面,透過點點滑鼠即可執行。客戶端直接呼叫API即可,客戶端程式碼如下:

task.initailization(tpl);
task.detect(target, results);
for (auto item : results) {
for (auto pt : item.pts) {
cv::circle(result, pt, 1, cv::Scalar(02550), 18);
}
cv::RotatedRect rrt = cv::minAreaRect(item.pts);
cv::Point2f minbox[4];
rrt.points(minbox);
for (int r = 0; r < 4; r++)
{
cv::line(result, minbox[r], minbox[(r + 1) % 4], cv::Scalar(00255), 28);
}
std::cout << "conf: " << item.conf << std::endl;
cv::putText(result, cv::format("conf:%.2f, angle:%d", item.conf, item.angle), item.center, cv::FONT_HERSHEY_SIMPLEX, .5, cv::Scalar(25500), 18);
}

Qt C++ 客戶端演示:

系統化學習直接掃碼檢視

推薦閱讀