From ca6e3819b8ac887102449b558ed06ad06ee8efd7 Mon Sep 17 00:00:00 2001 From: hesuicong Date: Fri, 26 Sep 2025 15:48:14 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 8 +++ apps/TextureMesh/TextureMesh.cpp | 3 +- build/Templates/ConfigEnv.h.in | 7 +++ build/Templates/ConfigLocal.h.in | 3 + libs/MVS/Scene.h | 3 +- libs/MVS/SceneTexture.cpp | 59 +++++++++++++++--- .../mask_face_occlusion.cpython-310.pyc | Bin 16738 -> 16861 bytes libs/MVS/mask_face_occlusion.py | 40 ++++++++---- 8 files changed, 103 insertions(+), 20 deletions(-) create mode 100644 build/Templates/ConfigEnv.h.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 920e4c3..8f11638 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,14 @@ ENDIF() # ${OpenMVS_BINARY_DIR}. PROJECT(OpenMVS) +SET(ENV_PYTHON_PATH "/home/algo/.conda/envs/py310_pyt210/lib/python3.10/site-packages") +SET(ENV_MVS_PATH "/home/algo/Documents/openMVS/openMVS/libs/MVS") + +CONFIGURE_FILE( + "${CMAKE_CURRENT_SOURCE_DIR}/build/Templates/ConfigEnv.h.in" + "${CMAKE_BINARY_DIR}/ConfigEnv.h" +) + SET(OpenMVS_MAJOR_VERSION 2) SET(OpenMVS_MINOR_VERSION 3) SET(OpenMVS_PATCH_VERSION 0) diff --git a/apps/TextureMesh/TextureMesh.cpp b/apps/TextureMesh/TextureMesh.cpp index 9764849..aeeee2c 100644 --- a/apps/TextureMesh/TextureMesh.cpp +++ b/apps/TextureMesh/TextureMesh.cpp @@ -1133,7 +1133,8 @@ int main(int argc, LPCTSTR* argv) TD_TIMER_START(); if (!scene.TextureMesh(OPT::nResolutionLevel, OPT::nMinResolution, OPT::minCommonCameras, OPT::fOutlierThreshold, OPT::fRatioDataSmoothness, OPT::bGlobalSeamLeveling, OPT::bLocalSeamLeveling, OPT::nTextureSizeMultiple, OPT::nRectPackingHeuristic, Pixel8U(OPT::nColEmpty), - OPT::fSharpnessWeight, OPT::nIgnoreMaskLabel, OPT::nMaxTextureSize, views, baseFileName, OPT::bOriginFaceview)) + OPT::fSharpnessWeight, OPT::nIgnoreMaskLabel, OPT::nMaxTextureSize, views, baseFileName, OPT::bOriginFaceview, + OPT::strInputFileName, OPT::strMeshFileName)) return EXIT_FAILURE; VERBOSE("Mesh texturing completed: %u vertices, %u faces (%s)", scene.mesh.vertices.GetSize(), scene.mesh.faces.GetSize(), TD_TIMER_GET_FMT().c_str()); diff --git a/build/Templates/ConfigEnv.h.in b/build/Templates/ConfigEnv.h.in new file mode 100644 index 0000000..ff757be --- /dev/null +++ b/build/Templates/ConfigEnv.h.in @@ -0,0 +1,7 @@ +#pragma once + +#include + +// 从环境变量获取的路径 +const std::string PYTHON_PATH = "@ENV_PYTHON_PATH@"; +const std::string MVS_PATH = "@ENV_MVS_PATH@"; \ No newline at end of file diff --git a/build/Templates/ConfigLocal.h.in b/build/Templates/ConfigLocal.h.in index 39ac292..5d7b2b5 100644 --- a/build/Templates/ConfigLocal.h.in +++ b/build/Templates/ConfigLocal.h.in @@ -1,3 +1,5 @@ +#include + // OpenMVS version #define OpenMVS_MAJOR_VERSION ${OpenMVS_MAJOR_VERSION} #define OpenMVS_MINOR_VERSION ${OpenMVS_MINOR_VERSION} @@ -64,3 +66,4 @@ // SSE support #cmakedefine _USE_SSE + diff --git a/libs/MVS/Scene.h b/libs/MVS/Scene.h index f66a1fe..d669eb4 100644 --- a/libs/MVS/Scene.h +++ b/libs/MVS/Scene.h @@ -168,7 +168,8 @@ public: // Mesh texturing bool TextureMesh(unsigned nResolutionLevel, unsigned nMinResolution, unsigned minCommonCameras=0, float fOutlierThreshold=0.f, float fRatioDataSmoothness=0.3f, bool bGlobalSeamLeveling=true, bool bLocalSeamLeveling=true, unsigned nTextureSizeMultiple=0, unsigned nRectPackingHeuristic=3, Pixel8U colEmpty=Pixel8U(255,127,39), - float fSharpnessWeight=0.5f, int ignoreMaskLabel=-1, int maxTextureSize=0, const IIndexArr& views=IIndexArr(), const SEACAVE::String& basename = "", bool bOriginFaceview = false); + float fSharpnessWeight=0.5f, int ignoreMaskLabel=-1, int maxTextureSize=0, const IIndexArr& views=IIndexArr(), const SEACAVE::String& basename = "", bool bOriginFaceview = false, + const std::string& inputFileName = "", const std::string& meshFileName = ""); bool is_face_visible(const std::string& image_name, int face_index); bool is_face_visible_relative(int face_index); diff --git a/libs/MVS/SceneTexture.cpp b/libs/MVS/SceneTexture.cpp index 2953b52..195531f 100644 --- a/libs/MVS/SceneTexture.cpp +++ b/libs/MVS/SceneTexture.cpp @@ -39,6 +39,8 @@ #include #include +#include "ConfigEnv.h" + namespace py = pybind11; using namespace MVS; @@ -8598,7 +8600,8 @@ bool Scene::LoadVisibleFacesData(std::map>& // - nIgnoreMaskLabel: label value to ignore in the image mask, stored in the MVS scene or next to each image with '.mask.png' extension (-1 - auto estimate mask for lens distortion, -2 - disabled) bool Scene::TextureMesh(unsigned nResolutionLevel, unsigned nMinResolution, unsigned minCommonCameras, float fOutlierThreshold, float fRatioDataSmoothness, bool bGlobalSeamLeveling, bool bLocalSeamLeveling, unsigned nTextureSizeMultiple, unsigned nRectPackingHeuristic, Pixel8U colEmpty, float fSharpnessWeight, - int nIgnoreMaskLabel, int maxTextureSize, const IIndexArr& views, const SEACAVE::String& baseFileName, bool bOriginFaceview) + int nIgnoreMaskLabel, int maxTextureSize, const IIndexArr& views, const SEACAVE::String& baseFileName, bool bOriginFaceview, + const std::string& inputFileName, const std::string& meshFileName) { if (!bOriginFaceview) { @@ -8624,7 +8627,7 @@ bool Scene::TextureMesh(unsigned nResolutionLevel, unsigned nMinResolution, unsi MeshTexture texture(*this, nResolutionLevel, nMinResolution); - printf("baseFileName=%s\n", baseFileName.c_str()); + // printf("baseFileName=%s\n", baseFileName.c_str()); /* std::filesystem::path path(baseFileName.c_str()); @@ -8668,6 +8671,39 @@ bool Scene::TextureMesh(unsigned nResolutionLevel, unsigned nMinResolution, unsi #ifdef MASK_FACE_OCCLUSION + /* + // 创建遮挡数据 + std::cout << "inputFileName: " << inputFileName << std::endl; + std::cout << "meshFileName: " << meshFileName << std::endl; + try { + py::scoped_interpreter guard{}; // 自动管理解释器生命周期 + py::module_ sys = py::module_::import("sys"); + // 设置命令行参数(模拟Python的argparse) + py::list argv; + argv.append("program_name"); + argv.append("--sparse_dir"); + argv.append(static_cast(inputFileName)); + argv.append("--mesh_path"); + argv.append(static_cast(meshFileName)); + // argv.append("--mask_image"); + // argv.append("63_2"); + sys.attr("argv") = argv; + + py::print(sys.attr("version")); // 打印Python版本 + sys.attr("path").attr("append")("/root/miniconda3/lib/python3.10/site-packages"); + sys.attr("path").attr("append")("/root/code/openMVS/libs/MVS"); + // 调用自定义函数 + py::module_ mymodule = py::module_::import("mask_face_occlusion"); + + // 获取ModelProcessor类 + py::object ModelProcessor = mymodule.attr("ModelProcessor"); + + py::object processor = ModelProcessor(); + py::dict result = processor.attr("process")().cast(); + + printf("result size=%d\n", result.size()); + */ + std::string basePath = ""; size_t lastSlash = baseFileName.find_last_of('/'); size_t secondLastSlash = baseFileName.find_last_of('/', lastSlash - 1); @@ -8693,13 +8729,22 @@ bool Scene::TextureMesh(unsigned nResolutionLevel, unsigned nMinResolution, unsi argv.append("--id"); // argv.append("274658"); // 274658 7613212046 argv.append(id); - // argv.append("--mask_image"); - // argv.append("63_2"); + argv.append("--base_path"); + argv.append(basePath.c_str()); + argv.append("--mesh_path"); + argv.append(meshFileName.c_str()); + argv.append("--sparse_dir"); + argv.append(inputFileName.c_str()); sys.attr("argv") = argv; - + py::print(sys.attr("version")); // 打印Python版本 - sys.attr("path").attr("append")("/home/algo/.conda/envs/py310_pyt210/lib/python3.10/site-packages"); - sys.attr("path").attr("append")("/home/algo/Documents/openMVS/openMVS/libs/MVS"); + + printf("PYTHON_PATH=%s\n", PYTHON_PATH.c_str()); + printf("MVS_PATH=%s\n", MVS_PATH.c_str()); + // sys.attr("path").attr("append")("/home/algo/.conda/envs/py310_pyt210/lib/python3.10/site-packages"); + // sys.attr("path").attr("append")("/home/algo/Documents/openMVS/openMVS/libs/MVS"); + sys.attr("path").attr("append")(PYTHON_PATH.c_str()); + sys.attr("path").attr("append")(MVS_PATH.c_str()); // 调用自定义函数 py::module_ mymodule = py::module_::import("mask_face_occlusion"); diff --git a/libs/MVS/__pycache__/mask_face_occlusion.cpython-310.pyc b/libs/MVS/__pycache__/mask_face_occlusion.cpython-310.pyc index 7e82d042927f55d230c4928e9a27464e3d15abe6..608882b9b3f00c7a572300732f576238d3f732c9 100644 GIT binary patch delta 4340 zcmbuC3v3+48OLvS_ty9FBXNS`2f=o+GHn642oIvATQ z9}f&h4l#G5S7B4_VC0^_ecA-Oh1mh}sk8%^2jW}8z59$rB5iMvGa2H}?vXTi?0wNh zVwdGQ$(-d4#5HMnV>yRoCaB3c?trS<7fU4EoW;q}PIJ+!*Rd+GL65J|U60F%Ut{rp zS88cnhNmLRu;sdrhek3y6-`F`SmH~1rzs8G7tiap<~h{usSCwv?QC&MU*5HniXq+5 zG^R20v|-{()(2;@LZOfr(nBnyRj?`+(L}G&QTH+hATf?+ws`3n*i9<&H z49(ULYEYOo3VT7@5XX(P*9X1GxIV!qG#2nG#`Vd{Ljl{g%MJwW5P2IEFFaXwDB$iO zKe7j-6KsFbGY4l(&h%oF)#E`sEE2)yV1zV}iXFj5aUl5Ad`yjWXQLdJk4Ca&sB6f| z?6R%yZQ>ep)9hKOtpVl$wLqPC)?CQy#UIQESc5oFwz;_^Mr0^!*~v`Sc7|3{19u_8 z)C+$vdziINxzgflZA&FfmX09OHI#O}R5p|A?h`MCx3tVhrwa)27_X;`40}9n4fhW@ zE?A=IO=q(P@pv=~x51u~1+BWwsuTHg1oH`DQe@0=N>m z3h;x#+5ubxTuq?KsA28IjcdipisstSz)S&s1X;$NOm>fBb4RpPHdRgQ9JMv#cx4T{ zU*sxZi%u!TTgBy7Z4D)^(cOETR6Eal8OwX6a9`CQ*;cgZ<*n!o%5p}C&*Zydhk&B6 zken|i$g)0KSg)g9nggz9rLN~V5hVQanU}CmQD5CaGOes$J|hQb!=p~6zPCNamx_G# z6Q$#?6Zg-mW4|u!n6;cGFq{+gr{60*z5ZhBzLJ~h9>16nH+{iAFOJS$P<0`0Pn)NB zYjzzwT?n6bH_I30z_j?+(byOe-|bk=iWCdg9<;pPGF4rNiAyU(Q8EeeF&)Iw=3qgejhy zeqw#Yn{O=N(i5-ZOQ_agfqk%UARtBVaVX*0Tq$xd?gcH*tud)*tWoa4bB{PsAMa87 z>Nb>bhgT#$Ob2GzO{ZKLN@x0$ZhD`?_oMzsAP?LGOaKSOU+OP4?}K^2Sl`eySHQdz zn5H+1V}z!{WJ86K{}!3?8D|^i^@e#luF|0>{$AHIy?*dN{WN`0*!<~4G zzerP4;!nckdw@R;WSEc51NROCM}Y4G1@YOYbJzU<=2O7afIn4O&j8N?KLm~fKLUOX zJO?}vY!}Zpoy}elzisN7eMWV}bqkxc_Nxn*&D&w*C#i|Qr}-hYR-2N;dI0z~pibh0 zu&@`l$8}oN^sv%N22QA9~{U=B+E@-O0@)*LY=vxuqx>i6>jmINR7Gtk=M5w|JrErJ5^hglkua6j zu5F|xna7?M6APbV4;5C&J6RqlG_IfgkbeG}_|nJx0S=%zL7*I0S}z`3T*nrR7Z>-IPbKtt1#b|IiLUYi)wpQwh6Ci{l0e*c|@SUiH$9SuMfZs#Q z_kj<9)4+$o2_Qg8oHL-P;W{;dn^2A8=!<*QD0_t%1PZ)8-`SYUN zannBn;*s;4uKESaKLs!^8O@G(xe-r&2dRA{!+loDNjf$qz+G?)Vq6ALdJg;?Z#5l^a< z?^DjC_ub-NDXLHuVQRBUW7x_#`@(qlfVD;%D>{=a#aFtT^EC)Ohaio?EIskgLfJss z++z)mIIaw*s0p_y_ZRzr8F$)-uETuQA$uDk)Xq8vOJ(IswWzYpkL5~JB`TM* z_r$U_*KT_Q9jbRDjF0a`yBZ28tCY0#A>+{AQ3{txTA9pP?)AxRDm66XrnAGxb$TuA z7Qb7w%nZ?&;!Iu4>^|D9#!lUuFE*yK-Ts%kxD}Mz+)5`1AYel5*PPo{g2q6gCcwkwT~2>@DIpY~58gzmSyZfDH&Z18tgZ|Wk7ROV ze3{s_w#CF!(>K*u*KTGp@!Hx2E3U*1gyGB3A7*@puJB<>ACx0QPB%FO+&0m1K|B=5 Lhh|hT|LXhTH delta 4299 zcmb`KdvIJ;9mn_Fd-uIf(r(jAnwBArgI z-82a)fu=M30p;QGfzsL(D^LLi*V0-X21IdC$Kel{!Q-F|QwCynM3jfhh`;Z-G#ge# zoN;IJ$?u%=JFnmGcYf#G7bn=u`&eCZ)~r~7e!o2N+(6*IN9s&1W>9ex{kel;L|ZUE zsUHdK)yA|zV=Ry{tN<}+kvwSJ9XO;>DMWJU?tm3krLY$nj84X=E_{T!-Co>6dlA{i;aJ;JOh&l9yXfxpUB=amnrNdD-Ox0qvCuyw@rV}E>sXyu#~PUNo_N~mzWiBIp)CYxi|mlL zmw9YZo7Be`Z7=B=mNv%DZq5siu?fZkUT82p7#U-hZW#wO7>~>p^@3JV^adAh3VE?H zeS%GBq**tnPu3p^SYa!&KVU^k8>Wp;HXI4KUnD(}2jdfLZ;-~EJvqlqOeV*IR!kfY zE)T}ZlnL=naB(7@=61<+cxNd$B3=tVx)j?Ye(jRW0$oq!ldUCQVHHb|76tTj#=o>*)Cs+who|89E^1| zccMLHmP&TPl0nC_^KL56=R;wGcqO)R?)3Z|+vOJ!`ox-emMs#8w zI4pb%uoc(__+vx*Ja8581p@6+t@dhETqFAGm!ESP#A^YQAj90w7l&+%Ung#@UlO0O zCULU9ncXU$uYVyvZ8N@HoNVZ9o}q;?;=70JY!@$jdDDBmqRl?dE=P|(z8urQ)|?Si zb9fGN1gM%CPT=hX8Qw{*_PV=dXu$Q%>@MDorZ&-){47h08f7sRiN`*xXLF`p)oIkH%xbcL0AI$Swc2 z57a#XJP14ld{>-Wa^7{{gZMD;2;grO()WQ1@B`pD@F;KsI0^g^xPl;~C1=>qWp>#k zGC^MO?BR@Mm%IUfN~~|`ZTe4ElMBU7sb;O~(#naJtBmoxX(&Is`9Tb=!U2K84*}l< z)Nwov2|=-q?kYX+6qFHVFk37aJpL23Dy#k!(j+03{21;S|DXK9AH(2ku1he(fAtI0 zYr_k5({2f$^-FR^+xY*-FR}NX;aJ1`aZGj!c!D6~%0U@U*M`lXMD>l3#7RsPAZEt)i`?uYWqzr|Q%SWh86nGk9as3h83C zIscgR_{Vi0%_xKZ5m9FLZ7qJ+(a4sHH#<(Yqavm89;{CtyBTWe99`RQ7wEF(J*&kF zoqY8x&^M%(E%L?a^BnLzD%pqi=S!$*jYc{xVt;y7WT~&&DV|85qh5G3yg$n=axa5O zacY(D@K({%b>((-kDjI) z|CZei=?>sLK&5?z1z!bBJB4pRar!DyfhKjcFv17Wu!BG|%ooph^|icA1sS1B-li8* z?(8XW@+O^vF=+1<7k76qz=$$geZ}PL%npa%1|_~-+}2&FjkhzT-cxBRJs9WQf20&C|0kWUr|vSJIlEo4)0Fix*MT0q&BCrpK`-&RMrEyd1P`Ar$=Vy z?1MCeuM6LO%1bH=_@zQ5n;#Z(~G4Pz2wR*`l&p`Y!fPKk$vFw$~UZ!NyJ*MIzs^Y=6 zC{(sXEx-uxL8>{Nv;26^77Jdn%-4&XSD#{Q#l|&#jEg(hIKo)FFC06l)5l0$99X-! z4-w$MF>$?3y-P`z9?8`RsqVeH_303kM#0S6qfsZ{pMkVauyxA^lNfR?K^lWax*+GE zY@i$(GIM3yl~GDzHa9blRh>zF@|k&eMgTWrlj``L!4T6~+fUf_bgb@J*T~)y_pZD4 zb1!22$k~PPtI=T&^_LCGa`g3MQ)nmy)>y1QlQ-R6nPN7ZE4xmy@R&|tNvp-So=<6W zLgJR5Q$1=4>o8&~MvPuOoTV2AsY;!08A_G7IV7`de8E?c_M5tx=>2p(%uMOxb*|w!87!3Zr4hbT{APV?2wtR*uE>T