关于openMVG如何调试python代码pipeLine中C++的Filesmain_SfMInit_ImageListing的问题
如果想调试 tutorial_demo.py 或者 SfM_SequentialPipeline.py 和SfM_GlobalPipeline.py 的c++software代码。
例如 tutorial_demo.py (下列代在tutorial_demo.py 中)
路径大概是build\software\SfM\SfM_GlobalPipeline.py
build为cmake处理后的代码文件
print ("1. Intrinsics analysis")
pIntrisics = subprocess.Popen( [os.path.join(OPENMVG_SFM_BIN, "openMVG_main_SfMInit_ImageListing"), "-i", input_dir, "-o", matches_dir, "-d", camera_file_params, "-c", "3"] )
pIntrisics.wait()
你只需要先通过python调试代码并记录 需要的参数 例如该例子
input_dir matches_dir camera_file_params的值
回到vs c++代码中
打开openMVG.sln后 解决方案openmvg 下的openMVG文件夹下的software文件夹中的openMVG_main_SfMInit_ImageListing/Source /Filesmain_SfMInit_ImageListing.cpp
找到main函数
加入如下代码:注意替换argvCommendi argvCommendo argvCommendd 的内容
int main(int argc, char **argv)
{
char** pretendArgv = new char* [sizeof(pretendArgv)];
bool runOrNotThird = true;
if (runOrNotThird) {
char program_name[] = "E:/**/opmvgdate/openmvg/build/Windows-AMD64-/Release/openMVG_main_SfMInit_ImageListing";
char argvCommendi[] = "-iE:\\**\\opmvgdate\\openmvg\\build\\software\\SfM\\ImageDataset_SceauxCastle\\images";
char argvCommendo[] = "-oE:\\**\\opmvgdate\\openmvg\\build\\software\\SfM\\tutorial_out\\matches";
char argvCommendd[] = "-dE:/**/opmvgdate/openmvg/openMVG/src/software/SfM/../../openMVG/exif/sensor_width_database\\sensor_width_camera_database.txt";
char argvCommendc[] = "-c3";
pretendArgv[0] = program_name;
pretendArgv[1] = argvCommendi;
pretendArgv[2] = argvCommendo;
pretendArgv[3] = argvCommendd;
pretendArgv[4] = argvCommendc;
argc = 4; //它在之后会变成1,这一句还是要加上来。
}
};
以及大概在190行左右注释掉这个 并替换为pretendArgv
try {
if (argc == 1) throw std::string("Invalid command line parameter.");
if(runOrNotThird){
cmd.process(argc, pretendArgv);
}
else{
cmd.process(argc, argv);
}
} catch (const std::string& s) {
注意 -i后面直接跟上路径,不要加空格,不然会找不到路径。具体可以自己调试看看后面怎么报错的,folder_exists里面有,去里面断点。
if ( !stlplus::folder_exists( sImageDir ) )
{
OPENMVG_LOG_ERROR << "The input directory doesn't exist";
return EXIT_FAILURE;
}
实际上cmd.process 就做了一个-i与cmd.add( make_option(‘i’, sImageDir, “imageDirectory”) ); 的一个内容匹配检查。 你也可是尝试直接对argv进行赋值修改,对argc进行判断。当然我不推荐。
修改完成后即可模拟命令行参数的传递,方便调试学习代码。其他的需要传递命令行的应该都一样。
注意tutorial_demo.py 调用的为exe文件,与c++代码文件不共用。所以如果想要改pipeLine调用software中的代码而不是exe,等我评论吧,如果我找到方法的话。
实际上也可以删除与cmd相关的代码,然后把main改掉参数。