wir müssen im Laufe unsere Projektwoche eine Dokumentenkamera erstellen. Dazu müssen wir über den Borland-Builder 2010 eine Webcam ansteuern. Das Problem dabei ist, dass unser Lehrer nicht gerade hilfreich ist. Wir haben bereits einen Blick auf das AllanPetersen WebCam Programm geworfen, jedoch konnten wir uns damit auch nicht helfen, da die Struckturanfänge für uns nicht ersichtlich sind.
Nun zu meiner Frage:
Wie steuert man die Webcam an, bzw. wie fängt man an ein Bild im Builder zu erzeugen? Eine Videoobjekt gibt es ja leider nicht.
Ich hoffe ihr könnt uns helfen( JA, SuFu wurde benutzt!)
Eine Minute Google-Suche brachte mich zu ESCAPI - Extremely Simple Capture API:
Jari Komppa schrieb:
Simple DLL interface to use video capture devices (i.e. webcams), along with a simple example that uses SDL, as well as a couple even simpler examples that don't require SDL. 2.1 adds examples for BlitzMax, PureBasic, as well as a OpenGL-based "funny mirrors"-example. The only DLL change is that the 'alpha' bits now have value 0xff.
The DLL is free for anyone to use as long as I'm not held responsible for anything.
Das sollte helfen. Ansonsten: DirectShow direkt ansteuern.
Hallo,
ich hänge mich einfach mal an das Thema ran, und zwar möchte ich "einfach" in das Webcam Bild bei der Software von Allan Petersen, WebCam 2.1, ein Fadenkreuz einblenden. Wenn möglich sollte dieses auch in X und Y Position verschiebbar sein und gegeben falls auch vergrößert und verkleinert werden...
Soweit habe ich C++ Builder und das Projekt am laufen, ich komme leider aus der Mikrocontroller Ecke und habe mit C++ und Konsorten noch nicht viel am Hut gehabt etwas Java das war es dann aber schon. Es gibt also noch reichlich Verständnis Probleme, ich werde mal schauen was es bei uns an der FH Literatur zum Thema gibt, aber die erste Frage wäre an diese Stelle ob es überhaupt Sinn macht die Software von Petersen an zu passen oder ob es der Flasche weg ist?!
Hallo,
...in das Webcam Bild bei der Software von Allan Petersen, WebCam 2.1, ein Fadenkreuz einblenden.
Ist möglich, indem du auf den Device Context des CaptureWindow innerhalb der WM_TIMER Botschaft zeichnest.
An diese WM_TIMER kommst du über Application->OnMessage heran.
Dazu wird immer die aktuelle Cursorposition abgefragt.
Jedoch zum nächsten Problem
Sobald wir die Größe von dem Fenster ändern, bleibt das Video so bestehen wie es ist. Das Panel lässt sich bereits in der Größe verändern, jedoch nicht das Videobild. Wie kann ich nachträglich auf die Größe von dem Videohandle zugreifen? Mit hWebcam->Height geht das ja nicht.
Nochmal der Code zum Panel:
mit folgendem Code wird die DialogBox Videoformat geöffnet.
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9 10 11
void __fastcall TForm1::sbVideoFormatClick(TObject *Sender)
{
capDlgVideoFormat(hCap);
CAPSTATUS CapStatus;
capGetStatus(hCap, &CapStatus, sizeof(CAPSTATUS));
int wi = CapStatus.uiImageWidth;
int hi = CapStatus.uiImageHeight;
void __fastcall TForm1::sbVideoFormatClick(TObject *Sender)
{
capDlgVideoFormat(hCap);
CAPSTATUS CapStatus;
capGetStatus(hCap, &CapStatus, sizeof(CAPSTATUS));
int wi = CapStatus.uiImageWidth;
int hi = CapStatus.uiImageHeight;
void __fastcall TForm1::sbVideoFormatClick(TObject *Sender)
{
capDlgVideoFormat(hCap);
CAPSTATUS CapStatus;
capGetStatus(hCap, &CapStatus, sizeof(CAPSTATUS));
int wi = CapStatus.uiImageWidth;
int hi = CapStatus.uiImageHeight;
Beachtet die Reihenfolge der Fensteranpassungen. Panel1 ist das Parent-Fenster.
mfg
kpeter
edit: natürlich gehts auch ohne Dialogbox, entscheidend ist, dass der Status abgefragt wird (ab Zeile 4).
Der Dialog ist interessant wegen der bevorzugten Formate Breite/Höhe.
Zuletzt bearbeitet von kpeter am 10:47:25 10.03.2010, insgesamt 1-mal bearbeitet
void __fastcall TDokuCam::FormResize(TObject *Sender)
{
capDlgVideoFormat(hWebcam);
CAPSTATUS CapStatus;
capGetStatus(hWebcam, &CapStatus, sizeof(CAPSTATUS));
int wi = CapStatus.uiImageWidth;
int hi = CapStatus.uiImageHeight;
void __fastcall TDokuCam::FormResize(TObject *Sender)
{
capDlgVideoFormat(hWebcam);
CAPSTATUS CapStatus;
capGetStatus(hWebcam, &CapStatus, sizeof(CAPSTATUS));
int wi = CapStatus.uiImageWidth;
int hi = CapStatus.uiImageHeight;
void __fastcall TDokuCam::FormResize(TObject *Sender)
{
capDlgVideoFormat(hWebcam);
CAPSTATUS CapStatus;
capGetStatus(hWebcam, &CapStatus, sizeof(CAPSTATUS));
int wi = CapStatus.uiImageWidth;
int hi = CapStatus.uiImageHeight;
Einmal der komplette Code soweit. Selbe Problem wie zuvor, es ändert sich NUR das Panel, das Videobild bleibt unberührt, egal welche Werte ich in die SetWindowsPos() schreibe. Was machen wir falsch?
Habe als Test mal die Werte für wi und hi abgefragt, wobei wi=0 und hi=-1 war, muss das so sein?
Header-Dekl. in Zeile 13, 14 und 29 löschen und in private setzen:
C/C++ Code:
// *.h-Datei:
private:
HWND hWebcam;
HWND hwnd;
C/C++ Code:
// *.h-Datei:
private:
HWND hWebcam;
HWND hwnd;
C/C++ Code:
// *.h-Datei:
private:
HWND hWebcam;
HWND hwnd;
Zeile 30 in der *.cpp heisst dann nur
C/C++ Code:
hwnd = Panel1->Handle;
C/C++ Code:
hwnd = Panel1->Handle;
C/C++ Code:
hwnd = Panel1->Handle;
Beim Beenden des Programmes muss noch disconnected werden (spätestens im Destruktor).
Das Erstellen des Video-Fensters würde ich komplett in den Konstruktor verlagern; OnFormCreate sollte nicht (mehr) verwendet werden.
Dazu gibts auch im Forum Beiträge.
mfg
kpeter
edit1: Die SendMessages geben jeweils einen Boolscher Wert, je nach Erfolg, zurück.
Dieser sollte vor Ausführen der folgenden SendMessage ausgewertet werden. Also in der Art
C/C++ Code:
if (!SendMessage(hWebcam, WM_CAP_DRIVER_CONNECT,0, 0))
return;
C/C++ Code:
if (!SendMessage(hWebcam, WM_CAP_DRIVER_CONNECT,0, 0))
return;
C/C++ Code:
if (!SendMessage(hWebcam, WM_CAP_DRIVER_CONNECT,0, 0))
return;
erzeugt mit Sicherheit einen Ausschnitt des Videofensters, wenn das Panel kleiner als wi, hi ist;
Breite und Höhe sind verschieden.
Gibts dafür einen Grund?
Zuletzt bearbeitet von kpeter am 20:12:31 10.03.2010, insgesamt 3-mal bearbeitet
Moin, moin,
ich habe ein ähnliches Projekt am Laufen und ich versuche grad eine zoomfunktion einzubauen, hab bisher aber keinen Zoom für Videostreams (vfw) gefunden.
in MCI-Devices ist Zooming möglich. Mit dem Makro capSetMCIDeviceName leitet man den Videostream weiter.
Hier der Link dazu.
Probiert hab ichs selbst noch nicht...
mfg
kpeter
edit: Möglicherweise gehts nur in Richtung MCIDevice->CaptureWindow.
Eine andere Möglichkeit ist die Frames auszulesen und zu stretchen.
Zuletzt bearbeitet von kpeter am 12:26:19 17.03.2010, insgesamt 2-mal bearbeitet
Gibt es eine Möglichkeit das Hauptformular durch einen Befehl zu maximieren?
Zoom und die Einstellungen der Farbe etc machen auchnoch Probleme, aber da sind wir grad eifrig dabei Die MCI Devices haben uns soweit nicht geholfem wahrscheinlich haben wir sie falsch verwendet
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.