# week3_code **Repository Path**: sika0819/week3_code ## Basic Information - **Project Name**: week3_code - **Description**: 第三周代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-04-24 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 背景提取 ## 源码 ```c++ #include "pch.h" #include #include "opencv2/opencv.hpp" #include"opencv2/xfeatures2d.hpp" using namespace cv; using namespace std; using namespace xfeatures2d; int labelTargets(Mat &src, Mat &mask, int thresh = 100); int main() { char fn[] = "C:\\opencv\\sources\\samples\\data\\vtest.avi"; VideoCapture capture(fn); Mat img, foreGround, backGround, fgMask; PtrpBgModel = createBackgroundSubtractorMOG2().dynamicCast(); if (!capture.isOpened()) { cout << "无法打开视频" << fn << endl; } double rate = capture.get(CV_CAP_PROP_FPS); bool stop(false); Mat frame; int delay = 1000 / rate; while (!stop) { if (!capture.read(frame)) break; resize(frame, img, Size(frame.cols / 2, frame.rows / 2), INTER_LINEAR); if (foreGround.empty()) { foreGround.create(img.size(), img.type()); } pBgModel->apply(img, fgMask); threshold(fgMask, fgMask, 128, 255, THRESH_BINARY); foreGround = Scalar::all(0); img.copyTo(foreGround, fgMask); int nTargets = labelTargets(img, fgMask); pBgModel->getBackgroundImage(backGround); imshow("source", img); imshow("foreground", foreGround); imshow("mask", fgMask); imshow("background", backGround); cout << "共检测到" << nTargets << "个目标" << endl; char key = waitKey(delay); if (key==27) stop = true; } capture.release(); waitKey(); } int labelTargets(Mat &src, Mat &mask, int thresh) { Mat seg = mask.clone(); vector> cnts; findContours(seg, cnts, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); float area; Rect rect; int count = 0; string strCount; for (int i = cnts.size() - 1; i >= 0; i--) { vectorc = cnts[i]; area = contourArea(c); if (area < thresh) continue; count++; rect = boundingRect(c); rectangle(src, rect, Scalar(0, 0, 0xff), 1); stringstream ss; ss << count; ss >> strCount; putText(src, strCount, Point(rect.x, rect.y), CV_FONT_HERSHEY_PLAIN, 0.5, Scalar(0, 0xff, 0)); } return count; } ``` ## 效果 ![img](高斯提取背景.png) # 光流估计 ## 代码 ```c++ #include "pch.h" #include #include "opencv2/opencv.hpp" #include"opencv2/xfeatures2d.hpp" using namespace cv; using namespace std; using namespace xfeatures2d; int main() { char fn[] = "C:\\opencv\\sources\\samples\\data\\vtest.avi"; VideoCapture capture(fn); Mat source, gray, lastgray, result; vector points[2], temp; vector status; vectorerr; bool stop(false); int MAX_POINT_POINTS = 100; while (!stop) { if (!capture.read(source)) break; cvtColor(source, gray, COLOR_BGR2GRAY); if (points[0].size() < 10) { goodFeaturesToTrack(gray, points[0], MAX_POINT_POINTS, 0.01, 20); } if (lastgray.empty()) { gray.copyTo(lastgray); } calcOpticalFlowPyrLK(lastgray, gray, points[0], points[1], status, err); int counter = 0; source.copyTo(result); for (int i = 0; i < points[1].size(); i++) { line(result, points[0][i], points[1][i], Scalar(0, 0, 0xff)); circle(result, points[1][i], 3, Scalar(0, 0, 0xff)); } swap(points[0], points[1]); swap(lastgray, gray); imshow("原图像", source); imshow("结果", result); char key = waitKey(1000); if (key == 27) { break; } } } ``` ## 效果 ![img2](光流估计.png)