热度 17
2013-2-20 19:43
1870 次阅读|
0 个评论
之前写了一个自己当时的操作流程, 偶然看到一个当时自己移植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中也是不会出现, 处理图像后,图像全黑。 这个不足的是用的arm920T内核中如果没有浮点运算单元, 程序执行起来, 会显得有些慢, 我当时一幅图像分析完,基本得要30s, 如果有浮点运算单元, 估计速度会好好多 如果用arm做的话,建议使用单浮点运算的。 在opencv的官方网站里有好多问题的解决, 上边的很多问题,就是在那里解决的, 可以多去看看。