Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;ValueError:无效的数据缓冲区大小。”;将Nmpy图像从BGR转换为RBG后,在wx.Bitmap.FromBuffer中_Python_Numpy_Opencv_Bitmap_Wxpython - Fatal编程技术网

Python &引用;ValueError:无效的数据缓冲区大小。”;将Nmpy图像从BGR转换为RBG后,在wx.Bitmap.FromBuffer中

Python &引用;ValueError:无效的数据缓冲区大小。”;将Nmpy图像从BGR转换为RBG后,在wx.Bitmap.FromBuffer中,python,numpy,opencv,bitmap,wxpython,Python,Numpy,Opencv,Bitmap,Wxpython,我正在将numpy图像从BGR转换为RBG格式,并且此图像正在转换为wx.Bitmap图像,但在转换过程中,我得到了位图图像的“ValueError:无效数据缓冲区大小”。 在没有BGR到RBG转换的情况下,位图图像可以正常生成 使用错误代码: class Video: def __init__(self): # self._filename = file_name self._frame_number = -1 self._cap = c

我正在将numpy图像从BGR转换为RBG格式,并且此图像正在转换为wx.Bitmap图像,但在转换过程中,我得到了位图图像的“ValueError:无效数据缓冲区大小”。 在没有BGR到RBG转换的情况下,位图图像可以正常生成

使用错误代码:

