Ubuntu 16.04下用Python显示YUV格式的图片

YUV420p to RGB & view

UYVY/YUV422 to RGB and view:

原始链接


YUV to RGB : Python Imaging Library

Python matplotlib.pyplot.draw()在不同版本中的差别导致界面绘制异常问题

Ubuntu系统上进行如下配置:

之后执行如下测试代码:

上面的测试代码在 Ubuntu 14.04.5版本上是可以正常执行的,对应的 matplotlib的版本是 matplotlib 1.3.1,但是放到 Ubuntu 16.04.2系统上则是无法正常显示的,对应的 matplotlib的版本是 matplotlib 1.5.1

造成这个问题的原因在于 matplotlib.pyplot.draw(),这个函数行为的改变,早期这个函数是同步更新界面的,后来的版本却变成了空闲异步更新界面,只有当 matplotlib.pyplot.pause(interval)被调用的时候才会刷新界面。

所以只需要上面的代码修改成如下即可在不同版本之间兼容:

注意,我们在 matplotlib.pyplot.draw()调用后面增加了 matplotlib.pyplot.pause(interval)的调用。

貌似调用 fig.canvas.flush_events()更合适

查看 matplotlib的版本使用如下代码:

参考链接


Ubuntu 14.04系统上Python使用"subprocess.Popen"执行"source"命令报告错误“/bin/sh: source: not found”

使用如下的例子中的代码

运行的时候报告错误

这个错误发生的原因是 subprocess.Popen执行 Shell命令的时候默认调用 /bin/sh,而 source命令 /bin/bash才支持的,因此导致错误发生,修改后的脚本如下:

注意添加的 executable="/bin/bash",指明了执行脚本的执行程序是 /bin/bash

参考链接


Calling the “source” command from subprocess.Popen

ubuntu 16.04执行letsencrypt的时候报告错误“ImportError: No module named datetime”

网站一直使用 letsencrypt提供的 HTTPS证书,这个证书的问题在于每隔三个月就必须更新一次,本次更新证书的时候,提示如下错误:

错误发生的原因在于 letsencrypt自己构建了一个 Python的虚拟环境来隔离,但是早期建立的虚拟环境中是缺少部分软件包的,而自身的 BUG导致也没有重新更新虚拟环境,导致出现异常。

解决方法就是删除 letsencrypt自己构建的 Python的虚拟环境,然后继续执行脚本让他重建即可。

参考链接


Python 2.7中PIL.Image转换为OpenCV支持的Image格式

参考链接


Convert image from PIL to openCV format

TypeError: slice indices must be integers or None or have an __index__ method

执行如下 Python脚本时

会遇到错误信息

这个提示非常具有迷惑性,会让人不知所措。

其实非常简单

这行导致整个数组变成了浮点数格式的数组,可以试着打印出结果,就会发现整个里面的数字完全变成了浮点数。

而浮点数是不可以用来作为数组的下标的。

修改成如下方式即可

请注意最后的

函数,强制转换浮点数为整数。

参考链接


错误异常slice indices must be integers or None or have

如何用Python PIL获取图片的RGB数值

参考链接


如何用Python PIL获取图片的RGB数值

Python 2.7在调用自定义类函数时候报错"exceptions.TypeError: 'int' object is not callable"

Python 2.7中按照如下方式定义类

在执行脚本的时候会报告如下错误

造成错误的原因在于 Python 2.7中当类的成员变量跟方法名重名的时候,默认是使用类的成员变量,而成员变量是无法被调用的,因而导致报错。

解决方法就是避免方法名跟成员变量同名即可,比如上面的定义修改成如下方式即可

Python 2.7使用multiprocessing报错PicklingError: Can't pickle : attribute lookup __builtin__.instancemethod failed

Python 2.7中使用下面代码的时候

会报告如下错误:

这种错误发生的原因是 Python 2.7版本中的 multiprocessing模块的进程池部分存在 BUG,无法正常处理这种写法的代码,据说在 Python 3.4版本之后解决了此问题。

目前测试来看,不用 Python 2.7中的进程池,而是自己创建进程,自己管理进程的方式,可以比较简单的解决此类问题。

比如代码修改成如下样子,即可正常运行

至于多进程的管理,则只需要使用

引入 multiprocessing模块的 Queue,实现一个简单的生产者,消费者模型即可。

参考链接


python multiprocessing遇到Can’t pickle instancemethod问题

WARNING:libav.swscaler:Warning: data is not aligned! This can lead to a speedloss

Python中使用 libav视频解码的时候,如果需要更改最后输出的视频的宽高,比如如下代码:

可能会收到一条警告信息

导致警告的原因是 swscaler的缩放的目标尺寸不合适,它预期的大小是 16的倍数,这个倍数可以保证 swscaler以最高效的方式进行图片的缩放处理。

解决警告的方式就是保证宽高都是 16的倍数即可。

参考链接


[swscaler] Warning: data is not aligned! This can lead to a speedloss 的解决方法【FFmpeg】