Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    在Ubuntu中交叉编译Opencv 4.5.1 运行于Tina Linux中(整合帖)

    MR Series
    7
    26
    10190
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • BedRock
      BedRock LV 6 last edited by

      前言

      看到很多人在小哪吒上编译Opencv,自己也尝试过编译了几次,各位开发者在编译的时候都可能会遇到不同的问题,现将其整理出来方便后面新来的开发者查阅。

      环境需求

      理论上任何版本的Ubuntu都可以,在社区中有hu487364在Ubuntu14 中成功 见帖:编译Tengine D1 出错
      aldfaaa的Ubuntu20.04中,见贴:Ubuntu20.04交叉编译OpenCV 4.5.2, 运行在Tina Linux

      • hu487364 在虚拟机中,符合广大开发者开发环境及方法。
      • aldfaaa使用命令行和直接修改CmakeLists.txt 文件来完成编译.
        这里推荐开发者使用第一种方法。在虚拟机中使用cmake-gui进行配置完成编译。

      工具安装

      sudo apt install cmake-qt-gui
      

      获取opencv源码

      (小声bb)opencv的Relase版本更新还是挺快的,当然推荐大家使用最新的版本,这里就先贴上上一个版本了(前两天还是最新版本)😣 😣 😣
      源码下载地址

      下载源码后,放到虚拟机目录进行解压。然后进入opencv目录。

      编译及编译配置

      编译使用cmake-gui 打开cmake配置工具。
      source 选择 opencv源码路径 🙂 🙂 build 选择编译路径(!注意不是安装路径)
      8a5e5db2-06ea-48cd-87ca-777ecc491309-image.png
      然后点击
      87b8f8bb-5079-4a57-8317-0ec054ce284e-image.png
      此处务必选择SDK中交叉编译链路径
      3343c334-638d-451a-a03d-64580b2b93a2-image.png

      # Operating system : Linux
      # process : riscv
      # C 选择
      d1-tina-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-gcc
      # C++ 选择
      d1-tina-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-gc++
      # Target root 选择
      d1-tina-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702
      

      然后点击 FInish

      编译配置

      打开Advancd选项, 设置了这些选项:

      CMAKE_BUILD_TYPE Release
      CMAKE_EXE_LINKER_FLAGS -ldl -lpthread -latomic
      CMAKE_INSTALL_PREFIX ./install
      
      关闭jpeg 和 openjpeg 选项。
      
      搜索python 和 java --> 关闭所有相关的选项
      关于 是否勾选 opencv_word 将其全部链接成一个静态库 此处就仁者见仁智者见智。。。看个人需求  
      我自己是勾上的  这样在链接的时候好链接
      

      文件更改

      (1)/d1-tina-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/sysroot/usr/include/features.h 的第364行前 加 上

       #define _FILE_OFFSET_BITS 64
      

      e96206c5-055c-4651-b6f8-691a653857dc-image.png
      (2) opencv/3rdparty/protobuf/src/google/protobuf/stubs/commen.cc 中增加一行

      #define HAVE_PTHREAD
      

      确认都配置好后

      点击Configure ---> Configuring done
      点击Generate----->Generating done
      如果两个都没有问题,此时就可以开始编译了😄 😄 😄

      编译

      make -j8
      

      这个错误是因为没有关上jpeg 暂时只能将这个包关掉做编译(类型错误,没有修正)😅 😅 😅
      9284a5cb-53f6-4ee4-ac47-ce30e20ebd9d-image.png
      这个错误是没有在上面加 -latomic
      4aad242b-12bc-4f92-a6bd-23dc4fc957ce-image.png

      如果以上都没有 ,你就可以顺利编译下来
      9fee6b7a-254e-437f-9bdd-5462cf22fa28-image.png
      然后你就可以在 install 目录下 看到我们交叉编译后的文件了😊 😊 😊
      c3574f6a-5ae2-4302-b859-df19ab6f0c54-image.png

      在移动到板子之前,我们需要将atimic (原子操作库) 移动到我们的lib 目录,因为 Tina 默认没有将原子库打包进固件内。

      cd 到lib目录
      # -d 和 * 可以保证其全部链接拿出来
      cp -d  ~/d1-tina-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/riscv64-unknown-linux-gnu/lib64/lp64d/libatomic.so* .
      

      移动完成后 lib 中就有 如下 静态库。
      0eafdcb2-fad4-42c5-945e-d2823c10acd5-image.png

      然后就可以使用adb 将其 发送至开发板中。🤠 🤠 🤠 🤠 🤠 即将完成!!

      adb push lib\libopencv_world.so /lib
      adb push lib\libatomic.so /lib
      adb push lib\libatomic.so.1.2.0 /lib
      adb push lib\libatomic.so.1 /lib
      

      然后我们再将 bin 送入开发板

      adb push bin /root
      
      root@TinaLinux:~/bin# chmod +x *
      root@TinaLinux:~/bin# ls
      opencv_annotation               opencv_visualisation
      opencv_interactive-calibration  setup_vars_opencv4.sh
      opencv_version
      root@TinaLinux:~/bin# ./opencv_version
      4.5.1
      

      可以看到我们的开发板已经打印了 opencv的版本号🤤 🤠 🤠 即将起飞。芜湖😀 😀 😀 😀

      注意👏 👏

      我们在编译的过程中 关掉了 jpeg 的相关包,所以在 imwrite 等操作时 ,无法解析 jpg 文件会出现这样的报错:

      terminate called after throwing an instance of 'cv::Exception'
        what():  OpenCV(4.5.1) /home/jie/下载/opencv-4.5.1/modules/imgcodecs/src/loadsave.cpp:682: error: (-2:Unspecified error) could not find a writer for the specified extension in function 'imwrite_'
      
      1 Reply Last reply Reply Quote Share 0
      • L
        lijyhh LV 3 last edited by

        71532ccc-cbe8-476e-8efa-f9111d0285d2-image.png
        请问你遇到过这种问题吗,百度无解,一开始勾选上BUILD_opencv_world的时候也有这种问题,但是不知道咋办,然后我就取消勾选了,但在另一个地方还是出现了这种问题。

        BedRock aldfaaa 4 Replies Last reply Reply Quote Share 0
        • BedRock
          BedRock LV 6 @lijyhh last edited by BedRock

          @lijyhh 在 在Ubuntu中交叉编译Opencv 4.5.1 运行于Tina Linux中(整合帖) 中说:

          71532ccc-cbe8-476e-8efa-f9111d0285d2-image.png
          请问你遇到过这种问题吗,百度无解,一开始勾选上BUILD_opencv_world的时候也有这种问题,但是不知道咋办,然后我就取消勾选了,但在另一个地方还是出现了这种问题。

          看错误是没有找到 lib64xthead/lp64d/livc.so.6 在交叉编译工具链中 的 lib/ld-linux-riscv64xthead-lp64d.so.1 中链接不到 你检查一下你的交叉编译链 路径中对应的位置 是不是存在这个文件 如果存在 就是在 刚开始设置的过程中 编译链根目录设置错误🤔 🤔 🤔
          不是勾选 BUILD_opencv_world 的问题

          1 Reply Last reply Reply Quote Share 0
          • aldfaaa
            whycan矿工-小叶 LV 7 @lijyhh last edited by

            @lijyhh 建议用Tina工具链编译东西前, 按照编译Tina SDK的方法, 先加载编译环境:

            1 Reply Last reply Reply Quote Share 0
            • aldfaaa
              whycan矿工-小叶 LV 7 @lijyhh last edited by

              @lijyhh
              在Tina SDK目录下运行这些脚本

              source build/envsetup.sh
              lunch d1_nezha-tina
              

              这样环境变量一般是可以了, 因为连系统都能编译出来, 何况是个库呢😊

              A 1 Reply Last reply Reply Quote Share 0
              • BedRock
                BedRock LV 6 @lijyhh last edited by

                @lijyhh 对的,我也推荐使用Tina中的交叉编译链,之前下载的最新的交叉编译链,不能在Tina中运行,会报LIBC版本不对

                1 Reply Last reply Reply Quote Share 0
                • aldfaaa
                  whycan矿工-小叶 LV 7 last edited by

                  -fpermissive这是错误是可以忽略的.
                  在CMakeLists.txt加一句

                  add_compile_options(-fpermissive)
                  或
                  set(CMAKE_CXX_FLAGS "-fpermissive ${CMAKE_CXX_FLAGS}")
                  

                  即可将错误转为警告

                  1 Reply Last reply Reply Quote Share 0
                  • L
                    lijyhh LV 3 last edited by

                    两位大佬,看了你们的回答,我仔细检查了一下cmake配置,发现是编译器路径设置错了,改了之后不会出现上面的错误了,谢谢两位!!!
                    但是现在又遇到了新的问题:
                    15d032c6-27bf-402c-9954-4262bc4d1024-image.png
                    这是为啥呀,还得麻烦二位帮忙看一下😖

                    BedRock 1 Reply Last reply Reply Quote Share 0
                    • BedRock
                      BedRock LV 6 @lijyhh last edited by

                      @lijyhh 你开单线程编译 或者你之前在配置的过程中有东西没有下载 看一下cmake 有没有错误

                      1 Reply Last reply Reply Quote Share 0
                      • L
                        lijyhh LV 3 last edited by

                        感谢大佬提供的教程,我在自己的板子上也安装成功了,遇到了一些问题,贴出来:
                        一.大佬文中有几处笔误,都是小问题:
                        1.原文“关于 是否勾选 opencv_word 将其全部链接成一个静态库 此处就仁者见仁智者见智。。。看个人需求”里面的opencv_word应该为opencv_world。
                        2.原文“opencv/3rdparty/protobuf/src/google/protobuf/stubs/commen.cc 中增加一行”里面的commen应该为common
                        二.我遇到的一些问题
                        1.”file RELATIVE_PATH must be passed a full path to the directory : ./install/lib。“此处提示使用绝对路径而非相对路径,需要将
                        8243f326-73ff-40ec-bd55-ab47f80388ba-image.png
                        此处的./install改为绝对路径,比如我这里是/usr/opencv/build/install。
                        2.“/opencv-4.5.2/nodules/videoio/src/cap_dc1394_v2.cpp:59:10: fatal error: dc1394/dc1394.h: No such file or directory
                        . #include <dc1394/dc1394.h>”这里参考文章:fatal error: dc1394/dc1394.h: No such file or directory的问题原因?,只需搜索 WITH_DC1394,去掉该选项即可。
                        3.
                        5cf3763e-3973-4bef-99dd-1b56a511346e-image.png
                        在Tina SDK目录下运行这些脚本

                        source build/envsetup.sh
                        lunch d1_nezha-tina

                        这样环境变量一般是可以了, 因为连系统都能编译出来, 何况是个库呢。
                        如果不行就检查交叉编译工具链是否设置正确,我的这个错误是由于g++编译器设置错误了导致的。
                        实在不行就重新弄一遍cmake,记得删除上次的CmakeCache.txt
                        4.安装好opencv后,将文件push到板子上进行测试,报错:
                        c2247fb2-43db-4ec8-b25f-4b4e4f812b0f-image.png
                        应该是由于opencv_world库的名字不对,将libopencv_world.so改为libopencv_world.so.4.5即可

                        1 Reply Last reply Reply Quote Share 1
                        • L
                          lijyhh LV 3 last edited by

                          请问你的opencv能读取图片吗,我的报这个错误:
                          033c0a6a-aa28-450c-bb9b-970c915e69ac-image.png
                          这个cmake的时候勾选了jpeg选项

                          BedRock 2 Replies Last reply Reply Quote Share 0
                          • BedRock
                            BedRock LV 6 @lijyhh last edited by

                            @lijyhh 我不能读取jpg 图片,我读取的时候是不报错的,但是会读不到,png 可以读

                            1 Reply Last reply Reply Quote Share 0
                            • BedRock
                              BedRock LV 6 @lijyhh last edited by

                              @lijyhh 请问一下你jpeg的错误是怎么解决的

                              1 Reply Last reply Reply Quote Share 0
                              • L
                                lijyhh LV 3 last edited by

                                @bedrock 没有解决😖

                                1 Reply Last reply Reply Quote Share 0
                                • nihui
                                  nihui LV 6 last edited by

                                  ncnn 自带的 simpleocv 支持读写 jpg png bmp 等图片格式,用法和 opencv 一样

                                  BedRock 1 Reply Last reply Reply Quote Share 0
                                  • BedRock
                                    BedRock LV 6 @nihui last edited by

                                    @nihui 妙不可言
                                    直接ncnn
                                    ncnn Mat 和 Opencv Mat 是不是有着异曲同工的意思

                                    nihui 1 Reply Last reply Reply Quote Share 0
                                    • nihui
                                      nihui LV 6 @BedRock last edited by

                                      @bedrock simpleocv.h 里面是对着opencv api模拟的,大部分opencv的代码不需要改就能兼容啦

                                      BedRock aldfaaa 2 Replies Last reply Reply Quote Share 0
                                      • BedRock
                                        BedRock LV 6 @nihui last edited by

                                        @nihui cool,就是选择性集成😀 😀

                                        1 Reply Last reply Reply Quote Share 0
                                        • aldfaaa
                                          whycan矿工-小叶 LV 7 @nihui last edited by

                                          @nihui 要是能写个remap就好了

                                          aldfaaa 1 Reply Last reply Reply Quote Share 0
                                          • aldfaaa
                                            whycan矿工-小叶 LV 7 @aldfaaa last edited by

                                            @aldfaaa OpenCV的remap成功跑起来了

                                            1 Reply Last reply Reply Quote Share 0
                                            • C
                                              chen_bopk LV 3 last edited by

                                              This post is deleted!
                                              1 Reply Last reply Reply Quote Share 0
                                              • C
                                                chen_bopk LV 3 last edited by

                                                8c23e4f8-2f25-432b-aff1-bcacda96e3a5-图片.png
                                                按照这个帖子编译的 ,不知道怎么处理,还是cmake 选项的问题

                                                1 Reply Last reply Reply Quote Share 0
                                                • C
                                                  chen_bopk LV 3 last edited by

                                                  13762621-a7f4-43f9-a232-af69615d70e0-图片.png 勾选 BUILD_opencv_world 报这个错,

                                                  1 Reply Last reply Reply Quote Share 0
                                                  • L
                                                    lfdcn LV 4 last edited by

                                                    这里提示一下,那个原子库,注意lp64d别搞成lp64了。

                                                    1 Reply Last reply Reply Quote Share 0
                                                    • Referenced by  L lfdcn 
                                                    • Referenced by  L lfdcn 
                                                    • A
                                                      astonzorro LV 3 @aldfaaa last edited by

                                                      @aldfaaa 库编译可以用tina的交叉环境编译,但是现在的OPENCV的CPP程序需要引用OPENCV的库,交叉编译又找不到编译出来的库,不知道APP这方面,如何交叉编译的时候还能用上自己编译出来的LIB库阿?

                                                      BedRock 1 Reply Last reply Reply Quote Share 0
                                                      • BedRock
                                                        BedRock LV 6 @astonzorro last edited by

                                                        @astonzorro 最简单的方法: 交叉编译链的 -l 链接动态库 -i 包含头文件路径 参数来设置
                                                        高级方法:包管理
                                                        工具方法:cmake(教程很多)

                                                        1 Reply Last reply Reply Quote Share 0
                                                        • 1 / 1
                                                        • First post
                                                          Last post

                                                        Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

                                                        行为准则 | 用户协议 | 隐私权政策