0
我遇到了另一个问题,同时使采用卤化物模板匹配(与解决问题的原文链接:output shifted in template matching)的结果显示模板匹配
现在,我想在得分最低的位置绘制一个矩形(其表示最佳匹配)。
模板匹配部分:
Image<float> source = load_image("C:\\Users\\Admin\\Desktop\\templateMatchingOpenCV\\clip\\clip2.png");
Image<float> templ = load_image("C:\\Users\\Admin\\Desktop\\templateMatchingOpenCV\\clip\\object3.png");
Var x, y, xt, yt, x_outer, y_outer, x_inner, y_inner, tile_index;
RDom r(0, templ.width(), 0, templ.height());
Func limit, comparesqdiff, comparesqdiffnorm, compareccorr;
limit = BoundaryConditions::constant_exterior(source, 1.0f);
Expr function = sum(Halide::pow(templ(r.x, r.y) - limit(x + r.x, y + r.y), 2))/(templ.width()*templ.height());
comparesqdiff(x, y) = sum(Halide::pow(templ(r.x, r.y) - limit(x + r.x, y + r.y), 2))/(templ.width()*templ.height());
Image<float> outputsqdiff;
comparesqdiff.tile(x, y, x_outer, y_outer, x_inner, y_inner, 64,64).fuse(x_outer, y_outer, tile_index).vectorize(x_inner).unroll(y_inner).parallel(tile_index);
comparesqdiff.compile_jit();
现在很明显,我认为我应该使用寻找得分最低的位置的功能是argmin但我不太明白如何使用它。此外,我知道绘图方法将涵盖像素的下方和右侧的所有内容,但我还没有涉及到该部分。
绘制矩形部分:
RDom wholeImage(0, source.width() - templ.width(), 0, source.height() - templ.height());
Tuple coords = argmin(r, function, "argmin");
Func show;
show(x, y) = select(x >= coords[0] && y >= coords[1] && x <= coords[0] + templ.width() && y <= coords[1] + templ.height(), 0, limit(x, y));
Image<float> test(source.width(), source.height());
test = show.realize(source.width(), source.height());
预先感谢您。
嗯,如果我有其他的选择,我会选择他们,但此刻我正在为我的论文和OpenCV版本等这样做。 另外我假设我必须在模板匹配完成后添加argmin作为更新? 另外我想知道如何将像素的坐标转换为源图像,以使用它来绘制矩形,我已经知道如何去做。感谢您的回答 – Rok
另外,我用于argmin的RDom基本上是模板匹配的整个结果图片 – Rok
我会尝试您的建议并通过回报:) – Rok