it-swarm.com.de

So erfassen Sie ein Standbild von einer Webcam unter Linux

Ich versuche, ein C++/Qt-Programm für Linux zu schreiben, bei dem ich ein Standbild von einer Webcam mache, einige Umwandlungen in ein Foto (Zuschneiden, Größenanpassung usw.) vornehme und es in einer JPEG-Datei speichere.

Aber ich bin auf einige Probleme gestoßen. Das Hauptproblem ist, dass der Standart-UVC-Linux-Treiber (USB-Videogeräteklasse) derzeit keine direkte Einzelbildaufnahme unterstützt: http://www.ideasonboard.org/uvc/ .

Es gibt also zwei Möglichkeiten, ein Standbild aufzunehmen. Sie können ein Bild aus dem Videostream von der Kamera aufnehmen oder ein separates Foto wie eine tragbare Digitalkamera aufnehmen. Der zweite Weg wird vom Linux-Uvc-Treiber nicht unterstützt. Daher ist der erste Weg der einzige Weg. Das Problem ist jedoch, dass, wenn Sie ein Bild aus dem Videostream aufnehmen möchten, die Größe des Fotos nicht größer sein darf als die Größe des Videos im Videovorschaufenster. Wenn ich also ein 2-Megapixel-Foto aufnehmen möchte, muss ich einen Videostream mit der Größe 1600x1200 starten, was nicht so komfortabel ist (zumindest hängt in Qt die Größe des Videostreams von der Videopreview-Fenstergröße ab).

Ich weiß, dass es für linux 2 API ein Video gibt, das bei dieser Aufgabe hilfreich sein kann, aber ich weiß nicht, wie es verwendet werden soll. Ich lerne gerade Gstreamer, aber ich kann jetzt nicht herausfinden, was ich mit diesen Tools tun kann.

Ich freue mich über jede Hilfe. Ich denke, es ist kein schweres Problem für Leute, die Linux, GStreamer, v4l2 API und andere linuxspezifische Dinge kennen.

Das Programm wird übrigens nur mit der Web-Kamera Logitech C270 HD verwendet.

Bitte hilf mir. Ich weiß nicht, welche API oder welches Framework mir dabei helfen kann. Vielleicht weißt du.

10
locomotion

Leider funktionierten die C4V2-Aufrufe in opencv nicht für die Bildaufnahme mit einer Kamera, die ich mit dem UVC-Treiber aus der Box probiert habe.

Um das Problem zu debuggen, habe ich versucht, dies mit c-Code zu tun, der c4v2 direkt aufruft.

Ich habe mit dem gefundenen Beispielcode hier gespielt. Dabei werden Frames aus dem Videostrom gezogen. 

Sie können es mit kompilieren:

gcc -O2 -Wall `pkg-config --cflags --libs libv4l2` filename.c -o filename

Ich habe mit 3 Logitech-Kameras experimentiert. Das Beste an diesem Produkt scheint der Logitech C910 zu sein. Aber auch das hat erhebliche Probleme. 

Hier sind die Probleme, denen ich beim Versuch begegnet bin, Ihre gleiche Aufgabe mit diesem Code auszuführen.

Mit Breite und Höhe, die auf 1920 x 1080 eingestellt sind, funktioniert es fast immer. 

Wenn ich andere Möglichkeiten direkt von der Befehlszeile aus abfrage, zum Beispiel:

v4l2-ctl --list-formats-ext

und ich versuche einige der anderen "verfügbaren" kleineren Größen, die in der Auswahl hängen und warten, bis die Kamera den Puffer freigibt. 

Auch wenn ich versuche, andere Größen direkt über die Befehlszeile einzustellen, zum Beispiel:

v4l2-ctl -v height=320 -v width=240 -v pixelformat=YUYV

Dann überprüfe mit 

v4l2-ctl -V

Ich finde, dass es das korrekte Pixelformat zurückgibt, aber oft nicht die richtige Größe. 

Anscheinend ist diese Kamera, die auf der UVC-Site als UVC und daher v4l2-kompatibel aufgeführt ist, nicht dem Schnupftabak vorbehalten. Ich vermute, es ist genauso schlecht für andere Kameras. Die anderen beiden, die ich ausprobiert hatte, waren auf der Website ebenfalls als kompatibel aufgeführt, hatten jedoch schlechtere Probleme.

