1. 程式人生 > >opencv2.0移植到ARM

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:
這裡寫圖片描述