我有一个应用程序,从使用ctypes包装的相机API接收指向JPEG数据的指针,将其转换为wx.Image,并将图像显示为电影。
其中一个必需的功能是将像素的两个分量设置为第三个分量。例如,我的RGB格式像素为(100,200,255),我想将R和B值设置为G,即(200,200,200)。我需要在保持良好帧率的同时对图像中的每个像素执行此操作。
我可以通过调用Image.GetData从我的wx.Image访问RGB值,该方法返回一个字符串,其中包含以下格式的像素值:RGBRGBRGB...我通过迭代这个RGBRGBRGB字符串来实现该特性。
然而,这种天真的方法速度太慢,无法达到良好的FPS,因为(我认为):
a)我正在遍历图像中的每个像素。
b)我正在做过多的数据复制。
我考虑将我的RGB数据转换为numpy,执行操作(我假设numpy有一种更快的方法来做这种事情),然后再转换回wx.Image。不幸的是,我不能直接从原始数据转换为numpy,因为数据以JPEG格式而不是RGB位图的形式提供。因此,我需要从数据->wx.Image->numpy数组->wx.Image。
我还考虑实现自己的Python缓冲区,当读取时返回G像素值而不是R和B值。我认为这将是理想的解决方案,因为它不需要数据复制或过多的迭代,但我不知道如何去做。我需要用C编写此缓冲区吗?是否可以在纯Python中实现缓冲区并仍然操作原始内存?
那么,SO,您认为我应该如何改进我的性能?我应该尝试numpy或缓冲区解决方案,还是我忽略了更简单的解决方案?
我主要寻找相关文档或示例的想法/链接,但如果有人想编写一些代码,那也可以:)
谢谢
其中一个必需的功能是将像素的两个分量设置为第三个分量。例如,我的RGB格式像素为(100,200,255),我想将R和B值设置为G,即(200,200,200)。我需要在保持良好帧率的同时对图像中的每个像素执行此操作。
我可以通过调用Image.GetData从我的wx.Image访问RGB值,该方法返回一个字符串,其中包含以下格式的像素值:RGBRGBRGB...我通过迭代这个RGBRGBRGB字符串来实现该特性。
然而,这种天真的方法速度太慢,无法达到良好的FPS,因为(我认为):
a)我正在遍历图像中的每个像素。
b)我正在做过多的数据复制。
我考虑将我的RGB数据转换为numpy,执行操作(我假设numpy有一种更快的方法来做这种事情),然后再转换回wx.Image。不幸的是,我不能直接从原始数据转换为numpy,因为数据以JPEG格式而不是RGB位图的形式提供。因此,我需要从数据->wx.Image->numpy数组->wx.Image。
我还考虑实现自己的Python缓冲区,当读取时返回G像素值而不是R和B值。我认为这将是理想的解决方案,因为它不需要数据复制或过多的迭代,但我不知道如何去做。我需要用C编写此缓冲区吗?是否可以在纯Python中实现缓冲区并仍然操作原始内存?
那么,SO,您认为我应该如何改进我的性能?我应该尝试numpy或缓冲区解决方案,还是我忽略了更简单的解决方案?
我主要寻找相关文档或示例的想法/链接,但如果有人想编写一些代码,那也可以:)
谢谢