Wednesday, February 26, 2014
Building OpenCV-2.4.X for Freescale's i.MX6 BSP (Yocto)
Lately a lot of people are working with the
Yocto Project and many of them migrated from LTIB (like me). Yocto uses a different conception when adding new packages/applications to the system, now everything is based on RECIPES. As it is being highly used, the amount of packages (recipes) already included is very big and it keep increasing continuously. For our lucky the recipe for OpenCV is already there, we just need to configure the system in order to add it to us.
In order to get everything up running we will divide de taks in steps:
Step #1 - Installing Yocto
--------------------------
As our focus is to install OpenCV, the Yocto install procedure we can use this very good tutorial created by Daiane: https://community.freescale.com/docs/DOC-94849
Step #2 - Enabling OpenCV
----------------------------
As we already have the OpenCV recipe in our Yocto release, we just need to add what packages we want in our local.conf file, located at /yocto/fsl-community-bsp/build/conf. With some modification (opencv package), it should look like this:
MACHINE ??= 'imx6qsabresd'
DISTRO ?= 'poky'
PACKAGE_CLASSES ?= "package_rpm"
EXTRA_IMAGE_FEATURES = "debug-tweaks dev-pkgs"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS = "\
STOPTASKS,${TMPDIR},1G,100K \
STOPTASKS,${DL_DIR},1G,100K \
STOPTASKS,${SSTATE_DIR},1G,100K \
ABORT,${TMPDIR},100M,1K \
ABORT,${DL_DIR},100M,1K \
ABORT,${SSTATE_DIR},100M,1K"
PACKAGECONFIG_pn-qemu-native = "sdl"
ASSUME_PROVIDED += "libsdl-native"
CONF_VERSION = "1"
BB_NUMBER_THREADS = '4'
PARALLEL_MAKE = '-j 4'
DL_DIR ?= "${BSPDIR}/downloads/"
ACCEPT_FSL_EULA = ""
CORE_IMAGE_EXTRA_INSTALL += "gpu-viv-bin-mx6q gpu-viv-bin-mx6q-dev"
CORE_IMAGE_EXTRA_INSTALL += "libopencv-core-dev libopencv-highgui-dev
libopencv-imgproc-dev libopencv-objdetect-dev libopencv-ml-dev"
LICENSE_FLAGS_WHITELIST = "commercial"
Note that we included the "-dev" packages, this is necessary if you always want to have the OpenCV headers/libraries included in the rootfs, Yocto is smart if you don´t add a "-dev" package and the libraries are just included any application that uses it needs to be built. As we always want our OpenCV stuff to build our applications so we use it this way.
Step #3 - Building OpenCV
----------------------------
Now the easy part:
/yocto/fsl-community-bsp/build$ ./bitbake core-image-x11
after build is finished you can check the images generated by the bitbake command at:
/build/tmp/deploy/images/imx6qsabresd/
and after extracting the rootfs: core-image-x11-imx6qsabresd.tar.bz2, you can find the opencv libraries in the /usr/lib folder:
andre@b22958:~/bsps/yocto/rootfs$ ls usr/lib/libopen*
usr/lib/libopencv_calib3d.so usr/lib/libopencv_ml.so
usr/lib/libopencv_calib3d.so.2.4 usr/lib/libopencv_ml.so.2.4
usr/lib/libopencv_calib3d.so.2.4.7 usr/lib/libopencv_ml.so.2.4.7
usr/lib/libopencv_contrib.so usr/lib/libopencv_nonfree.so
usr/lib/libopencv_contrib.so.2.4 usr/lib/libopencv_nonfree.so.2.4
usr/lib/libopencv_contrib.so.2.4.7 usr/lib/libopencv_nonfree.so.2.4.7
usr/lib/libopencv_core.so usr/lib/libopencv_objdetect.so
usr/lib/libopencv_core.so.2.4 usr/lib/libopencv_objdetect.so.2.4
usr/lib/libopencv_core.so.2.4.7 usr/lib/libopencv_objdetect.so.2.4.7
usr/lib/libopencv_features2d.so usr/lib/libopencv_ocl.so
usr/lib/libopencv_features2d.so.2.4 usr/lib/libopencv_ocl.so.2.4
usr/lib/libopencv_features2d.so.2.4.7 usr/lib/libopencv_ocl.so.2.4.7
usr/lib/libopencv_flann.so usr/lib/libopencv_photo.so
usr/lib/libopencv_flann.so.2.4 usr/lib/libopencv_photo.so.2.4
usr/lib/libopencv_flann.so.2.4.7 usr/lib/libopencv_photo.so.2.4.7
usr/lib/libopencv_gpu.so usr/lib/libopencv_stitching.so
usr/lib/libopencv_gpu.so.2.4 usr/lib/libopencv_stitching.so.2.4
usr/lib/libopencv_gpu.so.2.4.7 usr/lib/libopencv_stitching.so.2.4.7
usr/lib/libopencv_highgui.so usr/lib/libopencv_superres.so
usr/lib/libopencv_highgui.so.2.4 usr/lib/libopencv_superres.so.2.4
usr/lib/libopencv_highgui.so.2.4.7 usr/lib/libopencv_superres.so.2.4.7
usr/lib/libopencv_imgproc.so usr/lib/libopencv_video.so
usr/lib/libopencv_imgproc.so.2.4 usr/lib/libopencv_video.so.2.4
usr/lib/libopencv_imgproc.so.2.4.7 usr/lib/libopencv_video.so.2.4.7
usr/lib/libopencv_legacy.so usr/lib/libopencv_videostab.so
usr/lib/libopencv_legacy.so.2.4 usr/lib/libopencv_videostab.so.2.4
usr/lib/libopencv_legacy.so.2.4.7 usr/lib/libopencv_videostab.so.2.4.7
andre@b22958:~/bsps/yocto/rootfs$
After those 3 steps above you should be able to find all the OpenCV headers/libraries needed by mostly of your application, but in any case you need more dev packages, you can look at: /tmp/work/cortexa9hf-vfp-neon-poky-linux-gnueabi/opencv/2.4.6+gitAUTOINC+1253c2101b-r0/packages-split
Now that you have the OpenCV headers/libraries we need the toolchain to build our sample application, just re-do the bitbake command now adding the "-c populate" option in the command line:
/yocto/fsl-community-bsp/build$ ./bitbake core-image-x11 -c populate_sdk
and then run the install script created at: /yocto/fsl-community-bsp/build/tmp/deploy/sdk to install it.
With that you will be able to see the toolchain installed at: /opt/poky
Now we are able to test our sample code, just a camera test and you can find the source code here: camera_test_sample
To build this application you need a new terminal window (all environment variables will be reset), then run the setup environment:
$ cd /opt/poky/1.5+snapshot/
$ . ./envionment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi
and then go to the camera_test_yocto folder and type make. The binary will be placed in the bin folder.
Once flashed your card with the Yocto image (opencv included), mount the sd card in your host computer and then copy the binary to your rootfs.
To test it, run the application with the following command:
$ DISPLAY =:0 ./camera_test
EOF !
In order to get everything up running we will divide de taks in steps:
Step #1 - Installing Yocto
--------------------------
As our focus is to install OpenCV, the Yocto install procedure we can use this very good tutorial created by Daiane: https://community.freescale.com/docs/DOC-94849
Step #2 - Enabling OpenCV
----------------------------
As we already have the OpenCV recipe in our Yocto release, we just need to add what packages we want in our local.conf file, located at /yocto/fsl-community-bsp/build/conf. With some modification (opencv package), it should look like this:
MACHINE ??= 'imx6qsabresd'
DISTRO ?= 'poky'
PACKAGE_CLASSES ?= "package_rpm"
EXTRA_IMAGE_FEATURES = "debug-tweaks dev-pkgs"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS = "\
STOPTASKS,${TMPDIR},1G,100K \
STOPTASKS,${DL_DIR},1G,100K \
STOPTASKS,${SSTATE_DIR},1G,100K \
ABORT,${TMPDIR},100M,1K \
ABORT,${DL_DIR},100M,1K \
ABORT,${SSTATE_DIR},100M,1K"
PACKAGECONFIG_pn-qemu-native = "sdl"
ASSUME_PROVIDED += "libsdl-native"
CONF_VERSION = "1"
BB_NUMBER_THREADS = '4'
PARALLEL_MAKE = '-j 4'
DL_DIR ?= "${BSPDIR}/downloads/"
ACCEPT_FSL_EULA = ""
CORE_IMAGE_EXTRA_INSTALL += "gpu-viv-bin-mx6q gpu-viv-bin-mx6q-dev"
CORE_IMAGE_EXTRA_INSTALL += "libopencv-core-dev libopencv-highgui-dev
libopencv-imgproc-dev libopencv-objdetect-dev libopencv-ml-dev"
LICENSE_FLAGS_WHITELIST = "commercial"
Note that we included the "-dev" packages, this is necessary if you always want to have the OpenCV headers/libraries included in the rootfs, Yocto is smart if you don´t add a "-dev" package and the libraries are just included any application that uses it needs to be built. As we always want our OpenCV stuff to build our applications so we use it this way.
Step #3 - Building OpenCV
----------------------------
Now the easy part:
/yocto/fsl-community-bsp/build$ ./bitbake core-image-x11
after build is finished you can check the images generated by the bitbake command at:
/build/tmp/deploy/images/imx6qsabresd/
and after extracting the rootfs: core-image-x11-imx6qsabresd.tar.bz2, you can find the opencv libraries in the /usr/lib folder:
andre@b22958:~/bsps/yocto/rootfs$ ls usr/lib/libopen*
usr/lib/libopencv_calib3d.so usr/lib/libopencv_ml.so
usr/lib/libopencv_calib3d.so.2.4 usr/lib/libopencv_ml.so.2.4
usr/lib/libopencv_calib3d.so.2.4.7 usr/lib/libopencv_ml.so.2.4.7
usr/lib/libopencv_contrib.so usr/lib/libopencv_nonfree.so
usr/lib/libopencv_contrib.so.2.4 usr/lib/libopencv_nonfree.so.2.4
usr/lib/libopencv_contrib.so.2.4.7 usr/lib/libopencv_nonfree.so.2.4.7
usr/lib/libopencv_core.so usr/lib/libopencv_objdetect.so
usr/lib/libopencv_core.so.2.4 usr/lib/libopencv_objdetect.so.2.4
usr/lib/libopencv_core.so.2.4.7 usr/lib/libopencv_objdetect.so.2.4.7
usr/lib/libopencv_features2d.so usr/lib/libopencv_ocl.so
usr/lib/libopencv_features2d.so.2.4 usr/lib/libopencv_ocl.so.2.4
usr/lib/libopencv_features2d.so.2.4.7 usr/lib/libopencv_ocl.so.2.4.7
usr/lib/libopencv_flann.so usr/lib/libopencv_photo.so
usr/lib/libopencv_flann.so.2.4 usr/lib/libopencv_photo.so.2.4
usr/lib/libopencv_flann.so.2.4.7 usr/lib/libopencv_photo.so.2.4.7
usr/lib/libopencv_gpu.so usr/lib/libopencv_stitching.so
usr/lib/libopencv_gpu.so.2.4 usr/lib/libopencv_stitching.so.2.4
usr/lib/libopencv_gpu.so.2.4.7 usr/lib/libopencv_stitching.so.2.4.7
usr/lib/libopencv_highgui.so usr/lib/libopencv_superres.so
usr/lib/libopencv_highgui.so.2.4 usr/lib/libopencv_superres.so.2.4
usr/lib/libopencv_highgui.so.2.4.7 usr/lib/libopencv_superres.so.2.4.7
usr/lib/libopencv_imgproc.so usr/lib/libopencv_video.so
usr/lib/libopencv_imgproc.so.2.4 usr/lib/libopencv_video.so.2.4
usr/lib/libopencv_imgproc.so.2.4.7 usr/lib/libopencv_video.so.2.4.7
usr/lib/libopencv_legacy.so usr/lib/libopencv_videostab.so
usr/lib/libopencv_legacy.so.2.4 usr/lib/libopencv_videostab.so.2.4
usr/lib/libopencv_legacy.so.2.4.7 usr/lib/libopencv_videostab.so.2.4.7
andre@b22958:~/bsps/yocto/rootfs$
ps: don´t forget to flash the card with the image created at /tmp/deploy/images/imx6qsabresd/core-image-x11-imx6qsabresd.sdcard
$ sudo dd if= /build/tmp/deploy/images/imx6qsabresd/core-image-x11-imx6qsabresd.sdcard of=/dev/sdb
----------------------------------------
After those 3 steps above you should be able to find all the OpenCV headers/libraries needed by mostly of your application, but in any case you need more dev packages, you can look at: /tmp/work/cortexa9hf-vfp-neon-poky-linux-gnueabi/opencv/2.4.6+gitAUTOINC+1253c2101b-r0/packages-split
Now that you have the OpenCV headers/libraries we need the toolchain to build our sample application, just re-do the bitbake command now adding the "-c populate" option in the command line:
/yocto/fsl-community-bsp/build$ ./bitbake core-image-x11 -c populate_sdk
and then run the install script created at: /yocto/fsl-community-bsp/build/tmp/deploy/sdk to install it.
With that you will be able to see the toolchain installed at: /opt/poky
Now we are able to test our sample code, just a camera test and you can find the source code here: camera_test_sample
To build this application you need a new terminal window (all environment variables will be reset), then run the setup environment:
$ cd /opt/poky/1.5+snapshot/
$ . ./envionment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi
and then go to the camera_test_yocto folder and type make. The binary will be placed in the bin folder.
Once flashed your card with the Yocto image (opencv included), mount the sd card in your host computer and then copy the binary to your rootfs.
To test it, run the application with the following command:
$ DISPLAY =:0 ./camera_test
EOF !
Hi Andre,
ReplyDeleteThanks for the tutorial.
when I want to build OpenCV using "bitbake core-image-x11" (after changing the config file) I get the following error:
NOTE: Resolving any missing task queue dependencies
ERROR: Nothing RPROVIDES 'imgproc-dev' (but /home/mahyar/Yocto/sources/poky/meta/recipes-graphics/images/core-image-x11.bb RDEPENDS on or otherwise requires it)
NOTE: Runtime target 'imgproc-dev' is unbuildable, removing...
Missing or unbuildable dependency chain was: ['imgproc-dev']
ERROR: Required build target 'core-image-x11' has no buildable providers.
Missing or unbuildable dependency chain was: ['core-image-x11', 'imgproc-dev']
any idea how can I solve this problem?
Hi Mahyar,
ReplyDeletedid you get yocto using the tutorial I linked in the beginning of the post ?
I´ll double check, but I think that the OpenCV recipes are all good on this release.
regards,
Andre
I found the issue:
CORE_IMAGE_EXTRA_INSTALL += "libopencv-core-dev libopencv-highgui-dev libopencv- imgproc-dev libopencv-objdetect-dev libopencv-ml-dev"
there is a space between "libopencv-" and "imgproc-dev"... it should be all together "libopencv-imgproc-dev"
it will solve the issue.
regards,
andre