当前位置: 首页>>代码示例>>C++>>正文


C++ Motion::init_tracking方法代码示例

本文整理汇总了C++中Motion::init_tracking方法的典型用法代码示例。如果您正苦于以下问题:C++ Motion::init_tracking方法的具体用法?C++ Motion::init_tracking怎么用?C++ Motion::init_tracking使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Motion的用法示例。


在下文中一共展示了Motion::init_tracking方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: if

/** 将最新的轮廓合并到已有的“活动区域中”,如果没有重叠,则新建“活动区域”
 */
void DetectWithOF5::merge_motions(const CONTOURS &regions)
{
	remove_timeout_motions();

	/** 检查 regions 是否属于某个 motions ...
	 */
	std::set<size_t> merged_idxs;	// regions 中,被合并的idx
	std::vector<size_t> exp_idxs;
	for (size_t i = 0; i < motions_.size(); i++) {
		/** 针对每个 motion,合并所有与最后位置相交的轮廓 */
		Motion &m = motions_[i];
		exp_idxs.clear();

		// motion 仅仅保留最后 M 帧
		if (m.history.size() > m.M) {
			m.history.pop_front();	// FIXME: 有可能 history 中剩下的都是“空”轮廓了,但一般情况下不会的 ...
			if (m.tracking_inited_) {
				m.tracking_pts.pop_front();	// FIXME: 保证 size() ...
			}

			m.dense_of_poss.pop_front();
			m.dense_of_xs.pop_front();
			m.dense_of_ys.pop_front();

			m.frame_idx_ ++;
		}

		assert(!m.tracking_inited_ || m.history.size() == m.tracking_pts.size());

		// 最后一个有效轮廓的外接圆 ..
		cv::Point2f c0;
		float r0;
		cv::minEnclosingCircle(m.last_contour, c0, r0);	// 最后轮廓的外接圆

		for (size_t j = 0; j < regions.size(); j++) {
			cv::Point2f c;
			float r;
			cv::minEnclosingCircle(regions[j], c, r);
			if (::is_cross(c0, r0, c, r)) {
				exp_idxs.push_back(j);
				merged_idxs.insert(j);
			}
		}

		/** FIXME: 如果需要扩展两个以上轮廓,而且两个轮廓距离还比较远,如何合并?
				可能更好的方法是,根据历史运动的方向,选择其中某个轮廓,但 ....
		 */

		bool update = false;
		if (exp_idxs.size() == 1) {
			// 保存被合并的轮廓 ..
			m.last_contour = regions[exp_idxs[0]];
			motions_[i].history.push_back(m.last_contour);
			motions_[i].stamp = curr_;
			update = true;
		}
		else if (exp_idxs.size() == 0) {
			// 此时说明 motion 没有活动 ???
			motions_[i].history.push_back(CONTOUR());	//
		}
		else {
			// TODO: 应该根据历史轨迹方向,选择更有可能的一个 ...
			m.last_contour = regions[exp_idxs[0]];
			motions_[i].history.push_back(m.last_contour);
			motions_[i].stamp = curr_;
			update = true;
		}

		if (update) {
			// 重新计算外界矩形 ...
			m.update_bounding_rc();
		}

		if (m.dense_of_poss.size() > 0) {
			// 更新稠密光流
			cv::Mat x, y;
			if (calc_dense_of(m.brc, x, y)) {
				m.dense_of_poss.push_back(m.brc);
				m.dense_of_xs.push_back(x);
				m.dense_of_ys.push_back(y);
			}
		}

		if (!m.tracking_inited_) {
			m.init_tracking(cc_);
		}
	}

	// 合并重叠的 motions
	merge_overlapped_motions();

	// 创建新的 motions
	for (size_t i = 0; i < regions.size(); i++) {
		if (merged_idxs.find(i) == merged_idxs.end()) { // 所有未被合并的轮廓都应该创建为新的 motions ??
			const CONTOUR &c = regions[i];

			/** 使用不同颜色标识motion,方便调试 ...
			 */
//.........这里部分代码省略.........
开发者ID:chenyq123,项目名称:3516a_sample,代码行数:101,代码来源:DetectWithOF5.cpp


注:本文中的Motion::init_tracking方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。