opencv在hisi平台的移植

2024-03-26 22:38
文章标签 平台 opencv 移植 hisi

本文主要是介绍opencv在hisi平台的移植,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

opencv249在hisi3516上的移植总结

经本人尝试opencv249在arm-hisiv200-linux-g++ 可以编译通过,在arm-hisiv100-linux-g++ 下编译会出现错误。本文分别介绍在arm-hisiv200-linux-g++ 和arm-hisiv100-linux-g++ 下opencv的编译方式。

一、arm-hisiv200-linux-g++交叉编译链 

Ubuntu12.04

OpenCV-2.4.9

1、在/home下新建文件夹

# mkdir opencv249

把下载的OpenCV-2.4.9.tar.bz2解压到/home/opencv 目录下

2、然后在home/opencv  新建一个 hisiv200-build 文件夹,作为CMake编译hisi版本的工作目录

# mkdir hisiv200-build


3、在终端里调出CMake gui界面:

# cmake-gui 

(1)在configure时选择

CMAKE_SYSTEM_NAME:hisiv-linux 
C:选择/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-gcc 
C++:选择/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-g++ 

修改安装目录:CMAKE_INSTALL_PREFIX:/opt/2.4.9-arm-hisiv200 

(2)   opencv编译OPENEXR时要用到libImath.so,

在配置界面要把build_opencvxr和with_opencvxr去掉,否则会出现这个问题。

/usr/lib/libImath.so: could not read symbols: File in wrong format 

collect2: ld returned 1 exit status 

make[2]: *** [lib/libopencv_highgui.so] 错误 1 

make[1]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/all] 错误 2 make: *** [all] 错误 2

    还要去掉build_opencv_ocl和with_opencl,否则会出下面的错误

../../lib/libopencv_ocl.so:undefined reference to 'dlopen' 

    还要去掉tiff库的编译

(3)修改默认安装路径,默认安装目录为/usr/local,但我想对它统一归类,所以我在opt/目录下新建了一个opencv249文件夹,在Cmake-gui里修改CMAKE_INSTALL_PREFIX变量改为/opt/opencv249/hisi

(4)修改hisiv200_build目录下的CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt

4、进行编译:make

5、make install

这样就移植完成


二、arm-hisiv100-linux-g++交叉编译链

Ubuntu10.04

OpenCV-2.4.2

步骤与上述一致。


三、配置编译环境

1、进入/opt/opencv249/hisi目录下,建立pkgconfig目录,进入目录建立hisiv200-opencv249.pc文件 #gedit hisiv200-opencv249.pc点击打开链接

        

2、编辑库连接配置文件

      #gedit /etc/ld.so.conf/hisiv200-opencv249.pc

      在文档中加入/opt/opencv249/hisi/lib

     然后启用配置sudo ldconfig


3、配置PKG_CONFIG_PATH 

#gedit /etc/bash.bashrc

在文档最后加入export PKG_CONFIG_PATH=/opt/opencv249/hisi:$PKG_CONFIG_PATH

#source /etc/bash/bashrc


4、测试#pkg-config --libs --cflags hisiv200-opencv249

会显示相应的头文件和库即可


四、编译程序

注意:embedded linux不支持OpenCV自己的Highgui,所以不能在目标板上使用cvNameWidow(),cvWaitKey(),cvShowImage()等显示函数,但是可以利用里面的cvLoad()等函数。

        

         本人写了一个脚本文件,与要编译的文件放在同一目录下,直接./ ******,就可以编译C和C++源文件, 点击打开链接

       注意:要在该脚本文件中加上-static。否则在hisi上无法运行。

如果出现cv异常之类的错误,就是使用了cvNameWidow(),cvWaitKey(),cvShowImage()等显示函数



opencv320在3519上的移植

