【发布时间】:2012-02-17 03:01:29
【问题描述】:
我在 Python 中有一个设置,我使用 OpenCV 库将视频的帧读取为 2D 数组——这些视频是灰度的,所以我使用无符号 8 位整数作为像素值。
在下一步中,我尝试使用 matplotlib 中的 pyplot.imshow() 来显示视频的帧。不幸的是,我得到的东西根本没有任何意义。
这是阅读视频的代码:
import numpy as np
import cv
def read_video(filename):
video = cv.CaptureFromFile('%s' % filename)
num_frames = int(cv.GetCaptureProperty(video, cv.CV_CAP_PROP_FRAME_COUNT))
frames = []
for i in range(0, num_frames):
frame = cv.QueryFrame(video)
if frame is None:
quit('Failed to extract frame %s of %s!' % (i, num_frames))
toadd = cv2numpy(frame, 'uint8')
frames.append(np.array(toadd))
return np.array(frames)
cv2numpy 是一个实用函数,可将 OpenCV 数组转换为 numpy 数组(只需调用fromstring,然后调用reshape)。这是我用来绘制视频第一帧的代码:
import matplotlib.pyplot as plot
import matplotlib.cm as cm
frames = read_video('video.avi')
plot.imshow(frames[0], cmap = cm.gray)
plot.show()
在其他一些代码中,我在单个帧上使用了 OpenCV SaveImage,以提供我对 imshow 的期望的参考。 Here's the image I get from the former 和 here's the image I get from the code above。
如您所见,它们截然不同。我唯一能从实际图像中收集到的是条纹:看起来它的尺寸几乎是错误的,宽度上的像素比高度上的像素多(这个图像应该是 128 x 256)。但是我已经尝试在绘制数组之前对其进行转置,根据imshow documentation 更改extent 和aspect 和shape 参数,除了一些奇怪的像素拉伸之外,我还没有找到解决方法。
有什么想法吗?
编辑 1: 我认为添加 cv2numpy 代码可能是谨慎的做法,以防重塑以某种方式使事情变得混乱(因为我上面的“真实”图像没有使用该代码,因此cv2numpy 只涉及有问题的管道)。
def cv2numpy(cvarr, the_type):
a = np.fromstring(
cvarr.tostring(),
dtype = the_type,
count = cvarr.width * cvarr.height)
a.shape = (cvarr.height, cvarr.width)
return a
【问题讨论】:
标签: python opencv matplotlib computer-vision