我可以帮助您进行翻译。这段文字涉及编程相关内容,主要是介绍如何使用Python中的OpenCV库读取视频帧并将其转换为二维数组。这些视频是灰度的,因此像素值使用无符号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
中期望得到什么。 这是我从前者得到的图像,而这是我从上述代码中得到的图像。
正如您所看到的,它们完全不同。我能从实际图像中获取的唯一信息是条纹:它看起来几乎像是在尺寸上出现了错误,宽度比高度多了更多像素(此图像应为128 x 256)。但是,我已经尝试在绘制之前对数组进行转置,根据imshow文档更改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
cv.CreateImage
和cv.CvtColor
,打印出图像,它看起来正好像我期望的那样。非常感谢!显然,通过字符串将 OpenCV 数组转换为 numpy 数组是次优的。 - Magsol