【OpenCV】在MacOS上源码编译OpenCV

news2024/11/19 18:19:39

在MacOS上源码编译OpenCV

  • 1. 下载项目源码
  • 2. 创建CMake编译文件
  • 3. 编译安装
  • 4. 案例测试
  • 5. 总结

 前言

在做视觉任务时,我们经常会用到开源视觉库OpenCV,OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS。
最近在项目中,我遇到了在MacOS上使用OpenCV需求,目前OpenCV官网上并没有提供OpenCV现成的安装包,因此在此处我们需要自己进行编译,所以在此处我们将结合opencv_4.8.0opencv_contril_4.8.0,演示如何源码编译并使用

1. 下载项目源码

  首先下载项目源码,这里我们下载的是4.8.0,大家可以根据自己的需求进行下载,不过要尽量保证opencvopencv_contril源码版本一致。通过下面代码我们进行源码下载:

wget https://github.com/opencv/opencv/archive/4.8.0.zip
wget https://github.com/opencv/opencv_contrib/archive/refs/tags/4.8.0.zip

  下载完代码后,将代码文件解压到当前文件中,如下图所示:
在这里插入图片描述

2. 创建CMake编译文件

  OpenCV支持CMake编译,所以此处需要安装CMake,安装方式此处不做讲解。输入一下指令,打开并创建编译文件夹:

cd opencv-4.8.0
mkdir build && cd build

  接下来输入CMake指令,进行CMake编译,此处需要注意三个路径:

  • CMAKE_INSTALL_PREFIX=<install path><install path>表示编译好的OpenCV安装路径,可以指定到系统路径,也可以是自定义路径,此处设置为:/Users/ygj/3lib/opencv_4.8.0/include/opencv4/opencv2,注意这个路径,后续编译C++项目时会用到。
  • OPENCV_EXTRA_MODULES_PATH=<model path><model path>表示扩展模块的路径,就是上文我们下载的opencv_contril_4.8.0文件,在此处设置为/Users/ygj/3lib/opencv_build/opencv_contrib-4.8.0/modules
  • PYTHON3_EXECUTABLE=<python path><python path>表示本计算机Python的安装路径,此处也可以不设置,主要就是设置要不要生成Python依赖库。如果设置了,需要开启BUILD_opencv_python2=ON或者BUILD_opencv_python3=ON,具体按照你的电脑中安装的Python版本决定。
    设定好上面三个路径后,就可以在终端输入以下指令,进行CMake编译:
cmake -DCMAKE_SYSTEM_PROCESSOR=arm64 -DCMAKE_OSX_ARCHITECTURES=arm64 -DWITH_OPENJPEG=OFF -DWITH_IPP=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=<install path> -D OPENCV_EXTRA_MODULES_PATH=<model path> -D PYTHON3_EXECUTABLE=<python path> -D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=ON -D INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_C_EXAMPLES=OFF -D OPENCV_ENABLE_NONFREE=ON -D BUILD_EXAMPLES=ON ..

在这里插入图片描述

  编译完成后如下图所示,不过此处要注意一点,在编译时会下载相关的第三方库,要保证网络通畅,防止下载失败。

在这里插入图片描述

3. 编译安装

  上一步完成CMake编译后,就可以进行make编译了,只需要输入一下指令即可,-j8表示用8个核心进行编译,具体设置可以根据你的电脑进行设置,数值越大编译越快。

make -j8

  编译完成后,如下图所示:

在这里插入图片描述

  接下来就是进行安装,只需要一下指令就可:

make install

  安装完成后,会在你上文设置的安装路径下生成依赖文件,如下图所示:
在这里插入图片描述

4. 案例测试

  首先创建一个新的C++文件main.cpp文件,在文件中添加以下代码:

#include "opencv2/opencv.hpp"

int main(){
    std::cout<<"hello opencv!"<<std::endl;
    cv::Mat image = cv::imread("image.jpg");
    if (!image.empty())
    {
        std::cout << "image is OK!" << std::endl;
    }
    std::cout << "图像的宽度是:" << image.rows << std::endl;
    std::cout << "图像的高度是:" <<image.cols << std::endl;
    std::cout << "图像的通道数是:" << image.channels() << std::endl;
    cv::Mat image1;
    cv::cvtColor(image,image1,cv::COLOR_RGB2GRAY);
    cv::imshow("image",image);
    cv::imshow("image1",image1);
    cv::waitKey(0);
    std::cout<<"hello opencv!"<<std::endl;
    return 0;
}

  这一段代码主要是读取本地图片文件,获取并输出图片的基本信息,然后使用窗口将图片展示出来。

  此处编译方式采用CMake编译方进行编译,定义的CMakeLists.txt文件如下所示:

