目录
cv2.imread 和scipy.misc.imread的区别
module 'scipy.misc' has no attribute 'imread'
cv2.imread 和scipy.misc.imread的区别
cv2.imread读出来的图片是BGR格式的numpy.array,scipy.misc.imread读出来的图片是RGB格式的numpy.array。
因为都是numpy.array,所以scipy.misc.imread读出来的图片可以用cv2.imwrite直接保存。
而很神奇的是,cv2.imread读出来的图片直接用cv2.imwrite保存的图片颜色会失真,因为cv2.imwrite会把接收的矩阵以RGB格式写入图片,这就和cv2.imread不配套了。刚开始学openCV的时候这里特别容易乱。
解决方法是,cv2.imread读出来的图片要用cv2.imwrite保存前,先用cv2.cvtColor函数把BGR图像转为RGB才可以看到正常颜色的图片。
import cv2
img = cv2.imread('img path')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imwrite('save img path', img)
此外,scipy.misc.imread对处理图片的size有一定要求,实际使用时我遇过一个错误信息提示我图片尺寸太大,scipy.misc.imread无法处理,改用cv2.imread就好了,令我哭笑不得。
获取当前运行脚本的路径
sys.path[0]获取的是调用该脚本文件的路径,比如有一个test.py文件调用了cfg.py文件,在cfg.py文件中用sys.path[0]获取的是test.py文件文件的所在的文件夹路径。
若要获取cfg.py文件的路径,需要在cfg.py文件用下面这条语句
pathOfCfg = os.path.split(os.path.realpath(__file__))[0]
终端运行python程序的import module的问题
终端跑程序的时候,sys.path中的系统路径和在IDLE中跑的时候是不一样的,往往IDLE中可以跑通的代码在终端是跑不通的。
在IDLE中跑的时候,sys.path中既有当前IDLE所打开的最上层的文件夹的路径,也有当前要跑的子文件夹中程序的路径。
而在终端跑的时候,sys.path中只有当前要跑的子文件夹中程序的路径,这时如果你要import上一级目录下的文件,就会报错说找不到。
这个问题有两个解决方法:
1、在要跑的子文件夹的程序中,给系统路径加入上级目录的绝对路径
import os, sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..‘)
__file__ 是该运行的程序的绝对路径,os.path.dirname是获取该绝对路径的文件夹路径(去掉basename)
'..' 的意思就是跳到上一级目录(单个点是当前目录,'../..'是上两级目录 )
这样就可以在项目的最上级目录直接跑子文件中的程序了。
2、第2种方法是进入子文件夹中,把上一级文件夹的相对路径添加到系统路径中
import sys
sys.path.append('..’)
这时终端就只能在子文件夹中跑代码了,毕竟系统路径中对上一层文件夹的路径搜索只能从该子文件夹出发,通过相对路径'..'找到上一级文件夹。
module 'scipy.misc' has no attribute 'imread'
pip install scipy==1.2.1
显示中文乱码的问题
python有自带的可以显示中文的习题,不用专门去下载SimHei Font。
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
递归太多,程序运行时爆炸
在列表数超过1100多行之后,由于列表数据经过的子函数太多,造成了递归引用爆炸的问题。
这个问题的归因在于列表的传参和取值是一个引用的过程,如果列表传入一个函数,然后在函数内部又取部分列表数据传入下一个函数……如此递归,数据量一多就会爆炸。
解决这个问题可以在一些不需要用引用来同步改变列表值的地方,用深拷贝deepcopy来将引用断掉。
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 1022-1023: unexpected end of data
这个问题的起因是我用了中文人名当作了dict的key,正常运行的时候是没有问题的,但是debug的时候如果想点开dict一探究竟就会断开报上述错误。
解决方法是在用人名做key的时候用‘人名’.encode("utf-8")将人名编码存入,虽然debug的时候看着很奇怪,但是起码不会报错,是系统喜欢的样子。
qt.qpa.plugin: Could not load the Qt platform plugin "xcb"
装QT环境时出现这个错误,试了很多网上的方法,终于找到一个简单且有效的。
其实只需要把 libqxcb.so 这个链接库写进环境变量就好。
envpath = '/home/xier/anaconda3/envs/QT/lib/python3.6/site-packages/cv2/qt/plugins/platforms'
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = envpath
把以上这两句代码写进要运行的py文件中就解决问题了。
json.load出现'str' object has no attribute 'load'
一个简单的json.load竟然会出现这样的问题,其实原因也比较傻,就是json其实是一个包(需要import json)。
而我在写代码的时候把一个str变量也命名为json,发生了冲突,所以出现了str 对象没有load这个功能的问题。