我正在尝试在Docker文件中编译项目,但它会不断抛出错误。

Dockerfile:

FROM jjanzic/docker-python3-opencv:contrib-opencv-3.4.2

RUN apt-get update -y
RUN apt-get install -y g++ cmake libboost-dev libgoogle-perftools-dev

COPY . /opt/nsg

WORKDIR /opt/nsg

RUN mkdir -p build && cd build && \
    cmake -DCMAKE_BUILD_TYPE=Release .. && \
    make -j $(nproc)

根目录中的 CMakeLists.txt :
cmake_minimum_required(VERSION 2.8)

project(efanna2e)
include_directories(${PROJECT_SOURCE_DIR}/include)
find_package(OpenCV REQUIRED)
#OpenMP
find_package(OpenMP)
if (OPENMP_FOUND)
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
else()
    message(FATAL_ERROR "no OpenMP supprot")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")
add_definitions (-std=c++14 -O3 -lboost -march=native -Wall -DINFO)

add_subdirectory(src)
add_subdirectory(tests)

/tests目录中的 CMakeLists.txt :
set(CMAKE_CXX_STANDARD 14)

add_executable(test_nsg_index test_nsg_index.cpp)
target_link_libraries(test_nsg_index ${PROJECT_NAME} -ltcmalloc)

add_executable(test_nsg_search test_nsg_search.cpp)
target_link_libraries(test_nsg_search ${PROJECT_NAME})

add_executable(test_nsg_optimized_search test_nsg_optimized_search.cpp)
target_link_libraries(test_nsg_optimized_search ${OpenCV_LIBS})
target_link_libraries(test_nsg_optimized_search ${PROJECT_NAME} -ltcmalloc)

我要运行的代码:
auto body = req.body.substr(file.offset, file.length);
const cv::Mat image = cv::imdecode(body, 0);

运行docker build .之后,这是输出的一部分:
-- Found OpenCV: /usr/local (found version "3.4.2")

/opt/nsg/tests/test_nsg_optimized_search.cpp:149:4:   required from here
/opt/nsg/tests/test_nsg_optimized_search.cpp:145:39: error: no matching function for call to ‘imdecode(std::__cxx11::basic_string<char>&, int)’
     const cv::Mat image = cv::imdecode(body, 0);
                           ~~~~~~~~~~~~^~~~~~~~~
In file included from /usr/local/include/opencv2/imgcodecs/imgcodecs.hpp:48:0,
                 from /opt/nsg/tests/test_nsg_optimized_search.cpp:12:
/usr/local/include/opencv2/imgcodecs.hpp:222:18: note: candidate: cv::Mat cv::imdecode(cv::InputArray, int)
 CV_EXPORTS_W Mat imdecode( InputArray buf, int flags );
                  ^~~~~~~~


因此,它一直在说没有函数imdecode。我还尝试了imread和其他多个功能。它只是一直说它不存在,在下一行说它找到了我想要的功能并指向它。

我在代码中尝试了多种方法:
  • 我加载了#include <opencv2/core/core.hpp>
  • 然后,我加载了#include "opencv2/core/core.hpp"(是否对来自opencv的所有包含的hpp文件都使用了
  • 使用的
  • :using namespace cv;
  • 使用了没有命名空间
  • 的函数
  • 做到了:cv::imdecode()
  • 做到了:imdecode()

  • 这些都导致了相同的错误。

    昨天我在Ubuntu 18.04机器上遇到了同样的确切问题,除了我在机器上而非通过Docker安装了opencv之外。今天,我将Ubuntu重新安装到版本16.04,并开始使用Docker。但是还是同样的问题。我想我在这里做错了,但不知道是什么。

    最佳答案

    错误告诉您该函数调用:

    const cv::Mat image = cv::imdecode(body, 0);
    

    与头文件中定义的内容不匹配。编译器只知道如何使用与已定义的函数签名(即函数名称,函数参数类型,返回类型等)匹配的调用,在您的情况下为imgcodecs.hpp:
    cv::Mat cv::imdecode(cv::InputArray, int)
    

    编译器将此称为候选匹配项,因为虽然您使用的函数名称imdecode是正确的,但函数参数类型不匹配。您的函数调用具有此签名(根据错误消息),表明第一个参数与编译器期望的不同:
    cv::Mat imdecode(std::__cxx11::basic_string<char>&, int)
    

    因此,您必须将变量body更改为cv::InputArray类型,或者可以从中构造InputArray的类型。可能性列表为here。考虑到可以从cv::InputArray类型构造std::vector<T>,您可以尝试将body转换为char的 vector ,如下所示:
    auto body = req.body.substr(file.offset, file.length);
    std::vector<char> bodyVector(body.begin(), body.end());
    const cv::Mat image = cv::imdecode(bodyVector, 0);
    

    或者,您可以从cv::InputArray显式创建一个body变量,并将其传递给imdecode函数。

    关于c++ - Opencv链接CMAKE无法正常工作Ubuntu 16.04 Docker,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57433037/

    10-12 14:58
    查看更多