cmake_minimum_required(VERSION 3.28)
project(opencv)
set(OpenCV_DIR /Users/ygj/3lib/opencv_4.8.0/lib/cmake/opencv4)
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV_DIR = ${OpenCV_DIR}")
message(STATUS "OpenCV_INCLUDE_DIRS = ${OpenCV_INCLUDE_DIRS}")
message(STATUS "OpenCV_LIBS = ${OpenCV_LIBS}")
include_directories(
    ${OpenCV_INCLUDE_DIRS}
)
add_executable( main main.cpp )
target_link_libraries( main ${OpenCV_LIBS} )

  在CMakeLists文件中,我们通过find_package(OpenCV REQUIRED)查找本计算机安装的OpenCV依赖库,但是需要在之前指定OpenCV的安装路径。写完Cmake文件后,在命令行中输入cmake .进行运行,输出结果如下图所示:

在这里插入图片描述

  可以看出,CMake已经成功找到了本计算机安装的OpenCV路径,并获取了项目编译所需要的所有信息。
如果CMake没有任何问题,接下来就进行项目编译,只需要输入make指令即可,输出如下所示:
在这里插入图片描述

make之后,会在项目文件夹中生成一个main文件,接下来直接运行该文件,斌可以的到如下图所示的输出:

在这里插入图片描述

5. 总结

  在本项目中,我们实现了在MacOS系统上源码编译OpenCV,并在VS Code上使用OpenCV做了项目测试,最后成功实现了在MacOS系统上使用我们源码编译OpenCV的链接库,进行了图片处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1351623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring技术内幕笔记之IOC的实现

IOC容器的实现 依赖反转&#xff1a; 依赖对象的获得被反转了&#xff0c;于是依赖反转更名为&#xff1a;依赖注入。许多应用都是由两个或者多个类通过彼此的合作来实现业务逻辑的&#xff0c;这使得每个对象都需要与其合作的对象的引用&#xff0c;如果这个获取过程需要自身…

Java学习苦旅(十六)——List

本篇博客将详细讲解Java中的List。 文章目录 预备知识——初识泛型泛型的引入泛型小结 预备知识——包装类基本数据类型和包装类直接对应关系装包与拆包 ArrayList简介ArrayList使用ArrayList的构造ArrayList常见操作ArrayList遍历 结尾 预备知识——初识泛型 泛型的引入 我…

WebStorm 创建一个Vue项目(1)

一、下载并安装WebStorm 步骤一 步骤二 选择激活方式 激活码&#xff1a; I2A0QUY8VU-eyJsaWNlbnNlSWQiOiJJMkEwUVVZOFZVIiwibGljZW5zZWVOYW1lIjoiVU5JVkVSU0lEQURFIEVTVEFEVUFMIERFIENBTVBJTkFTIiwiYXNzaWduZWVOYW1lIjoiVGFvYmFv77yaSkVU5YWo5a625qG25rAIOa0uW3peS9nOWup…

json解析本地数据,使用JSONObject和JsonUtility两种方法。

json解析丨网址、数据、其他信息 文章目录 json解析丨网址、数据、其他信息介绍一、文中使用了两种方法作为配置二、第一种准备2.代码块 二、第二种总结 介绍 本文可直接解析本地json信息的功能示例&#xff0c;使用JSONObject和JsonUtility两种方法。 一、文中使用了两种方法…

R语言——R函数、选项参数、数学统计函数(六)

目录 一、R函数 二、选项参数 三、数学统计函数 四、参考 一、R函数 1.lm() lm()是R语言中经常用到的函数&#xff0c;用来拟合回归模型。它是拟合线性模型最基本的函数 lm()格式如下&#xff1a; fit<-lm(formula,data) 其中&#xff0c;formula指要拟合的模型形式…

【QT 自研上位机 与 ESP32下位机联调>>>串口控制GPIO-基础样例-联合文章】

