LocalExpansionStereo Proposer.h

#pragma once
#include <opencv2/opencv.hpp>
#include "Plane.h"
#include "Utilities.hpp"

class IProposer
{
protected:
	const int K;

	cv::Mat labeling;
	int iter;
	int outerIter;
	cv::Rect rect;

public:
	IProposer(int K)
		: K(K)
	{
	}

	virtual IProposer* createInstance() = 0;

	virtual ~IProposer()
	{
	}

	virtual void startIterations(cv::Mat labeling, cv::Rect rect, int outerIter) = 0;
	virtual Plane getNextProposal() = 0;
	virtual bool isContinued() = 0;
};


class ExpansionProposer : public IProposer
{
protected:
	cv::Point selectRandomPixelInRect(cv::Rect rect)
	{
		int n = cv::theRNG().uniform(0, rect.height * rect.width);

		int xx = n % rect.width;
		int yy = n / rect.width;
		return cv::Point(rect.x + xx, rect.y + yy);
	}

public:

	ExpansionProposer(int K)
		: IProposer(K)
	{
	}

	virtual IProposer* createInstance() override
	{
		return (IProposer*)(new ExpansionProposer(K));
	}

	virtual ~ExpansionProposer()
	{
	}

	virtual void startIterations(cv::Mat labeling, cv::Rect unitRegion, int outerIter) override
	{
		this->labeling = labeling(unitRegion);
		this->outerIter = outerIter;
		rect = unitRegion;
		iter = 0;
	}
	virtual Plane getNextProposal() override
	{
		auto p = selectRandomPixelInRect(cv::Rect(0, 0, labeling.cols, labeling.rows));
		auto label = labeling.at<Plane>(p);
		iter++;
		return label;
	}
	virtual bool isContinued() override
	{
		return iter < K;
	}
};



class RandomProposer : public ExpansionProposer
{
protected:
	const float MIN_DISPARITY;
	const float MAX_DISPARITY;
	const float MAX_VDISPARITY;
	const float randomNmax;
	const bool doEarlyStop;

	float getDisparityPerturbationWidth(int m)
	{
		return (MAX_DISPARITY - MIN_DISPARITY) * pow(0.5f, m + 1);
	}

public:

	RandomProposer(int K, float maxDisp, float minDisp = 0, float maxVDisp = 0, bool doEarlyStop = true)
		: ExpansionProposer(K)
		, MIN_DISPARITY(minDisp)
		, MAX_DISPARITY(maxDisp)
		, MAX_VDISPARITY(maxVDisp)
		, doEarlyStop(doEarlyStop)
		, randomNmax(1.0)
	{
	}

	virtual ~RandomProposer()
	{
	}

	virtual IProposer* createInstance() override
	{
		return (IProposer*)(new RandomProposer(K, MAX_DISPARITY, MIN_DISPARITY, MAX_VDISPARITY, doEarlyStop));
	}


	virtual Plane getNextProposal() override
	{
		auto p = selectRandomPixelInRect(cv::Rect(0, 0, labeling.cols, labeling.rows));
		auto in = labeling.at<Plane>(p);
		int m = outerIter + iter;
		iter++;

		cv::Point s = rect.tl() + p;
		float zs = in.GetZ(float(s.x), float(s.y));
		float dz = getDisparityPerturbationWidth(m);
		float minz = std::max(MIN_DISPARITY, zs - dz);
		float maxz = std::min(MAX_DISPARITY, zs + dz);
		zs = cv::theRNG().uniform(minz, maxz);

		float vs = in.v;
		if (MAX_VDISPARITY != 0)
		{
			float dv = MAX_VDISPARITY * pow(0.5f, m + 1);
			float minv = std::max(-MAX_VDISPARITY, vs - dv);
			float maxv = std::min(+MAX_VDISPARITY, vs + dv);
			vs = cv::theRNG().uniform(minv, maxv);
		}
		float nr = randomNmax * pow(0.5f, m);
		cv::Vec<float, 3> nv = in.GetNormal() + (cv::Vec<float, 3>) cvutils::getRandomUnitVector() * nr;

		nv = nv / sqrt(nv.ddot(nv));

		return Plane::CreatePlane(nv[0], nv[1], nv[2], zs, float(s.x), float(s.y), vs);
	}
	virtual bool isContinued() override
	{
		return (iter < K) && !(doEarlyStop && getDisparityPerturbationWidth(outerIter + iter) < 0.1);
	}
};

class RansacProposer : public IProposer
{
protected:
	cv::Mat coord;
	cv::Mat disps;
	const int MAX_SAM;
	const float conf;

	std::vector<int> randperm(int len)
	{
		std::vector<int> v;

		v.reserve(len);
		for (int i = 0; i < len; ++i)
			v.push_back(i);

		std::random_shuffle(v.begin(), v.end());

		return v;
	}

