OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
解包裹二维相位图

目标

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

代码

/*M///////////////////////////////////////////////////////////////////////////////////////
//
// 重要提示:在下载、复制、安装或使用之前请阅读。
//
// 通过下载、复制、安装或使用本软件,您同意此许可协议。
// 如果您不同意此许可协议,请勿下载、安装、
// 复制或使用本软件。
//
//
// 许可协议
// 适用于开源计算机视觉库
//
// 版权所有 (C) 2015, OpenCV Foundation, 保留所有权利。
// 第三方版权是其各自所有者的财产。
//
// 允许以源代码和二进制形式进行再分发和使用,无论是否进行修改,
// 前提是满足以下条件
//
// * 源代码的再分发必须保留上述版权声明,
// 本条件列表和以下免责声明。
//
// * 二进制形式的再分发必须在随发行版提供的文档
// 和/或其他材料中复制上述版权声明、
// 本条件列表和以下免责声明。
//
// * 未经事先书面许可,不得使用版权持有者的姓名来认可或推广
// 衍生自本软件的产品。
//
// 本软件由版权持有者和贡献者“按原样”提供,并且
// 不提供任何明示或暗示的保证,包括但不限于暗示的
// 适销性和特定用途适用性的保证。
// 在任何情况下,英特尔公司或贡献者均不对任何直接、
// 间接、附带、特殊、惩戒性或后果性损害承担责任
// (包括但不限于采购替代商品或服务;
// 使用、数据或利润损失;或业务中断),无论如何造成
// 以及基于任何责任理论,无论是在合同、严格责任、
// 或侵权行为(包括疏忽或其他),以任何方式引起的
// 使用本软件,即使已被告知可能发生此类损害。
* //
//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;
}
如果数组没有元素,则返回 true。
int64_t int64
XML/YAML/JSON 文件存储类,封装了写入或读取所需的所有信息...
定义 persistence.hpp:261
n 维密集数组类
定义 mat.hpp:830
int cols
定义 mat.hpp:2165
int rows
行数和列数,或者当矩阵具有超过 2 个维度时为 (-1, -1)
定义 mat.hpp:2165
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
Definition cvstd_wrapper.hpp:23
CV_8U
#define CV_8U
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
定义 core.hpp:107
STL 命名空间。
phaseUnwrapping 构造函数的参数。
Definition histogramphaseunwrapping.hpp:79

说明

要使用此示例,包裹相位图值应作为 CV_32FC1 Mat 存储在 yml 文件中,名称为“phaseValues”。数据的路径和保存解包相位图的名称必须在命令行中设置。结果以浮点精度保存在 yml 文件中,并以 8 位图像保存以用于可视化目的。

用户可以选择一些参数

  • histThresh 是一个用于将直方图分成两部分的参数。histThresh 之前的 bin 小于 histThresh 之后的 bin。(默认值为 3*pi*pi)。
  • nbrOfSmallBins 是 0 和 histThresh 之间的 bin 数。(默认值为 10)。
  • nbrOfLargeBins 是 histThresh 和 32*pi*pi 之间的 bin 数。(默认值为 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);