源码解析:CamShift算法进行兴趣区域追踪

#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;
	}
}

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值