點選上方 藍字 關註我們
微信公眾號: 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(0, 255, 0), 1, 8);
}
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(0, 0, 255), 2, 8);
}
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(255, 0, 0), 1, 8);
}
Qt C++ 客戶端演示:
系統化學習直接掃碼檢視
推薦閱讀