opencv2.0移植到ARM
opencv2.0移植到arm
背景
最近做實驗需要將opencv移植到arm平臺。剛開始也是一頭霧水啊。之前學的opencv都是opencv2.4.7以後的。再寫測試程式的時候也遇到了一些問題。後面會寫到。但是最後終究是移植成功了的。
第一次移植
參照了部落格:http://blog.csdn.net/luotuo44/article/details/8958990。我用的是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,工具鏈版本很重要。每個版本對應的工具鏈最好也是選擇部落格中提到的。並且移植成功了的。
另外一篇參考的部落格是http://www.cnblogs.com/s_agapo/archive/2011/11/24/2262346.html
建議還是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: