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: извините за изображения. Из-за моей новой подписки мне не хватает репутации.
РЕДАКТИРОВАТЬ Я использую изображение в градациях серого здесь, но я открыт для любого решения.