我在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()
在其他一些代码中,我在一个框架上使用OpenCVSaveImage
来提供对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
我相信问题出在你的CV2数量函数上。试试这个:
它给了我一个小把戏。如果您不使用灰度输入(我知道您说过现在使用灰度),则需要使用cv.CreateImage和cv.CvtColor进行转换。
您使用的是2.3.1版吗?使用cv2API,我们不再需要实现自己版本的OpenCV/Numpy转换。例如,以下代码工作正常:
相关问题 更多 >
编程相关推荐