#include <vector>
#include <iostream>
#include <fstream>
static const char* keys =
"{@width | | 投影仪宽度}"
"{@height | | 投影仪高度}"
{
"{@periods | | 周期数}"
"{@setMarkers | | 带或不带标记的模式}"
"{@horizontal | | 模式是水平的}"
"{@methodId | | 要使用的方法}"
"{@outputPatternPath | | 保存模式的路径}"
"{@outputWrappedPhasePath | | 保存包裹相位图的路径}"
"{@outputUnwrappedPhasePath | | 保存解包裹相位图的路径}"
"{@outputCapturePath | | 保存捕获图像的路径}"
"{@reliabilitiesPath | | 保存可靠性的路径}"
static void help()
cout << "\n此示例生成正弦模式" << endl;
};
cout << "调用方法:./example_structured_light_createsinuspattern <宽度> <高度>"
{
" <周期数> <设置标记>(布尔) <水平模式>(布尔) <方法ID>"
" <捕获输出路径> <模式输出路径>(可选) <包裹相位图输出路径> (可选)"
" <解包裹相位图输出路径>" << endl;
int main(int argc, char **argv)
if( argc < 2 )
}
{
{
help();
return -1;
}
// 从命令行检索参数
params.height = parser.get<int>(1);
params.nbrOfPeriods = parser.get<int>(2);
params.setMarkers = parser.get<bool>(3);
params.horizontal = parser.get<bool>(4);
params.methodId = parser.get<int>(5);
params.shiftValue =
static_cast<float>(2 *
CV_PI / 3);
params.nbrOfPixelsBetweenMarkers = 70;
structured_light::SinusoidalPattern::create(makePtr<structured_light::SinusoidalPattern::Params>(params));
vector<Mat> patterns;
Mat unwrappedPhaseMap, unwrappedPhaseMap8;
Mat wrappedPhaseMap, wrappedPhaseMap8;
// 生成正弦模式
sinus->generate(patterns);
if( !cap.isOpened() )
cout << "无法打开相机" << endl;
cap.set(CAP_PROP_PVAPI_PIXELFORMAT, CAP_PVAPI_PIXELFORMAT_MONO8);
{
return -1;
}
imshow(
"pattern", patterns[0]);
cout << "准备就绪后按任意键" << endl;
int nbrOfImages = 30;
int count = 0;
vector<Mat> img(nbrOfImages);
while( count < nbrOfImages )
for(int i = 0; i < (int)patterns.size(); ++i )
imshow(
"pattern", patterns[i]);
{
cap >> img[count];
{
count += 1;
cout << "准备就绪后按回车键" << endl;
bool loop = true;
}
}
while ( loop )
if( c == 10 )
{
case structured_light::FTP
{
loop = false;
}
}
for( int i = 0; i < nbrOfImages; ++i )
{
/*我们需要三张图像来计算阴影掩模,如参考文献中所述
* 即使相位图仅由一个模式计算得出
{
captures.push_back(img[i]);
captures.push_back(img[i-1]);
{
captures.push_back(img[i+1]);
else if( i == nbrOfImages - 1 )
captures.push_back(img[i-2]);
}
captures.push_back(img[i+2]);
{
captures.push_back(img[i+1]);
else if( i == nbrOfImages - 1 )
sinus->computePhaseMap(captures, wrappedPhaseMap, shadowMask);
}
else
{
captures.push_back(img[i+1]);
captures.push_back(img[i-2]);
if( camSize.height == -1 )
}
camSize.height = img[i].rows;
camSize.width = img[i].cols;
{
paramsUnwrapping.
height = camSize.height;
paramsUnwrapping.
width = camSize.width;
phaseUnwrapping =
phase_unwrapping::HistogramPhaseUnwrapping::create(paramsUnwrapping);
sinus->unwrapPhaseMap(wrappedPhaseMap, unwrappedPhaseMap, camSize, shadowMask);
phaseUnwrapping->unwrapPhaseMap(wrappedPhaseMap, unwrappedPhaseMap, shadowMask);
}
Mat reliabilities, reliabilities8;
ostringstream tt;
phaseUnwrapping->getInverseReliabilityMap(reliabilities);
tt << i;
imwrite(reliabilitiesPath + tt.str() +
".png", reliabilities8);
if( !outputUnwrappedPhasePath.empty() )
ostringstream name;
name << i;
{
imwrite(outputUnwrappedPhasePath +
"_FTP_" + name.str() +
".png", unwrappedPhaseMap8);
if( !outputWrappedPhasePath.empty() )
imwrite(outputWrappedPhasePath +
"_FTP_" + name.str() +
".png", wrappedPhaseMap8);
}
case structured_light::PSP
{
imwrite(outputUnwrappedPhasePath +
"_FTP_" + name.str() +
".png", unwrappedPhaseMap8);
if( !outputWrappedPhasePath.empty() )
case structured_light::FAPS
}
}
break;
for( int i = 0; i < nbrOfImages - 2; ++i )
if(
params.methodId == structured_light::PSP )
imwrite(outputUnwrappedPhasePath +
"_PSP_" + name.str() +
".png", unwrappedPhaseMap8);
{
captures.push_back(img[i]);
captures.push_back(img[i+1]);
captures.push_back(img[i-2]);
if( camSize.height == -1 )
camSize.height = img[i].rows;
camSize.width = img[i].cols;
{
paramsUnwrapping.
height = camSize.height;
paramsUnwrapping.
width = camSize.width;
phaseUnwrapping =
phase_unwrapping::HistogramPhaseUnwrapping::create(paramsUnwrapping);
sinus->unwrapPhaseMap(wrappedPhaseMap, unwrappedPhaseMap, camSize, shadowMask);
phaseUnwrapping->unwrapPhaseMap(wrappedPhaseMap, unwrappedPhaseMap, shadowMask);
}
Mat reliabilities, reliabilities8;
if( !outputUnwrappedPhasePath.empty() )
ostringstream name;
ostringstream tt;
phaseUnwrapping->getInverseReliabilityMap(reliabilities);
tt << i;
imwrite(reliabilitiesPath + tt.str() +
".png", reliabilities8);
name << i;
{
imwrite(outputUnwrappedPhasePath +
"_FTP_" + name.str() +
".png", unwrappedPhaseMap8);
if( !outputWrappedPhasePath.empty() )
imwrite(outputUnwrappedPhasePath +
"_FAPS_" + name.str() +
".png", unwrappedPhaseMap8);
imwrite(outputWrappedPhasePath +
"_PSP_" + name.str() +
".png", wrappedPhaseMap8);
else
imwrite(outputWrappedPhasePath +
"_FAPS_" + name.str() +
".png", wrappedPhaseMap8);
}
case structured_light::PSP
{
imwrite(outputUnwrappedPhasePath +
"_FTP_" + name.str() +
".png", unwrappedPhaseMap8);
if( !outputWrappedPhasePath.empty() )
imwrite(outputUnwrappedPhasePath +
"_FAPS_" + name.str() +
".png", unwrappedPhaseMap8);
if( !outputCapturePath.empty() )
else
imwrite(outputCapturePath +
"_PSP_" + name.str() +
".png", img[i]);
}
imwrite(outputCapturePath +
"_FAPS_" + name.str() +
".png", img[i]);
{
imwrite(outputUnwrappedPhasePath +
"_FTP_" + name.str() +
".png", unwrappedPhaseMap8);
if( !outputWrappedPhasePath.empty() )
imwrite(outputUnwrappedPhasePath +
"_FAPS_" + name.str() +
".png", unwrappedPhaseMap8);
if( i == nbrOfImages - 3 )
else
ostringstream nameBis;
nameBis << i+1;
{
imwrite(outputUnwrappedPhasePath +
"_FAPS_" + name.str() +
".png", unwrappedPhaseMap8);
{
ostringstream nameTer;
nameTer << i+2;
imwrite(outputCapturePath +
"_PSP_" + nameBis.str() +
".png", img[i+1]);
imwrite(outputCapturePath +
"_PSP_" + nameTer.str() +
".png", img[i+2]);
imwrite(outputCapturePath +
"_FAPS_" + nameBis.str() +
".png", img[i+1]);
imwrite(outputCapturePath +
"_FAPS_" + nameTer.str() +
".png", img[i+2]);
}
else
{
ostringstream nameTer;
nameTer << i+2;
imwrite(outputCapturePath +
"_PSP_" + nameBis.str() +
".png", img[i+1]);
imwrite(outputCapturePath +
"_PSP_" + nameTer.str() +
".png", img[i+2]);
cout << "错误" << endl;
cout << "完成" << endl;
}
}
}
}
break;
default:
if( !outputPatternPath.empty() )
}
for( int i = 0; i < 3; ++ i )
name << i + 1;
{
imwrite(outputPatternPath + name.str() +
".png", patterns[i]);
{
imwrite(outputUnwrappedPhasePath +
"_FTP_" + name.str() +
".png", unwrappedPhaseMap8);
loop = true;
}
}
void convertTo(OutputArray m, int rtype, double alpha=1, double beta=0) const
while( loop )
{
用于从视频文件、图像序列或相机捕获视频的类。
if( key == 27 )
{
loop = false;
}
}
return 0;
}
如果数组没有元素,则返回 true。
int64_t int64
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
使用可选缩放将数组转换为另一种数据类型。
用于指定图像或矩形大小的模板类。
Definition types.hpp:335
cv::setWindowProperty
Definition videoio.hpp:772
std::string String
定义 cvstd.hpp:151
std::shared_ptr< _Tp > Ptr
Definition cvstd_wrapper.hpp:23
#define CV_PI
定义 cvdef.h:380
void imshow(const String &winname, InputArray mat)
在指定窗口中显示图像。
int waitKey(int delay=0)
等待按键按下。
void setWindowProperty(const String &winname, int prop_id, double prop_value)
创建窗口。
PyParams params(const std::string &tag, const std::string &model, const std::string &weights, const std::string &device)
动态更改窗口参数。
cv::phase_unwrapping::HistogramPhaseUnwrapping::Params::width
将图像保存到指定文件。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
phaseUnwrapping 构造函数的参数。
Definition histogramphaseunwrapping.hpp:79
cv::phase_unwrapping::HistogramPhaseUnwrapping::Params::height
int height
SinusoidalPattern 构造函数的参数。
定义 sinusoidalpattern.hpp:83
首先,必须生成正弦模式。用户需要设置 SinusoidalPattern 类的参数:
对于 PSP 和 FAPS,使用三张投射图像来计算单个相位图。这三张图像设置在“captures”中,这是一个作为 FIFO 工作的向量。同样,相位图被转换为 8 位图像,以便将其保存为 png 格式。
if( params.methodId == structured_light::PSP )
{
/*我们需要三张图像来计算阴影掩模,如参考文献中所述
* 即使相位图仅由一个模式计算得出
{
captures.push_back(img[i]);
captures.push_back(img[i-1]);
{
captures.push_back(img[i+1]);
else if( i == nbrOfImages - 1 )
captures.push_back(img[i-2]);
}
captures.push_back(img[i+2]);
{
captures.push_back(img[i+1]);
else if( i == nbrOfImages - 1 )
sinus->computePhaseMap(captures, wrappedPhaseMap, shadowMask);
}
else
{
captures.push_back(img[i+1]);
captures.push_back(img[i-2]);
if( camSize.height == -1 )
}
camSize.height = img[i].rows;
camSize.width = img[i].cols;
{
paramsUnwrapping.
height = camSize.height;
paramsUnwrapping.
width = camSize.width;
}
Mat reliabilities, reliabilities8;
if( !outputUnwrappedPhasePath.empty() )
ostringstream name;
name << i;
{
imwrite(outputUnwrappedPhasePath +
"_FTP_" + name.str() +
".png", unwrappedPhaseMap8);
if( !outputWrappedPhasePath.empty() )
imwrite(outputWrappedPhasePath +
"_FTP_" + name.str() +
".png", wrappedPhaseMap8);
}
case structured_light::PSP
{
imwrite(outputUnwrappedPhasePath +
"_FTP_" + name.str() +
".png", unwrappedPhaseMap8);
if( !outputWrappedPhasePath.empty() )
case structured_light::FAPS
}
}
break;
for( int i = 0; i < nbrOfImages - 2; ++i )
if(
params.methodId == structured_light::PSP )
imwrite(outputUnwrappedPhasePath +
"_PSP_" + name.str() +
".png", unwrappedPhaseMap8);
{
captures.push_back(img[i]);
captures.push_back(img[i+1]);
captures.push_back(img[i-2]);
if( camSize.height == -1 )
camSize.height = img[i].rows;
camSize.width = img[i].cols;
{
paramsUnwrapping.
height = camSize.height;
paramsUnwrapping.
width = camSize.width;
}
Mat reliabilities, reliabilities8;
if( !outputUnwrappedPhasePath.empty() )
ostringstream name;
name << i;
{
imwrite(outputUnwrappedPhasePath +
"_FTP_" + name.str() +
".png", unwrappedPhaseMap8);
if( !outputWrappedPhasePath.empty() )
imwrite(outputUnwrappedPhasePath + "_FAPS_" + name.str() + ".png", unwrappedPhaseMap8);
imwrite(outputWrappedPhasePath + "_PSP_" + name.str() + ".png", wrappedPhaseMap8);
else
imwrite(outputWrappedPhasePath + "_FAPS_" + name.str() + ".png", wrappedPhaseMap8);
}
case structured_light::PSP
{
imwrite(outputUnwrappedPhasePath +
"_FTP_" + name.str() +
".png", unwrappedPhaseMap8);
if( !outputWrappedPhasePath.empty() )
imwrite(outputUnwrappedPhasePath + "_FAPS_" + name.str() + ".png", unwrappedPhaseMap8);
生成于 2025 年 7 月 3 日 12:14:36,由
1.12.0 为 OpenCV 生成
else
imwrite(outputWrappedPhasePath + "_FAPS_" + name.str() + ".png", wrappedPhaseMap8);
}
}
break;