学习c++/qt opencv 图像单模板多次全方位旋转镜像匹配(二)

        对上次的多目标匹配加多个旋转,然后可以对模板图全的角度方向进行匹配。

        函数解析在上篇文章中。         学习c++/qt opencv 图像单模板多次匹配_白嫖真香的博客-CSDN博客

//将图片旋转 镜像函数
cv::Mat PicMatch::spinImage(cv::Mat mtx, bool spin = 0,int Mirroring = 0)
{
    /*
        Mirroring镜像类型: 1    左右镜像
                          0    上下镜像
                         -1    上下左右镜像

        spin:       true transpose函数自动顺时针90°旋转并左右镜像
                    flase 不旋转不镜像
    */
    cv::Mat src = mtx;
    cv::Mat temp,dst0,dst1,dst_1;

    //已经考虑了transpose(),匹配到镜像方式,添加了个2为顺时针旋转90°
    if(spin){
        cv::transpose(src, temp);
        if(Mirroring == 2){
            cv::flip(temp,dst1,1);
            return dst1;        //结果为顺时针90°旋转不左右镜像
        }
        if(Mirroring == -1){
            cv::flip(temp,dst0,0);
            return dst0;        //结果为顺时针90°旋转并上下左右镜像
        }
        if(Mirroring == 0){
            cv::flip(temp, dst_1, -1);
            return dst_1;        //结果为顺时针90°旋转并上下镜像
        }
        if(Mirroring == 1){
            return temp;        //结果为顺时针90°旋转并左右镜像
        }
    }

    else{
        if(Mirroring == 1){
            cv::flip(src,dst1,1);
            return dst1;         //左右镜像
        }
        if(Mirroring == 0){
            cv::flip(src,dst0,0);
            return dst0;         //上下镜像
        }
        if(Mirroring == -1){
            cv::flip(src, dst_1, -1);
            return dst_1;         //上下左右镜像
        }
    }
}

cv::Mat PicMatch::TempMatch(cv::Mat src, cv::Mat temp)
{
    cv::Mat showImg = src.clone();

    int resultImage_rows = src.rows - temp.rows + 1;
    int resultImage_cols = src.cols - temp.cols + 1;

    cv::Mat res;
    res.create(resultImage_cols,resultImage_rows, CV_32FC1);
    cv::matchTemplate(src,temp,res,CV_TM_CCOEFF_NORMED);
    cv::normalize(res, res, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());

    double minValue, maxValue;
    cv::Point minLoc, maxLoc;
    cv::Point matchLoc;
    char matchRate[10];

    //这个循环次数可以搞个看情况输入数值
    for(int i=0; i<150; i++)
    {
        int startX = maxLoc.x - 20;
        int startY = maxLoc.y - 20;
        int endX = maxLoc.x + 20;
        int endY = maxLoc.y + 20;
        if(startX<0 || startY<0)
        {
            startX = 0;
            startY = 0;
        }
         if(endX > res.cols - 1 || endY > res.rows - 1)
        {
            endX = res.cols - 1;
            endY = res.rows- 1;
        }
         cv::Mat temp1 = cv::Mat::zeros(endX - startX, endY - startY, CV_32FC1);
         temp1.copyTo(res(cv::Rect(startX, startY, temp1.cols, temp1.rows)));
         minMaxLoc(res, &minValue, &maxValue, &minLoc, &maxLoc);
         if(maxValue<0.8)
             break;

         //qDebug() << "max_value= " << maxValue<

你可能感兴趣的:(qt,opencv,c++,qt)