• 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没有找到。

OpenHarmony怎么移植opencv opencv移植到arm开发板_移植


所以开发只能是选择使用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:

OpenHarmony怎么移植opencv opencv移植到arm开发板_arm_02


ba.bmp

OpenHarmony怎么移植opencv opencv移植到arm开发板_#include_03


g.bmp:

OpenHarmony怎么移植opencv opencv移植到arm开发板_opencv_04