如何编译一个适用于WRTnode的OpenCV应用

来自WRTnode Wiki
跳转至: 导航搜索
其他语言:
English • ‎中文(中国大陆)‎

OpenCV package 源码

opencv ipk源码
利用openwrt package的编译机制仅仅需要一个Makefile即可编译opencv。
为何会如此简单神奇,下面就对Makefile详解(个人看法,欢迎指正):

OpenCV Makefile写法

vim Makefile
 include $(TOPDIR)/rules.mk 
 PKG_NAME:=opencv 
 # PKG_NAME -软件包的名字, 在 menuconfig 和 ipkg 显示
 PKG_VERSION:=2.4.8 
 # PKG_VERSION -软件包的版本,主干分支的版本正是我们要下载的
 PKG_RELEASE:=1 
 # PKG_RELEASE -这个 makefile 的版本
 PKG_USE_MIPS16:=0 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).zip 
 # PKG_SOURCE -要下载的软件包的名字,一般是由 PKG_NAME 和 PKG_VERSION 组成
 PKG_SOURCE_URL:=http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.8/ 
 # PKG_SOURCE_URL -下载这个软件包的链接 ,从网上得到的
 PKG_MD5SUM:=50cc1433b3654074206f5b3dbfd49848 
 ##################################################
 # 软件包的 MD5 值,校验值,得到MD5的值的方法
 #$ ./scripts/update-package-md5sum ....../opencv/
 #PKG_CAT:= unzip
 #PKG_CAT -解压软件包的方法 (zcat, bzcat, unzip)
 ##################################################
 include $(INCLUDE_DIR)/package.mk 
 include $(INCLUDE_DIR)/cmake.mk 
 define Package/opencv/Default/description 
 the Open Source Computer Vision Library for linux 
 endef 
 define Package/opencv 
   SECTION:=libs 
   CATEGORY:=Libraries 
   TITLE:= opencv-2.4.8 
   DEPENDS:=+libpthread +librt +libstdcpp +zlib +libjpeg 
 endef 
 ##################################################
 #SECTION - 软件包类型 
 #CATEGORY - menuconfig中软件包所属的一级目录,如 Libraries
 #SUBMENU - menuconfig中软件包所属的二级目录(没有用到)
 #TITLE - 软件包标题
 #DESCRIPTION - 软件包的详细说明
 #URL - 软件的原始位置,一般是软件作者的主页
 #MAINTAINER - (optional) 软件包维护人员
 #DEPENDS - (optional) 依赖项,运行本软件依赖的其他包
 #################################################
 PKG_INSTALL:=1 
 CMAKE_OPTIONS += -DWITH_LIBV4L:BOOL=OFF -DBUILD_opencv_ts:BOOL=OFF
 #################################################
 #CMAKE_OPTIONS 
 #例如不想编译libv4l库、ts等,就选择OFF。
 #################################################
 define Build/InstallDev 
     $(INSTALL_DIR) $(1)/usr/include 
     $(CP) $(PKG_INSTALL_DIR)/usr/include/opencv $(1)/usr/include/ 
     $(CP) $(PKG_INSTALL_DIR)/usr/include/opencv2 $(1)/usr/include/ 
     $(INSTALL_DIR) $(1)/usr/lib 
     $(CP) $(PKG_INSTALL_DIR)/usr/lib/libopencv* $(1)/usr/lib/ 
 endef 
 #################################################
 # define Build/InstallDev 
 #生成的头文件和库放到  
 #./staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/usr/include 和 ./staging_dir/target- mipsel_24kec+dsp_uClibc-0.9.33.2/usr/lib 下
 #PKG_INSTALL_DIR  ./trunk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/opencv-2.4.8/ipkg-install 
 #################################################
 define Package/opencv/install 
     $(INSTALL_DIR) $(1)/usr/include 
     $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/ 
     $(INSTALL_DIR) $(1)/usr/lib 
     $(CP) $(PKG_INSTALL_DIR)/usr/lib/libopencv* $(1)/usr/lib/ 
 endef 
 $(eval $(call BuildPackage,opencv))
 #################################################
 #这是最为关键的BuildPackage宏。它是在$(INCLUDE_DIR)/package.mk文件里定义的。BuildPackage宏只要求 一个参数,即要编译的软件包名,在本例中是"opencv"。所有其他信息都通过宏来获得,这提供了一种内在的简洁性。比如BuildPackage需要软件包的一大串描述信息,我们并不要向它传递冗长的参数,因为我们已经约定描述信息定义在DESCRIPTION宏,BuildPackage从里面读取 就可以了。
 # Build/Compile (可选) 
 # 编译源代码命令
 # Package/install 
 # 软件安装命令,主要是把相关文件拷贝到指定目录,如配置文件。 
 #################################################

