为Nanopi m1交叉编译opencv

06-13 1150阅读

为Nanopi m1交叉编译opencv

一、下载交叉编译器

根据之前的博客进行

二、下载opencv和必要库

sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
git clone https://github.com/opencv/opencv.git
cd opencv

三、进行编译

  1. 创建cmake文件
nano toolchain.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
# 指定交叉编译器位置
set(CMAKE_C_COMPILER /opt/nanopi-toolchain/bin/arm-cortexa9-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /opt/nanopi-toolchain/bin/arm-cortexa9-linux-gnueabihf-g++)
# 指定系统根目录(sysroot),这是必需的以便编译器找到正确的库和头文件
set(CMAKE_FIND_ROOT_PATH /opt/nanopi-toolchain/arm-cortexa9-linux-gnueabihf/sys-root)
  1. 创建build文件
mkdir build
cd build
  1. 创建cmake指令

    这里将opencv的编译install输出放到了output文件夹中

    为Nanopi m1交叉编译opencv

cmake -D CMAKE_BUILD_TYPE=Release \
      -D CMAKE_INSTALL_PREFIX=../output \
      -D BUILD_SHARED_LIBS=ON \
      -D WITH_JPEG=ON \
      -D CMAKE_TOOLCHAIN_FILE=../toolchain.cmake \
      -D BUILD_EXAMPLES=OFF \
      -D WITH_IPP=OFF \
      -D WITH_TBB=OFF \
      -D BUILD_TESTS=OFF \
      -D BUILD_PERF_TESTS=OFF \
      -D ENABLE_NEON=ON \
      -D ENABLE_VFPV3=ON \
      -D CMAKE_C_FLAGS="-std=gnu99" \
      -D CMAKE_CXX_FLAGS="-std=c++14" \
      -D BUILfD_opencv_python2=OFF \
      -D BUILD_opencv_python3=OFF \
      -D BUILD_opencv_java=OFF \
      -D WITH_OPENCL=OFF \
      -D WITH_CUDA=OFF \
      -D WITH_GTK=OFF \
      -D WITH_VTK=OFF \
      -D BUILD_opencv_gapi=OFF ..  # 禁用G-API模块
  1. make编译
make -j12
  1. 错误后的处理

    如果编译错误,可通过以下指令删除build中的文件

# cd build
rm -rf *
  1. 编译安装

    由于修改了-D CMAKE_INSTALL_PREFIX=../output,因此编译安装的文件输出到了output文件夹中

sudo make install

四、进行scp传输到M1

  1. 进入output文件夹,使用scp发送这两个文件夹中的内容到m1
cd ../output
scp -r lib/* pi@192.168.10.197:/usr/local/lib/
scp -r include/* pi@192.168.10.197:/usr/local/include/
  1. 问题处理:如果显示没有权限,则可以通过一个temp文件夹进行转存

五、进行测试

  1. 在nano pi m1中写一个test_opencv.cpp文件
#include 
#include 
int main() {
    // 替换下面的路径为一个实际的图片文件路径
    cv::Mat img = cv::imread("/home/pi/head.png", cv::IMREAD_COLOR);
    if (img.empty()) {
        std::cerr 
    // 打开默认相机
    cv::VideoCapture cap(1); // 0是默认相机的设备ID。如果不起作用,尝试更换ID。
    if (!cap.isOpened()) {
        std::cerr 
        std::cerr 
        std::cerr 
//     // 替换下面的路径为一个实际的图片文件路径
//     cv::Mat img = cv::imread("/home/pi/head.png", cv::IMREAD_COLOR);
//     if (img.empty()) {
//         std::cerr 
//         std::cerr 
//         cout 

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]