Digitalkamera-algorithmen
Arbeite ich an einer einfachen video-Gerät, und ich möchte einige standard-Coole Kamera-features. Bei allen möchte ich vorstellen,
- Fokus-Anzeige
- Autofokus
- Automatische Belichtung (ideale Belichtungszeit Schätzung)
Momentan bin ich auf der Suche nach einigen Beispielen, wie diese Funktionen umgesetzt werden können. Haben Sie irgendwelche nützliche links?
BEARBEITEN :
Ok, ich werde mit standard-CCD-Kamera, die mir ~ 20 fps in ~1MPix Auflösung. Ich Plane, es zu schreiben in C#, im Fall der performance-Probleme, ich verwende C++. Ich werde Objektiv + CCD-Kamera + motor.
BEARBEITEN :
Ich würde gerne ein paar mehr detaillierte Algorithmus Beschreibung. Ich bin sicher, einige lernen in der universitären Lehre, aber ich habe Schwierigkeiten zu finden einige. Für die Fokus-Anzeige habe ich versucht, ein primitiver Ansatz, aber in einigen Fällen ist es gescheitert.
int verticalPoints = 0, horizontalPoints = 0;
///Calculate the vertical differences
for (int x = 0; x < toAnalyze.Width; x++)
{
for (int y = 1; y < toAnalyze.Height; y++)
{
byte* pixel = (byte*)data.Scan0 + y * stride + x;
verticalDiff += Math.Abs(*pixel - *(pixel - stride));;
}
}
verticalDiff /= toAnalyze.Width * (toAnalyze.Height-1);
///Calculate horizontal differences
for (int y = 0; y < toAnalyze.Height; y++)
{
for (int x = 1; x < toAnalyze.Width; x++)
{
byte* pixel = (byte*)data.Scan0 + y * stride + x;
horizontalDiff += Math.Abs(*pixel - *(pixel - 1));
}
}
horizontalDiff /= (toAnalyze.Width-1) * toAnalyze.Height;
///And return the average value
return(verticalDiff + horizontalDiff) / 2;
Dank
- Ich denke, die "language-agnostic" - tag können verhindern, dass jemand von der Buchung keine Antworten. Es würde helfen, eine Menge, die Sie angegeben, welche Art von video-Gerät und welche Sprache Sie möchten, dies zu tun - es gibt viel zu viele Möglichkeiten sonst.
- Würde es helfen, zu deine Frage, wenn Sie angeben, welche Art von einfachen video-Gerät, welche Art von input, den Sie von ihm bekommen und welche Art der Ausgabe, die Sie erwarten.
- Auch, welche Art von hardware verfügbar ist. Licht-sensor? Hardware-Objektiv Fokus? Etc.
- Meine sehr dumme Idee zu konzentrieren Indikation ist die Verwendung eines Optimierungs-Algorithmus, um daraus eine Unschärfe mit einem inverse-of-the-Unschärfe Faltung, maximiert (einfach gemessen) konzentrieren. "Einfach" könnte etwas bedeuten, wie die Standardabweichung für die pixel-Werte, oder zwischen-pixel-Unterschiede (sorry, nicht mein Gebiet). Sowieso, der Punkt ist, dass, wenn Sie haben geschätzt die Parameter des blur-Funktion, die eine weitere sinnvolle Maßnahme, mit der (nicht) konzentrieren. "Ganz dumme Idee", denn ich bezweifle, dass es getan werden kann, in angemessener Zeit.
- Gut, es kann nicht sein, dass dumme Idee. Sie werden überrascht sein, was Sie berechnen können, in "Echtzeit", wenn der code effizient geschrieben.
- Siehe auch stackoverflow.com/a/32951113/15485
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur, Sie zu informieren. Ich arbeite an einer professionellen forensischen 5-Megapixel-digital-Kamera-software in WPF. In DotNet nicht C++. Es gibt einige threading issus zu wissen, aber es funktioniert perfekt schnell. Schneller, weil die GPU verwendet wird.
Jerry hat eine gute Arbeit mit seiner Antwort.
Fokus Erkennung ist der "Kontrast-Erkennung, basierend auf Zeit /frames". Logik ist einfach, um es performant ist es nicht einfach.
Autofokus-Erkennung
Zur Kontrolle der Belichtung Zeit, es ist einfach, wenn Sie erstellt das Histogramm des Bildes. Bild-Histogramm
In jedem Fall müssen Sie es tun, für
Dieser mix macht es ein bisschen komplizierter, da Sie auch die Verwendung von Farb-gain-Kanäle zur Erhöhung der Helligkeit des Bildes. RGB-Bild digital. Die Leuchtdichte kann das gleiche Ergebnis wie mit "Gain" und "Exposition" Zeit.
Rechnet man die Belichtungszeit automatisch, halten gute daran, dass Sie benötigen einen frame zu berechnen und so kleiner die Belichtungszeit, da mehr frames, die Sie erhalten. Das bedeutet, dass, wenn Sie wollen, um einen guten Algorithmus, versuchen Sie immer, eine sehr kleine Belichtungszeit erhöhen und es langsam. Nicht verwenden Sie einen linearen Algorithmus, wo du verringern Sie den Wert langsam.
Gibt es auch mehr Methoden für digitale Kameras wie Pixel-Binning Pixel-Binning zur Erhöhung der framerate um schnelle Fokus-Ergebnisse.
Hier ist ein Beispiel, wie sich konzentrieren können, Arbeit zu generieren, die einen Fokus Intensität Bild :
Ab dem Ende, so zu sprechen:
Auto-Belichtung ist ziemlich einfach: Sie Messen die Licht-und herauszufinden, wie lange eine Belichtung benötigt wird für das Durchschnittliche Licht zu produzieren, ~15-18% Grau-Ebene. Es gibt viele versuche der Verbesserung, die (in der Regel durch Dosierung einer Anzahl von Abschnitten des Bildes getrennt, und die Verarbeitung dieser Ergebnisse), aber das ist der Ausgangspunkt.
Gibt es zwei Arten von Autofokus. Die meisten video-Kameras verwenden, basierend auf der Erkennung von Kontrast-look am Eingang vom sensor, und wenn die Unterschiede zwischen benachbarten Bildpunkten werden maximiert, man bedenkt, dass "im Fokus".
Kontrast-Erkennung Autofokus macht es ein bisschen schwierig zu tun, konzentrieren Hinweis obwohl-insbesondere die, die Sie nie wirklich wissen, Wann Sie erreicht haben, maximalen Kontrast, bis der Kontrast beginnt wieder zu fallen. Wenn du tust, Autofokus, konzentrieren Sie sich, bis Sie sehen, ein Berg und dann sehen, wie es anfängt wieder zu fallen, und dann fahren Sie zurück zu, wo es am höchsten war. Für den manuellen Fokus mit einer Anzeige, Sie können nicht erkennen, maximaler Kontrast, bis es beginnt wieder zu fallen. Der Benutzer befolgen müsste in etwa das gleiche Muster, bewegte Vergangenheit am besten konzentrieren, dann zurück zum optimum.
Alternativ können Sie die phase-Erkennung. Dies setzt die Ausrichtung der "Bilder" kommen durch zwei Prismen, ähnlich wie die split-Bild-Sucher, die verwendet wurden, in vielen (den meisten?) Spiegelreflexkameras vor-Autofokus zum Einsatz kamen.
Den AForge.net hat eine Menge Zeug tun Bildverarbeitung , einschließlich edge-detection-und convolution-Filter. Eine andere (größere) Bibliothek möchten Sie vielleicht, zu betrachten ist OpenCV hat aber nur einen Wrapper für .net, wo, wie AForge in c# geschrieben ist direkt