Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Resize & Template Matching

Hi folks. I tried to use this resize function to help me in template matching, since i dont know the size of a template image on my main image, but somewhy it goes wrong and find only 2/3 same images. Still works fine with 1:1 template image. Maybe you guys can help me here? Here's the code and images C:\fakepath\table.png C:\fakepath\temp3.png

int main()
{
    const int colDivisor = 21;
    const int rowDivisor = 13;
    int blacks[rowDivisor][colDivisor];
    int blockCount = 0;
    Mat imgROI;
    Point pointArray[3];
    int i = 0;
    Mat ref = imread("C:/Dev/QtBuild/try/debug/table.png");
    GaussianBlur(ref, ref, Size(5, 5), 0, 0);
    Mat tpl = imread("C:/Dev/QtBuild/try/debug/temp5.png");
    GaussianBlur(tpl, tpl, Size(5, 5), 0, 0);
    if (ref.empty() || tpl.empty())
        return -1;
    Mat gref, gtpl;
    cvtColor(ref, gref, CV_BGR2GRAY);
    cvtColor(tpl, gtpl, CV_BGR2GRAY);
    Mat res(ref.rows-tpl.rows+1, ref.cols-tpl.cols+1, CV_32FC1);
    int x = 0;
    int y = 0;
    resize(gtpl, gtpl, Size2i(gtpl.cols-1, gtpl.rows-1));
    while (true)
    {
        double minval, maxval, thresh = 0.8;
        Point minloc, maxloc;
        matchTemplate(gref, gtpl, res, CV_TM_CCOEFF_NORMED);
        threshold(res, res, 0.8, 1., CV_THRESH_TOZERO);
        minMaxLoc(res, &minval, &maxval, &minloc, &maxloc);
        if (maxval < thresh)
        {
            resize(gtpl, gtpl, Size(gtpl.cols-1, gtpl.rows-1));
        }
        else
        {
            break;
        }

    }
    matchTemplate(gref, gtpl, res, CV_TM_CCOEFF_NORMED);
    threshold(res, res, 0.8, 1., CV_THRESH_TOZERO);
    while (true)
    {
        double minval, maxval, thresh = 0.8;
        Point minloc, maxloc;

        minMaxLoc(res, &minval, &maxval, &minloc, &maxloc);
        if (maxval >= thresh)
        {
            floodFill(res, maxloc, Scalar(0), 0, Scalar(.1), Scalar(1.));
            if(maxloc.x < 100 && maxloc.y > 500)
            {
                x = maxloc.x+ gtpl.rows;
                y = maxloc.y;
            }
            else if( maxloc.x < 100 && maxloc.y < 100)
            {
                x = maxloc.x ;
                y = maxloc.y+ gtpl.cols;
            }
            else
            {
                x = maxloc.x ;
                y = maxloc.y + gtpl.rows;
            }
            pointArray[i] = Point(x,y);
            i++;
            circle(ref, Point(x, y), 5, CV_RGB(0, 0, 255));
        }
        else
        {
            break;
        }
    }
}