OpenCV cvMatchTemplate того же размера изображения - PullRequest
1 голос
/ 18 февраля 2011

Я сейчас пытаюсь найти нормализованную взаимную корреляцию между двумя изображениями 1 на 1.Поэтому для этого я использую cvMatchTemplate.Но после использования cvMinMaxLoc maxval всегда возвращает 1,00000 для любых 2 изображений 1 на 1.

Поэтому я попытался обойти это, пытаясь использовать cvMatchTemplate для изображений 6 на 3 и 3 на 3.Для каждого исходного пикселя я расширил его до 6 на 3 и 3 на 3, чтобы посмотреть, будет ли это лучше.Это не так.maxval по-прежнему возвращает 1.000000.Есть ли лучший способ найти NCC между 2 пикселями?

            cvSetImageROI(img, cvRect(curWidth, curHeight, 1, 1));
            IplImage* tempROI = cvCreateImage(cvSize(1, 1), img->depth, img->nChannels);
            cvCopy(img, tempROI);
            cvResetImageROI(img);

            IplImage* currentROI = cvCreateImage(cvSize(6,3), img->depth, img->nChannels);
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 6; j++) {
                    cvSetImageROI(currentROI, cvRect(j, i, 1, 1));
                    cvCopy(tempROI, currentROI);
                    cvResetImageROI(currentROI);
                }
            }

            cvReleaseImage(&tempROI);
            cvSetImageROI(opp_img, cvRect(opp_loc, curHeight, 1, 1));
            tempROI = cvCreateImage(cvSize(1, 1), opp_img->depth, opp_img->nChannels);
            cvCopy(opp_img, tempROI);
            cvResetImageROI(opp_img);

            IplImage* centerROI = cvCreateImage(cvSize(3,3), opp_img->depth, opp_img->nChannels);
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    cvSetImageROI(centerROI, cvRect(j, i, 1, 1));
                    cvCopy(tempROI, centerROI);
                    cvResetImageROI(centerROI);
                }
            }
            IplImage *re = cvCreateImage(cvSize(4, 1), IPL_DEPTH_32F, 1);
            cvZero(re);
            cvMatchTemplate(currentROI, centerROI, re, CV_TM_CCORR_NORMED);
            cvMinMaxLoc(re, &minval, &maxval, &minloc, &maxloc);

Ответы [ 2 ]

2 голосов
/ 28 августа 2012

Проверьте математику за нормализованной взаимной корреляцией.Вы обнаружите, что в случае изображений 1 * 1 вы ВСЕГДА получите 1,0 NCC - основная идея NCC - игнорировать различия в интенсивности.http://opencv.willowgarage.com/documentation/c/object_detection.html

1 голос
/ 18 февраля 2011

Можно сделать NCC для изображений 1 на 1 или любых изображений с таким же размером изображения, но обычно это бесполезно. Если вы ищете шаблон T на изображении I, результатом будет R с размерами I - T + 1, поэтому, если изображения имеют одинаковый размер, результат будет 1x1. Если вы ищете местоположение minmax на любом изображении с таким размером (1x1), оно вернет 1.000, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...