2025-05-13 17:48:58 +00:00
|
|
|
|
#include "GF3CalibrationAndOrthLib.h"
|
2025-05-13 18:56:15 +00:00
|
|
|
|
#include "BaseConstVariable.h"
|
|
|
|
|
#include "RasterToolBase.h"
|
|
|
|
|
#include "ImageOperatorBase.h"
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
#include <QFile>
|
|
|
|
|
#include <memory>
|
|
|
|
|
#include "FileOperator.h"
|
|
|
|
|
#include "GPUBaseTool.h"
|
|
|
|
|
#include "GPUTool.cuh"
|
2025-05-13 17:48:58 +00:00
|
|
|
|
|
2025-05-13 18:56:15 +00:00
|
|
|
|
|
|
|
|
|
GF3CALIBRATIONANDORTHLIB_EXPORT int GF3_Sigma0_HH2VV(QString in_SigmaHHRasterPath, QString in_IncidencAngleRasterPath, QString out_SigmaVVRasterPath)
|
|
|
|
|
{
|
|
|
|
|
// step 1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
// 1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>
|
|
|
|
|
if (in_SigmaHHRasterPath.isEmpty() || in_IncidencAngleRasterPath.isEmpty() || out_SigmaVVRasterPath.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
qDebug() << "Input or output file path is empty.";
|
|
|
|
|
throw std::invalid_argument("Input or output file path is empty.");
|
|
|
|
|
return 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>Ϊ<EFBFBD><CEAA>
|
|
|
|
|
}
|
|
|
|
|
// 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (!QFile::exists(in_SigmaHHRasterPath) || !QFile::exists(in_IncidencAngleRasterPath))
|
|
|
|
|
{
|
|
|
|
|
qDebug() << "Input file does not exist.";
|
|
|
|
|
throw std::runtime_error("Input file does not exist.");
|
|
|
|
|
return 2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
gdalImage inSigmaHHRaster(in_SigmaHHRasterPath);
|
|
|
|
|
gdalImage inIncidencAngleRaster(in_IncidencAngleRasterPath);
|
|
|
|
|
// 3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD>С<EFBFBD>Ƿ<EFBFBD>һ<EFBFBD><D2BB>
|
|
|
|
|
if (inSigmaHHRaster.width != inIncidencAngleRaster.width || inSigmaHHRaster.height != inIncidencAngleRaster.height)
|
|
|
|
|
{
|
|
|
|
|
qDebug() << "Input images have different sizes.";
|
|
|
|
|
throw std::runtime_error("Input images have different sizes.");
|
|
|
|
|
return 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD>С<EFBFBD><D0A1>һ<EFBFBD><D2BB>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
copyFile(in_SigmaHHRasterPath, out_SigmaVVRasterPath);
|
|
|
|
|
// 4. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (!QFile::exists(out_SigmaVVRasterPath))
|
|
|
|
|
{
|
|
|
|
|
qDebug() << "Output file does not exist.";
|
|
|
|
|
throw std::runtime_error("Output file does not exist.");
|
|
|
|
|
return 4; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// step 2 ִ<>в<EFBFBD><D0B2><EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
gdalImage inSigmaHHRaster(in_SigmaHHRasterPath);
|
|
|
|
|
gdalImage inIncidencAngleRaster(in_IncidencAngleRasterPath);
|
|
|
|
|
gdalImage outSigmaVVRaster(out_SigmaVVRasterPath);
|
|
|
|
|
|
|
|
|
|
long width = inSigmaHHRaster.width;
|
|
|
|
|
long height = inSigmaHHRaster.height;
|
|
|
|
|
|
|
|
|
|
int64_t pixel_count64 = static_cast<int64_t>(height) * static_cast<int64_t>(width);
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
std::shared_ptr<double> sigmaHHRasterData = readDataArr<double>(inSigmaHHRaster, 0, 0, height, width, 1, GDALREADARRCOPYMETHOD::VARIABLEMETHOD);
|
|
|
|
|
std::shared_ptr<double> incidenceAngleData = readDataArr<double>(inIncidencAngleRaster, 0, 0, height, width, 1, GDALREADARRCOPYMETHOD::VARIABLEMETHOD);
|
|
|
|
|
std::shared_ptr<double> outSigmaVVRasterData = readDataArr<double>(outSigmaVVRaster, 0, 0, height, width, 1, GDALREADARRCOPYMETHOD::VARIABLEMETHOD);
|
|
|
|
|
|
|
|
|
|
// <20>ֿ<EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
int64_t block_count = Memory1MB / 8 * 500; // 500M<30>ڴ<EFBFBD> <20><>Ϊ<EFBFBD><CEAA><EFBFBD>ݷֿ<DDB7><D6BF><EFBFBD>С
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
//double* sigmaHHRasterDataPtr_H = (double*)mallocCUDAHost(sizeof(double) * block_count); // <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
double* sigmaHHRasterDataPtr_D = (double*)mallocCUDADevice(sizeof(double) * block_count);// <20>豸<EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
//double* incidenceAngleDataPtr_H = (double*)mallocCUDAHost(sizeof(double) * block_count); // <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
double* incidenceAngleDataPtr_D = (double*)mallocCUDADevice(sizeof(double) * block_count);// <20>豸<EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
//double* outSigmaVVRasterDataPtr_H = (double*)mallocCUDAHost(sizeof(double) * block_count); // <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
double* outSigmaVVRasterDataPtr_D = (double*)mallocCUDADevice(sizeof(double) * block_count);// <20>豸<EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
for (int64_t i = 0; i < pixel_count64; i += block_count)
|
|
|
|
|
{
|
|
|
|
|
int64_t block_size = (i + block_count) > pixel_count64 ? pixel_count64 - i : block_count;
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ濽<DAB4><E6BFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڴ浽<DAB4>ֿ<EFBFBD><D6BF>ڴ<EFBFBD>
|
|
|
|
|
HostToDevice(sigmaHHRasterDataPtr_D, sigmaHHRasterData.get() + i, sizeof(double) * block_size);
|
|
|
|
|
HostToDevice(incidenceAngleDataPtr_D, incidenceAngleData.get() + i, sizeof(double) * block_size);
|
|
|
|
|
// ִ<><D6B4>GPU<50><55><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>豸<EFBFBD>ڴ浽<DAB4><E6B5BD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
DeviceToHost(outSigmaVVRasterDataPtr_D, outSigmaVVRasterData.get() + i, sizeof(double) * block_size);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ǿ<><C7BF><EFBFBD>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
FreeCUDADevice(sigmaHHRasterDataPtr_D);
|
|
|
|
|
//FreeCUDAHost(sigmaHHRasterDataPtr_H);
|
|
|
|
|
FreeCUDADevice(incidenceAngleDataPtr_D);
|
|
|
|
|
//FreeCUDAHost(incidenceAngleDataPtr_H);
|
|
|
|
|
FreeCUDADevice(outSigmaVVRasterDataPtr_D);
|
|
|
|
|
//FreeCUDAHost(outSigmaVVRasterDataPtr_H);
|
|
|
|
|
|
|
|
|
|
sigmaHHRasterData.reset();
|
|
|
|
|
incidenceAngleData.reset();
|
|
|
|
|
outSigmaVVRasterData.reset();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return -1;// <20><><EFBFBD><EFBFBD>ִ<EFBFBD>гɹ<D0B3>
|
|
|
|
|
}
|