#include <iostream>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/video.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
VideoCapture capture("slow_traffic_small.mp4");
if (!capture.isOpened()) {
//error in opening the video input
cerr << "Unable to open file!" << endl;
return 0;
}
Mat frame, roi, hsv_roi, mask;
// take first frame of the video
capture >> frame;
// setup initial location of window
Rect track_window(300, 200, 100, 50); // simply hardcoded the values
// set up the ROI for tracking
roi = frame(track_window);
cvtColor(roi, hsv_roi, COLOR_BGR2HSV);
inRange(hsv_roi, Scalar(0, 60, 32), Scalar(180, 255, 255), mask);//顾明思议,如果hsv_roi的像素,范围在lower和uper之间,则将该像素设位最大给mask
//准备直方图参数。
float range_[] = { 0, 180 };
const float* range[] = { range_ };
Mat roi_hist;
int histSize[] = { 180 };
int channels[] = { 0 };
//计算H通道直方图
calcHist(&hsv_roi, 1, channels, mask, roi_hist, 1, histSize, range);
normalize(roi_hist, roi_hist, 0, 255, NORM_MINMAX);
// Setup the termination criteria, either 10 iteration or move by atleast 1 pt
TermCriteria term_crit(TermCriteria::EPS | TermCriteria::COUNT, 10, 1);//迭代终止条件,到阈值(1)或者到最大次数(10)终止。最大迭代次数为10,中心位移值1
//终止标准的意思。
while (true) {
Mat hsv, dst;
capture >> frame;
if (frame.empty())
break;
cvtColor(frame, hsv, COLOR_BGR2HSV);
calcBackProject(&hsv, 1, channels, roi_hist, dst, range);//dst是直方反投影。
// apply camshift to get the new location
RotatedRect rot_rect = CamShift(dst, track_window, term_crit);//在dst中找track_window的最理想的位置。
// Draw it on image
Point2f points[4];
rot_rect.points(points);//找出旋转长方形的四个点。
for (int i = 0; i < 4; i++)
line(frame, points[i], points[(i + 1) % 4], 255, 2);
imshow("img2", frame);
//按q或者esc退出。
int keyboard = waitKey(30);
if (keyboard == 'q' || keyboard == 27)
break;
}
}