Видеокадр + оптический поток на базе CUDA9 + OpenCV3

компьютерное зрение OpenCV
Видеокадр + оптический поток на базе CUDA9 + OpenCV3

В области компьютерного зрения видеоалгоритмы являются важной частью.В отличие от изображений, видео требуют нескольких кадров изображений с функциями временных рядов, и в то же время они также включают определенную информацию о движении, такую ​​как оптический поток. Во время предварительной обработки изображение и оптический поток в видео должны быть извлечены, разработка с открытым исходным кодомdense_flowЭта функция была реализована для поддержки операций графического процессора.

В CUDA 9 и OpenCV 3 настройте проект плотности_потока, расширенную версию временных сегментов сети. В то же время проект Benchmark для рекомендуемых видеоmmaction.

Ссылаться на:

dense_flow: https://github.com/yjxiong/dense_flow
temporal-segment-networks: https://github.com/yjxiong/temporal-segment-networks
mmaction: https://github.com/open-mmlab/mmaction

Скомпилировать OpenCV

Шаги компиляции OpenCV следующие:

  1. Загрузите opencv, загрузите opencv_contrib;
  2. Измените 2 файла cmake и 1 файл hpp;
  3. Измените hdf5, ffmpeg, nonfree (необязательно);
  4. сделать, установить opencv;

OpenCV 3

CUDA 9 не поддерживает OpenCV2.x, можно выбрать только 3.x, например 3.1.0,Ссылаться на

CUDA9

Исходный код OpenCV

Загрузите исходный файл OpenCV и разархивируйте его:

wget https://github.com/opencv/opencv/archive/3.1.0.zip

unzip 3.1.0.zip

cd opencv-3.1.0

opencv_contrib

В opencv-3.1.0 загрузите файл opencv_contrib и разархивируйте его:

wget https://github.com/opencv/opencv_contrib/archive/3.1.0.zip

unzip 3.1.0.zip

Места следующие:

opencv_contrib

Причина в том, что алгоритм SURF или SIFT смещается вopencv_contrib, необходимо участвовать в компиляции исходного кода, вdense_flow, вызовите алгоритм SURF, иначе SURF не может быть найден,Ссылаться на.

Ошибка:

