В настоящее время я работаю над системой вторжения, основанной на видеонаблюдении. Чтобы выполнить эту задачу, я делаю снимок фона моей сцены (предположим, что он полностью чист, нет людей или движущихся объектов). Затем я сравниваю рамку, которую я получаю от (статической) видеокамеры, и ища различия. Я должен быть в состоянии проверить любые различия, а не только человеческую форму или что-то еще, поэтому я не могу выделить конкретную функцию.
Как правило, у меня есть:
Я использую 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: Извините за изображения. Из-за моей новой подписки у меня недостаточно репутации.
ИЗМЕНИТЬ Здесь я использую изображение в оттенках серого, но я открыт для любого решения.