LocalExpansionStereo LayerManager.h

#pragma once

#include <vector>
#include <opencv2/opencv.hpp>
#include "Proposer.h"

class LayerManager
{
	const int height;
	const int width;
	const int windowR;

public:
	struct Layer {
		int heightBlocks;
		int widthBlocks;
		int regionUnitSize;
		std::vector<cv::Rect> unitRegions;
		std::vector<cv::Rect> sharedRegions;
		std::vector<cv::Rect> filterRegions;
		std::vector<std::vector<int>> disjointRegionSets;
		//std::vector<std::unique_ptr<IProposer<float>>> proposers;
		std::vector<IProposer*> proposers;
	};
	std::vector<Layer> layers;

	LayerManager& LayerManager::operator=(const LayerManager& obj) {
		this->layers = obj.layers;
		return *this;
	}

	LayerManager(int width, int height, int windowR, int localLabelSetNum)
		: height(height)
		, width(width)
		, windowR(windowR)
	{
		layers = std::vector<Layer>();
	}

	~LayerManager(void)
	{
	}

	void addLayer(int unitRegionSize)
	{
		Layer layer;

#if 0
		// This produces cells with irregular (smaller) sizes at left and bottom boundaries. 
		layer.regionUnitSize = unitRegionSize;
		layer.heightBlocks = (height / unitRegionSize) + ((height % unitRegionSize) ? 1 : 0);
		layer.widthBlocks  = (width  / unitRegionSize) + ((width  % unitRegionSize) ? 1 : 0);

		layer.sharedRegions.resize(layer.heightBlocks * layer.widthBlocks);
		layer.filterRegions.resize(layer.heightBlocks * layer.widthBlocks);
		layer.unitRegions.resize(layer.heightBlocks * layer.widthBlocks);
		
		layer.disjointRegionSets.resize(16);
		cv::Rect imageDomain(0, 0, width, height);

		#pragma omp parallel for
		for ( int i = 0; i < layer.heightBlocks; i++ ){
			for ( int j = 0; j < layer.widthBlocks; j++ ){
				int r = i*layer.widthBlocks + j;
				cv::Rect &sharedRegion = layer.sharedRegions[r];
				cv::Rect &filterRegion = layer.filterRegions[r];
				cv::Rect &unitRegion   = layer.unitRegions[r];
				
				unitRegion.x = j * unitRegionSize;
				unitRegion.y = i * unitRegionSize;
				unitRegion.width  = unitRegionSize;
				unitRegion.height = unitRegionSize;
				unitRegion = unitRegion & imageDomain;
				
				sharedRegion.x = (j-1) * unitRegionSize;
				sharedRegion.y = (i-1) * unitRegionSize;
				sharedRegion.width  = unitRegionSize * 3;
				sharedRegion.height = unitRegionSize * 3;
				sharedRegion = sharedRegion & imageDomain;

				filterRegion.x = (j-1) * unitRegionSize - windowR;
				filterRegion.y = (i-1) * unitRegionSize - windowR;
				filterRegion.width  = unitRegionSize * 3 + windowR*2;
				filterRegion.height = unitRegionSize * 3 + windowR*2;
				filterRegion = filterRegion & imageDomain;
			}
		}
#else
		// Make bigger cells by merging smaller ones at the right and bottom boundaries
		// if the edge cells are smaller than "minsize".

		layer.regionUnitSize = unitRegionSize;
		int minsize = std::max(2, unitRegionSize / 2);
		int frac_h = height % unitRegionSize;
		int frac_w = width % unitRegionSize;
		int split_h = frac_h >= minsize ? 1 : 0;
		int split_w = frac_w >= minsize ? 1 : 0;

		layer.heightBlocks = (height / unitRegionSize) + split_h;
		layer.widthBlocks = (width / unitRegionSize) + split_w;

		layer.sharedRegions.resize(layer.heightBlocks * layer.widthBlocks);
		layer.filterRegions.resize(layer.heightBlocks * layer.widthBlocks);
		layer.unitRegions.resize(layer.heightBlocks * layer.widthBlocks);

		layer.disjointRegionSets.resize(16);
		cv::Rect imageDomain(0, 0, width, height);

		#pragma omp parallel for
		for (int i = 0; i < layer.heightBlocks; i++) {
			for (int j = 0; j < layer.widthBlocks; j++) {
				int r = i*layer.widthBlocks + j;
				cv::Rect &sharedRegion = layer.sharedRegions[r];
				cv::Rect &filterRegion = layer.filterRegions[r];
				cv::Rect &unitRegion = layer.unitRegions[r];

				unitRegion.x = j * unitRegionSize;
				unitRegion.y = i * unitRegionSize;
				unitRegion.width = unitRegionSize;
				unitRegion.height = unitRegionSize;
				unitRegion = unitRegion & imageDomain;

				sharedRegion.x = (j - 1) * unitRegionSize;
				sharedRegion.y = (i - 1) * unitRegionSize;
				sharedRegion.width = unitRegionSize * 3;
				sharedRegion.height = unitRegionSize * 3;
				sharedRegion = sharedRegion & imageDomain;

				filterRegion.x = (j - 1) * unitRegionSize - windowR;
				filterRegion.y = (i - 1) * unitRegionSize - windowR;
				filterRegion.width = unitRegionSize * 3 + windowR * 2;
				filterRegion.height = unitRegionSize * 3 + windowR * 2;
				filterRegion = filterRegion & imageDomain;
			}
		}

		// Fix sizes of regions near left and bottom boundaries to include fractional regions.
		if (split_w == 0)
		{
			for (int i = 0; i < layer.heightBlocks; i++) {
				int x1 = i*layer.widthBlocks + layer.widthBlocks - 1;
				layer.unitRegions[x1].width += frac_w;
				// sharedRegion and filterRegion have already correct sizes by their definition.
			}
			for (int i = 0; i < layer.heightBlocks; i++) {
				int x1 = i*layer.widthBlocks + layer.widthBlocks - 2;
				layer.sharedRegions[x1].width += frac_w;
				layer.filterRegions[x1].width += frac_w;
				layer.filterRegions[x1] = layer.filterRegions[x1] & imageDomain;
			}
		}
		if (split_h == 0)
		{
			for (int j = 0; j < layer.widthBlocks; j++) {
				int y1 = (layer.heightBlocks - 1)*layer.widthBlocks + j;
				layer.unitRegions[y1].height += frac_h;
				// sharedRegion and filterRegion have already correct sizes by their definition.
			}
			for (int j = 0; j < layer.widthBlocks; j++) {
				int y1 = (layer.heightBlocks - 2)*layer.widthBlocks + j;
				layer.sharedRegions[y1].height += frac_h;
				layer.filterRegions[y1].height += frac_h;
				layer.filterRegions[y1] = layer.filterRegions[y1] & imageDomain;
			}
		}
#endif
		
		for ( int i = 0; i < layer.heightBlocks; i++ ){
			for ( int j = 0; j < layer.widthBlocks; j++ ){
				int r = i*layer.widthBlocks + j;
				layer.disjointRegionSets[(i%4)*4 + (j%4)].push_back(r);
			}
		}
		auto it = layer.disjointRegionSets.begin();
		while (  it != layer.disjointRegionSets.end() ){
			it->shrink_to_fit();
			if ( it->size() == 0 ){
				it = layer.disjointRegionSets.erase(it);
			} else {
				it++;
			}
		}

		layers.push_back(layer);
	}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值