У меня есть приложение, которое получает указатель на данные JPEG от API камеры, завернутого в ctypes, преобразует его в wx.Image и отображает изображения в виде фильма.
Одна из необходимых функций заключается вустановите два компонента пикселя равным третьему.Например, мой пиксель в формате RGB (100 200 255), я хочу установить значения R и B равные G или (200 200 200).Мне нужно сделать это для каждого пикселя изображения, сохраняя при этом нормальную частоту кадров.
Я могу получить доступ к значениям RGB из моего wx.Image, вызвав Image.GetData, который возвращает строку, содержащую значения пикселейв следующем формате: RGBRGBRGB ... Я реализовал эту функцию наивно, перебирая эту строку RGBRGBRGB.
Однако этот наивный подход слишком медленен для достижения приличного FPS, потому что (я думаю):
a) Я перебираю каждый пиксель изображения.
б) Я слишком много копирую данные.
Я подумал о том, чтобы преобразовать мои данные RGB в numpy, выполнить операцию (я полагаю, что numpy будет иметь более быстрый способ сделать это), а затем преобразовать обратнок wx.Image.К сожалению, я не могу преобразовать прямые данные из исходных данных в пустые, поскольку данные представлены в формате JPEG, а не в виде растрового изображения RGB.Поэтому мне нужно перейти от data-> wx.Image-> numpy array-> wx.Image.
Я также рассмотрел реализацию своего собственного буфера python, который вместо этого будет возвращать, например, значение пикселя Gзначений R и B при чтении.Я думаю, что это было бы идеальным решением, поскольку оно не требует копирования данных или чрезмерных итераций, но я понятия не имею, как это сделать.Нужно ли мне писать этот буфер в C?Возможно ли реализовать буферы в чистом питоне и все же манипулировать необработанной памятью?
Итак, как вы думаете, как мне улучшить свою производительность?Стоит ли пытаться использовать решение NumPy или буферное решение, или мне не хватает более простого решения?
В основном я ищу идеи / ссылки на соответствующую документацию или примеры, но если кто-то хочет написать какой-то код, тогдахорошо:)
Спасибо