OpenCV  4.10.0
开源计算机视觉
加载...
搜索...
无匹配项
展开二维相位图

目标

在本教程中,您将学习如何使用相位展开模块来展开二维相位图。实现基于[156]

代码

/*M///////////////////////////////////////////////////////////////////////////////////////
//
// 重要信息:在下载、复制、安装或使用之前阅读。
//
// 下载、复制、安装或使用本软件即表示您同意本许可证。
// 如果您不同意本许可证,请不要下载、安装、
// 复制或使用本软件。
//
//
// 许可协议
// 对于开源计算机视觉库
//
// 版权所有(C)2015 年,OpenCV 基金会,保留所有权利。
// 第三方版权归其各自所有者所有。
//
// 重新分配和以源代码和二进制形式使用,无论是否修改,
// 均允许,前提是满足以下条件
//
// * 源代码重新分配必须保留上述版权声明、
// 此条件列表和以下免责声明。
//
// * 二进制形式重新分配必须在文档
// 和/或随分发提供的其他材料中复制上述版权声明、
// 此条件列表和以下免责声明。
//
// * 未经事先书面许可,不得使用版权持有人的名称来认可或推广产品
// 从本软件派生而来。
//
// 本软件由版权持有者和贡献者按“原样”提供,并且
// 任何明示或暗示的保证,包括但不限于隐含
// 适销性和特定用途适用性的保证均被否认。
// 在任何情况下,英特尔公司或贡献者都不对任何直接、
// 间接的、偶然的、特殊的、典型的或继发性的损害负责
// (包括但不限于采购替代品或服务;
// 使用、数据或利润损失;或业务中断),无论其原因如何
// 在任何责任理论下,无论是在合同中、严格责任中,
// 或侵权(包括过失或其他方式)以任何方式出现
// 使用本软件,即使已告知此类损害的可能性。
* //
//M*/
#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace cv;
using namespace std;
static const char* keys =
{
"{@inputPath | | 包含在 yaml 文件中已保存的包裹相位图的路径}"
"{@outputUnwrappedName | | 将要保存为 yaml 文件和 8 位 png 文件的未包裹相位图的路径}"
};
static void help()
{
cout << "\n此示例演示如何使用 \"相位展开模块\" 展开 yaml 文件中保存的相位图"
" (请参见 extra_data\\phase_unwrapping\\data\\wrappedpeaks.yml)。"
" 文件中的 mat 名称应当是 \"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)
{
CommandLineParser parser(argc, argv, keys);
String inputPath = parser.get<String>(0);
String outputUnwrappedName = parser.get<String>(1);
if( inputPath.empty() || outputUnwrappedName.empty() )
{
help();
return -1;
}
FileStorage fsInput(inputPath, FileStorage::READ);
FileStorage fsOutput(outputUnwrappedName + ".yml", FileStorage::WRITE);
Mat wPhaseMap;
Mat uPhaseMap;
Mat reliabilities;
fsInput["phaseValues"] >> wPhaseMap;
fsInput.release();
params.width = wPhaseMap.cols;
params.height = wPhaseMap.rows;
Ptr<phase_unwrapping::HistogramPhaseUnwrapping> phaseUnwrapping = phase_unwrapping::HistogramPhaseUnwrapping::create(params);
phaseUnwrapping->unwrapPhaseMap(wPhaseMap, uPhaseMap);
fsOutput << "phaseValues" << uPhaseMap;
fsOutput.release();
phaseUnwrapping->getInverseReliabilityMap(reliabilities);
Mat uPhaseMap8, wPhaseMap8, reliabilities8;
wPhaseMap.convertTo(wPhaseMap8, CV_8U, 255, 128);
uPhaseMap.convertTo(uPhaseMap8, CV_8U, 1, 128);
reliabilities.convertTo(reliabilities8, CV_8U, 255,128);
imshow("reliabilities", reliabilities);
imshow("wrapped phase map", wPhaseMap8);
imshow("unwrapped phase map", 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:820
XML/YAML/JSON 文件存储类,封装了用于编写或读取文件所需的所有信息...
定义 persistence.hpp:304
n 维稠密数组类
定义 mat.hpp:812
int cols
定义 mat.hpp:2138
int rows
矩阵维度(行数和列数),当矩阵维度大于 2 时为 (-1, -1)
定义 mat.hpp:2138
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
与磁盘上的文件关联的文件存储的“黑匣子”表示形式。
定义 core.hpp:102
STL 命名空间。
phaseUnwrapping 构造函数的参数。
定义 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)。
CommandLineParser parser(argc, argv, keys);
String inputPath = parser.get<String>(0);
String outputUnwrappedName = parser.get<String>(1);
String outputWrappedName = parser.get<String>(2);
if( inputPath.empty() || outputUnwrappedName.empty() )
{
help();
return -1;
}
FileStorage fsInput(inputPath, FileStorage::READ);
FileStorage fsOutput(outputUnwrappedName + ".yml", FileStorage::WRITE);
Mat wPhaseMap;
Mat uPhaseMap;
Mat reliabilities;
fsInput["phaseValues"] >> wPhaseMap;
fsInput.release();
params.width = wPhaseMap.cols;
params.height = wPhaseMap.rows;
Ptr<phase_unwrapping::HistogramPhaseUnwrapping> phaseUnwrapping = phase_unwrapping::HistogramPhaseUnwrapping::create(params);

对包相位图进行展开并将结果保存到 yml 文件中。我们还可以获取用于可视化目的的可靠性图。对展开相位图和可靠性图进行转换为 8 位图像,以便将其保存为 png 文件中。

phaseUnwrapping->unwrapPhaseMap(wPhaseMap, uPhaseMap);
fsOutput << "phaseValues" << uPhaseMap;
fsOutput.release();
phaseUnwrapping->getInverseReliabilityMap(reliabilities);
Mat uPhaseMap8, wPhaseMap8, reliabilities8;
wPhaseMap.convertTo(wPhaseMap8, CV_8U, 255, 128);
uPhaseMap.convertTo(uPhaseMap8, CV_8U, 1, 128);
reliabilities.convertTo(reliabilities8, CV_8U, 255,128);
imshow("reliabilities", reliabilities);
imshow("wrapped phase map", wPhaseMap8);
imshow("unwrapped phase map", uPhaseMap8);
imwrite(outputUnwrappedName + ".png", uPhaseMap8);
imwrite("reliabilities.png", reliabilities8);