mac下用Pyenv+opencv搭建opencv环境

最近图像识别技术越来越成熟了,乘着周末打算跑一个opencv,看网上教程,很多都是基于brew的,可是这样编译出来的看起来只能绑定系统的版本(因为是走默认的环境)

考虑到有多个不同版本python需要安装opencv的需求,于是决定从源码中之间编译 (本文使用opencv 3.4.3 , python 3.6.6 python 2.7.15, pyenv 1.2.7, mac 16.7.0 测试)

那首先就是要下载源码了,opencv源码分了两部分,一个是opencv,一个是opencv_contrib,可以直接从git上clone,也可以直接从release里下.但要注意两个版本保持一致

https://github.com/opencv/opencv/releases
https://github.com/opencv/opencv_contrib/releases

下载好了之后解压,得到两个目录,一个是opencv 一个是opencv_contrib,把她们放到统一工作目录下

在编译开始前,进入pyenv后要确保pyenv安装的python开启了动态链接,检查环境变量PYTHON_CONFIGURE_OPTS 是否设置mac上为--enable-framework, linux 上为 --enable-shared. 之后重新安装制定的版本

export PYTHON_CONFIGURE_OPTS=--enable-framework
pyenv install 3.3.6
pyenv local 3.6.6
安装numpy
pip3 install numpy

此时,python已经通过pyenv配置(已3.6.6为例),同时安装了numpy。如果需要安装ffmpeg/VTK支持。

brew install ffmpeg vtk

如果opencv_contrib和opencv同级存放。

mkdir opencv/build
cd opencv/build
python_root=$(python-config --prefix)
echo $python_root
cmake -DCMAKE_BUILD_TYPE=Release \
	-D PYTHON3_INCLUDE_DIR=${python_root}/include/python3.6m  \
	-D PYTHON3_EXECUTABLE=${python_root}/bin/python3  \
	-D PYTHON3_LIBRARY=${python_root}/lib/lib/libpython3.6m.dylib \
	-DPYTHON3_PACKAGES_PATH=${python_root}/site-packages \
	-DCMAKE_INSTALL_PREFIX=$HOME/opencv/  \
	-DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ \
	-DBUILD_TESTS=OFF \
	-DBUILD_PERF_TESTS=OFF \
	-DBUILD_opencv_python3=ON  ..

 如果要同时安装python2 添加python2的配置,要注意的是 PYTHON*系列选项的路径可能会变化,所有需要手动检查一下,不要忘了都需要安装pynum否则无法编译

如果也配置了2.7结果可能如下

mac+pyenv+python2+python3+opencv

最后就可以make了

make
make install

漫长的等待后,在输出的lib/下找到生成的python so 库,手动拷贝到自己虚环境的site-package下。之后就可以import cv2了

最后总结一下其中的坑:

  1. pyenv 安装python时没有启动动态链接支持,导致后续opencv无法链接
  2. pyenv中的python环境没有安装numpy
  3. 使用virtualenv创建了新的虚环境,但是opencv去动态链接时依旧查询pyenv中的环境,导致虚环境中虽然安装了pyenv,但是编译时无法检测到
  4. 调试时重新运行cmake不生效,应为没有删除之前cmake的结果,必须先rm -rf 所有build目录下的文件

前期后后断断续续的搞了2天,才把坑踩平,总算是踩平了

发表在 日誌 | 标签为 , , | mac下用Pyenv+opencv搭建opencv环境已关闭评论

HPA GEN 8 EXSi 升级

过年在家,决定抽出时间来解决掉之前自己HPA GEN8 EXSi磁盘读写过慢的问题
google 一下发现有人说升级一下就好1果断决定升级一下

esxcli network firewall ruleset set -e true -r httpClient
esxcli software profile update -p ESXi-6.5.0-20170702001-standard \
-d https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml
 [InstallationError]
 [Errno 28] No space left on device
       vibs = VMware_locker_tools-light_6.5.0-0.23.5969300
 Please refer to the log file for more details.

结果按照操作发现本地报错, google发现有人已经解决了2

cd /tmp/
wget http://hostupdate.vmware.com/software/VUM/PRODUCTION/main/esx/vmw/vib20/tools-light/VMware_locker_tools-light_6.5.0-0.23.5969300.vib

我在vmware里下载了几次都没有成功,直接去外面下载好,用scp传了回去

md5sum VMware_locker_tools-light_6.5.0-0.23.5969300.vib
5d5194cdc0795e74c29fa41d41d96110  VMware_locker_tools-light_6.5.0-0.23.5969300.vib

可以对照一下md5摘要,把下载好的vib文件存放到tmp下,然后安装:

esxcli software vib install -f -v /tmp/VMware_locker_tools-light_6.5.0-0.23.5969300.vib

出现如下结果说明成功了

Installation Result
   Message: Operation finished successfully.
   Reboot Required: false
   VIBs Installed: VMware_locker_tools-light_6.5.0-0.23.5969300
   VIBs Removed:
   VIBs Skipped:

清理空间
需要在设置里开启swap,否则可能回无法下载成功

rm /tmp/VMware_locker_tools-light_6.5.0-0.23.5969300.vib

现在重新执行更新命令

esxcli software profile update -f -p ESXi-6.5.0-20170702001-standard -d \
https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml

成功后重新开启防火墙

esxcli network firewall ruleset set -e false -r httpClient

reference:

  1. https://jayshao.com/update-esxi-solve-achi-problem/
  2. https://communities.vmware.com/message/2695601#2695601
发表在 系統 | 标签为 , , , | HPA GEN 8 EXSi 升级已关闭评论

docker 安装 sentry 踩坑记录

之前公司项目里用到了sentry。当初很轻松的用docker装好跑起来了,由于要上https。当初用端口区分的方案被换成了用域名访问,一切顺利。由于sentry服务要迁移服务器。考虑到老数据没太大用,所以直接下掉了老得sentry服务,打算重新架一套。万万没想到,走上了一条踩坑路
由于之前一次的经验,所以直接吧配置写到了docker-compose.yml里面,万万没想到,服务直接起不来了。查日志才发现,原来sentry-docker的文档太滞后,所以起服务的方式变了。重新调整姿势,好不容易服务器来了。万万没想到,浏览器没法访问,访问报告400 bad request。照着sentry-docker的评论说要改secure.prefix_url的配置,好不容易吧配置文件搞好,发现一点效果没有。
用w3m在localhost上试了一下,发现果然localhost可以访问。想一下sentey貌似是django写的,估计ALLOW_HOST设置问题,试了一下发现不行。一怒之下attach进去看python源码,看了半天发现sentry改的东西太多了。google半天也没有结果。不过遇到一个妹子和我遇到同一个问题,还在上海,果断github上follow。
想了一下默默的去nginx里吧host改成了localhost:9000(我的sentry放在了9000端口上)
试一下被重定向到了localhost:9000
心说为啥不proxy_redirect一下?
proxy_redirect ~(http://|https://)?.*?/(.*) /$2;
reload之后居然好了。。。
果然有的时候换个思路海阔天空,sentry确实开源版是不想让人用了啊

发表在 日誌 | 标签为 , , | 留下评论