	// [u v 1] * [a b c]^T =[d]
	Plane RANSACPlane(cv::Mat pts, cv::Mat disp, float threshold)
	{
		int len = pts.rows;
		int max_i = 3;
		int max_sam = MAX_SAM;
		int no_sam = 0;
		cv::Mat div = cv::Mat_<float>::zeros(3, 1);
		cv::Mat inls = cv::Mat_<uchar>(len, 1, (uchar)0);
		int no_i_c = 0;
		cv::Mat N = cv::Mat_<float>(3, 1);
		cv::Mat result;

		cv::Mat ranpts = cv::Mat_<float>::zeros(3, 3);
		cv::Mat ranpts_ = cv::Mat_<cv::Vec3f>(ranpts);
		cv::Mat pts_ = cv::Mat_<cv::Vec3f>(pts);

		while (no_sam < max_sam)
		{
			no_sam = no_sam + 1;
			auto ransam = randperm(len);
			for (int i = 0; i < 3; i++)
			{
				ranpts_.at<cv::Vec3f>(i) = pts_.at<cv::Vec3f>(ransam[i]);
				div.at<float>(i) = disp.at<float>(ransam[i]);
			}
			/// compute a distance of all points to a plane given by pts(:, sam) to dist
			cv::solve(ranpts, div, N, cv::DECOMP_SVD);
			cv::Mat dist = cv::abs(pts * N - disp);
			cv::Mat v = dist < threshold;
			int no_i = cv::countNonZero(v);

			if (max_i < no_i)
			{
				// Re - estimate plane and inliers
				cv::Mat b = cv::Mat_<float>::zeros(no_i, 1);
				cv::Mat A = cv::Mat_<float>::zeros(no_i, 3);
				cv::Mat A_ = cv::Mat_<cv::Vec3f>(A);

				// MATLAB: A = pts(v, :);
				for (int i = 0, j = 0; i < no_i; i++)
				if (v.at<uchar>(i))
				{
					A_.at<cv::Vec3f>(j) = pts_.at<cv::Vec3f>(i);
					b.at<float>(j) = disp.at<float>(i);
					j++;
				}

				cv::solve(A, b, N, cv::DECOMP_SVD);
				dist = cv::abs(pts * N - disp);
				v = dist < threshold;
				int no = cv::countNonZero(v);

				if (no > no_i_c)
				{
					result = N.clone();
					no_i_c = no;
					inls = v;
					max_i = no_i;
					max_sam = std::min(max_sam, computeSampleCount(no, len, 3, conf));
				}
			}
		}
		return Plane(result.at<float>(0), result.at<float>(1), result.at<float>(2));
	}


	int computeSampleCount(int ni, int ptNum, int pf, double conf)
	{
		int SampleCnt;

		// MATLAB: q = prod([(ni - pf + 1) : ni] . / [(ptNum - pf + 1) : ptNum]);
		double q = 1.0;
		for (double a = (ni - pf + 1), b = (ptNum - pf + 1); a <= ni; a += 1.0, b += 1.0)
			q *= (a / b);

		const double eps = 1e-4;

		if ((1.0 - q) < eps)
			SampleCnt = 1;
		else
			SampleCnt = int(log(1.0 - conf) / log(1.0 - q));

		if (SampleCnt < 1)
			SampleCnt = 1;
		return SampleCnt;
	}
public:

	RansacProposer(int K, int MAX_SAM = 500, float conf = 0.95)
		: IProposer(K)
		, MAX_SAM(MAX_SAM)
		, conf(conf)

	{
	}

	virtual IProposer* createInstance() override
	{
		return (IProposer*)(new RansacProposer(K, MAX_SAM, conf));
	}

	virtual ~RansacProposer()
	{
	}


	virtual void startIterations(cv::Mat labeling, cv::Rect unitRegion, int outerIter) override
	{
		this->labeling = labeling(unitRegion);
		this->outerIter = outerIter;
		rect = unitRegion;
		iter = 0;

		coord = cv::Mat(unitRegion.size(), CV_32FC3);
		disps = cv::Mat(unitRegion.size(), CV_32FC1);
		for (int y = 0; y < coord.rows; y++)
		for (int x = 0; x < coord.cols; x++){
			auto c = cv::Vec3f((float)x + unitRegion.x, (float)y + unitRegion.y, 1.0f);
			coord.at<cv::Vec3f>(y, x) = c;
			auto v = labeling.at<cv::Vec4f>(y + unitRegion.y, x + unitRegion.x);
			disps.at<float>(y, x) = v[0] * c[0] + v[1] * c[1] + v[2];
		}
		coord = coord.reshape(1, coord.rows * coord.cols);
		disps = disps.reshape(1, disps.rows * disps.cols);
	}
	virtual Plane getNextProposal() override
	{
		iter++;
		return RANSACPlane(coord, disps, 1.0);
	}
	virtual bool isContinued() override
	{
		return iter < K;
	}

};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
1. 智慧监狱概述 智慧监狱的建设背景基于监狱信息化的发展历程,从最初的数字化监狱到信息化监狱,最终发展到智慧监狱。智慧监狱强调管理的精细化、监管的一体化、改造的科学化以及办公的无纸化。政策上,自2017年以来,司法部连续发布了多项指导性文件,推动智慧监狱的建设。 2. 内在需求与挑战 智慧监狱的内在需求包括数据应用与共享的不足、安防系统的单一功能、IT架构的复杂性、信息安全建设的薄弱以及IT运维的人工依赖。这些挑战要求监狱系统进行改革,以实现数据的深度利用和业务的智能化。 3. 技术架构与设计 智慧监狱的技术架构包括统一门户、信息安全、综合运维、安防集成平台和大数据平台。设计上,智慧监狱采用云计算、物联网、大数据和人工智能等技术,实现资源的动态分配、业务的快速部署和安全的主动防护。 4. 数据治理与应用 监狱数据应用现状面临数据分散和共享不足的问题。智慧监狱通过构建数据共享交换体系、数据治理工具及服务,以及基于数据仓库的数据分析模型,提升了数据的利用效率和决策支持能力。 5. 安全与运维 智慧监狱的信息安全建设涵盖了大数据应用、安全管理区、业务区等多个层面,确保了数据的安全和系统的稳定运行。同时,综合运维平台的建立,实现了IT系统的统一管理和自动化运维,提高了运维效率和系统的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值