bug篇-python中关于PIL与cv2使用的一个问题


问题描述

python中通过如下语句
cap = cv2.VideoCapture(video_path)
ret, frame = cap.read()
可以解析视频路径为video_path的视频,frame是其生成的一帧图片(一个矩阵)。

我现在想使用cv2处理上面生成的这一帧图片,这里就产生了一个问题,对于同一张图片cv2和PIL处理生成的矩阵是不一样的。所以这里需要做一个转换,把frame转换成cv2可以处理的形式。这个可以通过如下代码实现:
img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))

这时候,就产生了一个问题,对这个视频生成的这个图片来说。我把它对应的frame通过上面的方式转换生成的矩阵跟我通过cv2把frame保存到本地然后再用cv2读取生成的矩阵是否一致?

于是我做了一下验证,首先,用PIL把frame保存到本地:
img = Image.fromarray(frameRGB).convert("RGB")
img.save("imgs/imgGet.jpg")

然后,用PIL读取本地的图片
img_path = "imgs/1.jpg"
img = Image.open(img_path).convert('RGB')

最后,对比imgByCv2和img,发现两者存在些微的差别。这让我很费解。

解决方案

通过一段时间的折腾,最后我发现是因为图片格式的问题,只需要保存图片的时候把图片的格式设置为Png格式即可。