- opencv20移植到arm
- 背景
- 第一次移植
- 第二次arm移植
- 遇到的几个问题
- 代码
- 测试成功样例
opencv2.0移植到arm
背景
最近做实验需要将opencv移植到arm平台。刚开始也是一头雾水啊。之前学的opencv都是opencv2.4.7以后的。再写测试程序的时候也遇到了一些问题。后面会写到。但是最后终究是移植成功了的。
第一次移植
参照了博客:。我用的是opencv2.4.13。工具链是arm-linux-gcc-4.5.1。花了一天的功夫解决了其中一堆问题。最后移植到arm平台后报了。bus error的错误。查了一下午的资料都没有能够解决问题。移植失败。
说明了什么问题呢?
1,opencv版本很重要。目前已知移植成功了版本有opencv2.0 opencv2.1.0,opencv.2.4.0,强调一下2.4.0和2.4.13,前者移植成功了后者移植失败。
因此如果想一次成功版本最好是选择上面移植成功了的版本。
2,工具链版本很重要。每个版本对应的工具链最好也是选择博客中提到的。并且移植成功了的。
另外一篇参考的博客是
建议还是2.4.0。这个opencv2版本相对比较成熟了。opencv2.0只是勉强能用。但是到底文章上说移植成功了,是不是一定就是移植成功了,还不可知,无亲测。可以尝试一下。
上面两篇博客中提到的问题我都不再详述,请先看完上述两篇博客再来看此篇文章。
第二次arm移植
工具链:arm-linux-gcc-4.5.1
opencv版本opencv2.0
遇到的几个问题:
1,ttp://www.cnblogs.com/lib/libcv.so,needed by****/*.so not foud (try use –rpath or –rpath-link)
这种类型的错误。我尝试q
去把Wl,–rpwoath-link,*.so文件夹路经
加入到g++编译选项中去,并不能解决问题。最后我的解决方法是直接把*.so文件放到工具链目录下toolchain/arm-none-linux-gnueabi/sys-root/lib中就好了。这样比较暴力,但是比较方便,只是换第二个版本的时候得一个一个的手动删除,或者不用管(两个版本的.so文件名没有重复的情况下)。
2,找不到imwrite
我在头文件中加入了
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "cxmat.hpp"
依然找不到。最后只有用 cvSaveImage代替。
3,不能读取.jpg .png 只能读取 .bmp格式的图片。在opencv2.4.13用cmake-gui配置时可以选择 下面有几个选项,而opencv2.0没有找到。
所以开发只能是选择使用bmp格式的图像。不过第二篇文章中有人把qt移植到了arm平台用qt可以读取大部分格式的图片。再在中使用opencv的库就好了。
代码
测试代码,很烂但是测试成功了,也就懒得改了。
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "cxmat.hpp"
#include<iostream>
#include<vector>
using namespace std;
using namespace cv;
int main()
{
cout <<"begin:\n";
string src;
string out;
cout << "input source image(example: name.jpg)" <<endl;
cin >> src;
cout <<"input destination image name(example: out.jpg)"<<endl;
cin >> out;
assert(src.length() != 0 && out.length() != 0);
cout<<"src="<< src <<" "<<"out="<<out<<endl;
Mat srcimg = imread(src);
if (srcimg.empty() )
{
cout << "Can't read image from " << src << endl;
}
// imshow("source",srcimg);
//转化到 Hsv颜色空间
assert(srcimg.channels() == 3);
Mat hsvimg;
cvtColor(srcimg,hsvimg,CV_BGR2HSV);
cout << "1"<<endl;
Mat mergeImg;//合并后的图像
//用来存储各通道图片的向量
vector<Mat> splitBGR;
//分割通道,存储到splitBGR中
split(hsvimg,splitBGR);
cout << "2"<<endl;
//对v通道分别进行直方图均衡化
equalizeHist(splitBGR[2],splitBGR[2]);
//合并通道
merge(splitBGR,mergeImg);
Mat rt;
cvtColor(mergeImg,rt,CV_HSV2BGR);
cout << "3"<<endl;
//imshow("destination",mergeImg);
IplImage iplimg = rt;
cout << "4"<<endl;
//imwrite(out,mergeImg);
cvSaveImage(out.c_str(),&iplimg);
//灰度化
Mat out2;
cvtColor(rt,out2,CV_BGR2GRAY);
IplImage iplimg2 = out2;
cvSaveImage("g.bmp",&iplimg2);
cout << "end \n";
return 0;
}
注意 IplImage iplimg2 = out2; 这行,Mat转到IplImage
makefile
source=test.cpp
header=-I/home/dsz/桌面/arm-linux/include/opencv -I/home/dsz/桌面/arm-linux/include
lib=/home/dsz/桌面/arm-linux/lib
link=-lcv -lcxcore -lhighgui
#linkr=libcvaux.so libcv.so libcxcore.so libcxts.so libhighgui.so libml.so
test:${source}
arm-linux-g++ -g -Wall ${source} -o test3 ${header} ${link} -lpthread -lrt -ldl -Wl,-rpath-link,${lib} -L${lib}
clean:
rm test3
=号两边不能有空格,行前面的不是空格,是tab
测试成功样例:
src=b.bmp out=ba.bmp
b.bmp:
ba.bmp
g.bmp: