影像處理第二篇之波段運算(軟體外掛篇)

楊發荷發表於2020-10-20

1、外掛編寫教程

2、影像外掛基類講解

3、波段運算

3.1、波段運算檔案

#ifndef IRASTERPROCESS_H
#include "seed_rastercore/irasterprocess.h"
#endif /*IRASTERPROCESS*/

BEGIN_DOX_NAMESPACE

class RasterProcessBandOperator
	: public IRasterProcess
{
	REGISTER_ACTUALIZE(RasterProcessBandOperator, IRasterProcess)

public:

	/* @介面 預設建構函式
	 * @類名 [RasterProcessBandOperator]
	 * @作者 楊發荷RasterDataConvert
	 * @郵箱 575814050@qq.com
	 * @時間 2020年3月14號
	 */
	RasterProcessBandOperator();

	/* @介面 預設建構函式
	 * @類名 [RasterProcessBandOperator]
	 * @作者 楊發荷
	 * @郵箱 575814050@qq.com
	 * @時間 2020年3月14號
	 */
	~RasterProcessBandOperator();

	/* @介面 資料處理名稱
	 * @類名 [RasterProcessBandOperator]
	 * @作者 楊發荷
	 * @郵箱 575814050@qq.com
	 * @時間 2020年10月11日
	 */
	virtual QString processName();

	/* @介面 處理完之後的波段集合索引
	 * @類名 [RasterProcessBandOperator]
	 * @作者 楊發荷
	 * @郵箱 575814050@qq.com
	 * @時間 2020年10月19日
	 */
	virtual IntsArray processBandMap(int);

	/* @介面 處理的塊的大小
	 * @類名 [RasterProcessBandOperator]
	 * @作者 楊發荷
	 * @郵箱 575814050@qq.com
	 * @時間 2020年10月11日
	 */
	virtual int2 processBlockSize(int, int);

	/* @介面 影像處理之後的大小
	 * @引數 int 原影像寬度
	 * @引數 int 原影像高度
	 * @引數 int2 處理之後的影像大小
	 * @類名 [RasterProcessBandOperator]
	 * @作者 楊發荷
	 * @郵箱 575814050@qq.com
	 * @時間 2020年10月13日
	 */
	virtual int3 saveRasterSize(int, int, int);

	/* @介面 資料處理介面
	 * @引數 cv::Mat 待處理影像資料
	 * @引數 cv::Mat 處理完影像結果
	 * @類名 [RasterProcessBandOperator]
	 * @作者 楊發荷
	 * @郵箱 575814050@qq.com
	 * @時間 2020年10月9日
	 */
	virtual bool rasterProcess(const cv::Mat &, cv::Mat &);

};

END_DOX_NAMESPACE

3.2、波段運算原始檔

BEGIN_DOX_NAMESPACE

RasterProcessBandOperator::RasterProcessBandOperator()
	: IRasterProcess()
{

}

RasterProcessBandOperator::~RasterProcessBandOperator()
{

}

QString RasterProcessBandOperator::processName()
{
	return QS("波段運算");
}

IntsArray RasterProcessBandOperator::processBandMap(int bandCount)
{
	IntsArray bandMaps;	Ints bandMap;
	bandMap << 1 << 2; bandMaps.append(bandMap);
	return bandMaps;
}

int2 RasterProcessBandOperator::processBlockSize(int xSize, int ySize)
{
	return int3(xSize, ySize);
}

bool RasterProcessBandOperator::rasterProcess(const Mat &srcMat, Mat &desMat)
{
	int row = srcMat.rows; int col = srcMat.cols;
	vector<Mat> mats; split(srcMat, mats);
	if(mats.size() != 2) return false;
	desMat = Mat(row, col, CV_MAKE_TYPE(srcMat.depth(), 1));
	for(int _row = 0; _row < row; ++_row)
	{
		for(int _col = 0; _col < col; ++_col)
			desMat.at<double>(_row, _col) = fabs(mats[0].at<double>(_row, _col) - mats[1].at<double>(_row, _col));
	}
	return true;
}

int3 RasterProcessBandOperator::saveRasterSize(int xSize, int ySize, int bSize)
{
	return int3(xSize, ySize, 1);
}

END_DOX_NAMESPACE

4、註冊波段運算類

#ifndef MODULEMACRO_CORE_H
#include "core/modulemacro.h"
#endif /*MODULEMACRO_CORE_H*/

#include "rasterrotate.h"

BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("rastercore")
	XDEFINE_CLASSMAP_ENTRY_NORMAL(RasterProcessBandOperator)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE

5、新增波段運算函式

void bandOperator()
{
	Object<IRasterProcess> iRasterProcess("rastercore.RasterProcessBandOperator");
	Object<IRasterProcessManager> iRaster(NIL); iRaster->rasterProcess(iRasterProcess);
}

6、註冊波段運算命令

void initApplication()
{
	dox::Object<dox::IDoxCommand> cmd(NIL);
	cmd->registerCommand("rastercore", "bandOperator", bandOperator);
}

7、執行波段運算功能

7.1、選擇資料

在這裡插入圖片描述

7.2、選擇儲存的檔案

在這裡插入圖片描述

7.3、瀏覽軟體之後的資料

相關文章