CV - Извлечь различия между двумя изображениями

В настоящее время я работаю над системой вторжения на основе видеонаблюдения. Чтобы выполнить эту задачу, я делаю снимок фона моей сцены (предположим, что он абсолютно чистый, без людей и движущихся объектов). Затем я сравниваю кадр, который я получаю от (статической) видеокамеры, и ищу различия. Я должен быть в состоянии проверитьлюбой различия, а не только человеческий облик или что-то еще, поэтому я не могу выделить конкретные функции.

Как правило, у меня есть:

Я использую OpenCV, поэтому для сравнения я в основном делаю:

cv::Mat bg_frame;
cv::Mat cam_frame;
cv::Mat motion;

cv::absdiff(bg_frame, cam_frame, motion);
cv::threshold(motion, motion, 80, 255, cv::THRESH_BINARY);
cv::erode(motion, motion, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3)));

Вот результат:

Как видите, рука раздета (думаю, из-за разницы в цвете), и это, к сожалению, не то, что я хочу.

Я думал о добавлении использованияcv::Canny() чтобы обнаружить края и заполнить недостающую часть руки, но, к сожалению (еще раз), это решает проблему только в немногих ситуациях, но не в большинстве из них.

Есть ли какой-либо алгоритм или метод, который я мог бы использовать, чтобы получитьточный отчет о разнице?

PS: извините за изображения. Из-за моей новой подписки мне не хватает репутации.

РЕДАКТИРОВАТЬ Я использую изображение в градациях серого здесь, но я открыт для любого решения.

Ответы на вопрос(2)

Ваш ответ на вопрос