This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SK-AM62A-LP:基于 SK-AM62A-LP E3开发板运行 OpenCV 应用时出错

Guru**** 2469940 points
Other Parts Discussed in Thread: SK-AM62A-LP

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1466955/sk-am62a-lp-error-in-running-opencv-application-based-on-sk-am62a-lp-e3-development-board

器件型号:SK-AM62A-LP

工具与软件:

您好!
我们使用刻录在 SK-AM62A-LP E3开发板上的默认 SD 卡映像、
启动并运行开发板。 在 CD/USR/lib 目录中、您可以看到包含 OpenCV4.9的库、如下所示:
这是我们的应用程序、如下所示:
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
using namespace std;
 
int main( )
{
   cv::Mat image = cv::Mat::ones(500, 500, CV_8UC3) * 255; 
   std::string text = "Hello, World!";
   cv::Point position(100, 250);  
   int font = cv::FONT_HERSHEY_SIMPLEX; 
   cv::Scalar color(0, 0, 0);  
   cv::putText(image, text, position, font, 1.5 , color, 2);
   cv::imwrite("./test.jpg", image);
}
它看起来非常全面、但当我们运行 OpenCV 应用时、会遇到以下错误:
 
看来,甚至没有基本的不可写和不可读。 是否是因为电路板上的 OpenCV 不完整并且缺少相关库?
我们是否仍需要配置相关依赖项? 或者、OpenCV 呼叫摄像头和 GStreamer 呼叫摄像头的一些示例在哪里?
TI 电路板上的 OpenCV 是否需要交叉编译并移植到电路板上?或者我们是否仍应使用 Yocto 进行总体编译和配置?
它可以在这个电路板上运行、请帮助查看、非常感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    SDK 中安装的 OpenCV 对于此类示例应该就足够了。 我很想看到您有关该项目的 CMakeLists.txt 文件-您能否分享?

    一个很好的例子是 edgeai-tidl-tools --见例子。 在 osrt_cpp 示例中、您可以看到使用 imwrite 的几个实例:

    这是交叉编译的一个选项、但此处不是必需的。 必要的头文件、库和编译器位于/usr 内的 SDK 中。 Yocto 用于创建 Linux 发行版、因此所有的软件包、工具、库、配置等都不是适合您的用例的工具。  

    您是否使用 edgeai-gst-apps 作为此应用的起点? 我看到目录结构与 APPS_CPP 的相似之处。 该工程(在/opt/edgeai-gst-apps/apps_cpp 下)构建时不会出现任何此类链接问题。

    BR、
    Reese

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、我不知道如何使用 edgeai-gst-apps 作为应用程序的起点。 我可以在哪里参考它?
    我之前测试的工程为 Hello world、可根据以下步骤在电路板上编译和执行:
    1) mkdir 构建
    2) CD 版本
    3) cmake ..
    4)制造
    代码结构如下:

    apps_cpp/文件夹中 CMakeLists.txt 的内容如下:


    apps_cpp/app_edgeai/apps src 目录中的 CMakeLists.txt 内容如下:

    这是我们的 CMakeLists,请看,期待您的答复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="633787" url="~/support/processors-group/processors/f/processors-forum/1466955/sk-am62a-lp-error-in-running-opencv-application-based-on-sk-am62a-lp-e3-development-board/5631024 #5631024"]我不知道如何使用 edgeai-gst-apps 作为应用程序的起点。 我可以在哪里引用它?

    我根据您的目录结构假设、您最初使用的是 edgeai-gst-apps、并且在那里使用的是 common.cmake。 我想我在这里做了一个错误的假设。

    对于一个 Hello world 类型的应用程序、edgeai-gst-apps 可能 过于 复杂。 但是、它有一个 common.cmake 文件可能很有用--它设置了已知有效的库和包含路径。  

    您是否还可以共享 common.cmake? 您共享的 cmake 文件未包含任何正确的库或包含路径、因此我假设它存在于 common.cmake 文件中。  

    我假设您正在针对目标进行编译。 如果内容不正确、请告诉我。

    BR、
    Reese

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、这是我们的 common.cmake 文件;位置如下:

    具体内容如下:

    include(GNUInstallDirs)
    include(CMakePackageConfigHelpers)
    
    add_compile_options(-std=c++17)
    
    option(USE_DLR_RT "Enable DLR inference" ON)
    option(USE_TENSORFLOW_RT "Enable Tensorflow inference" ON)
    option(USE_ONNX_RT "Enable Onnx inference" ON)
    
    # Specific compile optios across all targets
    #add_compile_definitions(MINIMAL_LOGGING)
    
    IF(NOT CMAKE_BUILD_TYPE)
      SET(CMAKE_BUILD_TYPE Release)
    ENDIF()
    
    # Turn off output data dumps for testing by default
    OPTION(EDGEAI_ENABLE_OUTPUT_FOR_TEST "Enable Output Dumps for test" OFF)
    
    # Check if we got an option from command line
    if(EDGEAI_ENABLE_OUTPUT_FOR_TEST)
        message("EDGEAI_ENABLE_OUTPUT_FOR_TEST enabled")
        add_definitions(-DEDGEAI_ENABLE_OUTPUT_FOR_TEST)
    endif()
    
    message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE} PROJECT_NAME = ${PROJECT_NAME}")
    
    SET(CMAKE_FIND_LIBRARY_PREFIXES "" "lib")
    SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib" ".so")
    
    if(NOT CMAKE_OUTPUT_DIR)
        set(CMAKE_OUTPUT_DIR ${CMAKE_SOURCE_DIR})
    endif()
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_OUTPUT_DIR}/lib/${CMAKE_BUILD_TYPE})
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_OUTPUT_DIR}/lib/${CMAKE_BUILD_TYPE})
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_OUTPUT_DIR}/bin/${CMAKE_BUILD_TYPE})
    
    if (NOT DEFINED ENV{SOC})
        message(FATAL_ERROR "SOC not defined.")
    endif()
    
    set(TARGET_SOC_LOWER $ENV{SOC})
    
    if ("${TARGET_SOC_LOWER}" STREQUAL "j721e")
        set(TARGET_PLATFORM     J7)
        set(TARGET_CPU          A72)
        set(TARGET_OS           LINUX)
        set(TARGET_SOC          J721E)
    elseif ("${TARGET_SOC_LOWER}" STREQUAL "j721s2")
        set(TARGET_PLATFORM     J7)
        set(TARGET_CPU          A72)
        set(TARGET_OS           LINUX)
        set(TARGET_SOC          J721S2)
    elseif ("${TARGET_SOC_LOWER}" STREQUAL "j784s4")
        set(TARGET_PLATFORM     J7)
        set(TARGET_CPU          A72)
        set(TARGET_OS           LINUX)
        set(TARGET_SOC          J784S4)
    elseif ("${TARGET_SOC_LOWER}" STREQUAL "j722s")
        set(TARGET_PLATFORM     J7)
        set(TARGET_CPU          A53)
        set(TARGET_OS           LINUX)
        set(TARGET_SOC          J722S)
    elseif ("${TARGET_SOC_LOWER}" STREQUAL "am62a")
        set(TARGET_PLATFORM     SITARA)
        set(TARGET_CPU          A53)
        set(TARGET_OS           LINUX)
        set(TARGET_SOC          AM62A)
    elseif ("${TARGET_SOC_LOWER}" STREQUAL "am62x")
        set(TARGET_PLATFORM     SITARA)
        set(TARGET_CPU          A53)
        set(TARGET_OS           LINUX)
        set(TARGET_SOC          AM62X)
    elseif ("${TARGET_SOC_LOWER}" STREQUAL "am62p")
        set(TARGET_PLATFORM     SITARA)
        set(TARGET_CPU          A53)
        set(TARGET_OS           LINUX)
        set(TARGET_SOC          AM62P)
    else()
        message(FATAL_ERROR "SOC ${TARGET_SOC_LOWER} is not supported.")
    endif()
    
    message("SOC=${TARGET_SOC_LOWER}")
    
    add_definitions(
        -DTARGET_CPU=${TARGET_CPU}
        -DTARGET_OS=${TARGET_OS}
        -DSOC_${TARGET_SOC}
    )
    
    
    set(TENSORFLOW_INSTALL_DIR ${TARGET_FS}/usr/include/tensorflow)
    set(ONNXRT_INSTALL_DIR ${TARGET_FS}/usr/include/onnxruntime)
    set(TFLITE_INSTALL_DIR ${TARGET_FS}/usr/lib/tflite_2.12)
    
    if(USE_DLR_RT)
    add_definitions(-DUSE_DLR_RT)
    endif()
    
    if(USE_TENSORFLOW_RT)
    add_definitions(-DUSE_TENSORFLOW_RT)
    endif()
    
    if(USE_ONNX_RT)
    add_definitions(-DUSE_ONNX_RT)
    endif()
    
    link_directories(${TARGET_FS}/usr/lib/aarch64-linux-gnu
                     ${TARGET_FS}/usr/lib/
                     )
    
    if(USE_DLR_RT)
    link_directories(${TARGET_FS}/usr/lib/python3.12/site-packages/dlr)
    endif()
    
    if(USE_TENSORFLOW_RT)
    link_directories(${TFLITE_INSTALL_DIR}/ruy-build
                     ${TFLITE_INSTALL_DIR}/xnnpack-build
                     ${TFLITE_INSTALL_DIR}/pthreadpool
                     ${TFLITE_INSTALL_DIR}/fft2d-build
                     ${TFLITE_INSTALL_DIR}/cpuinfo-build
                     ${TFLITE_INSTALL_DIR}/flatbuffers-build
                     ${TFLITE_INSTALL_DIR}/abseil-cpp-build
                     ${TFLITE_INSTALL_DIR}/farmhash-build
    )
    endif()
    
    if(USE_ONNX_RT)
    endif()
    
    #message("PROJECT_SOURCE_DIR =" ${PROJECT_SOURCE_DIR})
    #message("CMAKE_SOURCE_DIR =" ${CMAKE_SOURCE_DIR})
    
    include_directories(${PROJECT_SOURCE_DIR}
                        ${PROJECT_SOURCE_DIR}/..
                        ${PROJECT_SOURCE_DIR}/include
                        SYSTEM ${TARGET_FS}/usr/local/include
                        SYSTEM ${TARGET_FS}/usr/include/gstreamer-1.0
                        SYSTEM ${TARGET_FS}/usr/include/glib-2.0
                        SYSTEM ${TARGET_FS}/usr/lib/glib-2.0/include
                        SYSTEM ${TARGET_FS}/usr/lib/aarch64-linux-gnu/glib-2.0/include
                        SYSTEM ${TARGET_FS}/usr/include/opencv4/
                        SYSTEM ${TARGET_FS}/usr/include/processor_sdk/vision_apps
                        SYSTEM ${TARGET_FS}/usr/include/processor_sdk/app_utils
                        SYSTEM ${TARGET_FS}/usr/include/edgeai_dl_inferer
                        )
    
    if(USE_DLR_RT)
    include_directories(${TARGET_FS}/usr/lib/python3.12/site-packages/dlr/include/)
    endif()
    
    if(USE_TENSORFLOW_RT)
    include_directories(SYSTEM ${TENSORFLOW_INSTALL_DIR}
                        SYSTEM ${TENSORFLOW_INSTALL_DIR}/lite/tools/make/downloads/flatbuffers/include
                        )
    endif()
    
    if(USE_ONNX_RT)
    include_directories(SYSTEM ${ONNXRT_INSTALL_DIR}/include/onnxruntime
                        SYSTEM ${ONNXRT_INSTALL_DIR}/include/onnxruntime/core/session
                        )
    endif()
    
    set(COMMON_LINK_LIBS
    ###################################################################################
        #our .so/.a libs file
    ###################################################################################
        )
    
    set(SYSTEM_LINK_LIBS
        ncurses
        tinfo
        gstreamer-1.0
        glib-2.0
        gobject-2.0
        gstapp-1.0
        opencv_core
        opencv_imgproc
        yaml-cpp
        pthread
        dl
        )
    
    if(NOT ${TARGET_SOC} STREQUAL "AM62X" AND NOT ${TARGET_SOC} STREQUAL "AM62P")
    set(SYSTEM_LINK_LIBS ${SYSTEM_LINK_LIBS} tivision_apps)
    endif()
    
    if(USE_DLR_RT)
    set(SYSTEM_LINK_LIBS ${SYSTEM_LINK_LIBS} dlr)
    endif()
    
    if(USE_TENSORFLOW_RT)
    set(SYSTEM_LINK_LIBS ${SYSTEM_LINK_LIBS} tensorflow-lite)
    set(SYSTEM_LINK_LIBS ${SYSTEM_LINK_LIBS}
                         flatbuffers
                         fft2d_fftsg2d
                         fft2d_fftsg
                         cpuinfo
                         farmhash
                         ruy_allocator
                         ruy_apply_multiplier
                         ruy_blocking_counter
                         ruy_block_map
                         ruy_context
                         ruy_context_get_ctx
                         ruy_cpuinfo
                         ruy_ctx
                         ruy_denormal
                         ruy_frontend
                         ruy_have_built_path_for_avx2_fma
                         ruy_have_built_path_for_avx512
                         ruy_have_built_path_for_avx
                         ruy_kernel_arm
                         ruy_kernel_avx2_fma
                         ruy_kernel_avx512
                         ruy_kernel_avx
                         ruy_pack_arm
                         ruy_pack_avx2_fma
                         ruy_pack_avx512
                         ruy_pack_avx
                         ruy_prepacked_cache
                         ruy_prepare_packed_matrices
                         ruy_system_aligned_alloc
                         ruy_thread_pool
                         ruy_trmul
                         ruy_tune
                         ruy_wait
                         pthreadpool
                         XNNPACK
    )
    endif()
    
    if(USE_ONNX_RT)
    set(SYSTEM_LINK_LIBS ${SYSTEM_LINK_LIBS} onnxruntime)
    endif()
    
    set(SYSTEM_LINK_LIBS ${SYSTEM_LINK_LIBS} pthread dl)
    
    # Function for building a node:
    # ARG0: app name
    # ARG1: source list
    function(build_app)
        set(app ${ARGV0})
        set(src ${ARGV1})
        add_executable(${app} ${${src}})
        target_link_libraries(${app}
                              -Wl,--start-group
                              ${COMMON_LINK_LIBS}
                              ${TARGET_LINK_LIBS}
                              ${SYSTEM_LINK_LIBS}
                              -Wl,--end-group)
    endfunction(build_app)
    
    # Function for building a node:
    # ARG0: lib name
    # ARG1: source list
    # ARG2: type (STATIC, SHARED)
    function(build_lib)
        set(lib ${ARGV0})
        set(src ${ARGV1})
        set(type ${ARGV2})
        set(version 1.0.0)
    
        add_library(${lib} ${type} ${${src}})
    
        get_filename_component(PROJ_DIR "${CMAKE_CURRENT_SOURCE_DIR}" NAME)
    
        set(INC_DIR_DST ${CMAKE_INSTALL_LIBDIR}/${CMAKE_INSTALL_INCLUDEDIR}/${PROJ_DIR})
    
        install(TARGETS ${lib}
                LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}  # Shared Libs
                ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}  # Static Libs
                RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}  # Executables, DLLs
                INCLUDES DESTINATION ${INC_DIR_DST}
        )
    
        # Specify the header files to install
        install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include
            DESTINATION ${INC_DIR_DST}
        )
    
    endfunction(build_lib)
    
    

    请帮我看看,非常感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    此处的 CMAKE 文件很有用。 我认为问题在于一组链接库。 这里、您正在添加(从 OpenCV)内核和 imgproc 库、但我认为其中不包含 imwrite 函数。  

    看起来 imwrite 是 libopencv_imgcodecs 的一部分。 您是否可以尝试将"OpenCV_imgcodecs"添加到您的 system_link_libs (第170行)中?

    为了进行快速检查、我为 libopencv_core.so、libopencv_imgproc.so 和 libopencv_imgcodecs.so 转储了符号"nm -D":

    root@am62axx-evm:/usr/lib# nm -D  libopencv_core.so | grep imwrite
    
    root@am62axx-evm:/usr/lib# nm -D  libopencv_imgproc.so | grep imwrite
    
    root@am62axx-evm:/usr/lib# nm -D  libopencv_imgcodecs.so | grep imwrite
    000000000002a900 T _ZN2cv7imwriteERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_11_InputArrayERKSt6vectorIiSaIiEE
    

    它仅在 imgcodec 中定义

    BR、
    Reese