OpenCV: сдвиг / выравнивание изображения лица относительно эталонного изображения (регистрация изображения)

Я новичок в OpenCV2 и работаю над проектом по распознаванию эмоций и хотел бы выровнять изображение лица по отношению к эталонному изображению лица. Я хотел бы, чтобы перевод изображений работал до перехода к повороту. В настоящее время идея состоит в том, чтобы выполнить поиск в ограниченном диапазоне по координатам x и y и использовать сумму квадратов разностей в качестве метрики ошибки, чтобы выбрать оптимальные параметры x / y для выравнивания изображения. Я использую функцию OpenCV face_cascade для обнаружения изображений лица, все изображения имеют фиксированный размер (128×128). Вопрос: Какие параметры изображения Mat мне нужно изменить, чтобы сместить изображение в положительном / отрицательном направлении по осям x и y? Я полагаю, что setImageROI больше не поддерживается типами данных Mat? У меня есть ROI для обоих лиц, но я не знаю, как их использовать.

void alignImage(vector<Rect> faceROIstore, vector<Mat> faceIMGstore)
{
Mat refimg = faceIMGstore[1]; //reference image
Mat dispimg = faceIMGstore[52]; // "displaced" version of reference image
//Rect refROI = faceROIstore[1]; //Bounding box for face in reference image
//Rect dispROI = faceROIstore[52]; //Bounding box for face in displaced image
Mat aligned;

matchTemplate(dispimg, refimg, aligned, CV_TM_SQDIFF_NORMED);
imshow("Aligned image", aligned);
}

Идея этого подхода основана на Учебник по выравниванию изображений Ричарда Шелиски Работа на Windows с OpenCV 2.4. Любые предложения очень ценятся.

2

Решение

cv::Mat поддерживает ROI. (Но это не поддерживает ИСП — канал интереса.)

Для применения ROI вы можете использовать operator() или специальный конструктор:

Mat refimgROI  = faceIMGstore[1](faceROIstore[1]); //reference image ROI
Mat dispimgROI(faceIMGstore[52], faceROIstore[52]); // "displaced" version of reference image ROI

И чтобы найти лучшую позицию внутри смещенного изображения, вы можете использовать matchTemplate функция.


Исходя из ваших комментариев, я могу предложить следующий код, который найдет наилучшее положение контрольного патча рядом со вторым (смещенным) патчем:

Mat ref = faceIMGstore[1](faceROIstore[1]);
Mat disp = faceIMGstore[52](faceROIstore[52]);

disp = disp.adjustROI(5,5,5,5); //allow 5 pixel max adjustment in any direction
if(disp.cols < ref.cols || disp.rows < ref.rows)
return 0;
Mat map;
cv::matchTemplate( disp, ref, map, CV_TM_SQDIFF_NORMED );

Point  minLoc;
cv::minMaxLoc( map, 0, &minLoc );

Mat adjusted = disp(Rect(minLoc.x, minLoc.y, ref.cols, ref.rows));
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]