Map Inference in the Face of Noise and Disparity代码环境搭建
1. 引言
地图生成算法网站Mapconstruction by pfoser里可以看到许多关于地图生成算法的介绍,Map Inference in the Face of Noise and Disparity
是其中效果较好的算法,但是由于时间过去已久,Python相关的版本库迭代,作者也未使用版本管理工具,所以代码的运行也存在一定的问题
Map Inference in the Face of Noise and Disparity代码重现遇到的问题(持续更新....)_搬砖来的八块腹肌的博客-CSDN博客这篇文章没写完,笔者想给它写完
2. 资料下载
代码和数据下载地址:Bits - Software (uic.edu)
论文下载地址:https://www.cs.uic.edu/pub/Bits/JamesBiagioni/biagioni-gis12.pdf
3. 环境安装
作者经过不断的尝试,最终将环境所需要的软件版本使用Conda导出如下:
# This file may be used to create an environment using:
# $ conda create --name <env> --file <this file>
# platform: win-64
bzip2=1.0.6=vc9_3
ca-certificates=2022.3.29=haa95532_1
certifi=2020.6.20=pyhd3eb1b0_3
cython=0.10.1=pypi_0
freetype=2.5.5=vc9_2
jpeg=9b=vc9_0
libpng=1.6.37=h7a46e7a_0
libtiff=4.0.6=vc9_3
numpy=1.10.1=py27_0
olefile=0.46=py27_0
opencv=2.4.11=py27_1
pillow=4.2.1=py27_0
pip=19.3.1=py27_0
python=2.7.18=hfb89ab9_0
rtree=0.9.7=pypi_0
scipy=0.16.0=np110py27_0
setuptools=44.0.0=py27_0
sqlite=3.30.1=h0c8e037_0
vc=9=h2eaa2aa_6
vs2008_runtime=9.00.30729.1=haa95532_6
wheel=0.37.1=pyhd3eb1b0_0
wincertstore=0.2=py27hf04cefb_0
zlib=1.2.11=h3cc03e0_3
可以直接复制这段文字到txt文件然后使用Conda导入,一键安装
主要的库有:
- python 2.7.18
- opencv 2.4.11
- numpy 1.10.1
- scipy 0.16.0
- cython 0.10.1
- pillow
- rtree
4. 遇到的问题
4.1 Python版本
原代码里使用了是Python 2 的语法,直接使用Python 3 会报错,这里笔者建议先使用Python 2.7.x
4.2 OpenCV版本
原代码使用的应该是OpenCV 2 ,直接使用OpenCV 3 及以上会报错no module named cv
,这里笔者建议先使用OpenCV 2.4.x
pip源里是没有opencv 2的,只有opencv-python 3.x ,所以这里需要使用Conda安装
conda install opencv=2
4.3 Cython版本
运行骨架细化(skeleton.py
)会出现ImportError: No module named pyximport***
这里需要安装Cython,参照Map Inference in the Face of Noise and Disparity代码重现遇到的问题(持续更新....)_搬砖来的八块腹肌的博客-CSDN博客,安装完Cython和编译器后会出现ImportError: Building module subiterations failed: [“CompileError: command ‘C:\\Users\\xxx\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\amd64\\cl.exe’ failed with exit status 2\n”
,经过笔者的尝试,将cython版本降低到0.10.x可以解决,Conda源里没有cython 0.10.x,只有高版本的cython ,所以这里需要使用pip安装:
pip install cython==0.10.1
4.4 编译器
运行骨架细化(skeleton.py
)会出现Unable to find vcvarsall.bat
参考:Unable to find vcvarsall.bat_深山里的小白羊的博客-CSDN博客,总的来说就是需要编译器Microsoft Visual C++ Compiler for Python 2.7
这里笔者首先遇到的麻烦是:Microsoft Visual C++ Compiler for Python 2.7 下载地址https://www.microsoft.com/en-us/download/details.aspx?id=44266不可用,微软官网没有提供下载了
经过笔者探索,最后在这里下载:https://master.dl.sourceforge.net/project/transfervisc/VCForPython27.msi?viasf=1
第二个问题是环境变量:Unable to find vcvarsall.bat_深山里的小白羊的博客-CSDN博客里提到的方法都可行,只是第一个方法的环境变量地址不对,第二种方法修改了源文件,带有一定的侵入性,笔者查看源代码发现源代码里是使用VS90COMNTOOLS
这个环境变量,我们配置一下编译器的环境变量即可:
添加一个环境变量,变量名为VS90COMNTOOLS
,变量值为C:\Users\xxx\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\bin
(请将xxx换为你的用户名,并检测这个地址是否存在)
即使添加了环境变量也可能没解决,且看下一个问题
第三个问题是源代码的路径有问题,且看源代码(envs\<env-name>\Lib\distutils\msvc9compiler.py):
toolskey = "VS%0.f0COMNTOOLS" % version
toolsdir = os.environ.get(toolskey, None)
if toolsdir and os.path.isdir(toolsdir):
productdir = os.path.join(toolsdir, os.pardir, os.pardir, "VC")
意思就是VS90COMNTOOLS
的地址向上两级再添加VC
,可是笔者发现vcvarsall.bat
这个文件不在VC目录下啊,而是和VC目录同级,所以笔者将,"VC"
删除了:
toolskey = "VS%0.f0COMNTOOLS" % version
toolsdir = os.environ.get(toolskey, None)
if toolsdir and os.path.isdir(toolsdir):
productdir = os.path.join(toolsdir, os.pardir, os.pardir)
4.5 链接文件numpy/arrayobject.h
编译文件的时候说找不到这个numpy/arrayobject.h
:
fatal error C1083: 无法打开包括文件: “numpy/arrayobject.h”: No such file or directory
经过笔者验证这个文件存在于envs\<env-name>\Lib\site-packages\numpy\core\include\numpy
笔者将这个envs\<env-name>\Lib\site-packages\numpy\core\include\
下的numpy文件夹
复制到envs\<env-name>\include
解决了链接问题
4.5 无法导入imsave
将skeleton.py
中的
from scipy.misc import imsave, toimage
改为
from scipy.misc.pilutil import imsave, toimage
然后报错找不到Image库,安装PIL即可:
conda install pillow
至此问题基本全部解决
5. 写在最后
其实最烦的就是Cython的编译问题,Cython编译的那个文件其实就是两个运算函数,这个文件用Python重写也挺简单,就不必这么麻烦得搭建编译环境
笔者使用中也并未明显感受到这个Cython文件带来得加速作用
参考资料
- Unable to find vcvarsall.bat_深山里的小白羊的博客-CSDN博客
- Map Inference in the Face of Noise and Disparity代码重现遇到的问题(持续更新....)_搬砖来的八块腹肌的博客-CSDN博客
- Mapconstruction by pfoser
Map Inference in the Face of Noise and Disparity代码环境搭建的更多相关文章
- AV 地址错误 map 文件 根据地址报错,查 Delphi 代码
1. 首先需要设置程序生成 map 文件.Project -> Options -> Linker -> Map file , Detailed 2. 计算公式Edit2.Text ...
- java8--List转为Map、分组、过滤、求和等操作----代码示例
Java 8 函数式编程风格 Java 迄今为止最令人激动的特征.这些新的语言特征允许采用函数式风格来进行编码,我们可以用这些特性完成许多有趣的功能.这些特性如此有趣以至于被认为是不合理的.他们说会影 ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(六)针对spark2.2.1以yarn方式启动spark-shell抛出异常:ERROR cluster.YarnSchedulerBackend$YarnSchedulerEndpoint: Sending RequestExecutors(0,0,Map(),Set()) to AM was unsuccessful
Spark以yarn方式运行时抛出异常: [spark@master bin]$ cd /opt/spark--bin-hadoop2./bin [spark@master bin]$ ./spark ...
- perf 对两个map是否重叠的判断,以及函数map_groups__fixup_overlappings代码逻辑
该标题可以抽象出来的问题是:两个前开后闭的区间 rangeA 和 rangeB,如何判断这两个区间是否重叠.这个问题在内核中非常重要,虚拟地址空间的划分需要它,perf中map_group的构建也需要 ...
- 使用CXF开发WebService程序的总结(五):基于Map数据类型处理的的客户端和服务端代码的编写
1. 首先我们按照List或数组等处理方式来处理Map,看看效果 1.1 在服务端的接口中添加以下方法 /** * 查询所有班级信息加上对应的学生列表 * * @return */ public Ma ...
- MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析
在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...
- 【Java心得总结七】Java容器下——Map
我将容器类库自己平时编程及看书的感受总结成了三篇博文,前两篇分别是:[Java心得总结五]Java容器上——容器初探和[Java心得总结六]Java容器中——Collection,第一篇从宏观整体的角 ...
- STL模板中的map的使用与例题
最近的计分赛,记得自己的都只是过了两题.遇到了两次map,自己在寒假看了一点的map,只知道在字符串匹配的时候可以用的到.但是自己对map的使用还是不够熟练使用,这回在第一次和第二次的计分赛中都遇到可 ...
- 如何使用Google Map API开发Android地图应用
两年前开发过的GoogleMap已经大变样,最近有项目要用到GoogleMap,重新来配置Android GoogleMap开发环境,还真是踩了不少坑. 一.下载Android SDK Manager ...
- std::map用法
STL是标准C++系统的一组模板类,使用STL模板类最大的好处就是在各种C++编译器上都通用. 在STL模板类中,用于线性数据存储管理的类主要有vector, list, map 等等.本文主要 ...
随机推荐
- 【每日一题】【树的dfs递归,返回多次,注意都遍历完后才最终返回】2022年1月6日-112. 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum .判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum .如果存在,返回 tr ...
- Vue快速上门(3)-组件与复用
VUE家族系列: Vue快速上门(1)-基础知识 Vue快速上门(2)-模板语法 Vue快速上门(3)-组件与复用 01.component组件 1.1.component基础知识 组件是可以复用的V ...
- JavaScript:箭头函数:作为参数进行传参
之前已经说过,JS的函数,也是对象,而函数名是一个变量,是可以进行传参的,也即函数是可以被传参的. 只要是函数,都可以被传参,但是箭头函数的语法更为灵活,所以更方便进行传参. 如上图所示,fun1是一 ...
- CompletableFuture 使用总结
转载请注明出处: 1.Future使用对比 Future表示一个异步计算的结果.它提供了isDone()来检测计算是否已经完成,并且在计算结束后,可以通过get()方法来获取计算结果.在异步计算中,F ...
- Python实验报告(第5章)
实验5:字符串及正则表达式 一.实验目的和要求 学会使用字符串的常用操作方法和正确应用正则表达式 二.实验环境 软件版本:Python 3.10 64_bit 三.实验过程 1.实例01:使用字符串拼 ...
- 【Java】线程池梳理
[Java]线程池梳理 前言 线程池:本质上是一种对象池,用于管理线程资源.在任务执行前,需要从线程池中拿出线程来执行.在任务执行完成之后,需要把线程放回线程池.通过线程的这种反复利用机制,可以有效地 ...
- ArcGIS工具 - 统计要素数量
查询和统计是GIS中的重要功能之一.在ArcGIS中可以按属性信息.按空间位置关系进行查询和统计.今天为源GIS给大家分享使用ArcPy编程实现批量统计地理数据库要素类记录数量. 软件应用 统计单个图 ...
- P8622 [蓝桥杯 2014 国 B] 生物芯片
简要题意 有 \(N\) 个二进制数,编号为 \(1\sim N\),初始时都是 \(0\).博士进行了 \(N-1\) 次操作,在第 \(i\) 次操作时,会将 \(1\sim N\) 中所有编号为 ...
- 交叉编译esp8089
交叉编译esp8089 编译环境: 硬件:全志R528 ubuntu:Linux ubuntu 4.15.0-194-generic #205-Ubuntu SMP Fri Sep 16 19:49: ...
- 如何让Java编译器帮你写代码
作者:京东零售 刘世杰 导读 本文结合京东监控埋点场景,对解决样板代码的技术选型方案进行分析,给出最终解决方案后,结合理论和实践进一步展开.通过关注文中的技术分析过程和技术场景,读者可收获一种样板代码 ...