Frames aus Wecam holen
-
Hi
ich versuche bereits seit ~1 Woche, meine Webcam in C++ anzusprechen.
Dies gelingt mir schlecht bis sehr schlecht :-/.
Ich benutze den BCB 6 - Personal.Was ich bereits Probiert habe:
1. VfW dingens von allan petersen -> Webcam ließ sich exzellent Öffnen, und man bekommt eine Vorschau des Bildes auf die Form.
Jedoch kommt man nicht vernünftig an die einzelnen Frames. Es gibt dafür zwar die folgenden Möglichkeiten:
1.1. Auf Festplatte speichern und wieder lesen -> sehr schelcht, weil sicher nicht gut für platte; bei 25-30Fps sicher auch nicht schnell genug
1.2. In Zwischenablage kopieren ->wohl zügig genug, aber dadurch wird halt die zwischenablage nicht mehr benutzbar
1.3. mit BitBlt und dem Handle des DC ->nimmt den Frame nicht aus der Webcam/Aufnahme, sondern von der Vorschau, wenn man das fenster verschiebt oder die Größe verändert, hat er nichmehr den frame, sondern mehr oder weniger von Windows-Desktop -.-; Nachjustieren bringt nix, da das ganze später im tray ablaufen soll.
1.?. Es gibt wohl noch ne variante mit irgendsoner Callback-funktion und LPVIDEOHDR aber da blick ich iwie nich durch.^^2. OpenCV:
CvCapture *cam; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { cam=0; cam=cvCaptureFromCAM(1);//0 ist meine TV-Karte if(!cam)Application->MessageBoxA("asd","asd",NULL); cvNamedWindow("Cap",CV_WINDOW_AUTOSIZE); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { cvReleaseCapture(&cam); cvDestroyWindow("Capture"); }
Das ist der Init- und Beende-Code. Das funktioniert echt gut, also ohne iwelche Fehler. Außerdem Zeigt Dieses Treiberteil/Dienstprogramm der Webcam im Tray "Webcam starts to capture" und diese Lampe auf der Cam Leuchtet.
Jedoch bekomme ich kein Bild mit Folgendem Code.IplImage *cap; cap=cvQueryFrame(cam); Graphics::TBitmap *bmp=new Graphics::TBitmap(); IplImageToTBitmap(cap,bmp); //diese funktion is aus der Yahoo-Group Image1->Picture->Bitmap->Assign(bmp); bmp->Free();
das habe ich testweise (image1) erstmal geschrieben in einen Button. Später soll das bild ncoh verarbeitet werden und wahrscheinlich in einen Timer gestopft werden.
Das Bild wird/bleibt einfach weiß.Ach ja, was ich für OpenCV gemacht hab:
hab es installiert;
hab die *.lib mid coff2omf convertiert.
hab die Pfade von CxCore, CvAux, highgui und cv eingetragen und die *.h includiert.
hab den Pfad für die Libs eingetragen und cv, cvaux, cxcore,highgui cvhaartraining, cxts umd ml.lib ins projekt eingesclossen.3. Mid DirectShow/videoInput von dieser Seite ->bekomme es nichtmal Kompiliert, weil das für VC++ (kann ich garnich ab xD), DevC++ und CW (wat is dat) is. nix mid Borland :(, coff2omf konnte nicht helfen, da das statische libs sind und nicht nur solche import-beschreibungs-teile.
Meine Frage: wie bekomme ich das hin, ne webcam anzusprechen bzw, was is der Fehler in meinen obigen Lösungen?
Am liebsten wär mir, wenn Möglichkeit 2. OpenCV zum Laufen gebracht wird.falls ich noch was vergessen hab, melde ich mich.
Danke schonmal im Voraus
Gruß
Ele
Edit: was ich noch unbedingt schreiben wollte, is [Methode 2. OpenCV], dass wenn ich ich Fps, Hue, Saturation, Value, brightness und Contrast abfrage, erhalte ich immer 0.
hab schon versucht mid cvSetCaptureProperty(cam,Option,Wert) die FPS auf bspw. 15 zu setzen, aber wenn ich dann ne abfrage mache, sind die FPS wieder gleich 0
-
Hallo
Die Suchfunktion zu *webcam* liefert bereits einige offenbar passende Threads, und auch in der FAQ hier im Forum findet sich ein Eintrag zum Thema Webcam.
bis bald
akari
-
hmm hab grad mal in die FAQ geschaut: das war mit das erste was ich probiert hatte, siehe oben.
SuFu: hmm, jaa, da gibts echt ne ganze menge zu dem Thema, aba was wahres hab ich nich finden können, weil das fast alles auch die VfW methode behandelt, opencv findet man fast garnichhmm
die opencv methode scheint aber zu funktionieren.
zumindest bekomme ich mid cvShowImage("Capture",cap); n bild ins extrafenster.jez muss ich nurnoch hinbekomme, dass ich das in n brauchbares format bekomme^^
aber thx^^
Ele
Edit: s geht jez mid der obigen methode, musste nur n bisschen rumstöbern wie man am besten an die daten in nem IplImage* kommt. Mein eigentlicher Grundfehler war, dass ich das bild nicht habe angezeigt bekommen, weil ich die fensternamen unglücklich gewählt habe und ich dadurch (aus dummheit) das fenster nicht "getroffen" habe. (Blöde, über strings statt variablen zu identifizieren-.-)
kann meinetwegen geclosed werden^^
-
@ Elefunty:
Wie hast du denn opencv installiert bzw. wo die nötigen Dateien für Borland Builder 6 her?
-
Elefunty schrieb:
Ach ja, was ich für OpenCV gemacht hab:
hab es installiert;
hab die *.lib mit coff2omf convertiert.
hab die Pfade von CxCore, CvAux, highgui und cv eingetragen und die *.h includiert.
hab den Pfad für die Libs eingetragen und cv, cvaux, cxcore,highgui cvhaartraining, cxts umd ml.lib ins projekt eingesclossen.!?
-
Ist mir schon klar, aber welche Version hat er benutzt? Hat aber bereits bei mir auch funktioniert, Danke!
-
williman schrieb:
Hat aber bereits bei mir auch funktioniert, Danke!
NP, herzlichen Glückwunsch.
Vielleicht könntest du dein konkretes Vorgehen ja auch mal schildern, das wird bestimmt auch andere Leute hier interessieren.
-