查看: 7845|回复: 46

[原创] 移植opencv3.20到3519步骤

    [复制链接]
发表于 2017-2-22 14:32:22 | 显示全部楼层 |阅读模式
本帖最后由 liusir 于 2017-2-22 14:31 编辑

1.移植环境:

Ubuntu15.10 + arm-hisiv500-linux-

opencv3.20 [下载地址](http://opencv.org/downloads.html)

2.移植步骤:

1)安装cmake-gui

        shunzhi@ubuntu:~/hisi$ sudo apt-get install cmake-gui

2)新建一个opencv目录存放opencv-3.2.0.zip,并解压
        shunzhi@ubuntu:~/hisi$ mkdir opencv  
        shunzhi@ubuntu:~/hisi$ ls  
        opencv  opencv-3.2.0.zip  
        shunzhi@ubuntu:~/hisi$ unzip opencv-3.2.0.zip -d opencv  
        shunzhi@ubuntu:~/hisi$ cd opencv  
        shunzhi@ubuntu:~/hisi/opencv$ mkidr build _install  
        shunzhi@ubuntu:~/hisi/opencv$ ls  
        build  opencv-3.2.0  _install  


3)配置opencv编译环境
        shunzhi@ubuntu:~/hisi/opencv/opencv-3.2.0$ ls  
        3rdparty  cmake           CONTRIBUTING.md  doc      LICENSE  platforms  samples  
        apps      CMakeLists.txt  data             include  modules  README.md  
        shunzhi@ubuntu:~/hisi/opencv/opencv-3.2.0$cmake-gui  


点击Browse Source选择~/hisi/opencv/opencv-3.2.0  

点击Browse Build选择~/hisi/opencv/build  

点击Configure  


此时出现的对话框选择最后一项:Specify options for cross-compiling  

点击NEXT  

Operating System填写 arm-hisiv500-linux  

C填写arm-hisiv500-linux-gcc  

C++填写arm-hisiv500-linux-g++  


点击finish,然后等待Configuration done  

然后在出现的列表中修改CMAKE_INSTALL_PREFIX为~/hisi/opencv/_install  

点击Generate  

等待Generation done  

之后关闭cmake软件。  


4)编译opencv
        shunzhi@ubuntu:~/hisi/opencv/build$make


编译中遇到的问题:  
        ../../lib/libopencv_core.so: undefined reference to `pthread_mutex_trylock'
        ../../lib/libopencv_core.so: undefined reference to `pthread_mutexattr_settype'
        ../../lib/libopencv_core.so: undefined reference to `dlsym'
        ../../lib/libopencv_core.so: undefined reference to `pthread_mutexattr_destroy'
        ../../lib/libopencv_imgcodecs.so: undefined reference to `pthread_create'
        ../../lib/libopencv_core.so: undefined reference to `pthread_mutexattr_init'
        ../../lib/libopencv_core.so: undefined reference to `dlopen'
        ../../lib/libopencv_imgcodecs.so: undefined reference to `pthread_join'
        collect2: error: ld returned 1 exit status
        modules/core/CMakeFiles/opencv_perf_core.dir/build.make:816: recipe for target 'bin/opencv_perf_core' failed
        make[2]: *** [bin/opencv_perf_core] Error 1
        CMakeFiles/Makefile2:1341: recipe for target 'modules/core/CMakeFiles/opencv_perf_core.dir/all' failed
        make[1]: *** [modules/core/CMakeFiles/opencv_perf_core.dir/all] Error 2
        Makefile:146: recipe for target 'all' failed
        make: *** [all] Error 2


问题原因:
        cmake不认识我定义的arm-hisiv500-linux系统标记,没有加上库pthread和rt的链接选项


解决方案:修改CMakeCache.txt文件192行处  
        //Flags used by the linker.
        CMAKE_EXE_LINKER_FLAGS:STRING= -lpthread -lrt


5)安装opencv
        shunzhi@ubuntu:~/hisi/opencv/build$make install  
        shunzhi@ubuntu:~/hisi/opencv/_install$ ls  
        bin  include  lib  LICENSE  share  


