Переместить каждый пиксель вправо (на 1 пиксель) в OpenCV без использования переназначения?

Я хочу переместить каждый пиксель изображения вправо на 1 пиксель, а ниже приведена карта, которую я использую для преобразования переназначения.

Этот подход требует гораздо больше времени, чем нужно для такого простого преобразования. Есть ли функция cv, которую я могу использовать? Или мне просто разделить изображение на 2 изображения, одно шириной src.cols-1 пикселей, другое шириной 1 пиксель, а затем скопировать их в новое изображение?

void update_map()
{
    for( int j = 0; j < src.cols; j++ ){
       for( int i = 0; i < src.rows; i++ ){
         if (j == src.cols-1)
             mat_x_Rotate.at<float>(i,j) = 0;
         else
            mat_x_Rotate.at<float>(i,j) = j + 1;
            mat_y_Rotate.at<float>(i,j) = i;
         }
     }
}

person kennyzx    schedule 16.08.2012    source источник


Ответы (1)


Что вы можете сделать, чтобы улучшить свою производительность:

  • remap является излишним для этой цели. Более эффективно копировать пиксели напрямую, чем определять полное преобразование переназначения, а затем использовать его.
  • измените порядок цикла: перебирайте строки, затем столбцы. (OpenCV Mat хранится в порядке строк, поэтому итерация сначала по столбцам очень неудобна для кэширования)
  • используйте Mat::ptr() для прямого доступа к пикселям в той же строке, как массив C-стиля. (это большой выигрыш в производительности по сравнению с использованием at<>(), который, вероятно, делает такие вещи, как проверка индексов для каждого доступа)
  • вытащите оператор if из внутреннего цикла и обработайте столбец 0 отдельно.

В качестве альтернативы: да, разделение изображения на части и копирование в новое изображение может быть примерно таким же эффективным, как и непосредственное копирование, как описано выше.

person comingstorm    schedule 16.08.2012