OpenCV(C++)多目标模板匹配

原理

主要是在调用模板匹配函数后,生成了结果图,对结果图进行筛选,对于大于阈值并且不重叠的进行保留,最终实现多目标的匹配。对于判断不重叠的方式主要使用nms的方式。

nms:对于每个矩形框,从小到大进行排序,然后进行遍历从第二个开始判断与矩形框的list的每一个是否相交,相交则舍弃,否则保留,一下为代码实现,全部复制后进行编译即可运行,记得自己替换模板与图片路径。

代码

所需的头文件

#include 
#include 

结构体的定义,方便保存数据

/**
 * @author stf
 * @brief nms data struct
 * @date 2022-12-27
 * @param val match template min val
 * @param loc match template min loc
 * @param roi match template result rect roi
 * @param getRect Function:use loc and temp size to calibrate roi
**/
struct nms_data_struct
{
    float val;
    cv::Point loc;
    cv::Rect roi;

    void getRect(cv::Size temp_size)
    {
        roi=cv::Rect(loc.x,loc.y,temp_size.width,temp_size.height);
    }
};

函数编写,其中,comp函数是比较函数,使用algorithm方法;nms_detect函数是判断两个矩形是否相交,相交则直接舍弃,否则保留;nms_temp_min是主要实现函数,最后以图片形式保存结果

/**
 * @author stf
 * @date 2022-12-27
 * @brief sort compare function
**/
bool comp(nms_data_struct data1,nms_data_struct data2)
{
    return data1.val data_list)
{
    for(int i=0;i nms_data;
    for(int i=0;i(j,i)<=thr)
            {
                nms_data_struct data;
                data.val=result.at(j,i);
                data.loc=cv::Point(i,j);
                data.getRect(temp_size);
                nms_data.push_back(data);
            }
        }
    }

    //Sort from smallest to largest
    std::sort(nms_data.begin(),nms_data.end(),comp);

    //nms
    std::vector nms_output_list;  
    for(int i=0;i

主函数编写,调用以上函数

int main()
{
    cv::Mat img=cv::imread("../b1.jpg");
    cv::Mat temp=cv::imread("../temp_bd.jpg");

    cv::Mat result;
    cv::matchTemplate(img,temp,result,1);
    nms_temp_min(img,result,temp.size(),true,0.06);

    return 0;
}

你可能感兴趣的:(opencv,opencv,c++,计算机视觉)