在Matplotlib.pyplot.imshow()中从OpenCV显示2D数组

Mag*_*sol 8 python opencv matplotlib computer-vision

我有一个Python设置,我使用OpenCV库以2D阵列的形式读取视频的帧 - 这些视频是灰度的,所以我使用无符号的8位整数作为像素值.

在我的下一步中,我正在尝试使用pyplot.imshow()matplotlib来显示视频的帧.不幸的是,我得到的东西根本没有任何意义.

这是阅读视频的代码:

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)
Run Code Online (Sandbox Code Playgroud)

cv2numpy是一个实用程序函数,它将OpenCV数组转换为numpy数组(只是调用fromstring然后是a 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()
Run Code Online (Sandbox Code Playgroud)

在其他一些代码中,我SaveImage在单个帧上使用OpenCV 来提供我期望的参考imshow.这是我从前者得到的图像,这是我从上面的代码中得到的图像.

正如你所看到的,它们完全不同.我可以从实际图像中收集的唯一内容是条纹:它看起来几乎就像是尺寸错误,宽度上的像素多于高度(此图像应该是128 x 256).但我已经试过绘制它,改变了之前调换阵列extentaspectshape参数按照imshow文档,并与一些奇怪的像素拉伸我还没有找到一个固定的除外.

有什么想法吗?

编辑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
Run Code Online (Sandbox Code Playgroud)

Jus*_*eel 5

我相信问题出在你的cv2numpy函数上.试试这个:

def cv2numpy(cvarr, the_type):
  a = np.asarray(cv.GetMat(cvarr), dtype=the_type)
  return a
Run Code Online (Sandbox Code Playgroud)

它为我做了伎俩.如果你没有使用灰度输入(我知道你说你现在使用的是灰度),那么你需要使用cv.CreateImage和cv.CvtColor进行转换.