undefined reference to `cv::xfeatures2d::SURF::create(double, int, int, bool, bool)'

Измените файл cmake

Ошибка CMake:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CUDA_nppi_LIBRARY (ADVANCED)

Причина в том, что от nppi отказались и другие CUDA нуждаются в замене, в то же время CUDA 2.0 больше не совместима с текущей версией и подлежит удалению.

необходимо изменитьпапка cmakeНайдите CUDA.cmake и OpenCVDetectCUDA.cmake и измените common.hpp.

ИсправлятьFindCUDA.cmakeфайл, заменить в 3-х местах:

заменять

find_cuda_helper_libs(nppi)

за

  find_cuda_helper_libs(nppial)
  find_cuda_helper_libs(nppicc)
  find_cuda_helper_libs(nppicom)
  find_cuda_helper_libs(nppidei)
  find_cuda_helper_libs(nppif)
  find_cuda_helper_libs(nppig)
  find_cuda_helper_libs(nppim)
  find_cuda_helper_libs(nppist)
  find_cuda_helper_libs(nppisu)
  find_cuda_helper_libs(nppitc)

заменять

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}")

за

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppial_LIBRARY};${CUDA_nppicc_LIBRARY};${CUDA_nppicom_LIBRARY};${CUDA_nppidei_LIBRARY};${CUDA_nppif_LIBRARY};${CUDA_nppig_LIBRARY};${CUDA_nppim_LIBRARY};${CUDA_nppist_LIBRARY};${CUDA_nppisu_LIBRARY};${CUDA_nppitc_LIBRARY};${CUDA_npps_LIBRARY}")

заменять

unset(CUDA_nppi_LIBRARY CACHE)

за

  unset(CUDA_nppial_LIBRARY CACHE)
  unset(CUDA_nppicc_LIBRARY CACHE)
  unset(CUDA_nppicom_LIBRARY CACHE)
  unset(CUDA_nppidei_LIBRARY CACHE)
  unset(CUDA_nppif_LIBRARY CACHE)
  unset(CUDA_nppig_LIBRARY CACHE)
  unset(CUDA_nppim_LIBRARY CACHE)
  unset(CUDA_nppist_LIBRARY CACHE)
  unset(CUDA_nppisu_LIBRARY CACHE)
  unset(CUDA_nppitc_LIBRARY CACHE)

ИсправлятьOpenCVDetectCUDA.cmakeФайл, удален в 2-х местах:

Аннотировать «Fermi» и продвигать «Kepler», то есть удалить ветвь if «Fermi», главным образом, чтобы удалить совместимость с CUDA версии 2.0.

  set(__cuda_arch_ptx "")
  if(CUDA_GENERATION STREQUAL "Fermi")
    set(__cuda_arch_bin "2.0")
  elseif(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_arch_bin "3.0 3.5 3.7")

превратиться в

  set(__cuda_arch_ptx "")
  if(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_arch_bin "3.0 3.5 3.7")

Когда версия CUDA выше 6.5, совместимость с версией 2.0 удаляется, а модификация выполняется следующим образом:

      elseif(${CUDA_VERSION} VERSION_GREATER "6.5")
        set(__cuda_arch_bin "3.0 3.5")

существуетopencv-3.1.0/modules/cudev/include/opencv2/cudev/common.hppв заголовочный файл добавьте:

#include <cuda_fp16.h>

Ссылаться на

hdf5 error

Error:

hdf5.hpp:40:18: fatal error: hdf5.h: No such file or directory

Измените файл opencv-3.1.0/modules/python/common.cmake, в заголовок файла добавьте

find_package(HDF5)
include_directories(${HDF5_INCLUDE_DIRS})

Ссылаться на

nonfree error

Error:

fatal error: opencv2/nonfree/nonfree.hpp: No such file or directory

Установите пакет libopencv-nonfree-dev:

sudo apt-get update
sudo add-apt-repository --yes ppa:xqms/opencv-nonfree
sudo apt-get update
sudo apt-get install libopencv-nonfree-dev

В случае неудачи замените источник ppa:

sudo add-apt-repository --remove ppa:xqms/opencv-nonfree
sudo add-apt-repository --yes ppa:jeff250/opencv
sudo apt-get update
sudo apt-get install libopencv-dev
sudo apt-get install libopencv-nonfree-dev

Ссылаться на,Ссылаться на

ffmpeg error

Error:

c->flags |= CODEC_FLAG_GLOBAL_HEADER

существуетopencv-3.1.0/modules/videoio/src/cap_ffmpeg_impl.hpp, добавлять:

#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020

Ссылаться на

make

Выполните операцию make вOPENCV_EXTRA_MODULES_PATH, необходимо ввестиopencv_contrib:

make -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/data1/wcl/workspace/opencv-3.1.0/opencv_contrib-3.1.0/modules/ ..

Выполнить make, 32 процесса:

make -j32  

Установите и импортируйте opencv в системную среду.

sudo make install  
sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig

Скомпилируйте DenseFlow

Ссылаться на

установить libzip-dev

apt-get install libzip-dev

Скачайте проект плотно_flow и переключитесьOpenCV 3.1Филиал:

git clone --recursive http://github.com/yjxiong/dense_flow
git checkout remotes/origin/opencv-3.1

Указываем OpenCV_DIR и компилируем проект:

mkdir build && cd build
OpenCV_DIR=/opencv-3.1.0/build cmake .. -DCUDA_USE_STATIC_CUDA_RUNTIME=OFF
make -j32

После успешной компиляции в папке сборки:

  1. 869956383.mp4 — тестовое видео, создайте папку tmp.
  2. Выполните команду, обратите внимание на все пробелызаменятьдля "=",Ссылаться наиСсылаться на.
  3. В папке tmp сгенерированные видеокадры имеют префикс image, а оптический поток по оси X имеет префиксflow_xпрефикс, оптический поток по оси Y начинается сflow_yпрефикс, остальные параметрыСсылаться на.
./extract_gpu -f=980044841.mp4 -x=./tmp/flow_x -y=./tmp/flow_y -i=./tmp/image -b=20 -t=1 -d=0 -s=1 -o=dir

Ошибка, указывающая на невозможность открытия видео, замените пробел на "=".

FATAL [default] Check failed: [video_stream.isOpened()]

Тестовое видео:

Test

Выходной результат:

Result

Использование графического процессора

GPU


OK, that's all! Enjoy it!