You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pkg-config失效时,如何构建带CUDA的OpenCV简单示例?

问题描述

我基于一个支持CUDA的OpenCV Docker容器(修改了基础镜像,Dockerfile见下文)构建了环境,版本为OpenCV 4.5.3、CUDA 11.4.3。

我编写了如下验证OpenCV CUDA功能的示例代码:

#include <iostream>
#include "opencv2/opencv.hpp"

int main (int argc, char* argv[])
{
    //Read Two Images 
    cv::Mat h_img1 = cv::imread("images/cameraman.tif");
    cv::Mat h_img2 = cv::imread("images/circles.png");
    //Create Memory for storing Images on device
    cv::cuda::GpuMat d_result1,d_img1, d_img2;
    cv::Mat h_result1;
    //Upload Images to device     
    d_img1.upload(h_img1);
    d_img2.upload(h_img2);

    cv::cuda::add(d_img1,d_img2, d_result1);
    //Download Result back to host
    d_result1.download(h_result1);
    cv::imshow("Image1 ", h_img1);
    cv::imshow("Image2 ", h_img2);
    cv::imshow("Result addition ", h_result1);
    cv::imwrite("images/result_add.png", h_result1);
    cv::waitKey();
    return 0;
}

尝试用以下命令编译时失败:

g++ -std=c++11 -o image_addition one.cpp `pkg-config --cflags --libs opencv`

报错信息:

Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
one.cpp:2:10: fatal error: opencv2/opencv.hpp: No such file or directory
    2 | #include "opencv2/opencv.hpp"
      |          ^~~~~~~~~~~~~~~~~~~~
compilation terminated.

请问该如何编译此示例以验证OpenCV的CUDA功能?

附修改后的Dockerfile:

FROM nvidia/cuda:11.4.3-devel-ubuntu20.04

ARG DEBIAN_FRONTEND=noninteractive
ARG OPENCV_VERSION=4.5.3

RUN apt-get update && apt-get upgrade -y &&\
    # Install build tools, build dependencies and python
    apt-get install -y \
    python3-pip \
        build-essential \
        cmake \
        git \
        wget \
        unzip \
        yasm \
        pkg-config \
        libswscale-dev \
        libtbb2 \
        libtbb-dev \
        libjpeg-dev \
        libpng-dev \
        libtiff-dev \
        libavformat-dev \
        libpq-dev \
        libxine2-dev \
        libglew-dev \
        libtiff5-dev \
        zlib1g-dev \
        libjpeg-dev \
        libavcodec-dev \
        libavformat-dev \
        libavutil-dev \
        libpostproc-dev \
        libswscale-dev \
        libeigen3-dev \
        libtbb-dev \
        libgtk2.0-dev \
        pkg-config \
        ## Python
        python3-dev \
        python3-numpy \
    && rm -rf /var/lib/apt/lists/*

RUN cd /opt/ &&\
    # Download and unzip OpenCV and opencv_contrib and delte zip files
    wget https://github.com/opencv/opencv/archive/$OPENCV_VERSION.zip &&\
    unzip $OPENCV_VERSION.zip &&\
    rm $OPENCV_VERSION.zip &&\
    wget https://github.com/opencv/opencv_contrib/archive/$OPENCV_VERSION.zip &&\
    unzip ${OPENCV_VERSION}.zip &&\
    rm ${OPENCV_VERSION}.zip &&\
    # Create build folder and switch to it
    mkdir /opt/opencv-${OPENCV_VERSION}/build && cd /opt/opencv-${OPENCV_VERSION}/build &&\
    # Cmake configure
    cmake \
        -DOPENCV_EXTRA_MODULES_PATH=/opt/opencv_contrib-${OPENCV_VERSION}/modules \
        -DWITH_CUDA=ON \
        -DCUDA_ARCH_BIN=7.5,8.0,8.6 \
        -DCMAKE_BUILD_TYPE=RELEASE \
        # Install path will be /usr/local/lib (lib is implicit)
        -DCMAKE_INSTALL_PREFIX=/usr/local \
        .. &&\
    # Make
    make -j"$(nproc)" && \
    # Install to /usr/local/lib
    make install && \
    ldconfig &&\
    # Remove OpenCV sources and build folder
    rm -rf /opt/opencv-${OPENCV_VERSION} && rm -rf /opt/opencv_contrib-${OPENCV_VERSION}

解决方法

方法1:修复pkg-config配置

报错核心是系统找不到opencv.pc文件——OpenCV 4.x版本的pkg-config文件通常命名为opencv4而非opencv,且默认安装路径/usr/local/lib/pkgconfig可能未被pkg-config扫描到。

  1. 检查目标路径下的pkg-config文件:
ls /usr/local/lib/pkgconfig/
  1. 若存在opencv4.pc,将该路径添加到环境变量:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
  1. 使用正确的pkg-config名称编译:
g++ -std=c++11 -o image_addition one.cpp `pkg-config --cflags --libs opencv4`

若需永久生效,可将export命令添加到~/.bashrc或容器的/etc/profile中。

方法2:直接指定头文件与库路径

无需依赖pkg-config,直接在编译命令中明确OpenCV的头文件和库位置:

g++ -std=c++11 -o image_addition one.cpp -I/usr/local/include/opencv4 -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs -lopencv_cudaimgproc

参数说明:

  • -I/usr/local/include/opencv4:指定OpenCV头文件目录
  • -L/usr/local/lib:指定OpenCV库文件目录
  • -lxxx:链接所需的OpenCV库,示例代码用到了核心库、图像处理库、GUI库、图像编解码库及CUDA图像处理库,按需添加即可。

方法3:使用CMake编译(推荐)

对于OpenCV项目,CMake是更稳定的编译方式,创建CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(image_addition)

set(CMAKE_CXX_STANDARD 11)

# 查找OpenCV库
find_package(OpenCV REQUIRED)

# 包含OpenCV头文件
include_directories(${OpenCV_INCLUDE_DIRS})

# 添加可执行文件
add_executable(image_addition one.cpp)

# 链接OpenCV库
target_link_libraries(image_addition ${OpenCV_LIBS})

执行编译命令:

mkdir build && cd build
cmake ..
make

编译完成后,build目录下会生成image_addition可执行文件。


额外注意事项

  • 代码中使用的cv::imshow和cv::waitKey需要图形界面支持,若无图形界面的Docker容器运行,需设置DISPLAY环境变量或使用Xvfb虚拟显示,也可直接注释这部分代码,仅保留CUDA运算与图片读写逻辑。
  • 运行容器时需使用docker run --gpus all参数,确保容器能访问GPU资源。

内容的提问来源于stack exchange,提问作者KansaiRobot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:12:08