opencv(arm移植总结)

来源:互联网 发布:淘宝店铺装修不能编辑 编辑:程序博客网 时间:2024/05/22 16:00

之前写了一个自己当时的操作流程,

偶然看到一个当时自己移植opencv的总结,

当时用了一个月才弄明白怎么回事,

这里放到这里,

一是保留,也希望其他人能在这里节省时间。


嵌入式ARM系统中安装

这里使用的是Opencv1.0.0版。

首先说明这里之所以取1.0版本,

是因为当时我的编译器是3.4.1,

我试过编译2.0的但是不行。

后来分析了一下它的部分代码,

发现里边有宏定义要求4.0以上的才行。

所以以后也就都用1.0了。


下边是操作步骤:

首先解压文件:tar -jxvf opencv-1.0.0
之后:
OpenCV库编译
./configure --host=arm-linux --without-gtk --without-carbon --without-quicktime --without-1394libs --without-ffmpeg --without-python --without-swig --enable-static --disable-shared --disable-apps CXXFLAGS=arm-linux-g++ CPPFLAGS=-I/usr/include CXXFLAGS=-O2

--host=arm-linux :指出交叉编译arm平台
--without-gtk:忽略gtk+2.0 windows
--without-carbon: 不使用Mac OS上的X库
--without-quicktime
--without-1394libs
--without-ffmpeg
--without-python
--without-swig
--enable-static :生成静态库
--disable-shared:不生成动态库
--prefix=/usr/local/opencv :指定文件安装路径
--exec-perfix=/usr/local/opencv :当前未知
CXXFLAGS=-O2 :对编译进行优化//在编译时,尽量用-O2进行优化,否则容易出问题,
如果没有用,则自己对makefile文件,进行修改,将其优化选项改为-O2。
切记
生成makefile后,修改里边的otherlibs,将含有他的子目录将其删掉。

这里使用O2优化我也说不好,因为文件中默认的优化等级是O3,

开始没有编译成功,

后来我换成O2就成功了,

应该是里边有什么地方,

没有注意到。



make
make install
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

之后:
根据需要在/usr/local/lib/pkgconfig/opencv.pc的Libs项中加入参数-lpthread、-ldl之类,
例如
Libs: -L${libdir} -lcv -lcxcore -lcvaux -lml -lpthread -ldl

(-lcv -cvaux -lml -lpthread -dl -highgui -lm)//如果遇到问题,可以先添加这几个链接库试试,
看是否好用。

如果在编译时仍出问题,则将-lpthread -ldl直接写在makefile文件里,进行连接。

同时在这里可能没有包含math库,所以要自己,-lm进行连接math库

这里应该编译成功,

然后再下载到开发板中,

运行时可能还会出错,如果提示出现缺少libstdc++库的情况,可以在arm编译器目录下的lib目录中查找,拷贝到开发板中的/lib中,保程序可以找到即可。

这样以后,应该可以运行,如果有错,再到网上查找原因吧。


总结一点:

这里有这么多错误,

不过有很多是自己,

没有好好看出错原因而导致的无从下手更改。

还有就是,不知道错误原因是什么,

虽然看到了,报错,

却总是不知道,错在哪里,应该如何纠正。

说明自己在程序方面,还有很大的缺陷。
在出错时,第一个想到的不是去网上查找,如何解决,
而是自己逐行分析,错误的提示,
查找错误存在的位置,并分析。
这时,如果仍没有头绪,再上网将自己的错误报告贴出来,
让大家一起分析。
这样才知道,自己错在哪里,为什么错,该怎样分析这个错误,
错误的原因是什么,怎样改正这个错误。

这是在这次移植Opencv1.0.0时,收获最大的。
///////////////////////////////
Run "gcc -dM -E - < /dev/null" to see a list of gcc defined symbols

查看GCC的所有默认宏定义


在移植完成后有些方还是要修改。

主要是canny算法中有一个地方在1.0中是不适合,arm中用的。

主要现象是,

在调用设计canny的算法时,

图像处理后是全黑的情况。


原因是在使用cvRound函数时,

返回的数值,

在PC和arm上是正好相反的。


解决方法如下:

找到

vcCanny中的cvRound函数

typedef union Cv64suf
{
int64 i;
uint64 u;
double f;
}
Cv64suf;
int cvRound( double value )
{
#if 1
Cv64suf temp;
temp.f = value + 6755399441055744.0;
printf("f = %f, %d, %d\n", temp.f, (int)(temp.u >> 32), (int)(temp.u & 0xFFFFFFFF) );
return (int)temp.u;
#endif
}

将红色字体部分改为return int(value + 0.5);

这样就可以解决图像全黑的情况,

下来就可以使用opencv做自己的项目了。


所以如果是要移植2.0,或2.1以上建议使用4.0以上的编译器。

还有在2.0.0和2.1中已经解决了上边图像处理后全黑的代码,

所以在2.0和2.1中即使移植到arm中也是不会出现,

处理图像后,图像全黑。


这个不足的是用的arm中如果没有浮点运算单元,

程序执行起来,

会显得有些慢,

我当时一幅图像分析完,基本得要30s,

如果有浮点运算单元,

估计速度会好好多

如果用arm做的话,建议使用单浮点运算的。


在opencv的官方网站里有好多问题的解决,

上边的很多问题,就是在那里解决的,

可以多去看看。


原创粉丝点击