WRTnode 2R 开发OpenCV C++程序

首先当然是下载OpenCV的源码,我这里的OpenCV版本是2.4.11。下载地址:http://opencv.org/downloads.html(87.4MB)。

下载好之后解压,然后安装cmake,并打开cmake-gui开始配置交叉编译。

1
2
sudo apt-get install cmake cmake-qt-gui
cmake-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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cstdio>

using namespace cv;

int main()
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;

Mat frame;
int i = 0;
char filename[10];
while(i<5)
{
i++;
cap.read(frame);
sprintf(filename, "img%d.jpg", i);
imwrite(filename, frame);
printf("frame:%d\n", i);
}

return 0;
}

编译并上传到/root目录下:

1
2
mipsel-openwrt-linux-g++ test.cpp -o test -lopencv_core -lopencv_highgui
scp test root@192.168.8.1:/root

如果你还没有给交叉编译器创建软链接,现在可以创建一个:

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
2
3
ssh root@192.168.8.1
echo 1 > /sys/bus/usb/devices/1-1.3/bConfigurationValue
./test

我们可以看到,拍好了五张图片,每张大小在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