====== new OpenCV & video4linux RPi camera support ====== \\ Finally, it happened: as of 2014, May, the **new 2.4.9 [[http://www.opencv.org|OpenCV]]** release features support for Raspberry Pi camera module :)\\ This will leverage the needs for a seamless usage of our camera within openCV code.\\ {{:rpi:rpi_camera.jpeg?direct&300|RPi camera module.}}{{:rpi:raspberry_pi_camera.jpg?direct&300|RPi and camera attached.}} \\ However, to benefits from openCV support of RPi camera, we ought to: * [[.opencv_install#RPi upgrade|Upgrade]] RPi packages **and** Firmware, * [[.opencv_install#Enable camera]] support at system level, * Load video4linux RPi camera kernel mode @ [[.opencv_install#Permanent Kernel module|boot time]], * [[.opencv_install#openCV install|lastest openCV]] install, * [[.opencv_install#Sample code|C & python sample code]] using freshly installed openCV, * [//alternative//] [[.opencv_install#openCV build@SL65|Build openCV for Scientific Linux 6.5]]. \\ //**__Warning: very long operation__**// The whole process leading you to a new working openCV with RPi camera support will take almost **10 hours!** \\ ===== RPi upgrade ===== To benefits from the new video for linux driver that exposes an interface to openCV, you need first to fully update your RPi.\\ sudo su apt-get -y update apt-get -y upgrade /sbin/reboot //Note: last reboot may not be usefull if there has not been any kernel upgrade.// \\ Now we'll update the RPi's firmware itself.\\ sudo su apt-get -y install rpi-update rpi-update /sbin/reboot //Note: You may want to restart a firmware upgrade anew after reboot occured.// \\ ===== Enable camera support ===== To enable camera support @ system-level on the RPi: raspi-config Then select ''enable camera''.\\ As an //alternative//, you can also enable camera support using CLI: cat >> /boot/config.txt # for more options see http://elinux.org/RPi_config.txt start_x=1 gpu_mem=128 EOF \\ ===== Permanent kernel module ===== The most convenient way is to have Video for Linux kernel module **bcm2835-v4l2** loaded at boot time:\\ cat >> /etc/modules << EOF # v4l2 camera bcm2835-v4l2 EOF Upon next reboot, the kernel module will be loaded --> #lsmod | grep -i v4l2 to check.\\ As an alternative, you may also load the kernel module immediately using ''modprobe bcm2835-v4l2''. \\ Below is an excerpt of the [[http://www.ics.com/blog/raspberry-pi-camera-module#.U5BX3ucW2_F|v4l2 kernel module]] documentation: # Load the module sudo modprobe bcm2835-v4l2 # Control the viewfinder v4l2-ctl --overlay=1 # enable viewfinder v4l2-ctl --overlay=0 # disable viewfinder # Record a video v4l2-ctl --set-fmt-video=width=1920,height=1088,pixelformat=4 v4l2-ctl --stream-mmap=3 --stream-count=100 --stream-to=somefile.264 # Capture a JPEG image v4l2-ctl --set-fmt-video=width=2592,height=1944,pixelformat=3 v4l2-ctl --stream-mmap=3 --stream-count=1 --stream-to=somefile.jpg # Set the video bitrate v4l2-ctl --set-ctrl video_bitrate=10000000 # Set the video framerate v4l2-ctl --set-parm=5 # List the supported formats v4l2-ctl --list-formats \\ ===== openCV install ===== Finally, you're now ready to launch the **longuest part** of this tutorial: lastest openCV installation.\\ Some of the information below have been borrowed over the Internet and adapted to the available software at the time of writing (2014, June).\\ [[http://robertcastle.com/2014/02/installing-opencv-on-a-raspberry-pi/|]] \\ **[1] required packages**\\ sudo su apt-get -y install build-essential cmake cmake-curses-gui pkg-config libpng12-0 \ libpng12-dev libpng++-dev libpng3 libpnglite-dev zlib1g-dbg zlib1g zlib1g-dev \ pngtools libtiff4-dev libtiff4 libtiffxx0c2 libtiff-tools libeigen3-dev apt-get -y install libjpeg8 libjpeg8-dev libjpeg8-dbg libjpeg-progs ffmpeg \ libavcodec-dev libavcodec53 libavformat53 libavformat-dev libgstreamer0.10-0-dbg \ libgstreamer0.10-0 libgstreamer0.10-dev libxine1-ffmpeg libxine-dev libxine1-bin \ libunicap2 libunicap2-dev swig libv4l-0 libv4l-dev python-numpy python-dev libgtk2.0-dev \\ **[2] retrieve openCV lastest archive**\\ At the time of writing, latest available [[http://www.opencv.org/downloads.html|openCV archive]] is rev. 2.4.9 wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.zip \\ **[3] unzip and prepare to build**\\ unzip opencv-2.4.9.zip cd opencv-2.4.9 mkdir release cd release ccmake ../ \\ **[4] build options**\\ After having launched ncurse version of the cmake gui, ''press c'' to configure with the following options: ANT_EXECUTABLE ANT_EXECUTABLE-NOTFOUND BUILD_DOCS OFF BUILD_EXAMPLES OFF BUILD_JASPER ON BUILD_JPEG ON BUILD_OPENEXR ON BUILD_PACKAGE ON BUILD_PERF_TESTS ON BUILD_PNG ON BUILD_SHARED_LIBS ON BUILD_TBB OFF BUILD_TESTS ON BUILD_TIFF ON BUILD_WITH_DEBUG_INFO ON BUILD_ZLIB ON BUILD_opencv_apps ON BUILD_opencv_calib3d ON BUILD_opencv_contrib ON BUILD_opencv_core ON BUILD_opencv_features2d ON BUILD_opencv_flann ON BUILD_opencv_gpu ON BUILD_opencv_highgui ON BUILD_opencv_imgproc ON BUILD_opencv_legacy ON BUILD_opencv_ml ON BUILD_opencv_nonfree ON BUILD_opencv_objdetect ON BUILD_opencv_ocl ON BUILD_opencv_photo ON BUILD_opencv_python ON BUILD_opencv_stitching ON BUILD_opencv_superres ON BUILD_opencv_ts ON BUILD_opencv_video ON BUILD_opencv_videostab ON BUILD_opencv_world OFF CLAMDBLAS_INCLUDE_DIR CLAMDBLAS_INCLUDE_DIR-NOTFOUND CLAMDBLAS_ROOT_DIR CLAMDBLAS_ROOT_DIR-NOTFOUND CLAMDFFT_INCLUDE_DIR CLAMDFFT_INCLUDE_DIR-NOTFOUND CLAMDFFT_ROOT_DIR CLAMDFFT_ROOT_DIR-NOTFOUND CMAKE_BUILD_TYPE Release CMAKE_CONFIGURATION_TYPES Debug;Release CMAKE_INSTALL_PREFIX /usr/local CMAKE_VERBOSE OFF CUDA_BUILD_CUBIN OFF CUDA_BUILD_EMULATION OFF CUDA_HOST_COMPILER /usr/bin/gcc CUDA_SDK_ROOT_DIR CUDA_SDK_ROOT_DIR-NOTFOUND CUDA_SEPARABLE_COMPILATION OFF CUDA_TOOLKIT_ROOT_DIR CUDA_TOOLKIT_ROOT_DIR-NOTFOUND CUDA_VERBOSE_BUILD OFF EIGEN_INCLUDE_PATH /usr/include/eigen3 ENABLE_COVERAGE OFF ENABLE_NEON OFF ENABLE_NOISY_WARNINGS OFF ENABLE_OMIT_FRAME_POINTER ON ENABLE_PRECOMPILED_HEADERS ON ENABLE_PROFILING OFF ENABLE_SOLUTION_FOLDERS OFF ENABLE_VFPV3 OFF EXECUTABLE_OUTPUT_PATH /root/opencv-2.4.9/release/bin GIGEAPI_INCLUDE_PATH GIGEAPI_INCLUDE_PATH-NOTFOUND GIGEAPI_LIBRARIES GIGEAPI_LIBRARIES-NOTFOUND INSTALL_CREATE_DISTRIB OFF INSTALL_C_EXAMPLES OFF INSTALL_PYTHON_EXAMPLES OFF INSTALL_TESTS OFF INSTALL_TO_MANGLED_PATHS OFF OPENCV_CONFIG_FILE_INCLUDE_DIR /root/opencv-2.4.9/release OPENCV_EXTRA_MODULES_PATH OPENCV_WARNINGS_ARE_ERRORS OFF OPENEXR_INCLUDE_PATH OPENEXR_INCLUDE_PATH-NOTFOUND PVAPI_INCLUDE_PATH PVAPI_INCLUDE_PATH-NOTFOUND PYTHON_NUMPY_INCLUDE_DIR /usr/lib/pymodules/python2.7/numpy/core/include PYTHON_PACKAGES_PATH lib/python2.7/dist-packages SPHINX_BUILD SPHINX_BUILD-NOTFOUND WITH_1394 OFF WITH_CUBLAS OFF WITH_CUDA OFF WITH_CUFFT OFF WITH_EIGEN ON WITH_FFMPEG ON WITH_GIGEAPI OFF WITH_GSTREAMER ON WITH_GTK ON WITH_JASPER ON WITH_JPEG ON WITH_LIBV4L ON WITH_NVCUVID OFF WITH_OPENCL OFF WITH_OPENCLAMDBLAS OFF WITH_OPENCLAMDFFT OFF WITH_OPENEXR ON WITH_OPENGL ON WITH_OPENMP OFF WITH_OPENNI OFF WITH_PNG ON WITH_PVAPI ON WITH_QT OFF WITH_TBB OFF WITH_TIFF ON WITH_UNICAP OFF WITH_V4L ON WITH_VTK OFF WITH_XIMEA OFF WITH_XINE OFF ... then ''press 'g' '' to generate the various makefiles. \\ **[5] build | the 10 hours step!**\\ In order to ease this process, best is to launch it within a ''tmux'' session: apt-get -y install tmux cat >> ~/.tmux.conf << EOF # remap prefix to Control + a set -g prefix C-a unbind C-b bind C-a send-prefix # force a reload of the config file unbind r bind r source-file ~/.tmux.conf # quick pane cycling with C-a C-a unbind ^A bind ^A select-pane -t :.+ EOF //Note: this tmux config files let tmux to behave the same as ''screen'' with the same command set.// We'll now launch a tmux session, launch build and disconnect from session: tmux make && make install //type CTRL + a then d for disconnect// To reconnect to a running tmux session ''tmux attach''. \\ Congratulation, you've just installed latest openCV version with video4linux support for RPi camera :) \\ ===== Sample code ===== You'll find below some simple examples making use of your freshly installed new openCV version. #!/usr/bien/env python # -*-coding:Utf-8-* import cv2.cv as cv #default to capture from /dev/video0 capture = cv.CaptureFromCAM(0) while True: # Grab one frame from camera frame = cv.QueryFrame(capture) # Display frame in a window cv.ShowImage( "image", frame ) # Wait for ESC to end program c = cv.WaitKey(7) % 0x100 if c == 27: break cv.DestroyAllWindows() ... then launch this application test chmod a+x opencv_test.py ./opencv_test.py //Note: ESC key to quit.// \\ Another test using this time the openCV's C libraries. #include "opencv2/highgui/highgui.hpp" #include using namespace std; using namespace cv; int main(int argc, char** argv){ VideoCapture cap(-1); if (!cap.isOpened()) { cout << "Cannot open camera" << endl; return -1; } cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480); namedWindow("Output",CV_WINDOW_AUTOSIZE); while (1) { Mat frame; bool bSuccess = cap.read(frame); if (!bSuccess) { cout << "Cannot read a frame from camera" << endl; break; } imshow("Output", frame); if (waitKey(30) == 27) { cout << "Exit" << endl; break; } } return 0; } Code compilation and launch gcc opencv_test.cpp -o opencv_test -lopencv_core -lopencv_highgui ./opencv_test As an alternative, you can check the availability of the libs @ system.\\ pkg-config: to test availability of the opencv package @ system level pkg-config --libs opencv /usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_contrib.so /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_features2d.so /usr/local/lib/libopencv_flann.so /usr/local/lib/libopencv_gpu.so /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_imgproc.so /usr/local/lib/libopencv_legacy.so /usr/local/lib/libopencv_ml.so /usr/local/lib/libopencv_nonfree.so /usr/local/lib/libopencv_objdetect.so /usr/local/lib/libopencv_photo.so /usr/local/lib/libopencv_stitching.so /usr/local/lib/libopencv_superres.so /usr/local/lib/libopencv_ts.a /usr/local/lib/libopencv_video.so /usr/local/lib/libopencv_videostab.so -lrt -lpthread -lm -ldl \\ ===== openCV build@SL65 ===== To install openCV @ Scientific Linux 6.5, the same procedure applies as for the RPi version except libs dependencies resumed below:\\ [Nov. 14]: updated to OpenCV 3.0 yum -y install cmake28 cmake28-gui gcc gcc-c++ gtk2-devel gtk+-devel libpng-devel libjpeg-devel libtiff-devel jasper-devel libpng-devel zlib-devel eigen3-devel ffmpeg ffmpeg-devel bzip2-devel //Note: no rtsp support without ffmpeg!// ... and do not forget to add libs paths to the ''LD_LIBRARY_PATH'' env var: cat >> /etc/ld.so.conf.d/opencv.conf << EOF /usr/local/lib EOF ... and activate the new paths: ldconfig \\ ===== openCV build in a VM ===== //**__Warning: qemu-kvm illegal instruction issue__**// When building openCV in a VM, you must pay attention to processor's features \\ #> cat /proc/cpuinfo | grep -E "^flags" flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm unfair_spinlock pni cx16 hypervisor lahf_lm Here are typical processor flags of a qemu-kvm VM instance. This leads to some adjustements to the openCV compilation flags: \\ ...... ENABLE_AVX OFF ENABLE_SSE3 OFF ENABLE_SSE4 OFF ENABLE_SSE4_1 OFF ENABLE_SSE4_2 OFF ENABLE_SSSE3 OFF ......