为Nanopi m1交叉编译opencv

2024-06-11 07:04
文章标签 编译 opencv m1 交叉 nanopi

本文主要是介绍为Nanopi m1交叉编译opencv,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为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文件夹中
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 <opencv2/opencv.hpp>
#include <iostream>int main() {// 替换下面的路径为一个实际的图片文件路径cv::Mat img = cv::imread("/home/pi/head.png", cv::IMREAD_COLOR);if (img.empty()) {std::cerr << "Could not open or find the image." << std::endl;return -1;}// 如果在具有图形界面的系统上运行,使用以下代码显示图片cv::imwrite("/home/pi/output.jpg", img);return 0;
}
  1. 进行编译
g++ test_opencv.cpp -o test_opencv `pkg-config --cflags --libs opencv4`
  1. 测试
./test_opencv # 可以看到生成一个output.jpg文件

六、交叉编译含opencv代码

  1. 主机弄一个标准的cpp工程。包含src、include、build文件夹
  2. CMakeList.txt文件内容如下:
cmake_minimum_required(VERSION 3.10)
project(t_cv)# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 添加include目录
include_directories(include)# 指定交叉编译工具链
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)# 设置交叉编译器路径
set(CMAKE_C_COMPILER /opt/nanopi-toolchain/bin/arm-linux-gcc)
set(CMAKE_CXX_COMPILER /opt/nanopi-toolchain/bin/arm-linux-g++)# 查找OpenCV包
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})# 添加源代码文件
file(GLOB SOURCES "src/*.cpp")
add_executable(t_cv ${SOURCES})# 链接OpenCV库
target_link_libraries(t_cv ${OpenCV_LIBS})# 设置输出文件夹为 'output',没有用
#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output)
#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/output)
  1. main.cpp文件内容如下,一个是拍照片的,一个是保存png的:
#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 打开默认相机cv::VideoCapture cap(1); // 0是默认相机的设备ID。如果不起作用,尝试更换ID。if (!cap.isOpened()) {std::cerr << "Error: Couldn't open the camera.\n";return -1;}cv::Mat frame;std::cout << "Starting camera...\n";// 从相机捕获一帧cap >> frame; // 或者使用 cap.read(frame);if (frame.empty()) {std::cerr << "Error: Couldn't capture an image.\n";return -1;}// 保存图像if (!cv::imwrite("/home/pi/captured_image.png", frame)) {std::cerr << "Error: Couldn't save the image.\n";return -1;}std::cout << "Image saved as /home/pi/captured_image.png\n";// 释放相机cap.release();return 0;
}// #include <opencv2/opencv.hpp>
// #include <iostream>
// using namespace std;
// int main() {
//     // 替换下面的路径为一个实际的图片文件路径
//     cv::Mat img = cv::imread("/home/pi/head.png", cv::IMREAD_COLOR);
//     if (img.empty()) {
//         std::cerr << "Could not open or find the image." << std::endl;
//         return -1;
//     }
//     cout<<"starting"<<endl;//     // 如果在具有图形界面的系统上运行,使用以下代码显示图片
//     bool isWritten = cv::imwrite("/home/pi/output.jpg", img);
//     if (!isWritten) {
//         std::cerr << "Failed to write the image." << std::endl;
//         return -1;
//     } else {
//         cout << "Image written successfully." << endl;
//     }//     cout<<"ok"<<endl;
//     return 0;
// }
  1. 问题:拍照片和输出png图片都没有问题,但是生成jpg文件失败。
    首先尝试在m1中安装如下库
sudo apt-get update
sudo apt-get install libjpeg62

前面的解决思路:上述通过在cmake中添加了如下对jpeg的支持,应该就解决了,上面已经添加了

-D BUILD_SHARED_LIBS=ON \
-D WITH_JPEG=ON \
  1. 问题:交叉编译的主机,显示#include <opencv2/opencv.hpp>错误找不到源。修改方式就是添加对应的源即可
    解决:在如下出问题的地方,电机快速修改,提示修改配置,然后添加对应的路径即可
    在这里插入图片描述
    图形化修改界面的内容如下
    在这里插入图片描述
    手动修改界面的内容如下
    在这里插入图片描述

这篇关于为Nanopi m1交叉编译opencv的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

树莓派5_opencv笔记27:Opencv录制视频(无声音)

今日继续学习树莓派5 8G:(Raspberry Pi,简称RPi或RasPi)  本人所用树莓派5 装载的系统与版本如下:  版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下: 今天就水一篇文章,用树莓派摄像头,Opencv录制一段视频保存在指定目录... 文章提供测试代码讲解,整体代码贴出、测试效果图 目录 阶段一:录制一段

Verybot之OpenCV应用三:色标跟踪

下面的这个应用主要完成的是Verybot跟踪色标的功能,识别部分还是居于OpenCV编写,色标跟踪一般需要将图像的颜色模式进行转换,将RGB转换为HSV,因为对HSV格式下的图像进行识别时受光线的影响比较小,但是也有采用RGB模式来进行识别的情况,这种情况一般光线条件比较固定,背景跟识别物在颜色上很容易区分出来。         下面这个程序的流程大致是这样的:

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采