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).但我已经试过绘制它,改变了之前调换阵列extent和aspect和shape参数按照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)
我相信问题出在你的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进行转换.
| 归档时间: |
|
| 查看次数: |
6433 次 |
| 最近记录: |