簡體   English   中英

在Matplotlib.pyplot.imshow()中從OpenCV顯示2D數組

[英]Display 2D array from OpenCV in Matplotlib.pyplot.imshow()

我有一個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 fromstring )。 這是我用來繪制視頻第一幀的代碼:

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文檔更改extentaspectshape參數,除了一些奇怪的像素拉伸我還沒有找到修復。

有什么想法嗎?

編輯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

我相信問題出在你的cv2numpy函數上。 試試這個:

def cv2numpy(cvarr, the_type):
  a = np.asarray(cv.GetMat(cvarr), dtype=the_type)
  return a

它為我做了伎倆。 如果你沒有使用灰度輸入(我知道你說你現在使用的是灰度),那么你需要使用cv.CreateImage和cv.CvtColor進行轉換。

你使用的是2.3.1版嗎? 使用cv2 API,我們不再需要實現我們自己的OpenCV / Numpy轉換版本。 例如,以下代碼工作正常:

>>> import cv2
>>> from matplotlib import pyplot as plt
>>> lenna = cv2.imread('lenna.tiff', cv2.CV_LOAD_IMAGE_GRAYSCALE)
>>> lenna
array([[162, 162, 162, ..., 170, 155, 128],
       [162, 162, 162, ..., 170, 155, 128],
       [162, 162, 162, ..., 170, 155, 128],
       ..., 
       [ 43,  43,  50, ..., 104, 100,  98],
       [ 44,  44,  55, ..., 104, 105, 108],
       [ 44,  44,  55, ..., 104, 105, 108]], dtype=uint8)
>>> plt.imshow(lenna, cmap='gray')
>>> plt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM