FC2カウンター FPGAの部屋 OpenCV

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Ubuntu 16.04 にOpenCV 3.3.0 rc をインストールした

Ubuntu 16.04 にOpenCV 3.1.0 をインストールした”の続き。

前回は、Ubuntu 16.04 にOpenCV 3.1.0 をインストールしようとしたのだが、make でエラーになってしまった。どうやらCUDA 8.0 が悪さしているようだというのがわかった。dandelion さんからOpenCV 3.2 だったら大丈夫と教えていただいたので、OpenCV 3.2 以降をインストールすることにした。

UbuntuにOpenCV3.2とcontribをインストールする。”を参考にさせていただいた。
さて、前準備は前回思いっきりやってあるので、OpenCV のソースコードのダウンロードからやってみよう。
まずは、ホームディレクトリ下に OpenCV ディレクトリを生成し、移動した。
mkdir OpenCV
cd OpenCV


OpenCV ソースをダウンロードした。
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git


opencv ディレクトリに移動して、build ディレクトリを生成した。build ディレクトリに移動して、cmake を実行した。
cd opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=~/OpenCV/opencv_contrib/modules

Ubuntu_OpenCV_11_170726.png

cmake のコンフィギュレーションを示す。

-- General configuration for OpenCV 3.3.0-rc =====================================
--   Version control:               3.3.0-rc-159-g06407b4
-- 
--   Extra modules:
--     Location (extra):            /home/masaaki/OpenCV/opencv_contrib/modules
--     Version control (extra):     3.3.0-rc-7-g067b0a6
-- 
--   Platform:
--     Timestamp:                   2017-07-27T05:33:25Z
--     Host:                        Linux 4.4.0-87-generic x86_64
--     CMake:                       3.3.2
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/make
--     Configuration:               RELEASE
-- 
--   CPU/HW features:
--     Baseline:                    SSE SSE2 SSE3
--       requested:                 SSE3
--     Dispatched code generation:  SSE4_1 SSE4_2 FP16 AVX AVX2
--       requested:                 SSE4_1 SSE4_2 AVX FP16 AVX2
--       SSE4_1 (2 files):          + SSSE3 SSE4_1
--       SSE4_2 (1 files):          + SSSE3 SSE4_1 POPCNT SSE4_2
--       FP16 (1 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
--       AVX (5 files):             + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
--       AVX2 (7 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2
-- 
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ Compiler:                /usr/bin/c++  (ver 5.4.0)
--     C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections  -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
--     C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections  -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
--     C Compiler:                  /usr/bin/cc
--     C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections  -msse -msse2 -msse3 -fvisibility=hidden -O3 -DNDEBUG  -DNDEBUG
--     C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections  -msse -msse2 -msse3 -fvisibility=hidden -g  -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):
--     Linker flags (Debug):
--     ccache:                      NO
--     Precompiled headers:         YES
--     Extra dependencies:          gtk-3 gdk-3 pangocairo-1.0 pango-1.0 atk-1.0 cairo-gobject cairo gdk_pixbuf-2.0 gio-2.0 gthread-2.0 /usr/lib/x86_64-linux-gnu/libpng.so /usr/lib/x86_64-linux-gnu/libz.so /usr/lib/x86_64-linux-gnu/libtiff.so /usr/lib/x86_64-linux-gnu/libjasper.so /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/x86_64-linux-gnu/libImath.so /usr/lib/x86_64-linux-gnu/libIlmImf.so /usr/lib/x86_64-linux-gnu/libIex.so /usr/lib/x86_64-linux-gnu/libHalf.so /usr/lib/x86_64-linux-gnu/libIlmThread.so gstbase-1.0 gstreamer-1.0 gobject-2.0 glib-2.0 gstvideo-1.0 gstapp-1.0 gstriff-1.0 gstpbutils-1.0 dc1394 avcodec-ffmpeg avformat-ffmpeg avutil-ffmpeg swscale-ffmpeg freetype harfbuzz dl m pthread rt cudart nppc nppi npps cufft -L/usr/local/cuda/lib64
--     3rdparty dependencies:
-- 
--   OpenCV modules:
--     To be built:                 cudev core cudaarithm flann imgproc ml objdetect phase_unwrapping plot reg surface_matching video xphoto bgsegm cudabgsegm cudafilters cudaimgproc cudawarping dnn face freetype fuzzy img_hash imgcodecs photo shape videoio xobjdetect cudacodec highgui ts bioinspired dpm features2d line_descriptor saliency text calib3d ccalib cudafeatures2d cudalegacy cudaobjdetect cudaoptflow cudastereo datasets rgbd stereo structured_light superres tracking videostab xfeatures2d ximgproc aruco optflow stitching python2
--     Disabled:                    world contrib_world
--     Disabled by dependency:      -
--     Unavailable:                 java python3 viz cnn_3dobj cvv dnn_modern hdf matlab sfm
-- 
--   GUI: 
--     QT:                          NO
--     GTK+ 3.x:                    YES (ver 3.18.9)
--     GThread :                    YES (ver 2.48.2)
--     GtkGlExt:                    NO
--     OpenGL support:              NO
--     VTK support:                 NO
-- 
--   Media I/O: 
--     ZLib:                        /usr/lib/x86_64-linux-gnu/libz.so (ver 1.2.8)
--     JPEG:                        /usr/lib/x86_64-linux-gnu/libjpeg.so (ver )
--     WEBP:                        build (ver encoder: 0x020e)
--     PNG:                         /usr/lib/x86_64-linux-gnu/libpng.so (ver 1.2.54)
--     TIFF:                        /usr/lib/x86_64-linux-gnu/libtiff.so (ver 42 - 4.0.6)
--     JPEG 2000:                   /usr/lib/x86_64-linux-gnu/libjasper.so (ver 1.900.1)
--     OpenEXR:                     /usr/lib/x86_64-linux-gnu/libImath.so /usr/lib/x86_64-linux-gnu/libIlmImf.so /usr/lib/x86_64-linux-gnu/libIex.so /usr/lib/x86_64-linux-gnu/libHalf.so /usr/lib/x86_64-linux-gnu/libIlmThread.so (ver 2.2.0)
--     GDAL:                        NO
--     GDCM:                        NO
-- 
--   Video I/O:
--     DC1394 1.x:                  NO
--     DC1394 2.x:                  YES (ver 2.2.4)
--     FFMPEG:                      YES
--       avcodec:                   YES (ver 56.60.100)
--       avformat:                  YES (ver 56.40.101)
--       avutil:                    YES (ver 54.31.100)
--       swscale:                   YES (ver 3.1.101)
--       avresample:                NO
--     GStreamer:                   
--       base:                      YES (ver 1.8.3)
--       video:                     YES (ver 1.8.3)
--       app:                       YES (ver 1.8.3)
--       riff:                      YES (ver 1.8.3)
--       pbutils:                   YES (ver 1.8.3)
--     OpenNI:                      NO
--     OpenNI PrimeSensor Modules:  NO
--     OpenNI2:                     NO
--     PvAPI:                       NO
--     GigEVisionSDK:               NO
--     Aravis SDK:                  NO
--     UniCap:                      NO
--     UniCap ucil:                 NO
--     V4L/V4L2:                    NO/YES
--     XIMEA:                       NO
--     Xine:                        NO
--     Intel Media SDK:             NO
--     gPhoto2:                     NO
-- 
--   Parallel framework:            pthreads
-- 
--   Trace:                         YES (with Intel ITT)
-- 
--   Other third-party libraries:
--     Use Intel IPP:               2017.0.2 [2017.0.2]
--                at:               /home/masaaki/OpenCV/opencv/build/3rdparty/ippicv/ippicv_lnx
--     Use Intel IPP IW:            prebuilt binaries (2017.0.2)
--     Use Intel IPP Async:         NO
--     Use VA:                      NO
--     Use Intel VA-API/OpenCL:     NO
--     Use Lapack:                  NO
--     Use Eigen:                   NO
--     Use Cuda:                    YES (ver 8.0)
--     Use OpenCL:                  YES
--     Use OpenVX:                  NO
--     Use custom HAL:              NO
-- 
--   NVIDIA CUDA
--     Use CUFFT:                   YES
--     Use CUBLAS:                  NO
--     USE NVCUVID:                 NO
--     NVIDIA GPU arch:             20 30 35 37 50 52 60 61
--     NVIDIA PTX archs:
--     Use fast math:               NO
-- 
--   OpenCL:                        <Dynamic loading of OpenCL library>
--     Include path:                /home/masaaki/OpenCV/opencv/3rdparty/include/opencl/1.2
--     Use AMDFFT:                  NO
--     Use AMDBLAS:                 NO
-- 
--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.12)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython2.7.so (ver 2.7.12)
--     numpy:                       /home/masaaki/.local/lib/python2.7/site-packages/numpy/core/include (ver 1.11.0)
--     packages path:               lib/python2.7/dist-packages
-- 
--   Python 3:
--     Interpreter:                 /usr/bin/python3 (ver 3.5.2)
-- 
--   Python (for build):            /usr/bin/python2.7
-- 
--   Java:
--     ant:                         NO
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
-- 
--   Matlab:                        Matlab not found or implicitly disabled
-- 
--   Documentation:
--     Doxygen:                     NO
-- 
--   Tests and samples:
--     Tests:                       YES
--     Performance tests:           YES
--     C/C++ Examples:              NO
-- 
--   Install path:                  /usr/local
-- 
--   cvconfig.h is in:              /home/masaaki/OpenCV/opencv/build
-- -----------------------------------------------------------------
-- 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/masaaki/OpenCV/opencv/build


make を行った。
make -j $(nproc)
Ubuntu_OpenCV_12_170726.png

make が成功した。

sudo make install
Ubuntu_OpenCV_13_170726.png

sudo ldconfig
Ubuntu_OpenCV_14_170726.png

cmake のログでも出てきたが、OpenCV 3.3.0 rc をインストールしたようだ。

opencv/samples を見てみると、dnn やopencl やいろいろなサンプルがあって楽しみだ。
Ubuntu_OpenCV_15_170729.png
  1. 2017年07月29日 04:17 |
  2. OpenCV
  3. | トラックバック:0
  4. | コメント:0

Ubuntu 16.04 にOpenCV 3.1.0 をインストールした

白線追従用の画像を処理するためにUbuntu 16.04 にOpenCV 3.1.0 をインストールすることにした。
なお、”Ubuntu 16.04にOpenCV 3.1をインストールする手順”を参考にさせていただいた。

早速、下準備から、
sudo apt-get install build-essential cmake git
Ubuntu_OpenCV_1_170726.png

sudo apt-get install ffmpeg libopencv-dev libgtk-3-dev python-numpy python3-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libv4l-dev libtbb-dev qtbase5-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip
Ubuntu_OpenCV_2_170726.png

wget https://github.com/Itseez/opencv/archive/3.1.0.zip
Ubuntu_OpenCV_3_170726.png

unzip 3.1.0
Ubuntu_OpenCV_4_170726.png

cd opencv-3.1.0
mkdir build
cd build

Ubuntu_OpenCV_5_170726.png

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..
Ubuntu_OpenCV_6_170726.png

成功した。コンフィギュレーションを貼っておく。

-- General configuration for OpenCV 3.1.0 =====================================
--   Version control:               unknown
-- 
--   Platform:
--     Host:                        Linux 4.4.0-87-generic x86_64
--     CMake:                       3.3.2
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/make
--     Configuration:               RELEASE
-- 
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ Compiler:                /usr/bin/c++  (ver 5.4.0)
--     C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -msse -msse2 -mno-avx -msse3 -mno-ssse3 -mno-sse4.1 -mno-sse4.2 -ffunction-sections -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
--     C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -msse -msse2 -mno-avx -msse3 -mno-ssse3 -mno-sse4.1 -mno-sse4.2 -ffunction-sections -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
--     C Compiler:                  /usr/bin/cc
--     C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -msse -msse2 -mno-avx -msse3 -mno-ssse3 -mno-sse4.1 -mno-sse4.2 -ffunction-sections -fvisibility=hidden -O3 -DNDEBUG  -DNDEBUG
--     C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -msse -msse2 -mno-avx -msse3 -mno-ssse3 -mno-sse4.1 -mno-sse4.2 -ffunction-sections -fvisibility=hidden -g  -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):
--     Linker flags (Debug):
--     Precompiled headers:         YES
--     Extra dependencies:          Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Test Qt5::Concurrent Qt5::OpenGL /usr/lib/x86_64-linux-gnu/libpng.so /usr/lib/x86_64-linux-gnu/libz.so /usr/lib/x86_64-linux-gnu/libtiff.so /usr/lib/x86_64-linux-gnu/libjasper.so /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/x86_64-linux-gnu/libImath.so /usr/lib/x86_64-linux-gnu/libIlmImf.so /usr/lib/x86_64-linux-gnu/libIex.so /usr/lib/x86_64-linux-gnu/libHalf.so /usr/lib/x86_64-linux-gnu/libIlmThread.so gstvideo-1.0 gstapp-1.0 gstbase-1.0 gstriff-1.0 gstpbutils-1.0 gstreamer-1.0 gobject-2.0 glib-2.0 dc1394 v4l1 v4l2 avcodec-ffmpeg avformat-ffmpeg avutil-ffmpeg swscale-ffmpeg dl m pthread rt /usr/lib/x86_64-linux-gnu/libGLU.so /usr/lib/x86_64-linux-gnu/libGL.so tbb atomic cudart nppc nppi npps cufft -L/usr/local/cuda/lib64
--     3rdparty dependencies:       libwebp
-- 
--   OpenCV modules:
--     To be built:                 cudev core cudaarithm flann imgproc ml video cudabgsegm cudafilters cudaimgproc cudawarping imgcodecs photo shape videoio cudacodec highgui objdetect ts features2d calib3d cudafeatures2d cudalegacy cudaobjdetect cudaoptflow cudastereo stitching superres videostab python2
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 java python3 viz
-- 
--   GUI: 
--     QT 5.x:                      YES (ver 5.5.1)
--     QT OpenGL support:           YES (Qt5::OpenGL 5.5.1)
--     OpenGL support:              YES (/usr/lib/x86_64-linux-gnu/libGLU.so /usr/lib/x86_64-linux-gnu/libGL.so)
--     VTK support:                 NO
-- 
--   Media I/O: 
--     ZLib:                        /usr/lib/x86_64-linux-gnu/libz.so (ver 1.2.8)
--     JPEG:                        /usr/lib/x86_64-linux-gnu/libjpeg.so (ver )
--     WEBP:                        build (ver 0.3.1)
--     PNG:                         /usr/lib/x86_64-linux-gnu/libpng.so (ver 1.2.54)
--     TIFF:                        /usr/lib/x86_64-linux-gnu/libtiff.so (ver 42 - 4.0.6)
--     JPEG 2000:                   /usr/lib/x86_64-linux-gnu/libjasper.so (ver 1.900.1)
--     OpenEXR:                     /usr/lib/x86_64-linux-gnu/libImath.so /usr/lib/x86_64-linux-gnu/libIlmImf.so /usr/lib/x86_64-linux-gnu/libIex.so /usr/lib/x86_64-linux-gnu/libHalf.so /usr/lib/x86_64-linux-gnu/libIlmThread.so (ver 2.2.0)
--     GDAL:                        NO
-- 
--   Video I/O:
--     DC1394 1.x:                  NO
--     DC1394 2.x:                  YES (ver 2.2.4)
--     FFMPEG:                      YES
--       codec:                     YES (ver 56.60.100)
--       format:                    YES (ver 56.40.101)
--       util:                      YES (ver 54.31.100)
--       swscale:                   YES (ver 3.1.101)
--       resample:                  NO
--       gentoo-style:              YES
--     GStreamer:                   
--       base:                      YES (ver 1.8.3)
--       video:                     YES (ver 1.8.3)
--       app:                       YES (ver 1.8.3)
--       riff:                      YES (ver 1.8.3)
--       pbutils:                   YES (ver 1.8.3)
--     OpenNI:                      NO
--     OpenNI PrimeSensor Modules:  NO
--     OpenNI2:                     NO
--     PvAPI:                       NO
--     GigEVisionSDK:               NO
--     UniCap:                      NO
--     UniCap ucil:                 NO
--     V4L/V4L2:                    Using libv4l1 (ver 1.10.0) / libv4l2 (ver 1.10.0)
--     XIMEA:                       NO
--     Xine:                        NO
--     gPhoto2:                     NO
-- 
--   Parallel framework:            TBB (ver 4.4 interface 9002)
-- 
--   Other third-party libraries:
--     Use IPP:                     9.0.1 [9.0.1]
--          at:                     /home/masaaki/opencv-3.1.0/3rdparty/ippicv/unpack/ippicv_lnx
--     Use IPP Async:               NO
--     Use VA:                      NO
--     Use Intel VA-API/OpenCL:     NO
--     Use Eigen:                   NO
--     Use Cuda:                    YES (ver 8.0)
--     Use OpenCL:                  YES
--     Use custom HAL:              NO
-- 
--   NVIDIA CUDA
--     Use CUFFT:                   YES
--     Use CUBLAS:                  NO
--     USE NVCUVID:                 NO
--     NVIDIA GPU arch:             20 21 30 35
--     NVIDIA PTX archs:            30
--     Use fast math:               NO
-- 
--   OpenCL:
--     Version:                     dynamic
--     Include path:                /home/masaaki/opencv-3.1.0/3rdparty/include/opencl/1.2
--     Use AMDFFT:                  NO
--     Use AMDBLAS:                 NO
-- 
--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.12)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython2.7.so (ver 2.7.12)
--     numpy:                       /home/masaaki/.local/lib/python2.7/site-packages/numpy/core/include (ver 1.11.0)
--     packages path:               lib/python2.7/dist-packages
-- 
--   Python 3:
--     Interpreter:                 /usr/bin/python3 (ver 3.5.2)
-- 
--   Python (for build):            /usr/bin/python2.7
-- 
--   Java:
--     ant:                         NO
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
-- 
--   Matlab:                        Matlab not found or implicitly disabled
-- 
--   Documentation:
--     Doxygen:                     NO
--     PlantUML:                    NO
-- 
--   Tests and samples:
--     Tests:                       YES
--     Performance tests:           YES
--     C/C++ Examples:              NO
-- 
--   Install path:                  /usr/local
-- 
--   cvconfig.h is in:              /home/masaaki/opencv-3.1.0/build
-- -----------------------------------------------------------------
-- 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/masaaki/opencv-3.1.0/build


make
Ubuntu_OpenCV_7_170726.png

エラーになってしまった。エラー内容を示す。

/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:120:54: error: ‘NppiGraphcutState’ has not been declared
     typedef NppStatus (*init_func_t)(NppiSize oSize, NppiGraphcutState** ppStat
                                                      ^
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:135:18: error: ‘NppiGraphcutState’ does not name a type
         operator NppiGraphcutState*()
                  ^
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:141:9: error: ‘NppiGraphcutState’ does not name a type
         NppiGraphcutState* pState;
         ^
In file included from /home/masaaki/opencv-3.1.0/build/modules/cudalegacy/precomp.hpp:75:0:
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp: In constructor ‘{anonymous}::NppiGraphcutStateHandler::NppiGraphcutStateHandler(NppiSize, Npp8u*, {anonymous}::init_func_t)’:
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:127:39: error: ‘pState’ was not declared in this scope
             nppSafeCall( func(sznpp, &pState, pDeviceMem) );
                                       ^
/home/masaaki/opencv-3.1.0/modules/core/include/opencv2/core/private.cuda.hpp:165:52: note: in definition of macro ‘nppSafeCall’
 #define nppSafeCall(expr)  cv::cuda::checkNppError(expr, __FILE__, __LINE__, CV
                                                    ^
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp: In destructor ‘{anonymous}::NppiGraphcutStateHandler::~NppiGraphcutStateHandler()’:
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:132:43: error: ‘pState’ was not declared in this scope
             nppSafeCall( nppiGraphcutFree(pState) );
                                           ^
/home/masaaki/opencv-3.1.0/modules/core/include/opencv2/core/private.cuda.hpp:165:52: note: in definition of macro ‘nppSafeCall’
 #define nppSafeCall(expr)  cv::cuda::checkNppError(expr, __FILE__, __LINE__, CV
                                                    ^
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:132:49: error: ‘nppiGraphcutFree’ was not declared in this scope
             nppSafeCall( nppiGraphcutFree(pState) );
                                                 ^
/home/masaaki/opencv-3.1.0/modules/core/include/opencv2/core/private.cuda.hpp:165:52: note: in definition of macro ‘nppSafeCall’
 #define nppSafeCall(expr)  cv::cuda::checkNppError(expr, __FILE__, __LINE__, CV
                                                    ^
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp: In function ‘void cv::cuda::graphcut(cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::Stream&)’:
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:174:51: error: ‘nppiGraphcutGetSize’ was not declared in this scope
     nppSafeCall( nppiGraphcutGetSize(sznpp, &bufsz) );
                                                   ^
/home/masaaki/opencv-3.1.0/modules/core/include/opencv2/core/private.cuda.hpp:165:52: note: in definition of macro ‘nppSafeCall’
 #define nppSafeCall(expr)  cv::cuda::checkNppError(expr, __FILE__, __LINE__, CV
                                                    ^
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:182:61: error: ‘nppiGraphcutInitAlloc’ was not declared in this scope
     NppiGraphcutStateHandler state(sznpp, buf.ptr<Npp8u>(), nppiGraphcutInitAll
                                                             ^
In file included from /home/masaaki/opencv-3.1.0/build/modules/cudalegacy/precomp.hpp:75:0:
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:191:146: error: ‘nppiGraphcut_32s8u’ was not declared in this scope
 nsp.step), sznpp, labels.ptr<Npp8u>(), static_cast<int>(labels.step), state) );
                                                                            ^
/home/masaaki/opencv-3.1.0/modules/core/include/opencv2/core/private.cuda.hpp:165:52: note: in definition of macro ‘nppSafeCall’
 #define nppSafeCall(expr)  cv::cuda::checkNppError(expr, __FILE__, __LINE__, CV
                                                    ^
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:196:146: error: ‘nppiGraphcut_32f8u’ was not declared in this scope
 nsp.step), sznpp, labels.ptr<Npp8u>(), static_cast<int>(labels.step), state) );
                                                                            ^
/home/masaaki/opencv-3.1.0/modules/core/include/opencv2/core/private.cuda.hpp:165:52: note: in definition of macro ‘nppSafeCall’
 #define nppSafeCall(expr)  cv::cuda::checkNppError(expr, __FILE__, __LINE__, CV
                                                    ^
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp: In function ‘void cv::cuda::graphcut(cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, cv::cuda::Stream&)’:
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:246:52: error: ‘nppiGraphcut8GetSize’ was not declared in this scope
     nppSafeCall( nppiGraphcut8GetSize(sznpp, &bufsz) );
                                                    ^
/home/masaaki/opencv-3.1.0/modules/core/include/opencv2/core/private.cuda.hpp:165:52: note: in definition of macro ‘nppSafeCall’
 #define nppSafeCall(expr)  cv::cuda::checkNppError(expr, __FILE__, __LINE__, CV
                                                    ^
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:254:61: error: ‘nppiGraphcut8InitAlloc’ was not declared in this scope
     NppiGraphcutStateHandler state(sznpp, buf.ptr<Npp8u>(), nppiGraphcut8InitAl
                                                             ^
In file included from /home/masaaki/opencv-3.1.0/build/modules/cudalegacy/precomp.hpp:75:0:
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:267:146: error: ‘nppiGraphcut8_32s8u’ was not declared in this scope
 nsp.step), sznpp, labels.ptr<Npp8u>(), static_cast<int>(labels.step), state) );
                                                                            ^
/home/masaaki/opencv-3.1.0/modules/core/include/opencv2/core/private.cuda.hpp:165:52: note: in definition of macro ‘nppSafeCall’
 #define nppSafeCall(expr)  cv::cuda::checkNppError(expr, __FILE__, __LINE__, CV
                                                    ^
/home/masaaki/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:274:146: error: ‘nppiGraphcut8_32f8u’ was not declared in this scope
 nsp.step), sznpp, labels.ptr<Npp8u>(), static_cast<int>(labels.step), state) );
                                                                            ^
/home/masaaki/opencv-3.1.0/modules/core/include/opencv2/core/private.cuda.hpp:165:52: note: in definition of macro ‘nppSafeCall’
 #define nppSafeCall(expr)  cv::cuda::checkNppError(expr, __FILE__, __LINE__, CV
                                                    ^
modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/build.make:362: ターゲット 'modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/src/graphcuts.cpp.o' のレシピで失敗しました
make[2]: *** [modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/src/graphcuts.cpp.o] エラー 1
CMakeFiles/Makefile2:9285: ターゲット 'modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/all' のレシピで失敗しました
make[1]: *** [modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/all] エラー 2
Makefile:160: ターゲット 'all' のレシピで失敗しました
make: *** [all] エラー 2


どうやらCUDA 関係のエラーのようだ。
opencv3.10 does not support cuda8.0rc? #6677”とかを見ていろいろとやってみたが、うまく行かなかった。
ツィッターでdandelion さんから、「CUDA8だと一部モジュールがビルドできない問題があります。OpenCV 3.2で修正されてます。」と教えて頂いた。
よって、OpenCV 3.2 以降をインストールすることにした。
  1. 2017年07月28日 04:29 |
  2. OpenCV
  3. | トラックバック:0
  4. | コメント:0

Vivado HLSのビデオ プロセッシング関数を使用したOpenCVのFPGAアクセラレーション

この記事は”OpenCV Advent Calendar 2016”の23日目の記事として書きます。

