Eine Liste der verfügbaren capture-Formate
Neues V4L habe ich beschlossen, beginnen mit der video4linux2 Bibliothek in um capture ein Bild aus meiner Kamera in C (ich bin mit dem uvcvideo-Modul mit einer Ricoh Co. Kamera). Ich folgte einige Anleitungen und tutorials, und es geschafft, ein Programm läuft. Meine Frage ist vor allem über das übliche code-line :
struct v4l2_format format = {0};
format.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
//...
Dies ist, wo ich die eigentlichen video-format bei der Aufnahme. Wie Sie sehen können, in diesem Beispiel habe ich mithilfe von MJPEG (http://lxr.free-electrons.com/source/include/uapi/linux/videodev2.h#L390). Auch wenn dies eine große format-und alle, meine Anwendung wird wahrscheinlich erfordern einfache RGB-Formatierung, pixel pro pixel denke ich. Aus diesem Grund habe ich versucht, mit Hilfe von RGB-format-Konstanten wie V4L2_PIX_FMT_RGB24
. Jetzt aus irgendeinem Grund... v4l2 mag es nicht. Ich vermute, dies ist hardware-bezogen, aber ich möchte vermeiden, MJPEG Manipulationen so weit wie möglich. Für Testzwecke habe ich versucht, mit anderen Konstanten und Formate, aber egal was ich Tat, v4l2 laufend die pixelformat
- Feld den Wert :
xioctl(fd, VIDIOC_S_FMT, &format); //This call succeeds with errno != EINTR.
if(format.fmt.pix.pixelformat != V4L2_PIX_FMT_RGB24){
//My program always enters this block when not using MJPEG.
fprintf(stderr, "Format wasn't accepted by v4l2.");
exit(4);
}
Nun meine Frage : gibt es eine Möglichkeit, ich könnte eine Liste der akzeptierten video-Formate (und ich meine, angenommen von meiner Kamera/v4l2), aus denen ich auswählen könnte etwas anderes als MJPEG ? Wenn Sie denken, ich habe einen stick mit MJPEG, würden Sie mir empfehlen jede Bibliothek, die mir erlaubt, um es zu manipulieren, und schließlich zurück zu ziehen, die Erfassung in einem GUI-frame ?
Barbar test-code
Ich verwendet die folgenden trick, um zu testen, alle verfügbaren Formate auf meiner hardware. Zunächst einige shell-Skript, um eine Liste aller Formate...
grep 'V4L2_PIX_FMT' /usr/include/linux/videodev2.h | grep define | tr '\t' ' ' | cut -d' ' -f2 | sed 's/$/,/g'
... der Ausgang ist in diesem C-Programm :
int formats[] = {/* result of above command */};
int i = 0;
struct v4l2_format format = {0};
for(i = 0; i < /* number of lines in previous command output */; i++){
format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
format.fmt.pix.width = 320;
format.fmt.pix.height = 240;
format.fmt.pix.pixelformat = formats[i];
format.fmt.pix.field = V4L2_FIELD_NONE;
if(xioctl(fd, VIDIOC_S_FMT, &format) != -1 && format.fmt.pix.pixelformat == formats[i])
fprintf(stderr, "Accepted : %d\n", i);
}
Dieser test zeigt, dass nur V4L2_PIX_FMT_YUYV
und V4L2_PIX_FMT_MJPEG
funktionsfähig sind. Keiner Weise konnte ich verbessern, oder ist es hardware-bedingt ?
Sorry, ich war nicht deutlich genug, mein Fehler. Ich bin auf der Suche nach einer Liste der verfügbaren und akzeptiert "Formate", was bedeutet, Formate meiner Kamera akzeptieren würde (siehe meine
if
Anweisung oben). Wenn ich noch was anderes einstellen, MJPEG, den pixelformat
- Attribut nicht gesetzt ist, die von der library aus, wahrscheinlich weil es nicht behandelt werden kann, indem meine hardware.InformationsquelleAutor John WH Smith | 2014-03-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Linux Befehlszeilen-Dienstprogramm v4l2-ctl zeigt eine webcam, die nativ unterstützten Formate -- installieren Sie es mit
sudo apt-get install v4l-utils
führen Sie es mitv4l2-ctl -dX --list-formats-ext
woX
ist die Kamera als index in/dev/videoX
. Diese Formate sind gemeldetv4l2
kernel-Modul überuvcvideo
Modul und Sie werden nativ unterstützt, die die webcam-Chipsatz. Nur die aufgelisteten Formate sind unterstützt durchv4l2
wäre alles andere muss codiert werden, durch den Benutzer, und RGBs sind sehr selten gestellt, obwohl praktisch alle CCDs arbeiten bei Bayer RGGB. Die gängigsten Formate sind mit Abstand YUV422 (YUYV oder YUY2) und MJPEG mit einer gewissen überlappung: MJPEG erreichen größere frame-raten bei hohen Auflösungen.C++ - code für die Auflistung der Kamera-Formate finden Sie in Chrom GetDeviceSupportedFormats () - Implementierung für Linux hier.
Wenn Sie plug-code zu konvertieren YUV to RGB ich würde empfehlen,libyuv, die optimiert wurde für viele Architekturen.
VIDIOC_ENUM_FMT
Anruf war, was ich brauchte, undv4l2-ctl
nutzt es 🙂 Danke! libyuv wird wahrscheinlich helfen Sie mir, wie ich wörtlich scheiterten alle meine versuche, zu konvertieren mathematisch. Indem man RGB-Werte, ich werde in der Lage sein, ziehen Sie den Rahmen wieder mit der SDL (und vielleicht sollte ich mal einen Blick auf YUV overlays...). Kennen Sie eine Bibliothek, die mir erlaubt zurück zu ziehen, MJPEG-codierte frames ?Wenn Sie möchten, zu konvertieren MJPEG Sie RGB
libyuv
unterstützt diese Umwandlung, als auch nur einen anderen Farbraum (pixelformat, mehr Beton), siehe f.e. code.google.com/p/chromium/codesearch#chromium/src/third_party/... .Tut
libyuv
C-Bindungen ? Das Programm, das ich auf Arbeit bin nicht gebaut, in C++.Sowohl C als auch C++ funktionieren sollte, finden Sie unter code.google.com/p/libyuv/source/browse/trunk/include/libyuv/...
InformationsquelleAutor miguelao
Um alle verfügbaren format, das Sie verwenden können, ioctl VIDIOC_ENUM_FMT
Drucken Beschreibungen der capture-format unterstützt
/dev/video0
Sie können den Prozess so :InformationsquelleAutor mpromonet