VideoTeror::GrayscaleImage VideoTeror::MotionDetection::FarnebackMotionDetector::detect(const GrayscaleImage &curFrame) { GrayscaleImage resized; cv::resize(curFrame, resized, cv::Size(prevFrame.cols, prevFrame.rows)); cv::Mat_<cv::Vec2f> flow(resized.rows, resized.cols); cv::calcOpticalFlowFarneback(prevFrame, resized, flow, 0.75, 3, 10, 20, 5, 1.1, 0); GrayscaleImage test; curFrame.copyTo(test); GrayscaleImage result(resized.rows, resized.cols); for (int y = 0; y < resized.rows; y++) { for (int x = 0; x < resized.cols; x++) { cv::line(test, cv::Point(x*blockSize, y*blockSize), cv::Point(x*blockSize + flow(y, x)[0]*blockSize, y*blockSize + flow(y, x)[1]*blockSize), 255); result(y, x) = 255 * (sqrt(flow(y, x)[0]*flow(y, x)[0] + flow(y, x)[1]*flow(y, x)[1])); // > threshold); } } morphClosure(result, 4); cv::imshow("test", test); resized.copyTo(prevFrame); cv::resize(result, result, cv::Size(curFrame.cols, curFrame.rows), 0, 0, cv::INTER_NEAREST); return result; }