目标
本教程将学习如何使用相位解包裹模块来解包裹二维相位图。实现基于 [156]。
代码
#include <iostream>
#include <fstream>
#include <stdio.h>
static const char* keys =
{
"{@inputPath | | 保存于 yaml 文件中的包裹相位图的路径 }"
"{@outputUnwrappedName | | 要保存到 yaml 文件和 8 位 png 图像中的解包裹相位图的路径}"
};
static void help()
{
cout << "\n此示例演示如何使用“相位解包裹模块”来解包裹保存在 yaml 文件中的相位图"
" (参见 extra_data\\phase_unwrapping\\data\\wrappedpeaks.yml)。"
" 文件中的矩阵名称应为“phaseValue”。结果也保存在 yaml 文件中"
" 。还会创建两个图像(wrapped.png 和 output_name.png)"
" 用于可视化目的。
"\n调用方法:./example_phase_unwrapping_unwrap <input_path> <output_unwrapped_name> \n"
<< endl;
}
int main(
int argc,
char **argv)
{
if( inputPath.empty() || outputUnwrappedName.empty() )
{
help();
return -1;
}
FileStorage fsOutput(outputUnwrappedName +
".yml", FileStorage::WRITE);
fsInput["phaseValues"] >> wPhaseMap;
params.width = wPhaseMap.
cols;
params.height = wPhaseMap.
rows;
phaseUnwrapping->unwrapPhaseMap(wPhaseMap, uPhaseMap);
fsOutput << "phaseValues" << uPhaseMap;
phaseUnwrapping->getInverseReliabilityMap(reliabilities);
Mat uPhaseMap8, wPhaseMap8, reliabilities8;
uPhaseMap.convertTo(uPhaseMap8,
CV_8U, 1, 128);
imshow("可靠性", reliabilities);
imshow("包裹相位图", wPhaseMap8);
imshow("解包裹相位图", uPhaseMap8);
imwrite(outputUnwrappedName + ".png", uPhaseMap8);
imwrite("reliabilities.png", reliabilities8);
bool loop = true;
while( loop )
{
char key = (char)waitKey(0);
if( key == 27 )
{
loop = false;
}
}
return 0;
}
用于命令行解析。
定义 utility.hpp:890
XML/YAML/JSON 文件存储类,封装了写入或读取…所需的所有信息
定义 persistence.hpp:261
int rows
行和列的数量,当矩阵的维度大于 2 时为 (-1, -1)
定义 mat.hpp:2155
void convertTo(OutputArray m, int rtype, double alpha=1, double beta=0) const
将数组转换为另一种数据类型,并可选缩放。
void release()
递减引用计数器,并在需要时释放矩阵。
std::string String
定义 cvstd.hpp:151
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
#define CV_8U
定义 interface.h:73
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
相位解缠构造函数的参数。
定义 histogramphaseunwrapping.hpp:79
解释
要使用此示例,包裹相位图的值应存储在 yml 文件中,作为 CV_32FC1 Mat 类型,名称为“phaseValues”。数据路径和保存解缠相位图的名称必须在命令行中设置。结果以浮点数精度保存在 yml 文件中,并作为 8 位图像用于可视化。
用户可以选择一些参数
- histThresh 是一个用于将直方图分成两部分的参数。histThresh 之前的箱子小于 histThresh 之后的箱子。(默认值为 3*pi*pi)。
- nbrOfSmallBins 是 0 到 histThresh 之间的箱子数量。(默认值为 10)。
- nbrOfLargeBins 是 histThresh 到 32*pi*pi 之间的箱子数量。(默认值为 5)。
if( inputPath.empty() || outputUnwrappedName.empty() )
{
help();
return -1;
}
FileStorage fsOutput(outputUnwrappedName +
".yml", FileStorage::WRITE);
fsInput["phaseValues"] >> wPhaseMap;
params.width = wPhaseMap.
cols;
params.height = wPhaseMap.
rows;
包裹的相位图被解缠,结果保存在 yml 文件中。我们还可以获得可靠性图以用于可视化。解缠的相位图和可靠性图被转换为 8 位图像以便保存为 png 文件。
phaseUnwrapping->unwrapPhaseMap(wPhaseMap, uPhaseMap);
fsOutput << "phaseValues" << uPhaseMap;
phaseUnwrapping->getInverseReliabilityMap(reliabilities);
Mat uPhaseMap8, wPhaseMap8, reliabilities8;
uPhaseMap.convertTo(uPhaseMap8,
CV_8U, 1, 128);
imshow("可靠性", reliabilities);
imshow("包裹相位图", wPhaseMap8);
imshow("解包裹相位图", uPhaseMap8);
imwrite(outputUnwrappedName + ".png", uPhaseMap8);
imwrite("reliabilities.png", reliabilities8);