3.测试:

1)编译测试程序
        shunzhi@ubuntu:~/hisi/opencv$ pwd
        /home/shunzhi/hisi/opencv
        shunzhi@ubuntu:~/hisi/opencv$ ls
        build  _install  opencv-3.2.0  test
        shunzhi@ubuntu:~/hisi/opencv$ cd test/
        shunzhi@ubuntu:~/hisi/opencv/test$ ls
        Makefile  opencv_hisi.c
        shunzhi@ubuntu:~/hisi/opencv/test$ make
        [Compiling] opencv_hisi.c ...
        shunzhi@ubuntu:~/hisi/opencv/test$ ls
        Makefile  opencv_hisi  opencv_hisi.c  opencv_hisi.o
        shunzhi@ubuntu:~/hisi/opencv/test$


2)测试程序

opencv_hisi.c

  1. #include <opencv/cv.h>
  2.         #include <opencv/highgui.h>
  3.         #include <stdio.h>[/p]
  4.         int main( int argc, char** argv )
  5.         {
  6.             IplImage* pImg; // 声明IplImage指针
  7.             // 载入图像,强制转化为Gray
  8.             if( argc == 3 && (pImg = cvLoadImage( argv[1], 0)) != 0 )
  9.             {
  10.                         IplImage* pImg2 = cvCreateImage(cvGetSize(pImg), pImg->depth, pImg->nChannels);
  11.                         cvCopy(pImg, pImg2, NULL);
  12.                         cvSaveImage(argv[2], pImg2);// 把图像写入文件
  13.                         cvReleaseImage( &pImg );    // 释放图像
  14.                         cvReleaseImage( &pImg2 );   // 释放图像
  15.                         printf("Success!\n");
  16.                         return 0;
  17.             }
  18.                 printf("Fail!\n");
  19.                 return -1;
  20.         }
复制代码

Makefile:

  1. CC = arm-hisiv500-linux-g++
  2. DEMOTAR = opencv_hisi
  3. DEMOOBJ = opencv_hisi.o
  4. CFLAGS += -g -Wall -I$(shell pwd)/../_install/include
  5. LDFLAGS += -L$(shell pwd)/../_install/lib -Wl,-Bdynamic -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lpthread -lrt
  6. %.o: %.c
  7.         @echo "[Compiling] $< ..."
  8.         @$(CC) $(CFLAGS) -c $<
  9. all: $(DEMOTAR)
  10. $(DEMOTAR):$(DEMOOBJ)
  11.         @$(CC) -o $@ $^ $(LDFLAGS)
  12. .PHONY : clean
  13.         clean:
  14.         rm -rf $(DEMOOBJ) $(DEMOTAR)
复制代码

4.测试结果

1)将opencv库拷贝到3519的开发板/usr/lib目录下。
        /usr/lib # ls
        libopencv_calib3d.so     libopencv_imgproc.so     libopencv_superres.so
        libopencv_core.so        libopencv_ml.so          libopencv_video.so
        libopencv_features2d.so  libopencv_objdetect.so   libopencv_videoio.so
        libopencv_flann.so       libopencv_photo.so       libopencv_videostab.so
        libopencv_highgui.so     libopencv_shape.so
        libopencv_imgcodecs.so   libopencv_stitching.so


2)开发板执行测试程序

        /mnt # ./opencv_hisi lena.jpg lena_test.jpg


注:

1)测试程序功能是将彩色图片转化为灰色图片(彩转灰)。  

2)lean.jpg文件在 ```opencv/opencv-3.2.0/samples/data/lena.jpg``` 位置。

楼主热帖
发表于 2017-7-10 11:45:56 | 显示全部楼层
July 发表于 2017-7-10 11:00
为什么不能移植ffmpeg呢?是否硬件性能受限?海思IVE是否就是类似ffmpeg的编解码库呢?我这里需要结合ope ...