1、修改opencv-3.2.0/platforms/linux/arm-gnueabi.toolchain.cmake,如下:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR arm-hisiv500-linux-gnueabi)set(GCC_COMPILER_VERSION "4.9" CACHE STRING "GCC Compiler version")set(FLOAT_ABI_SUFFIX "")
if (NOT SOFTFP)set(FLOAT_ABI_SUFFIX "hf")
endif()#CROSS COMPILE SETTING
set(TOOLCHAIN_DIR "/opt/hisi-linux/x86-arm/arm-hisiv500-linux/")
set(CMAKE_C_COMPILER "/opt/hisi-linux/x86-arm/arm-hisiv500-linux/bin/arm-hisiv500-linux-uclibcgnueabi-gcc")
set(CMAKE_CXX_COMPILER "/opt/hisi-linux/x86-arm/arm-hisiv500-linux/bin/arm-hisiv500-linux-uclibcgnueabi-g++")
set(CMAKE_FIND_ROOT_PATH /opt/hisi-linux/ /opt/hisi-linux/x86-arm/arm-hisiv500-linux/)
set(ARM_LINUX_SYSROOT /opt/hisi-linux/x86-arm/arm-hisiv500-linux/ CACHE PATH "ARM cross compile system root")MESSAGE(STATUS "This is cross compile dir --->"$(CMAKE_C_COMPILER))#find_program(CMAKE_C_COMPILER NAMES arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-gcc-${GCC_COMPILER_VERSION})
#find_program(CMAKE_CXX_COMPILER NAMES arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-g++-${GCC_COMPILER_VERSION})
#set(ARM_LINUX_SYSROOT /usr/arm-linux-gnueabi${FLOAT_ABI_SUFFIX} CACHE PATH "ARM cross compilation system root")#set(CMAKE_CXX_FLAGS           ""                    CACHE STRING "c++ flags")
#set(CMAKE_C_FLAGS             ""                    CACHE STRING "c flags")
#set(CMAKE_SHARED_LINKER_FLAGS ""                    CACHE STRING "shared linker flags")
#set(CMAKE_MODULE_LINKER_FLAGS ""                    CACHE STRING "module linker flags")
#set(CMAKE_EXE_LINKER_FLAGS    "-Wl,-z,nocopyreloc"  CACHE STRING "executable linker flags")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now ${CMAKE_SHARED_LINKER_FLAGS}")
set(CMAKE_MODULE_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now ${CMAKE_MODULE_LINKER_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS    "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now ${CMAKE_EXE_LINKER_FLAGS}")if(USE_NEON)message(WARNING "You use obsolete variable USE_NEON to enable NEON instruction set. Use -DENABLE_NEON=ON instead." )set(ENABLE_NEON TRUE)
elseif(USE_VFPV3)message(WARNING "You use obsolete variable USE_VFPV3 to enable VFPV3 instruction set. Use -DENABLE_VFPV3=ON instead." )set(ENABLE_VFPV3 TRUE)
endif()#set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${ARM_LINUX_SYSROOT})if(EXISTS ${CUDA_TOOLKIT_ROOT_DIR})set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${CUDA_TOOLKIT_ROOT_DIR})
endif()set( CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries." )
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)# macro to find programs on the host OS
macro( find_host_program )set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )if( CMAKE_HOST_WIN32 )SET( WIN32 1 )SET( UNIX )elseif( CMAKE_HOST_APPLE )SET( APPLE 1 )SET( UNIX )endif()find_program( ${ARGN} )SET( WIN32 )SET( APPLE )SET( UNIX 1 )set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
endmacro()# macro to find packages on the host OS
macro( find_host_package )set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )if( CMAKE_HOST_WIN32 )SET( WIN32 1 )SET( UNIX )elseif( CMAKE_HOST_APPLE )SET( APPLE 1 )SET( UNIX )endif()find_package( ${ARGN} )SET( WIN32 )SET( APPLE )SET( UNIX 1 )set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
endmacro()

2、在opencv-3.2.0/platforms/linux/下建立执行cmake的路径:build_softfp,建立好编译后的安装路径:install_dir


3、进入build_softfp,并执行

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=../install_dir/ -D SOFTFP=ON -D ENABLE_NEON=ON -D CMAKE_TOOLCHAIN_FILE=../arm-gnueabi.toolchain.cmake ../../../


然后make,make install


4、编写测试程序

在opencv-3.2.0/platforms/linux/建立test目录,进入test,

opencv_hisi.c

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>int main( int argc, char** argv )
{IplImage* pImg; // 声明IplImage指针// 载入图像,强制转化为Grayif( argc == 3 && (pImg = cvLoadImage( argv[1], 0)) != 0 ){IplImage* pImg2 = cvCreateImage(cvGetSize(pImg), pImg->depth, pImg->nChannels);cvCopy(pImg, pImg2, NULL);cvSaveImage(argv[2], pImg2);// 把图像写入文件cvReleaseImage( &pImg );    // 释放图像cvReleaseImage( &pImg2 );   // 释放图像printf("Success!\n");return 0;}printf("Fail!\n");return -1;
}

Makefile:

CC = arm-hisiv500-linux-g++DEMOTAR = opencv_hisi
DEMOOBJ = opencv_hisi.oCFLAGS += -g -Wall -I$(shell pwd)/../_install/include
LDFLAGS += -L$(shell pwd)/../_install/lib -Wl,-Bdynamic -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lpthread -lrt%.o: %.c@echo "[Compiling] $< ..."@$(CC) $(CFLAGS) -c $<all: $(DEMOTAR)$(DEMOTAR):$(DEMOOBJ)@$(CC) -o $@ $^ $(LDFLAGS).PHONY : clean
clean:rm -rf $(DEMOOBJ) $(DEMOTAR)

将对应so库放入hisi3519中,然后执行

./opencv_hisi lena.jpg lena_test.jpg





这篇关于opencv在hisi平台的移植的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/850081

相关文章

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函