影像处理第二篇之波段运算(软件插件篇)
程序员文章站
2022-04-14 07:50:14
...
影像处理第二篇之波段运算
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
* @邮箱 aaa@qq.com
* @时间 2020年3月14号
*/
RasterProcessBandOperator();
/* @接口 默认构造函数
* @类名 [RasterProcessBandOperator]
* @作者 杨发荷
* @邮箱 aaa@qq.com
* @时间 2020年3月14号
*/
~RasterProcessBandOperator();
/* @接口 数据处理名称
* @类名 [RasterProcessBandOperator]
* @作者 杨发荷
* @邮箱 aaa@qq.com
* @时间 2020年10月11日
*/
virtual QString processName();
/* @接口 处理完之后的波段集合索引
* @类名 [RasterProcessBandOperator]
* @作者 杨发荷
* @邮箱 aaa@qq.com
* @时间 2020年10月19日
*/
virtual IntsArray processBandMap(int);
/* @接口 处理的块的大小
* @类名 [RasterProcessBandOperator]
* @作者 杨发荷
* @邮箱 aaa@qq.com
* @时间 2020年10月11日
*/
virtual int2 processBlockSize(int, int);
/* @接口 影像处理之后的大小
* @参数 int 原图像宽度
* @参数 int 原图像高度
* @参数 int2 处理之后的图像大小
* @类名 [RasterProcessBandOperator]
* @作者 杨发荷
* @邮箱 aaa@qq.com
* @时间 2020年10月13日
*/
virtual int3 saveRasterSize(int, int, int);
/* @接口 数据处理接口
* @参数 cv::Mat 待处理影像数据
* @参数 cv::Mat 处理完影像结果
* @类名 [RasterProcessBandOperator]
* @作者 杨发荷
* @邮箱 aaa@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、浏览软件之后的数据
推荐阅读