2016-06-30 6 views
1

Ich versuche etwas zu tun, was ich schon einmal gesehen habe und ich dachte, es wäre sehr einfach, aber Sie wissen, wie das geht.Shading mit opencv

Betrachten Sie den Code unten:

  vector<Point> polypoints{topleft,topright,bottomright,bottomleft}; 
      vector<vector<Point>> arrayofpolypoints{polypoints}; 
      fillPoly(frame, arrayofpolypoints, color3, LINE_8 ,0,Point(0,0)); 

Ich nehme 4 gegeben Punkte und ziehen/ein Polygon auf einer Matte Bild füllen. Einfach, oder? Jetzt möchte ich, dass dieses Polygon Transparenz oder Schatten hat, den Bereich nicht massiv (oder schattiert mit einem festen Rahmen wäre schön). Aber es scheint, dass es in OpenCV keine Funktion gibt, die das schon tut, also muss ich jetzt etwas erfinden. Irgendwelche Ideen?

Ich denke, es könnte besser sein, das Polygon auf ein anderes leeres Mat-Bild zu zeichnen, und dann durch jedes Pixel zu gehen und jedes zweite (oder eine andere Art von Verhältnis) auszublenden. Dann kann ich irgendwie den ursprünglichen Rahmen und die neue Matte kombinieren. Ist das sinnvoll?

+2

vielleicht [diese] (http://answers.opencv.org/question/73016) wird hilfreich sein, – sturkmen

Antwort

1

Ich landete die folgenden Schritte ausführen:

      vector<Point> polypoints{topleft,topright,bottomright,bottomleft}; 
      vector<vector<Point>> arrayofpolypoints{polypoints}; 
      destimage = Scalar::all(0); 
      fillPoly(destimage, arrayofpolypoints, color3, LINE_8 ,0,Point(0,0)); 
      double transparency = 0.5; 
      for (int i = 0; i < frame.cols; i++) { 
       for (int j = 0; j < frame.rows; j++) { 
        Vec3b &intensity = frame.at<Vec3b>(j, i); 
        Vec3b &intensityoverlay = destimage.at<Vec3b>(j, i); 
        for(int k = 0; k < frame.channels(); k++) { 
         uchar col = intensityoverlay.val[k]; 
         if (col != 0){ 
          intensity.val[k] = (intensity.val[k]*(1-transparency) + (transparency*col)); 
         } 
        } 
       } 
      }