Ich habe noch einige Tests mit der LogitechC910 durchgeführt, nachdem ich dies gepostet hatte. Ich dachte, ich würde die Ergebnisse veröffentlichen, falls es jemand anderen hilft.

Ich habe ein Skript geschrieben, um den oben genannten v4l2-Grabber-Code für alle Formate zu testen, die von der Kamera behauptet werden, wenn sie mit v4l2 abgefragt wird. Hier sind die Ergebnisse: 

640x480 => Hangs on clearing buffer
160x120 => Works
176x144 => Works
320x176 => Works
320x240 => Works
432x240 => Works
352x288 => Works
544x288 => Works
640x360 =>  Works
752x416 => Hangs on clearing buffer
800x448 => Hangs on clearing buffer
864x480 => Works
960x544 => Works
1024x576 => Works
800x600 => Works
1184x656 => Works
960x720 => Works
1280x720 => Works
1392x768 => Works
1504x832 => Works
1600x896 => Works
1280x960 => Works
1712x960 => Works
1792x1008 => Works
1920x1080 => Works
1600x1200 => Works
2048x1536 => Works
2592x1944 => Hangs on clearing buffer.

Es stellt sich heraus, dass die Standardeinstellung von 640x480 nicht funktioniert. Das hat mich und die meisten anderen, die auf Message Boards gepostet haben, gefangen. 

Da es sich beim ersten Bild um ein Videoframe handelt, kann es beim Start zu einer falschen Belichtung kommen (oft schwarz oder in der Nähe). Ich glaube, das liegt daran, dass die Kamera die Belichtung anpasst, da sie als Videokamera verwendet wird, und sich nicht um die ersten Bilder kümmert. Ich glaube, das hat auch mich und andere gefangen, die das erste Bild als schwarz oder fast schwarz empfunden haben und es für einen Fehler gehalten haben. Spätere Bilder haben die richtige Belichtung 

Es stellt sich heraus, dass opencv mit Python-Wrappern mit dieser Kamera gut funktioniert, wenn Sie die oben aufgeführten Landminen vermeiden und alle Fehlermeldungen ignorieren. Die Fehlermeldungen sind darauf zurückzuführen, dass die Kamera zwar v4l2-Befehle akzeptiert, jedoch nicht korrekt reagiert. Wenn Sie also die Breite einstellen, wird sie tatsächlich richtig eingestellt, sie reagiert jedoch mit einer falschen Breite. 

Um mit Python-Wrapper unter opencv zu laufen, können Sie Folgendes tun:

import cv2
import numpy

cap = cv2.VideoCapture(0)  #ignore the errors
cap.set(3, 960)        #Set the width important because the default will timeout
                       #ignore the error or false response
cap.set(4, 544)        #Set the height ignore the errors
r, frame = cap.read()
cv2.imwrite("test.jpg", frame)
3
Sani Elfishawy
**Download And Install 'mplayer'** 
mplayer -vo png -frames 1 tv://
2
M. Haris Azfar
mplayer -vo png -frames 1 tv://

möglicherweise wird ein grüner Bildschirm ausgegeben, da die Kamera noch nicht bereit ist. 

mplayer -vo png -frames 2 tv://

Sie können versuchen, die Anzahl der Bilder zu erhöhen, und eine Zahl auswählen, aus der die Kamera korrekte Bilder liefert.

1
Dave

Was ist mit diesem Programm?

#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
    VideoCapture webcam;
    webcam.open(0);
    Mat frame;
    char key;

    while(true)
    {
        webcam >> frame;
        imshow("My Webcam",frame);
        key = waitKey(10);

        if(key=='s')
        break;
    }
    imwrite("webcam_capture.jpg", frame);
    webcam.release();
    return 0;
}

Dadurch wird ein Bild der maximal für Ihre Webcam zulässigen Größe aufgenommen. Jetzt können Sie mit Qt Effekte hinzufügen oder die Größe des aufgenommenen Bildes ändern. Und OpenCV ist sehr einfach in Qt zu integrieren, :)

0