1.FPGAのツールについて
FPGAを知らないという方も多いと思うので、ツールについて説明したいと思います。
Xilinx 社のFPGA 用のツールとしてVivado Design Suite - HLx Edition (通称 Vivado) というツールがあります。これでFPGA を開発するわけです。通常はハードウェア記述言語(HDL)という専用の言語を使います。HDL言語の 2 大勢力としてVerilog HDLとVHDL があります。ですが、最近は高位合成ということで、C, C++, Python, Jave などからHDLを合成できるツールが出てきました。そのうちのC, C++ を使ってHDL を合成するツールがVivado にもあります。Vivado HLS です。
なお、Vivado と Vivado HLS は、デバイス限定ではありますが、無料です。だれでも気軽に始められますよ。

2.Vivado HLS(高位合成ツール)
正確に書くとVivado HLS はC, C++ 言語の記述をHDLに変換して、Vivado のIP を作ります。そのIP をVivado にインポートし、Vivado のIP インテグレータのブロックデザイン上にインスタンスして使用します。(CやC++でどこが高位なのかという疑問があると思いますが、ハードウェアはHDLレベルなので、動作を書けるCやC++ でも高位な言語となります)
また、Xilinx 社のFPGAチップとして、Zynq というチップが出ていますが、これはARMプロセッサのCortex-A9 x2 +FPGAが搭載されているチップです。Zynq を使用するとC やC++ でOpenCV でソフトウェアとして書いて実行もできますし、ハードウェアに落としてアクセラレーションすることもできます。ただし、OpenCV のコードはハードウェアに独自のライブラリを使っているため一部書き換えが必要です。

Vivado HLS についての資料は”Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2016.3) 2016 年 10 月 5 日”をご覧ください。215ページの「ビデオ プロセ ッ シング関数」にOpenCV ライブラリのことが記述されています。
Accelerating OpenCV Applications with Zynq-7000 All Programmable SoC using Vivado HLS Video Libraries XAPP1167 (v3.0) June 24, 2015”に使用例が書いてあります。
もう1つの情報源はXilinx のWiki の”HLS Video Library”です。
Xilinx のCommunity Forum も参考になります。
とにかく情報が少なく、どのような構造になっているのかが、よくわからないのが欠点です。

3.Xilinx社のHLS ビデオライブラリのWikiの内容
Xilinx のWiki の”HLS Video Library”からの引用です。日本語はGoogle翻訳を使用します。
Vivado HLS のHLS ビデオライブラリには、以下に示すライブラリ関数があります。

Video Library Data Structures
HLS Video Libraryには、イメージ、ピクセルなどの基本的なデータ構造を表現するためのテンプレートクラスがいくつか用意されています。これらの名前と使用方法のほとんどは、OpenCVに似ており、FPGAの特殊化と最適化があります。
 hls :: Mat <ROWS、COLS、T>
 hls :: Scalar <N、T>
 hls :: Window <ROWS、COLS、T>
 hls :: LineBuffer <ROWS、COLS、T>

OpenCV interface functions
 IplImage2AXIvideo
 AXIvideo2IplImage
 cvMat2AXIvideo
 AXIvideo2cvMat
 CvMat2AXIvideo
 AXIvideo2CvMat
 IplImage2hlsMat
 hlsMat2IplImage
 cvMat2hlsMat
 hlsMat2cvMat
 CvMat2hlsMat
 hlsMat2CvMat
 CvMat2hlsWindow
 hlsWindow2CvMat

AXI4-Stream I/O Functions
 hls :: AXIvideo2Mat
 hls :: Mat2AXIvideo

Video Processing Functions
 hls::AbsDiff
 hls::AddS
 hls::AddWeighted
 hls::And
 hls::Avg
 hls::AvgSdv
 hls::Cmp
 hls::CmpS
 hls::CornerHarris
 hls::CvtColor
 hls::Dilate
 hls::Duplicate
 hls::EqualizeHist
 hls::Erode
 hls::FASTX
 hls::Filter2D
 hls::GaussianBlur
 hls::Harris
 hls::HoughLines2
 hls::Integral
 hls::InitUndistortRectifyMap
 hls::Max
 hls::MaxS
 hls::Mean
 hls::Merge
 hls::Min
 hls::MinMaxLoc
 hls::MinS
 hls::Mul
 hls::Not
 hls::PaintMask
 hls::Range
 hls::Remap
 hls::Reduce
 hls::Resize
 hls::Set
 hls::Scale
 hls::Sobel
 hls::Split
 hls::SubRS
 hls::SubS
 hls::Sum
 hls::Threshold
 hls::Zero


4.Vivado HLS の操作手順について
これからのXilinx社の高位合成ツールのVivado HLS について簡単に説明します。
Vivado HLSのファイルはテストベンチとソースに分けられます。Vivado HLSのファイル構成や手順を図 1 に示します。
Vivado_HLS_OpenCV_1_161219.png
図 1 Vivado HLSのファイル構成や手順

テストベンチが main() 関数があるところで、main() からハードウェア化する関数を呼び出して使用します。テストベンチとハードウェア関数は別のファイルで、それぞれ、Vivado HLS のTest Benchフォルダ、Sourcesフォルダにから関連付けされています。その様子を図 2 に示します。
Vivado_HLS_OpenCV_2_161219.png
図 2 Vivado HLS 画面

図 2 で、Sourcesフォルダの opencv_ex_ug.cpp がハードウェア化する関数のファイルで、opencv_ex_ug_tb.cpp がテストベンチです。

図 1 に話を戻すと、ハードウェア関数はCコードの合成を行って、HDLに落とされます。次にIP 化を行って、Vivado で使えるようになります。
この辺りは、話せば相当長くなるので、省略します。

つまり何が言いたかったかというと、ソフトウェアでも実装できて、最初にソフトウェアで動作を確認して、そのままハードウェアに落とすことができます。Vivado_HLS のOpenCVライブラリは通常のOpenCVと違うところもあるので、そのままというわけにはいきませんが、ほとんど同じにできます。
ハードウェアにすると、性能が向上するか?という疑問があると思いますが、ハードウェアに適した課題で、しかもハードウェアに合わせてコードを最適化したり、指示子(ディテクティブ、プラグマで書きます)を適切に追加する必要があります。今のところは、FPGAの構造を熟知していないとチューニングは難しいかもしれません?

5.例1 Sobelフィルタ
それでは実際のC コードを見ていきましょう。最初にSobel フィルタのコード例です。

Vivado HLS 2015.4 で OpenCV を使ってみた3(Sobelフィルタを試した1)

ここでは、シミュレーションだけを行っていて、実機では動作させていません。

6.Vivado HLS のC シミュレーションとC/RTL協調シミュレーション
Vivado HLS にはC シミュレーションとC/RTL協調シミュレーションの2つのシミュレーションがあります。C シミュレーションは普通にC ソースコードをコンパイルして実行します。これは普通のVisual Studio とかでやっているのと同じ普通のC の実行です。
もう1つのC/RTL協調シミュレーションは、ハードウェア化する関数をハードウェアとしてHDL に合成した後に動作を確かめるためにRTL シミュレーター(HDLをテストするシミュレーターです)とC のテストベンチを連動させてシミュレーションするものです。この場合に、HDL にしたときのデータの同一性をチェックするためにテストベンチでOpenCVを使用して処理したデータとRTL シミュレーターの出力データを比較しています。今のところテストベンチはそのように記述されています。図 3 にC/RTL協調シミュレーションのブロック図を示します。
Vivado_HLS_OpneCV_3_161220.png
図 3 C/RTL協調シミュレーションのブロック図1

OpenCV では、値が一致しないこともあるので、(近い値になっています)その場合は異常終了しないようにしています。
また、FPGAに落とす場合は、浮動小数点演算のコストが大きく、膨大なリソースを使用するため浮動小数演算を固定小数点演算にする場合が多いです。その場合の誤差を計測するためにもシミュレーションを使用します。その場合のブロック図を図 4 に示します。
Vivado_HLS_OpneCV_4_161220.png
図 4 C/RTL協調シミュレーションのブロック図2

7.例2 FASTXコーナー検出
OpenCV のFAST コーナー検出器のHLS ビデオライブラリ版のFASTX コーナー検出器を確かめてみたのがこの記事です。

FASTX コーナー検出の改良3(threshold をソフトウェアで変更可能にする)

ここでは、800 x 600 ピクセルの画像で、リアルタイムにFASTX コーナー検出を行っています。レポートを見ると、

FASTX コーナー検出IP は 280 MHz まで動作するというレポートが出ているので、HD 解像度の 148.5 MHz も問題なくできると思う。そのようにすればHD解像度で、60 fps のFASTX コーナー検出ができると思う。

という結論になりました。かなりの性能が出ていると思われます。

その他、Vivado HLS の記事は、Vivado HLS をご覧ください。

8.実例 ミニロボットカーによる自動走行例
Vivado HLS のHLS ビデオライブラリを使用したハードウェア+ソフトウェアによる白線追従走行の様子です。カメラを使用した画像解析で白線の間を走っています。


次に同様に、Vivado HLS のHLS ビデオライブラリを使用したハードウェア+ソフトウェアによるマーカーを使用した隊列走行の様子です。



  1. 2016年12月23日 03:30 |
  2. OpenCV
  3. | トラックバック:0
  4. | コメント:0

FASTX コーナー検出の改良3(threshold をソフトウェアで変更可能にする)

FASTX コーナー検出の改良2(threshold をソフトウェアで変更可能にする)”の続き。

前回は、Vivado HLS 2016.1 でC コードの合成とIP へのパッケージを行った。今回は、その threshold を変更できるFASTX コーナー検出IP をカメラ表示システムに組み込んで、ZYBO にダウンロードしてやってみた。

threshold を変更できるFASTX コーナー検出IP を組み込んだ、Vivado 2016.1 のプロジェクトを示す。もう、ビットストリームの生成まで済んでいる。
Vivado_HLS_OpenCV_123_160423.png

Summary を示す。タイミング制約も満足している。
Vivado_HLS_OpenCV_124_160423.png

ハードウェアをエクスポートして、SDKを立ち上げた。
Vivado_HLS_OpenCV_125_160423.png

fastx_on_serial.c を作製した。下にソースコードを示す。

// fastx_on_serial.c
// 2016/04/13 by marsee
//
// Refered to http://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2014_4/ug902-vivado-high-level-synthesis.pdf
//
// 2016/04/21 : threshold をシリアル経由で入力する
//

#include <stdio.h>
#include "ximage_filter.h"
#include "xparameters.h"

int main(){
    XImage_filter Ximage_filter;
    XImage_filter_Config *Ximage_filterPtr;
    int threshold;

    // Look Up the device configuration
    Ximage_filterPtr = XImage_filter_LookupConfig(0);
    if (!Ximage_filterPtr){
        fprintf(stderr, "XImage_filter configuration failed.\n");
        return(-1);
    }

    // Initialize the Device
    int Xlap_status = XImage_filter_CfgInitialize(&Ximage_filter, Ximage_filterPtr);
    if (Xlap_status != XST_SUCCESS){
        fprintf(stderr, "Could not Initialize XImage_filter\n");
        return(-1);
    }

    // image_filter rows, cols set
    XImage_filter_Set_cols(&Ximage_filter, (u32)800);
    XImage_filter_Set_rows(&Ximage_filter, (u32)600);

    // first shreshold set
    printf("\n\rfirst threshold = ");
    scanf("%d", &threshold);
    XImage_filter_Set_threshold(&Ximage_filter, (u32)threshold);

    // axis_switch_1, 1to2 ,Select M01_AXIS
    // Refer to http://marsee101.blog19.fc2.com/blog-entry-3177.html
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x40), 0x80000000); // disable
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x44), 0);
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR), 0x2); // Commit registers

    // fastx filter AXIS Start
    XImage_filter_Start(&Ximage_filter);
    XImage_filter_EnableAutoRestart(&Ximage_filter);

    // axis_switch_0, 2to1, Select S01_AXIS
    // Refer to http://marsee101.blog19.fc2.com/blog-entry-3177.html
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_0_BASEADDR+0x40), 0x1);
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_0_BASEADDR), 0x2); // Commit registers

    // threshold set
    while(1){
        printf("\n\rthreshold = ");
        scanf("%d", &threshold);
        if (threshold == 999)
            break;
        
        XImage_filter_Set_threshold(&Ximage_filter, (u32)threshold);
    }

    return(0);
}


Tera Term を起動して、ZYBO とシリアル経由で接続した。シリアルの設定は 115200 bps, 8 bits, 1 stop bit, local echo にした。
Vivado_HLS_OpenCV_126_160423.png

いろいろと threshold を変更してやってみた。999 を入力するとアプリケーションが終了する。

threshold = 2 の場合の画像を下に示す。
Vivado_HLS_OpenCV_127_160423.jpg

threshold = 5 の場合
Vivado_HLS_OpenCV_128_160423.jpg

threshold = 10 の場合
Vivado_HLS_OpenCV_129_160423.jpg

threshold = 20 の場合
Vivado_HLS_OpenCV_130_160423.jpg

threshold = 40 の場合
Vivado_HLS_OpenCV_131_160423.jpg

threshold = 60 の場合
Vivado_HLS_OpenCV_132_160423.jpg

threshold = 80 の場合
Vivado_HLS_OpenCV_133_160423.jpg

