关于openMVG如何调试python代码pipeLine中C++的Filesmain_SfMInit_ImageListing的问题

关于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改掉参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值