WRTnode 2R 开发OpenCV C++程序
首先当然是下载OpenCV的源码,我这里的OpenCV版本是2.4.11。下载地址:http://opencv.org/downloads.html(87.4MB)。
下载好之后解压,然后安装cmake,并打开cmake-gui开始配置交叉编译。
1 | sudo apt-get install cmake cmake-qt-gui |
选好源码的目录,这里我在桌面上创建了一个目录叫opencv-mipsel,用来存放编译好的文件。
设置好之后点击Configure。
选择最后一个选项(交叉编译)。
在Operating
System填上Linux,然后c和c++编译器选择/home/ypw/Desktop/wrtnode/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-gcc
这个编译器和```
/home/ypw/Desktop/wrtnode/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-g++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Target Root就是```
/home/ypw/Desktop/wrtnode/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin
``` 目录。Finish之后会看到很多选项。
[![](/images/Snip20151020_63.png)](/images/Snip20151020_63.png)
首先我们应该去掉**WITH_GTK**,**WITH_FFMPEG**,因为它们无法编译成功。(此处参考[opencv-2.4.4的交叉编译](http://wiki.wrtnode.com/index.php?title=Common_method/zh-cn "Common_method/zh-cn"),事实上我勾上以后并不会编译GTK和FFMPEG,也就是说能编译成功)
[![](/images/Snip20151020_66.png)](/images/Snip20151020_66.png)
然后还有**CMAKE_INSTALL_PREFIX**目录需要设置一下,这里我们选择了```
/usr/local/openwrt
``` 。
[![](/images/Snip20151020_69.png)](/images/Snip20151020_69.png)
最后点击Generate,然后进入openwrt-mipsel文件夹,输入make -j8开始编译。
```sh
cd /home/ypw/Desktop/opencv-mipsel
make -j8
编译过程中我出现过virtual memory exhausted: Cannot allocate memory
错误,建议将虚拟机内存扩大到4GB以上。
编译过程中会看到各种花花绿绿的信息输出,不出意外的话大概需要编译十分钟。
完成以后我们就可以安装刚编译好的库了。
1 | sudo make install |
除此之外还需要将库和头文件复制到toolchain中。
1 | sudo cp -r /usr/local/openwrt/* /home/ypw/Desktop/wrtnode/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2 |
然后我们就可以开始写我们的OpenCV程序了。参考Reading and Writing Images and Video。
1 | #include <opencv2/core/core.hpp> |
编译并上传到/root目录下:
1 | mipsel-openwrt-linux-g++ test.cpp -o test -lopencv_core -lopencv_highgui |
如果你还没有给交叉编译器创建软链接,现在可以创建一个:
1 | sudo ln -s /home/ypw/Desktop/wrtnode/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-g++ /usr/local/bin |
此外,我们还需要在WRTnode上安装OpenCV,不然会提示缺少库,就像这样:
1 | ./test: can't load library 'libopencv_highgui.so.2.4' |
所以解决方法是:
1 | Libraries ---> opencv |
开启opencv的编译,然后修改Makefile文件,开启highgui。为什么要开启highgui呢?因为要用VideoCapture就必须```
#include <opencv2/highgui/highgui.hpp> 1
2
3
```sh
/home/ypw/Desktop/wrtnode/feeds/packages/libs/opencv/Makefile
-DBUILD_opencv_highgui:BOOL=ON
然后make -j8
,如果以前编译过了OpenCV,最好先``` make
clean 1
2
3
4
5
6
7
[![](/images/Snip20151021_78.png)](/images/Snip20151021_78.png)
刷好新的固件之后,我们就可以在WRTnode上运行这个程序了。当然,刷完系统以后需要重新scp一下。
```sh
scp test root@192.168.8.1:/root
当然,运行test之前,USB电流问题也是需要解决的:
1 | ssh root@192.168.8.1 |
我们可以看到,拍好了五张图片,每张大小在100kb左右。
在Ubuntu中安装opencv的方法是这样的:
1 | sudo apt-get install libopencv-dev |
编译: 安装好之后可以直接用g++编译,在本机运行即可测试是否满足我们的需求。只要不含imshow之类的函数,一般可以直接移植到WRTnode 中运行。一般情况下我们会现在ubuntu里写好程序,再放到WRTnode中。
1 | g++ test.cpp -o test -lopencv_core -lopencv_highgui |