思路参考:Simple Background Estimation in Videos using OpenCV (C++/Python)
#include
#include
#include using namespace std;
using namespace cv;int computeMedian(vector elements)
{nth_element(elements.begin(), elements.begin() + elements.size() / 2, elements.end());return elements[elements.size() / 2];
}cv::Mat compute_median(std::vector vec)
{cv::Mat medianImg(vec[0].rows, vec[0].cols, CV_8UC3, cv::Scalar(0, 0, 0));for (int row = 0; row elements_B;std::vector elements_G;std::vector elements_R;for (int imgNumber = 0; imgNumber (row, col)[0];int G = vec[imgNumber].at(row, col)[1];int R = vec[imgNumber].at(row, col)[2];elements_B.push_back(B);elements_G.push_back(G);elements_R.push_back(R);}medianImg.at(row, col)[0] = computeMedian(elements_B);medianImg.at(row, col)[1] = computeMedian(elements_G);medianImg.at(row, col)[2] = computeMedian(elements_R);}}return medianImg;
}int main(int argc, char const *argv[])
{std::string video_file;if (argc > 1){video_file &#61; argv[1];//从命令行传入视频}else{video_file &#61; "dance1.mp4";//放自己的视频资源}VideoCapture cap(video_file);if (!cap.isOpened())cerr <<"Error opening video file\n";default_random_engine generator;uniform_int_distribution distribution(0, cap.get(CAP_PROP_FRAME_COUNT));vector frames;Mat frame;for (int i &#61; 0; i <25; i&#43;&#43;){int fid &#61; distribution(generator);cap.set(CAP_PROP_POS_FRAMES, fid);Mat frame;cap >> frame;if (frame.empty())continue;frames.push_back(frame);}Mat medianFrame &#61; compute_median(frames);imshow("frame", medianFrame);waitKey(0);cap.set(CAP_PROP_POS_FRAMES, 0);Mat grayMedianFrame;cvtColor(medianFrame, grayMedianFrame, COLOR_BGR2GRAY);while (1){cap >> frame;if (frame.empty())break;cvtColor(frame, frame, COLOR_BGR2GRAY);Mat dframe;absdiff(frame, grayMedianFrame, dframe);threshold(dframe, dframe, 30, 255, THRESH_BINARY);imshow("frame", dframe);waitKey(20);}cap.release();return 0;
}