рассчитать несоответствие в обработке

я использую обработку, и я пытаюсь вычислить несоответствие из 2 выпрямленных изображений, и для этого мне нужно взять каждый пиксель из левого изображения и выполнить поиск в одной строке из правого изображения и найти аналогичный пиксель, размер изображений 640x480 .

Мне нужно запустить disparityImage(PImage imgL, PImage imgR) в функции draw() и она слишком медленная, функция выполняется за 1-2 секунды, но если я прокомментирую эти строки кода «minD=d;rightX=xr;» из блока if функция выполняется за 3-5 миллисекунд. Я не понимаю, в чем проблема с моим кодом, я пытался выяснить это слишком много часов, но не смог.

void depthImage(PImage imgL, PImage imgR) { 
    for (int x=0; x<imgL.width; x=x+1) {
      for (int y=0; y<imgL.height; y=y+1) {    
        color imgleft=imgL.get(x,y);
        float r1=red(imgleft);
        float g1=green(imgleft);
        float b1=blue(imgleft);

        float minD=Integer.MAX_VALUE;
        int rightX=0;

        for (int xr=0; xr<imgR.width; xr++) {    
          color imgright=imgR.get(x,y);
          float r2=red(imgright);
          float g2=green(imgright);
          float b2=blue(imgright);

          float d=dist(r1, g1, b1, r2, g2, b2);

          if (d<minD) {
            minD=d;
            rightX=xr;
          }
        }
      }
    }
  }

person madalin costache    schedule 21.12.2019    source источник


Ответы (1)


dist() вычисляет Евклидово расстояние между двумя точками. Для вычисления требуется функция sqrt(). sqrt() очень трудоемкая операция.

dist(x1, y1, z1, x2, y2, z2)

можно выразить как

sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) + (z2-z1)*(z2-z1))

Вместо этого я рекомендую вычислять и сравнивать квадрат евклидова расстояния. Это позволяет избежать дорогостоящей операции sqrt. например.:

void depthImage(PImage imgL, PImage imgR) {
    for (int x=0; x<imgL.width; x=x+1) {
        for (int y=0; y<imgL.height; y=y+1) {

            color imgleft = imgL.get(x,y);
            float r1=red(imgleft);
            float g1=green(imgleft);
            float b1=blue(imgleft);

            float minD_square = Integer.MAX_VALUE;
            int rightX=0;

            for (int xr=0; xr<imgR.width; xr++) {

                color imgright=imgR.get(x,y);
                float dr = red(imgright)   - r1;
                float dg = green(imgright) - g1;
                float db = blue(imgright)  - b1;

                float d_square = dr*dr + dg*dg + db*db;

                if (d_square < minD_square) {
                    minD_square = d_square;
                    rightX = xr;
                }
            }
        }
    }
}
person Rabbid76    schedule 21.12.2019