没有说不能, 只是说一般脑子没进水都不会去做这事情,  即便移植了,每秒做个一帧编解码甚至几秒做一帧有什么意义,毫无竞争力, 除非ffmpeg支持海思芯片的硬件编解码器, 就现在来看显然不支持,

再次说一下我的观点, 移植opencv到海思的芯片上是没有价值的事情, 学生做作业请自便

移植opencv用来做什么?无非就是利用里面的算法来做图像处理, 那么用opencv在海思芯片上运行的速度如何呢?显然在arm核上跑的速度是无法和同样的算法在IVE上跑的速度比的, 那么用opencv产品化出来的东西有什么优势呢?

有人会说:我使用的算法, IVE没有相应算子, 但是这并不是移植opencv的理由,图像处理算法的实现并不需要opencv,就像楼主会问 “如何使opencv接收到mat或是iplimage类型的图片呢”,这就是典型的有个锤子,看什么都是钉子,理解算法才是重点

opencv比较适合用于算法开发,利用opencv在PC上根据需求和海思芯片的硬件特点来设计和验证算法才是比较合理的做法
发表于 2017-2-22 14:37:38 | 显示全部楼层
没有硬件加速的移植实际意义不大
 楼主| 发表于 2017-2-22 15:02:55 | 显示全部楼层
zhuangweiye 发表于 2017-2-22 14:37
没有硬件加速的移植实际意义不大

硬件加速移植是指的“SSE TO NEON”?
发表于 2017-2-22 15:13:58 | 显示全部楼层
liusir 发表于 2017-2-22 15:02
硬件加速移植是指的“SSE TO NEON”?

硬件是指IVE
发表于 2017-4-19 16:33:47 | 显示全部楼层
您好,测试程序运行时出现“Bus error” 这是什么情况?
发表于 2017-4-20 08:17:16 | 显示全部楼层
是的必须启用IVE,软跑延时太长
发表于 2017-4-25 10:50:15 | 显示全部楼层
好东西, 顶,顶,顶!
发表于 2017-6-21 17:22:42 | 显示全部楼层
如何启用IVE, 即将opencv与IVE联系起来,  求大神们指导
发表于 2017-6-29 09:32:04 | 显示全部楼层
zhuangweiye 发表于 2017-2-22 14:37
没有硬件加速的移植实际意义不大

,兄弟移植过EasyPR到板子上吗?高手!
发表于 2017-6-29 09:39:21 | 显示全部楼层
IVE 怎么搞起来,有没有指导帖子。
发表于 2017-6-29 09:42:12 | 显示全部楼层
好帖,出来透透气。
发表于 2017-6-29 13:45:14 | 显示全部楼层
zhuangweiye 发表于 2017-2-22 14:37
没有硬件加速的移植实际意义不大

完全同意。。
发表于 2017-6-29 14:57:13 | 显示全部楼层
本帖最后由 zhuangweiye 于 2017-6-29 15:12 编辑



在海思芯片上移植某个开源代码,目的是产品化应用,那么在普通ARM核上跑的图像处理软件的价值就很有限了

就好像应该不会有人在海思芯片上移植ffmpeg一样

不知道有没有人移植matlab

其实,海思的IVE算子就是参考opencv研发的,所以理解算法还是最重要的
 楼主| 发表于 2017-6-29 21:57:47 | 显示全部楼层
SA12009903 发表于 2017-6-29 09:32
,兄弟移植过EasyPR到板子上吗?高手!

这个没搞过,不过有移植成功的,识别率不咋地
 楼主| 发表于 2017-6-29 21:58:37 | 显示全部楼层
ecomsbz 发表于 2017-6-29 09:39
IVE 怎么搞起来,有没有指导帖子。

海思提供的直接模型导入ive跑的,参考我最新更新的帖子
您需要登录后才可以回帖 登录 | 注册

本版积分规则

© 2008-2017 当前位置 易百纳技术社区论坛 返回 易百纳技术社区 ( 苏ICP备14036084 )   Powered by Discuz! X3.1
快速回复 返回顶部 返回列表