class Video:
    def __init__(self):
        # self._filename = file_name
        self._frame_number = -1
        self._cap = cv2.VideoCapture('Path/t/o/Video')  ###self._filename
        self._frameCount = int(self._cap.get(cv2.CAP_PROP_FRAME_COUNT))
        self._frameWidth = int(self._cap.get(cv2.CAP_PROP_FRAME_WIDTH))
        self._frameHeight = int(self._cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
        self._frame_count = 0
        self._frame_grabbed = True
        self.img = np.array((self._frameHeight, self._frameWidth, 3), np.dtype('uint8'))

    def iter_frames(self): # Generator to return Numpy and BitMap Image 
        while self._frame_count < self._frameCount and self._frame_grabbed:
            self._frame_count += 1
            self._frame_grabbed, self.img = self._cap.read()
            print(type(self.img))
            #self.img.reshape(self._frameHeight,self._frameWidth, 3)
            self.img = self.img[..., ::-1]  # To convert BGR to RGB
            yield self.img, wx.Bitmap.FromBuffer(self._frameWidth, self._frameHeight, self.img)

v=Video()
print(next(iter_frames()))
课堂视频:
定义初始化(自):
#self.\u filename=文件名
self.\u帧\u编号=-1
self._cap=cv2.VideoCapture('Path/t/o/Video')###self._文件名
self.\u frameCount=int(self.\u cap.get(cv2.cap\u PROP\u FRAME\u COUNT))
self.\u frameWidth=int(self.\u cap.get(cv2.cap\u PROP\u FRAME\u WIDTH))
self.\u frameHeight=int(self.\u cap.get(cv2.cap\u PROP\u FRAME\u HEIGHT))
自。\帧\计数=0
self.\u frame\u=True
self.img=np.array((self.\u frameHeight,self.\u frameWidth,3),np.dtype('uint8'))
def iter_帧(self):#用于返回Numpy和位图图像的生成器
而self.\u frame\u count
遇到错误:

  File "C:/Users/qpjg1605/Documents/Python_proj/Auptimo/Video_file.py", line 46, in <module>
    print(next(v.iter_frames()))
  File "C:/Users/qpjg1605/Documents/Python_proj/Auptimo/Video_file.py", line 30, in iter_frames
    yield self.img, wx.Bitmap.FromBuffer(self._frameWidth, self._frameHeight, self.img)
ValueError: Invalid data buffer size.
文件“C:/Users/qpjg1605/Documents/Python\u proj/Auptimo/Video\u File.py”,第46行,在
打印(下一个(v.iter_frames()))
文件“C:/Users/qpjg1605/Documents/Python_proj/Auptimo/Video_File.py”,第30行,在iter_框架中
产生self.img,wx.Bitmap.FromBuffer(self.\u frameWidth,self.\u frameHeight,self.img)
ValueError:无效的数据缓冲区大小。
但是,当我使用numpy数组(self.buf[])的代码时,它工作得很好。”

相同的代码:

class Video:
    def __init__(self):
        # self._filename = file_name
        self._frame_number = -1
        self._cap = cv2.VideoCapture('Path\to\Video')  ###self._filename
        self._frameCount = int(self._cap.get(cv2.CAP_PROP_FRAME_COUNT))
        self._frameWidth = int(self._cap.get(cv2.CAP_PROP_FRAME_WIDTH))
        self._frameHeight = int(self._cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
        self._buf = np.empty((self._frameCount, self._frameHeight, self._frameWidth, 3),np.dtype('uint8'))  # Empy numpy array of the shape and dtype(pixel from 0 to 255)   

        self._frame_count = 0
        self._frame_grabbed = True
        print("here")
        while self._frame_count < self._frameCount and self._frame_grabbed:
            self._frame_grabbed, self._buf[self._frame_count] = self._cap.read()
            self._buf[self._frame_count] = self._buf[self._frame_count][..., ::-1]## Converting BGR to RBG(last dimension)
            #self._buf[self._frame_count] = imutils.resize(self._buf[self._frame_count], 640, 360)
            self._frame_count += 1


    def iter_frames(self):
        while self._frame_number < self._frameCount:
            self._frame_number = self._frame_number + 1
            # yield int(self._frame_number)
            # cur_bmp = wx.Bitmap.FromBuffer(self.get_org_frame_width(), self.get_org_frame_height(), )
            print(self._frame_number)
            yield self._buf[self._frame_number], wx.Bitmap.FromBuffer(self.get_org_frame_width(),
                                                                      self.get_org_frame_height(),
                                                                      self._buf[self._frame_number])
课堂视频:
定义初始化(自):
#self.\u filename=文件名
self.\u帧\u编号=-1
self._cap=cv2.VideoCapture('Path\to\Video')###self._文件名
self.\u frameCount=int(self.\u cap.get(cv2.cap\u PROP\u FRAME\u COUNT))
self.\u frameWidth=int(self.\u cap.get(cv2.cap\u PROP\u FRAME\u WIDTH))
self.\u frameHeight=int(self.\u cap.get(cv2.cap\u PROP\u FRAME\u HEIGHT))
self.\u buf=np.empty((self.\u frameCount,self.\u frameHeight,self.\u frameWidth,3),np.dtype('uint8'))#形状和dtype的Empy numpy数组(像素从0到255)
自。\帧\计数=0
self.\u frame\u=True
打印(“此处”)
而self.\u frame\u count

这将创建一个包含3项的数组。第一个参数是用于填充数组的iterable,而不是数组的形状。可能您希望创建带有
np.zero
或类似值的数组。在这种情况下,第一个参数是形状。

解决了位图转换问题:

 def iter_frames(self):   # Frame Generator to yield next frame
    while self._frame_count < self._frameCount and self._frame_grabbed:
        self._frame_count += 1
        self._frame_grabbed, self.img = self._cap.read()
        self.img = cv2.cvtColor(self.img,cv2.COLOR_BGR2RGB)
        yield self.img, wx.Bitmap.FromBuffer(640, 360, cv2.resize(self.img, (640, 360)))
def iter_帧(self):#生成下一帧的帧生成器
而self.\u frame\u count

`

尝试在运行的代码中对self.img=np.array((self.\u frameHeight,self.\u frameWidth,3),np.dtype('uint8')进行赋值:
self.\u frame\u count+=1 self.\u frame\u抓取,self.img=self.\u cap.read()self.img=self.img[…,:-1]生成self.img,wx.Bitmap.FromBuffer(self.\u frameWidth,self.\u frameHeight,self.img)
但在尝试将其从BGR转换为RGB时仍出现相同错误:
生成self.img,wx.Bitmap.FromBuffer(self.\u frameWidth,self.\u frameHeight,self.img)值错误:数据缓冲区大小无效。
@robindann
 def iter_frames(self):   # Frame Generator to yield next frame
    while self._frame_count < self._frameCount and self._frame_grabbed:
        self._frame_count += 1
        self._frame_grabbed, self.img = self._cap.read()
        self.img = cv2.cvtColor(self.img,cv2.COLOR_BGR2RGB)
        yield self.img, wx.Bitmap.FromBuffer(640, 360, cv2.resize(self.img, (640, 360)))