このように、FASTX コーナー検出を threshold を変更して、リアルタイムに 行うことができた。但し、残念だが今のところのカメラの fps は 5 fps だ。回路を変更して、15 fps にしたいと思う。

FASTX コーナー検出IP は 280 MHz まで動作するというレポートが出ているので、HD 解像度の 148.5 MHz も問題なくできると思う。そのようにすればHD解像度で、60 fps のFASTX コーナー検出ができると思う。
  1. 2016年04月23日 04:31 |
  2. OpenCV
  3. | トラックバック:0
  4. | コメント:0

FASTX コーナー検出の改良2(threshold をソフトウェアで変更可能にする)

FASTX コーナー検出の改良1(threshold をソフトウェアで変更可能にする)”の続き。

前回は、threshold をソフトウェアで変更可能にして、いろいろなthreshold の値でC シミュレーションを行った。今回はC コードの合成、IPへのパッケージを行う。

C コードへの合成を行った。結果を示す。
Vivado_HLS_OpenCV_120_160422.png

Latency、Interval は前回の threshold を 20 に固定した時と変化はない。

リソース使用量を示す。左が今回のリソース使用量で、右が前回の threshold を 20 に固定した時のリソース使用量だ。
Vivado_HLS_OpenCV_121_160422.pngVivado_HLS_OpenCV_102_160418.png

FFとLUT が今回の方が増えているのが分かる。

threshold のレジスタを確認した。

//------------------------Address Info-------------------
// 0x00 : Control signals
//        bit 0  - ap_start (Read/Write/COH)
//        bit 1  - ap_done (Read/COR)
//        bit 2  - ap_idle (Read)
//        bit 3  - ap_ready (Read)
//        bit 7  - auto_restart (Read/Write)
//        others - reserved
// 0x04 : Global Interrupt Enable Register
//        bit 0  - Global Interrupt Enable (Read/Write)
//        others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
//        bit 0  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
//        others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
//        bit 0  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
//        others - reserved
// 0x10 : Data signal of rows
//        bit 31~0 - rows[31:0] (Read/Write)
// 0x14 : reserved
// 0x18 : Data signal of cols
//        bit 31~0 - cols[31:0] (Read/Write)
// 0x1c : reserved
// 0x20 : Data signal of threshold
//        bit 31~0 - threshold[31:0] (Read/Write)
// 0x24 : reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)

//------------------------Parameter----------------------


0x20 番地に threshold レジスタが追加されていた。

IP へのパッケージを行った。
IP が生成された。
Vivado_HLS_OpenCV_122_160422.png
  1. 2016年04月22日 04:25 |
  2. OpenCV
  3. | トラックバック:0
  4. | コメント:0

FASTX コーナー検出の改良1(threshold をソフトウェアで変更可能にする)

FASTXコーナー検出IPのカメラ表示システム4(Vivado HLS 2016.1でやってみた2)
FASTXコーナー検出IPのカメラ表示システム5(Vivado HLS 2016.1でやってみた3)
で出来上がったFASTX コーナー検出だが、Xilinx Wiki の HLS FASTX の threshold は 20 に固定したままだ。そこで、threshold を変更できるようにしてみた。
具体的には、opencv_ex_ug.cpp の image_filter() に int threshold を追加した。

void image_filter(AXI_STREAM& INPUT_STREAM, AXI_STREAM& OUTPUT_STREAM, int rows, int cols, int threshold)


opencv_ex_ug.cpp を貼っておく。

// opencv_ex_ug.cpp
// 2016/04/02 by marsee
// 2016/04/09 : FAST Corners Detection

#include "opencv_ex_ug.h"

void image_filter(AXI_STREAM& INPUT_STREAM, AXI_STREAM& OUTPUT_STREAM, int rows, int cols, int threshold) {
#pragma HLS INTERFACE ap_stable port=threshold
#pragma HLS INTERFACE s_axilite port=threshold
#pragma HLS DATAFLOW
#pragma HLS INTERFACE ap_stable port=cols
#pragma HLS INTERFACE ap_stable port=rows
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE axis port=OUTPUT_STREAM
#pragma HLS INTERFACE axis port=INPUT_STREAM
#pragma HLS INTERFACE s_axilite port=cols
#pragma HLS INTERFACE s_axilite port=rows

    RGB_IMAGE img_0(rows, cols);
    RGB_IMAGE img_1(rows, cols);
    RGB_IMAGE img_1_(rows, cols);
#pragma HLS STREAM variable=img_1_.data_stream depth=8192
    // FASTX に最大 7 ラインのレイテンシ、Dilate に最大 3 ラインのレイテンシがあるそうだ
    // 1ラインのピクセル数X10 ラインのFIFO バッファが必要 800x10 < 8192 (2の13乗)
    // http://japan.xilinx.com/support/documentation/application_notes/xapp1167.pdf
    // の 10 ページ参照

    GRAY_IMAGE img_1g(rows, cols);
    GRAY_IMAGE mask(rows, cols);
    GRAY_IMAGE dmask(rows, cols);
    GRAY_IMAGE img_2g(rows, cols);
    RGB_IMAGE img_3(rows, cols);
    RGB_PIXEL color(25500);

    hls::AXIvideo2Mat(INPUT_STREAM, img_0);
    hls::Duplicate(img_0, img_1, img_1_);
    hls::CvtColor<HLS_BGR2GRAY>(img_1, img_1g);
    hls::FASTX(img_1g, mask, threshold, true);
    hls::Dilate(mask, dmask);
    hls::PaintMask(img_1_, dmask, img_3, color);
    hls::Mat2AXIvideo(img_3, OUTPUT_STREAM);
}


opencv_ex_ug.h を貼っておく。

// 2016/04/03 : GRAY_IMAGE を追加

#ifndef __opencv_ex_ug_H__
#define __opencv_ex_ug_H__

#include "ap_axi_sdata.h"
#include "hls_video.h"

#define MAX_HEIGHT    600
#define MAX_WIDTH    800

typedef hls::stream<ap_axiu<32,1,1,1> > AXI_STREAM;
typedef hls::Scalar<3unsigned char> RGB_PIXEL;
typedef hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC3> RGB_IMAGE;
typedef hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC1> GRAY_IMAGE;
#endif


opencv_ex_ug_tb.cpp を貼っておく。

// opencv_ex_ug_tb.cpp
// 2016/04/02 by marsee
// OpenCV 2 の Mat を使用したバージョン
// 2016/04/09 : FAST Corners Detection

#include <iostream>
#include "hls_opencv.h"
#include "opencv_ex_ug.h"

using namespace cv;

#define INPUT_IMAGE     "test.jpg"
#define OUTPUT_IMAGE    "test_result.jpg"
#define OUTPUT_IMAGE_CV "test_result_cv.jpg"

