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扫描到。
- 检查目标路径下的pkg-config文件:
ls /usr/local/lib/pkgconfig/
- 若存在
opencv4.pc,将该路径添加到环境变量:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
- 使用正确的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
相关产品推荐
相关产品推荐

