EmguCV / OpenCV Bild Addition / Subtraktion
-
16-09-2019 - |
Frage
Ich verwende EmguCV und ich versuche, zwei Bilder zu subtrahieren, um einen Filter ähnlich wie AForge .NET des MoveTowards Filter.
Das ist, was meine leicht modifizierte Version der oben genannten URL zu tun versucht. Gegeben 2 Bilder, die Quelle und das Overlay - es bewegt sich langsam das Quellbild in Richtung der Überlagerung. Er tut dies auf der Grundlage der folgenden:
result = source + movementFactor * (overlay - source);
Dabei Ergebnis Quelle und Overlay sind Bilder und movementFactor ist die Änderungsrate im Bereich von 0 bis 1.
Als ich versuchte, dies in Code mit movementFactor gleich 1 ist, sah die Ergebnisse verkorkste (es war so etwas wie eine Bewegung Trail). Um es zu testen weiter entfernte ich movementFactor aus der obigen Gleichung und machte Ergebnis = Quelle + Overlay - Quelle. Ich erwartete das Overlay-Bild als das Ergebnis zu sehen, was ich auch tat, aber zusammen mit einer Region des Bildes, das wurde zu blinken.
Ich vermute, dass Pixelintensitäten in den oberen oder unteren Grenzen abgeschnitten werden, wenn Addition / Subtraktion stattfindet.
kann ich erreichen, was ich mit diesem wollen:
for (int i = 0; i < src.Height; i++)
{
for (int j = 0; j < src.Width; j++)
{
res[i, j] = new Gray(src[i, j].Intensity + movementFactor * (ovr[i, j].Intensity - src[i, j].Intensity));
}
}
Aber dies deutlich verlangsamt die Verarbeitung. Wie kann ich die Addition / Subtraktion Problem oder die Geschwindigkeit Problem mit der oben überwinden? Vielen Dank für Ihre Antworten!
Lösung
Ich werde nach der Antwort, die ich hier gefunden, falls jemand über das gleiche Problem in der Zukunft ausgeführt wird.
Dies ist, wie Sie es tun würde:
Image<Gray,Byte> result = new Image<Gray,Byte>(source.Size);
CvInvoke.cvAddWeighted(source, 1.0-movementFactor, overlay, movementFactor, 0.0, result);
Quelle: EmguCV Foren, hier ist die Post das gab mir die Antwort
Andere Tipps
Ich werde nach der Antwort, die ich hier gefunden, falls jemand läuft über das gleiche Problem in der Zukunft.
Dies ist, wie Sie es tun würde:
Image<Gray,Byte> result = new Image<Gray,Byte>(source.Size); CvInvoke.cvAddWeighted(source, 1.0-movementFactor, overlay, movementFactor, 0.0, result);
Quelle: EmguCV Foren, hier ist die Post, die gab mir die Antwort
Beachten Sie, dass es eine sauberere Syntax dafür:
var result = frame.AddWeighted(1.0 - movementFactor, overlay, movementFactor, 0.0);