#define THESHOLD_LEVEL    60

void image_filter(AXI_STREAM& INPUT_STREAM, AXI_STREAM& OUTPUT_STREAM, int rows, int cols, int threshold);
void opencv_imaga_filter(Mat& src, Mat& dst, int threshold);

int main (int argc, char** argv) {
    // OpenCV で 画像を読み込む
    Mat src = imread(INPUT_IMAGE);
    AXI_STREAM src_axi, dst_axi;

    // Mat フォーマットから AXI4 Stream へ変換
    cvMat2AXIvideo(src, src_axi);

    // image_filter() 関数をコール
    image_filter(src_axi, dst_axi, src.rows, src.cols, THESHOLD_LEVEL);

    // AXI4 Stream から Mat フォーマットへ変換
    // dst は宣言時にサイズとカラー・フォーマットを定義する必要がある
    Mat dst(src.rows, src.cols, CV_8UC3);
    AXIvideo2cvMat(dst_axi, dst);

    // Mat フォーマットからファイルに書き込み
    imwrite(OUTPUT_IMAGE, dst);

    // opencv_image_filter() をコール
    Mat dst_cv(src.rows, src.cols, CV_8UC3);
    opencv_imaga_filter(src, dst_cv, THESHOLD_LEVEL);
    imwrite(OUTPUT_IMAGE_CV, dst_cv);

    // dst と dst_cv が同じ画像かどうか?比較する
    for (int y=0; y<src.rows; y++){
        Vec3b* dst_ptr = dst.ptr<Vec3b>(y);
        Vec3b* dst_cv_ptr = dst_cv.ptr<Vec3b>(y);
        for (int x=0; x<src.cols; x++){
            Vec3b dst_bgr = dst_ptr[x];
            Vec3b dst_cv_bgr = dst_cv_ptr[x];

            // bgr のどれかが間違っていたらエラー
            if (dst_bgr[0] != dst_cv_bgr[0] || dst_bgr[1] != dst_cv_bgr[1] || dst_bgr[2] != dst_cv_bgr[2]){
                printf("x = %d, y = %d,  Error dst=%d,%d,%d dst_cv=%d,%d,%d\n", x, y,
                        dst_bgr[0], dst_bgr[1], dst_bgr[0], dst_cv_bgr[0], dst_cv_bgr[1], dst_cv_bgr[2]);
                //return 1;
            }
        }
    }
    printf("Test with 0 errors.\n");

    return 0;
}

void opencv_imaga_filter(Mat& src, Mat& dst, int threshold){
     src.copyTo(dst); // 深いコピー
     std::vector<Mat> layers;
     std::vector<KeyPoint> keypoints;
     split(src, layers);
     FAST(layers[0], keypoints, threshold, true);
     for (int i = 0; i < keypoints.size(); i++) {
         rectangle(dst,
                 Point(keypoints[i].pt.x-1, keypoints[i].pt.y-1),
                 Point(keypoints[i].pt.x+1, keypoints[i].pt.y+1),
                 Scalar(255,0), CV_FILLED);
     }
}


Vivado HLS 2016.1 のプロジェクトで試した。
Vivado_HLS_OpenCV_114_160421.png

C シミュレーションを行った。今回は threshold を 10, 20, 40, 60, 80 に変更しながら、C シミュレーションを行った。
まずは、threshold = 10 の時の test_result.jpg を示す。
Vivado_HLS_OpenCV_115_160421.jpg

threshold = 20 の時の test_result.jpg を示す。
Vivado_HLS_OpenCV_116_160421.jpg

threshold = 40 の時の test_result.jpg を示す。
Vivado_HLS_OpenCV_117_160421.jpg

threshold = 60 の時の test_result.jpg を示す。
Vivado_HLS_OpenCV_118_160421.jpg

threshold = 80 の時の test_result.jpg を示す。
Vivado_HLS_OpenCV_119_160421.jpg

threshold が大きくなるに従って、青い点が減っていくのが分かった。
  1. 2016年04月21日 04:51 |
  2. OpenCV
  3. | トラックバック:0
  4. | コメント:0

FASTXコーナー検出IPのカメラ表示システム5(Vivado HLS 2016.1でやってみた3)

FASTXコーナー検出IPのカメラ表示システム4(Vivado HLS 2016.1でやってみた2)”の続き。

前回は、hls::Duplicate() で複製された img_1_ の data_stream に hls::FASTX() と hls::Dilate() の最大レイテンシの 7 行と 3 行を足した 10 行分より多い 2 の 13 乗の 8196 個の FIFO バッファを付けるように STREAM ディレクティブを指定した。
今回は、前回作製した FASTX コーナー検出IP を使用して、Vivado 2016.1 で論理合成、インプリメントを行って、SDKでZYBO にコンフィグレーションしアプリケーションを起動して、 FASTX コーナー検出できるかどうかを確かめた。

まずは、Vivado HLS 2016.1 で IP としてパッケージした C:\Users\Masaaki\Documents\Vivado_HLS\ZYBO\test\opencv_ex_ug2_161\solution1\impl\ip\xilinx_com_hls_image_filter_1_0.zip を展開して、Z:\V_ZYBO_CAMDS_FASTX_161\FASTX_OpenCV_154 に貼り付け直した。
Vivado_HLS_OpenCV_107_160420.png

Vivado 2016.1 の V_ZYBO_CAMDS ブロックデザインを示す。
Vivado_HLS_OpenCV_112_160420.png

camera_interface サブモジュールを示す。image_filter が FASTX コーナー検出IP だ。
Vivado_HLS_OpenCV_113_160420.png

論理合成、インプリメント、ビットストリーム生成後のVivado を示す。
Vivado_HLS_OpenCV_108_160420.png

Summary を示す。
Vivado_HLS_OpenCV_109_160420.png

ハードウェアをエクスポートして、SDK を立ち上げた。
Vivado_HLS_OpenCV_110_160420.png

Program FPGA を行って、cam_disp.elf を右クリックメニューの Run As -> 4 Launch on Hardware (GDB) を選択して、ZYBO 上で実行するとカメラ画像が表示された。
fast_on.elf を右クリックメニューの Run As -> 4 Launch on Hardware (GDB) を選択して、ZYBO 上で実行すると青い点でFASTX コーナー検出された。できました~。。。
Vivado_HLS_OpenCV_111_160420.jpg

特にスタジャンのエンブレムの所に青い点が集まっている。カメラの画像がリアルタイムにFASTX コーナー検出された。
  1. 2016年04月20日 03:57 |
  2. OpenCV
  3. | トラックバック:0
  4. | コメント:0
»