WRTnode配置里选上OpenCV

make menuconfig
Libraries  ---> <*> opencv............... opencv-2.4.11

编译OpenCV ipk

OpenCV的ipk在静态sdk里包含的有,具体位置$(TOPDIR)/package/feeds/packages
编译的方式有两种:
̽*直接编译固件,因为在配置里已选择opencv,直接编译固件opencv也就被编译了

make V=s
  • 仅仅编译OpenCV这个ipk
make package/opencv/compile V=s

clean opencv ipk

make package/opencv/clean V=s

这样的编译只是编译成一个ipk包,在$(TOPDIR)/bin/ramips/packages

OpenCV测试程序的编译

opencv-test ipk源码

下面我们利用opencv-test这个demo来测试opencv libs。测试程序实现功能是从摄像头读取图片,保存在当前目录。由于存储空间受限,就存6张图片。
下面是生成opencv-test ipk包所需要的Makefile,其编译方法与其他任何ipk包的编译方法完全一样。

vim Makefiel 
 include $(TOPDIR)/rules.mk
 PKG_NAME:=opencv-test
 PKG_RELEASE:=1
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
 PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install
 include $(INCLUDE_DIR)/kernel.mk
 include $(INCLUDE_DIR)/package.mk
 define Package/opencv-test
   SECTION:=wrtnode
   CATEGORY:=WRTnode
   SUBMENU :=demos
   TITLE:=opencv demo app
   DEPENDS := +opencv
 endef
 #################################################
 #DEPENDS := +opencv ,依赖opencv lib
 #################################################
 define Package/opencv-test/description
         WRTnode test program for opencv lib
 endef
 define Build/Prepare
         mkdir -p $(PKG_BUILD_DIR)
         $(CP) ./src/* $(PKG_BUILD_DIR)/
 endef
 define Build/Compile
         $(MAKE) -C $(PKG_BUILD_DIR) \
                 $(TARGET_CONFIGURE_OPTS) CFLAGS="$(TARGET_CFLAGS)" \
                         LDFLAGS="$(TARGET_LDFLAGS)"
 endef
 #################################################
 #$(TARGET_CONFIGURE_OPTS) 、$(TARGET_CFLAGS)、 $(TARGET_LDFLAGS)等定义在rules.mk 
 #################################################
 define Package/opencv-test/install
         $(INSTALL_DIR) $(1)/usr/bin
         $(INSTALL_BIN) $(PKG_BUILD_DIR)/cv_test $(1)/usr/bin/
 endef
 #################################################
 #cv_test 编译生成的可执行文件
 #################################################
 $(eval $(call BuildPackage,opencv-test))

而opencv-test的源码和编译二进制代码的Makefile在src目录下,有兴趣的同学可以深入研究。
备注:opencv应用程序几乎可以认为是跨平台的,我们可以在x86的windows或Mac下面进行开发,将与图形窗口显示和键盘输入等OpenWrt不能支持的代码去掉以后,即可保证在WRTnode上顺利编译通过并执行。