Ubuntu 18.04构建GPU加速的OpenCV

教程地址
由于我使用的账号不具有sudo权限,且仅希望该版本(OpenCV 4.2.0)安装在特定的虚拟环境下(这里使用anaconda创建虚拟环境),安装时需位于该环境下(这里是pytorch17)。修改上述教程第6步的CMake指令如下:

cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D WITH_CUDA=ON \
-D WITH_CUDNN=ON \
-D WITH_FFMPEG=ON \
-D WITH_GSTREAMER=ON \
-D OPENCV_DNN_CUDA=ON \
-D OPENCV_ENABLE_PKG_CONFIG=1 \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D CUDA_ARCH_BIN=6.1 \
-D WITH_CUBLAS=1 \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib/modules/ \
-D HAVE_opencv_python3=ON \
-D CMAKE_INSTALL_PREFIX=$(python -c "import sys; print(sys.prefix)") 
-D PYTHON3_EXECUTABLE=$(which python) \
-D PYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-D PYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..

Python验证部分

>>> import cv2
>>> print(cv2.getBuildInformation())

输入如下

......
  NVIDIA CUDA:                   YES (ver 10.1, CUFFT CUBLAS FAST_MATH)
    NVIDIA GPU arch:             61
    NVIDIA PTX archs:

  cuDNN:                         NO

  OpenCL:                        YES (no extra features)
    Include path:                /home/lishizhen/opencv/opencv/3rdparty/include/opencl/1.2
    Link libraries:              Dynamic load
......

然而,可能由于账号权限不够,编译时无法找到ffmpeg(服务器已经安装ffmpeg,可以正常使用),控制台出现WARNING: Can’t build ffmpeg test code。反复查找解决方案、重新编译未果,FFMPEG始终为NO(如下图)。
Ubuntu 18.04构建GPU加速的OpenCV_第1张图片
造成虚拟环境下OpenCV调用VideoCapture读取.avi视频出错(视频可以正常播放且输入路径正确),报错如下图:
Ubuntu 18.04构建GPU加速的OpenCV_第2张图片
使用ffmpeg能够正常处理该视频,遂安装ffmpeg-python进行视频读取。

import ffmpeg
import sys


def read_frame_as_jpeg(in_file, frame_num):
    """
    指定帧数读取任意帧
    """
    out, err = (
        ffmpeg.input(in_file)
              .filter('select', 'gte(n,{})'.format(frame_num))
              .output('pipe:', vframes=1, format='image2', vcodec='mjpeg')
              .global_args('-loglevel', 'error')    # 取消log打印
              .run(capture_stdout=True)
    )
    return out


def get_video_info(in_file):
    """
    获取视频基本信息
    """
    try:
        probe = ffmpeg.probe(in_file)
        video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None)
        total_frames = int(video_stream['nb_frames'])
		fps = int(video_stream['r_frame_rate'].split('/')[0])/int(video_stream['r_frame_rate'].split('/')[1])
		width = video_stream['width']
		height = video_stream['height']
        if video_stream is None:
            print('No video stream found', file=sys.stderr)
            sys.exit(1)
        return width, height, fps, total_frames
    except ffmpeg.Error as err:
        print(str(err.stderr, encoding='utf8'))
        sys.exit(1)

你可能感兴趣的:(系统/环境配置,opencv,ubuntu,python)