【QT 自研上位机 与 ESP32下位机联调&#xff1e;&#xff1e;&#xff1e;串口控制GPIO-基础样例-联合文章】 1、概述2、实验环境3、 自我总结4、 实验过程1、验证上位机QT程序1、下载样例代码2、修改qt程序3、运行测试验证 2、验证下位机ESP32程序1、下载样例代码2、更改ESP3…

Ubuntu18 安装chatglm2-6b

记了下Ubuntu18 上安装chatglm2-6遇到的问题。 环境&#xff1a;Ubuntu18.04 V100(显卡) nvcc 11.6 显卡驱动cudacudnnaniconda chatglm6b 的安装 网上有很多&#xff0c; 不记录 了。 chatglm2-6b 我从别的地方拷贝的&#xff0c; 模型也包含了。 遇到的问题&#xf…

【MMC子系统】三、MMC子系统框架

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强企业&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …

【SpringBoot开发】之商城项目案例(购物车相关操作)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之商城项目系列》。&#x1f3af…

GZ075 云计算应用赛题第4套

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷4 某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenSt…

Pytorch上采样

文章目录 Upsample特殊上采样 Upsample 所谓上采样&#xff0c;实则是一个插值过程。所以上采样对象在初始化时&#xff0c;需要指定一个插值类型&#xff0c;Upsample是torch.nn中最基础的上采样类&#xff0c;初始化参数如下 Upsample(sizeNone, scale_factorNone, modenea…

计算机组成原理 主存和CPU连接与主存提速方案

文章目录 主存与CPU的连接译码器线选法译码片选法总结 位拓展字拓展字位同时拓展 主存提速方案存储周期双端口RAM多模块存储器单体多字存储器多模块多体并行存储器存储器高位交叉编址低位交叉编址 主存与CPU的连接 #mermaid-svg-3wv6WzRP2BvKEHQZ {font-family:"trebuchet…

GZ075 云计算应用赛题第1套

2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷1 某企业根据自身业务需求,实施数字化转型,规划和建设数字化平台,平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”,拟采用开源OpenStack搭建企业内部私有云平台,开源Kubernetes搭建云原生服务平台,…

HTML5 和 CSS3 新特性(常用)

HTML5 的新特性 HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题&#xff0c;基本是 IE9 以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以大量使用这 些新特性。 HTML…

Linux CPU 数据 Metrics 指标解读

过去从未仔细了解过使用 top 和 htop 等命令时显式的CPU信息&#xff0c;本文我们详解解读和标注一下各个数据项的含义&#xff0c;同时和 Ganglia 显式的数据做一个映射。开始前介绍一个小知识&#xff0c;很多查看CPU的命令行工具都是 cat /proc/stat 里的数据&#xff0c;所…

Element-ui自定义input框非空校验

1、vue自定义非空指令&#xff1a; main.js中自定义非空指令 当input框或下拉框中数据更新时&#xff0c;触发校验 Vue.directive(isEmpty,{update:function(el,binding,vnode){if(vnode.componentInstance.value""){el.classList.add("is-required");}e…

使用echarts的bmap配置项绘制区域轮廓遮罩

示例图 代码 <template><div id"map" style"width: 100%; height: 100vh"></div> </template><script> import * as echarts from "echarts"; import "echarts/extension/bmap/bmap"; export default…

软件测试/测试开发丨Pytest结合数据驱动

安装yaml pip install pyyaml pytest结合数据驱动yaml 工程目录结构 数据准备 读取excel文件 openpyxl库的安装 openpyxl库的操作 pytest结合csv实现数据驱动 csv文件介绍 pytest结合json实现数据驱动 最后感谢每一个认真阅读我文章的人&#xff0c;礼尚往来总是要有的&…

Halcon底帽运算bottom_hat

Halcon底帽运算 底帽运算的原理是用原始的二值图像减去闭运算的图像。闭运算的目的是对某些局部区域进行“填补”&#xff0c;如填空洞、使分离的边缘相连接等。而底帽运算正是用来提取这些用于填补的区域的。图&#xff08;a&#xff09;为从二值图像中提取出的亮的区域&…

RKE安装k8s及部署高可用rancher,证书在外面的LB(nginx中)

一 了解 Rancher 1 推荐架构 安装 Rancher 的方式有两种&#xff1a;单节点安装和高可用集群安装。因为单节点安装只适用于测试和 demo 环境&#xff0c;而且单节点安装和高可用集群安装之间不能进行数据迁移&#xff0c;所以推荐从一开始就使用高可用集群安装的方式安装 Ran…