У вас есть много проблем, и в разделе комментариев вы указываете, что он даже не работает. Я думаю, вы должны сосредоточиться на решении одной проблемы за раз, и когда код действительно работает, имеет смысл попытаться сделать это быстрее.
Ваше приложение извлекает width
из одного изображения и из height
из другого. Это редко приводит к хорошим вещам.
uint32_t width = im1.GetWidth();
uint32_t height = im2.GetHeight();
Хорошо, так buffer1
указывает на im1
и p1
указывает на buffer1
. Я думаю, вам действительно не нужно p1
, просто используйте вместо этого buffer1
.
uint8_t* buffer1 = static_cast<uint8_t*>(im1.GetBuffer());
uint8_t* p1 = buffer1;
А теперь buffer2
и p2
указывает на im1
. Что ?! Не должно быть im2
??? Вам действительно не нужно p2
.
uint8_t* buffer2 = static_cast<uint8_t*>(im1.GetBuffer());
uint8_t* p2 = buffer2;
for (uint32_t y = 0; y < height; ++y)
{
приращения следующего цикла p
, который представляет собой переменный, которая не была объявлена. Полагаю, вы пытались увеличить p1
.
for (uint32_t x = 0; x < width; ++x, ++p)
{
*p2 = (uint8_t)*p1+*p2;
++p2;
}
}
Прямо сейчас это не имеет смысла для отображения im2
, так как он не был изменен с помощью кода. более
ShowImage(im2, "Mixed image");
Одно дело, если im1
и im2
имеют разные размеры, то это может привести к аварии.
я настоятельно рекомендую вам взглянуть на следующий пост, чтобы узнать, как задавать лучшие вопросы и получить людей, чтобы помочь вам: Short, Self Contained, Correct (Compilable), Example
Существует несколько технологий, которые могут ускорить обработку этих арифметических операции:
- Если у вас есть Intel CPU: Intel® Threading Building Blocks (Intel® TBB);
- Если у вас есть процессор Intel: Intel® Integrated Performance Primitives (Intel® IPP);
- Если у вас есть GPU, поддерживающий OpenGL, вы можете написать свой собственный GLSL shader;
- Если у вас есть графический процессор, поддерживающий DirectX, вы можете написать свой собственный HLSL shader;
- Если у вас есть графический процессор NVIDIA: CUDA™;
- Если у вас есть NVIDIA/ATI GPU: OpenCL;
- Вы можете попробовать Eigen, библиотеку шаблонов C++ для линейной алгебры (выполняет оптимизированные операции над матрицами);
- OpenMP® (спецификация для набора директив-компилятора, подпрограмм библиотеки и переменных среды, которые могут использоваться для указания высокоуровневого параллелизма в программах Fortran и C/C++);
- Наконец, вы всегда можете написать свой собственный код для выполнения арифметических операций.
Просьба уточнить .. ваше название говорит «без буфера», но в вашем вопросе упоминается «не пиксель за пикселем» .. они не являются взаимоисключающими? Чего вы действительно хотите? Что значит «без буфера»? Как вы ожидаете вычесть одно изображение из другого, не делая этого для каждого пикселя? – stijn
Вы можете попробовать использовать инструкции SSE для выполнения этого по 4 байта за раз. Но реальные вопросы: вы профилировали, чтобы знать, что узкое место в этом конкретном действии? О каком разрешении мы говорим? – RedX
Я добавил часть своего предыдущего кода, чтобы уточнить. Может быть, я могу добавить буфер для всего изображения. Как я могу это сделать? Разрешение моей камеры составляет 1294 пикселя x 964 пикселя. – CherryCola