代码之家  ›  专栏  ›  技术社区  ›  Ivan

如何构建cv2绑定

  •  0
  • Ivan  · 技术社区  · 4 年前

    我遵循了 opencv doc 用于创建自己的绑定。

    我运行文件 gen2.py 生成了一些头文件:

    ./
    ../
    pyopencv_generated_enums.h
    pyopencv_generated_funcs.h
    pyopencv_generated_include.h
    pyopencv_generated_modules_content.h
    pyopencv_generated_modules.h
    pyopencv_generated_types_content.h
    pyopencv_generated_types.h
    pyopencv_signatures.json
    

    我应该如何构建它? 我试着跑步 cmake CMakeLists.txt 直接在 /opencv/modules/python 但是没有找到一些定义。

    我试着重建跑步 cmake CMakeLists.txt 在里面 /opencv/ ,我得到了:

      FATAL: In-source builds are not allowed.
    
             You should create a separate directory for build files.
    
    

    我认为这两种方法都是错误的,但我还没有找到任何文档来解释如何使用生成的头进行构建。

    我正在使用 opencv 4.5.5 我克隆并构建了它。

    编辑

    我在中发现了这个 /source/opencv/modules/python/bindings/CMakeLists.txt :

    string(REPLACE ";" "\n" opencv_hdrs_ "${opencv_hdrs}")
    file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/headers.txt" "${opencv_hdrs_}")
    add_custom_command(
        OUTPUT ${cv2_generated_files}
        COMMAND "${PYTHON_DEFAULT_EXECUTABLE}" "${PYTHON_SOURCE_DIR}/src2/gen2.py" "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/headers.txt"
        DEPENDS "${PYTHON_SOURCE_DIR}/src2/gen2.py"
                "${PYTHON_SOURCE_DIR}/src2/hdr_parser.py"
                # not a real build dependency (file(WRITE) result): ${CMAKE_CURRENT_BINARY_DIR}/headers.txt
                ${opencv_hdrs}
        COMMENT "Generate files for Python bindings and documentation"
    )
    

    我想我必须在中添加标题的路径 ${CMAKE_CURRENT_BINARY_DIR}/headers.txt 只是不知道如何获得 CMAKE_CURRENT_BINARY_DIR

    编辑2

    按照@berak的提议,我试着 CMAKE_EXTRA_MODULES_PATH=my/path 这似乎让我非常接近我需要的东西。

    它编译我的源代码并生成 .so 文件为 libopencv_xxx.so 并将它们保存在我的 /usr/local/lib

    (运行时 nm 在上面我看到了我的类和方法)

    但是!当我 import cv2 在一个我无法加载模块的脚本中。 我试过了 print(cv2.__dict__) grep 有,但它不在那里。

    关于如何将编译后的模块添加到我的python opencv安装中,有什么线索吗?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Ivan    4 年前

    关于如何创建绑定的文档不多(至少我只找到了 this ,这很有帮助,但没有提供所有信息)。

    首先,您的模块 必须 使用以下树结构(我使用cmake完成了所有操作):

    .
    src
    └── modules
        └── your_module
            ├── CMakeLists.txt
            ├── include
            │   └── opencv2
            │       └── your_module_bind_lib.hpp
            └── src
                └── your_module_bind_lib.cpp
    

    我的一个例子 CMakeLists.txt (当然,这可能会根据您的项目而改变):

    set(the_description "yourModule LIB")
    ocv_define_module(your_module opencv_imgproc WRAP python)
    include_directories(${OpenCV_INCLUDE_DIRS})
    

    然后我用克隆了OpenCV

    git clone https://github.com/opencv/opencv.git
    

    制作生成文件夹

    mkdir wherever/build
    

    并运行以下命令 cmake

    cd wherever/build
    cmake -DOPENCV_EXTRA_MODULES_PATH=/project_from_previous_tree/src/modules/ -D BUILD_EXAMPLES=OFF -D BUILD_opencv_apps=OFF -D BUILD_DOCS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -D CMAKE_INSTALL_PREFIX=/usr/local/  your_opencv_location/opencv/
    make -j8
    make install
    

    在这个命令中,唯一“特别”的是 DOPENCV_EXTRA_MODULES_PATH (感谢@berak的创意)。

    然后呢?python级别会发生什么?

    确保您的python安装实际指向已构建的opencv,或者使用以下内容:

    import sys
    sys.path.append('/usr/local/lib/python3.8/site-packages/cv2/python-3.8')
    import cv2
    

    哪里 /usr/local/lib/python3.8/site-packages/cv2/python-3.8' 是生成的 .so 位于我的电脑中。

    有了这个,你就可以使用

    cv2.my_cpp_function()
    cv2.my_cpp_class.some_method()
    ...
    

    哪里 my_cpp stuff是在模块项目中声明和定义的 doc 并且可以“轻松”将OpenCV类型的对象作为参数。

    等等,现在你可以在python中使用你的c++函数了。

    请注意,此解决方案不起作用 任何 修改从Git克隆的opencv目录。

        2
  •  0
  •   berak    4 年前

    您不应该手动运行gen2.py,cmake会在某个阶段在内部为您执行此操作。

    因为你似乎在使用linux follow the build steps here ,这也将生成python绑定,其要点是:

    • 制作一个特殊的“构建文件夹”并将cd放入其中(不要试图在src文件夹中构建,你永远无法清理任何东西)

    • cmake <some args> path_to_src_folder (或者更好的是-cmake-gui),检查 python3 显示在输出的“待构建”部分

    • make install

    推荐文章