因此你的brew update一定要为最新。在brew update时,经常我们会碰到卡死、或者报各种奇芭的错,99%的用户碰到的说是xcode不是最新或者说是commandline tool找不到,因此你可以使用以下步骤
sudo rm -rf /Library/Developer/CommandLineTools
sudo xcode-select --install
稍等12-15分钟(依赖于网速和你的Mac性能),即完成了xcode的修复。
再运行
brew update
果碰到brew已经坏了(别重装MAC哈),我经常碰到,是因为brew的很多源是在“墙外”,有时装一半掉一半导致了Mac内的brew被搞了“一股臭味”,那么没有关系,我们就可以修复我们的brew。
安装brew软件管理工具的时候遇见了怎么一个错误:xcode-select: note: install requested for command line developer tools
手动下载commandLineTools
点击这里下载https://developer.apple.com/download/all/
进入下载页,搜索Command Line Tools,查看系统版本,找到跟系统版本一样或者相近的xcode-select版本。系统版本查看电脑的关于本机就可以。
找到后点击版本,打开后下载程序并执行即可。
再次终端执行 /bin/zsh -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)”
进行下载安装成功
brew update-reset
rm -rf /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
brew tap homebrew/core
# Homebrew 源代码仓库
cd "$(brew --repo)"
git remote set-url origin https://mirrors.ustc.edu.cn/brew.git
# Homebrew 核心软件仓库
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
# Homebrew cask 软件仓库,提供 macOS 应用和大型二进制文件
cd "$(brew --repo)"/Library/Taps/homebrew/homebrew-cask
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git
# Homebrew 预编译二进制软件包
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc
source ~/.zshrc
# 更新镜像
brew update
这边再次需要各位引起重视,一定要在恒定百兆宽带基础上对xcode、brew进行update或者是运行上述修复命令。本身OpenCV还有Brew以及Mac相关的一些关键资源都是在墙外,虽然国内有一些mirror,但速度不行。
如果你的网速到达不了恒定的一秒至少5兆下载速率,你光以上几步因为失败、反复、失败就要耗费40多个小时。
对于网上说有时brew update时会碰到“git clone”或者是“error: RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)"。
这些的root cause就是一点:
你的网络速率不行,导致git在clone超过100兆以上的东西时,自己把自己打断了;
此时如果你按照网上做以下的设置,试图先clone下来一个框子或者是把所谓的git下载时的缓存加大都是徒劳。因此,请确保你的网络至少有恒定的5兆每秒。现在100兆,200兆宽带都到家,这个已经不是条件限制了我想。
git config --global http.postBuffer 2024288000
git config --list
git config --global core.compression 0
git clone --depth 1 https://mirrors.ustc.edu.cn/homebrew-core.git
git fetch --unshallow
git pull --all
brew install ant
装完后你一定要确保你的Mac的环境变量path里可以直接访问ant命令。
ant -version
如果不可以在任意地方运行ant -version命令得到ant的正确输出,你还需要手工自己在~/.bash_profile里加入ant的命令于你的path变量中去。
记得一定要是ant 1.9或者以上版本,否则装了也是白装。
个梗和上面第3点,必装ANT一样。OpenCV无论是3还是4在安装时要生成Java这两个文件,必装Python3.
brew upgrade python3
mac一般自带python2,而big sur版本中装OpenCV都用的是OpenCV4,它要求必须安装python3.
因此我们可以升级我们的本地python2至3,升级完后你原有的python2还会留着。网上会说把python3和python2互换一下。
但没必要,你可以保证python2和python3都存在。因为python2用的命令叫python,python3的命令叫python3.
这个没事的。因为我本机还有不少python2写的AI,因此我经常在两者间要用哪个时做手工切换。
安装过程网上找,选可以调试的版本
在终端中输入
java -version
查看当前的java版本信息
使用下面的命令查看JAVA_HOME
echo $JAVA_HOME
如果没有输出JAVA_HOME的路径,说明还没有设置
可以继续下面的设置操作
首先查找java的安装路径
我们首先想到的就是使用
which java
或者
whereis java
我们得到的结果是
/usr/bin/java
我们到finder中打开这个目录看到的并不是真正的java的安装目录
通过查找,在开发者网站找到了一篇文章
https://developer.apple.com/library/content/qa/qa1170/_index.html
JavaHomeManyJava applications need to know the location of a $JAVA_HOME directory. The $JAVA_HOME on MacOSX should be found using the /usr/libexec/java_home command line tool on MacOSX10.5 or later.On older MacOSX versions where the tool does not exist, use the fixed path "/Library/Java/Home". The /usr/libexec/java_home tool dynamically finds the top Java version specified inJavaPreferencesfor the current user.This path allows access to the bin subdirectory where command line tools such as java, javac, etc. exist as on other platforms.The tool /usr/libexec/java_home allows you to specify a particular CPU architecture and Java platform version when locating a $JAVA_HOME.Another advantage of dynamically finding this path,as opposed to hardcoding the fixed endpoint,is that it is updated when a new version of Javais downloaded via SoftwareUpdate or installed with a newer version of MacOS X.Forthis reason, it is important that developers do not install files in the JDKs inside of /System, since the changes will be lost with subsequent updates by newer versions of Java.To obtain the path to the currently executing $JAVA_HOME, use the java.home System property.
我们执行以下命令查看
/usr/libexec/java_home -V
执行结果
Matching Java Virtual Machines (1):
1.8.0_111, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home
结果中的
/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home
就是JAVA_HOME的路径
我们将JAVA_HOME的路径添加到.bash_profile中
cd #切换到当前目录下
ls -a #查看当前路径下的所有文件,主要就是看看我们要编辑的.bash_profile是不是存在
将下面的内容添加到.bash_profile的最后
export JAVA_HOME=$(/usr/libexec/java_home)
export PATH=$JAVA_HOME/bin:$PATH
export CLASS_PATH=$JAVA_HOME/lib
保存完成之后使用
source .bash_profile
更新修改的内容
现在我们再使用上面的查看JAVA_HOME的命令查看的话,就会看到以下结果的输出
/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home
下载OpenCV最新master源码;
下载OpenCV 对应版本的contribute源码包(有内置图形、JAVA包、声音等);
使用C编译器,生成C工程;
使用C编译器,编译C工程;
使用python3+ant对java文件进行编译并生成java通过jndi调用OpenCV的C的底层native lib包(在Windows10下是一个.dll文件);
把C编译生成成功的release包进行系统安装;
brew edit opencv
在安装前,你要确认你的opencv内的java编译选项是turn on的。默认opencv是不会安装和编译打包java文件的。
在控制端找到-DBUILD_opencv_java=OFF 修改为-DBUILD_opencv_java=ON ,以确保之后生成需要的jar文件如下图所示
然后你就可以:
brew install --build-from-source opencv
接下去按照我这个机型,22分钟后,一切显示failed 0,install successfully。
安装opencv,如果之前有安装过但是没有jar文件的话,需要运行brew reinstall --build-from-source opencv来重装。
你就可以看到OpenCV4正确装在了你的这个路径下了
而java用文件是生成在这边的
brew install gcc git cmake pkg-config ffmpeg libgphoto2 libav libjpeg libpng libtiff libdc1394 ant
我这里用的是~/.zshrc文件,除此之外,~/.bash_profile、~/.bashrc、/etc/profile 这些文件都可以添加环境变量,不用纠结我为什么在zshrc中添加(启动终端会自动加载的环境变量配置文件)
vi ~/.zshrc
export JAVA_HOME=$(/usr/libexec/java_home)
export PATH=$JAVA_HOME/bin:$PATH
export CLASS_PATH=$JAVA_HOME/lib
========================分割线-很重要========================
export JAVA_AWT_INCLUDE_PATH=$JAVA_HOME
export JAVA_AWT_LIBRARY=$JAVA_HOME
export JAVA_INCLUDE_PATH=$JAVA_HOME/indclude
export JAVA_INCLUDE_PATH2=$JAVA_HOME/include/darwin
export JAVA_JVM_LIBRARY=$JAVA_HOME
============================================================
注意分割线中间内容,不配置安装OpenCV之后,一直没有找到生成的Jar包和dylib动态库。
保存配置
source .zshrc
配置完了保存,别忘了使用source命令重载配置,并检查是否配置成功
echo $JAVA_INCLUDE_PATH2 // 检查是否配置成功
Cmake
如果红色字体不配置的话,Cmake之后的结果如下:
...
-- Java:
-- ant: /usr/local/bin/ant (ver 1.10.12)
-- JNI: NO
-- Java wrappers: NO
-- Java tests: NO
...
配置之后,Cmake之后结果如下:
...
-- Java:
-- ant: /usr/local/bin/ant (ver 1.10.12)
-- JNI: /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/include /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/include/darwin /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/include
-- Java wrappers: YES
-- Java tests: YES
...
就是这个差别,会影响最后到底有没有生成Jar包和动态库
下载:https://opencv.org/releases/
我选的4.7.0 选Sources下载解压
cd Downloads/opencv-4.7.0
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=OFF -DWITH_IPP=OFF -DBUILD_ZLIB=OFF -DCMAKE_INSTALL_PREFIX={你的路径}/opencv-4.5.4 ../
如果遇到了(表示你Cmake太多次了)
1.FATAL:In-source builds are not allowed.
You should create separate directory for build files.
解决方法:1)先删除刚才在当前目录下创建的CMakeCache.txt文件和CMakeFIles目录;2)再新建目录,比如build目录,在build目录执行cmake.
... 开始进行配置/编译
注意检查最后:
-- Java:
-- ant:
-- JNI:
-- Java wrappers:
-- Java tests:
这后面的值有没有,如果没有说明环境变量没有配置成功
等待片刻后在当前目录下会出现一堆文件,这时使用命令
make -j 8
等待编译完成,然后进行安装,等待结束
make install
安装结束后,可以找到安装目录,找到对应的动态链接库以及对应的Jar文件
cd ~/Downloads/opencv-4.7.0/build/bin
能找到 opencv-470.jar 文件
cd ~/Downloads/opencv-4.7.0/build/lib
能找到 libopencv_java470.dylib 文件
至此,OpenCV的安装结束
如果使用了Homebrew完成了OpenCV安装,则忽略这一步
如果直接使用的源码安装,则需要配置环境变量
export OPENCV_HOME={你的目录}
export PATH=$OPENCV_HOME/build/bin:$PATH
别忘了source加载
➜ opencv_version
4.7.0
看到这个环境变量就配置成功了
Java使用:
System.load(opencvPath + "libopencv_java470.dylib");
org.bytedeco.javacpp-presets
opencv
4.0.1-1.4.4
必备:opencv-454.jar、libopencv_java454.dylib (在windows环境下,应该为dll文件,在Linux环境下,应该为.so文件)
将jar包放入项目根目录./lib目录下
org.opencv opencv 4.5.4 system ${project.basedir}/lib/opencv-454.jar
publicclassOpenCVTest{static{System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}publicstaticvoidmain(String[] args){Mat imread =Imgcodecs.imread("WechatIMG26763.jpeg");System.out.println(imread);}}
点击执行,这个时候会报错,不要管
点开IDEA的运行Configurations,找到OpenCVTest选项,添加VM参数
-Djava.library.path={你的libopencv_java454.dylib所在目录}
例如:/Home/Users/my/Download/opencv_4.5.4/build/lib
再次点击运行:
Mat[873*1920*CV_8UC3, isCont=true, isSubmat=false, nativeObj=0x7fb3524176b0, dataAddr=0x7fb356aaa000]
至此,开发环境搭建完成。
主要是需要把我们独立引入的lib下的包打包到jar中
org.springframework.boot spring-boot-maven-plugin true true
打包后,所有依赖包都会打包到jar中
mvn install:install-file -Dfile={jar地址} -DgroupId=org.opencv -DartifactId=opencv-454-for-mac -Dversion4.5.4 -Dpackaging=jar
在Mac OS X上.dylib和.so之间的区别在于它们的编译方式。对于.so文件,您使用-shared;对于.dylib,您使用-dynamiclib。.so和.dylib都可以作为动态库文件互换,并且都具有DYLIB或BUNDLE的类型。这是显示此内容的不同文件的读数。
两者在Mac OS X上等效的原因是为了与其他编译为.so文件类型的UNIX OS程序向后兼容。
编译说明:无论是编译.so文件还是.dylib文件,都需要在链接步骤中将正确的路径插入动态库中。通过将-install_name和文件路径添加到链接命令来执行此操作。如果不这样做,您将遇到这篇文章中看到的问题:Mac Dynamic Library Craziness(可能仅适用于Fortran)。