Entwickler-Ecke

Multimedia / Grafik - Funkkamera: In Panel Text mit einbringen


Roboman - Mi 13.01.10 17:22
Titel: Funkkamera: In Panel Text mit einbringen
Servus Leute,

also ich habe ein kleines Problem, und ja ich habe auch schon einmal gegoogelt. ;-)

Es dreht sich um folgendes. Ich lese das Livebild einer Kamra ein die auf nem Roboter von mit aufgebaut ist. So, und ich möchte halt über dieses Bild den Roboter fern steuern. Auch kein Problem, läuft alles super. Windows-PC ist sozusagen die Schaltzentrale und ich kann per Joystick den Roboter über Funk alles steuern.

Jetzt meine Frage. Ich würde gerne ins Live-Bild Texte rein schreiben, sozusagen wie ein HUD im Flugzeug. Ist das irgendwie möglich? Ich verwende das DS-Pack und bin bis jetzt damit sehr zu frieden. Mein Problem ist nicht die Technik, sondern die Software *grins*.

Aber ich hab Delphi in der Techniker-Schule gehabt und seit dem einiges an Software für mich geschrieben, macht sehr viel Spass ist aber auf jeden Fall verbesserungswürdig. *grins*

Für jede Info bin ich sehr dankbar.

// schauen, ob sich durch die Zuweisung der changed-Status überhaupt ändert?!

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


René R.Fo. - Mi 13.01.10 19:02

Also ich habe eine USB Webcam und damit funktioniert es perfekt, weiß aber nicht ob es damit auch bei einer Funkcam geht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls, Buttons;

type
  TForm1 = class(TForm)
    Button2: TButton; //zum starten des forganges
    Timer1: TTimer; //zum erzeugen des bildes
    Image1: TImage; //Erzeugtesbild
    Panel1: TPanel; //Origenalbild
    Label1: TLabel; //ist als Tranzparentes dargestelt
    Label2: TLabel; //Kenzeichnung
    Label3: TLabel; //Kenzeichnung
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1 : TForm1;
  Bitmap: TBitmap;
  MyRect, MyOther: TRect;

const
  WM_CAP_DRIVER_CONNECT = WM_USER + 10;
  WM_CAP_EDIT_COPY = WM_USER + 30;
  WM_CAP_SET_PREVIEW = WM_USER + 50;
  WM_CAP_SET_OVERLAY = WM_USER + 51;
  WM_CAP_SET_PREVIEWRATE = WM_USER + 52;


  WM_CAP_DLG_VIDEOFORMAT          = WM_USER+41;
  WM_CAP_DLG_VIDEOSOURCE          = WM_USER+42;
  WM_CAP_DLG_VIDEOCOMPRESSION     = WM_USER+46;


implementation

{$R *.dfm}

function capCreateCaptureWindow(lpszWindowName: LPCSTR;
  dwStyle: DWORD;
  x, y,
  nWidth,
  nHeight: integer;
  hwndParent: HWND;
  nID: integer): HWND; stdcall;
  external 'AVICAP32.DLL' name 'capCreateCaptureWindowA';

procedure TForm1.Button2Click(Sender: TObject);
var Handle:THandle;
begin
  Handle := capCreateCaptureWindow('Video',ws_child+ws_visible, 0,
  0320240, Panel1.Handle, 1);
  SendMessage(handle, WM_CAP_DRIVER_CONNECT, 00);
  SendMessage(handle, WM_CAP_SET_PREVIEWRATE, 300);
  sendMessage(handle, WM_CAP_SET_OVERLAY, 10);
  SendMessage(handle, wm_cap_set_preview, 10);
  Application.ProcessMessages;

  Timer1.Enabled := True;
  Label1.Visible := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.DoubleBuffered := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  MyRect := Rect(0,0,160,120);
  Bitmap := TBitmap.Create;
  Form1.Canvas.BrushCopy(MyRect, Bitmap, MyRect, clBlack);
  Image1.Canvas.CopyRect(MyRect,Form1.Canvas,MyRect);
  Bitmap.Free;
end;

end.

Das ist der geänderte Code^^


Roboman - Mi 13.01.10 21:17

Servus Rene,

vielen Dank für die Infos. Jetzt kommt genau der Punkt wo ich sage: "Warum hast du nicht besser aufgepasst?"

Wo ist denn da der Bereich wo man einen Text eingeben kann. Wie gesagt, bin Elektroniker und nur minimal Softwaremensch. ;)


René R.Fo. - Do 14.01.10 20:05

Oh Sorry :oops: :oops: :oops:
Ich habe es falsch verstanden ich dachte du suchst denn Code zum ansteuern der Cam :oops:

Habe oben denn Code angepasst.
Habe im Anhang nochmal das Projekt wie ich es gelöst habe.
leider nichts besseres gefunden :D

Mir ist es gerade aufgefallen das es einen Kleinen Fehler gibt mit der Version und möchte mich entschuldigen habe sie erneuert


Flamefire - Fr 15.01.10 00:14

wie gibst du denn dein Bild auf dem Panel aus?
i.A. solltest du mit element.canvas.drawtext o.ä. funktionen gut hinkommen.
Ansonsten wäre auch transparente Labels eine Lösung.

Viel Spaß ;-)


jaenicke - Fr 15.01.10 07:18

user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
wie gibst du denn dein Bild auf dem Panel aus?
i.A. solltest du mit element.canvas.drawtext o.ä. funktionen gut hinkommen.
Ansonsten wäre auch transparente Labels eine Lösung.
Beides wird bei DirectX wie es das genannte DSPack ja nutzt vermutlich nicht klappen.
Denn an der Stelle wird der Bereich ja quasi direkt in den Grafikspeicher geschrieben, da wird keine auf ein Canvas gezeichnete Grafik zu sehen sein (ein Panel hat auch gar kein Canvas dachte ich).

Deshalb geht das auch nur mittels DirectShow. Ab DX9 [http://msdn.microsoft.com/en-us/library/ms787918.aspx] bzw. der in XP integrierten Version 7 [http://msdn.microsoft.com/en-us/library/ms787917.aspx] geht das.


Roboman - Fr 15.01.10 08:55

Servus Leute,

ja das das mit dem DS-Pack nicht funktioniert hab ich auch schon gemerkt. Die Idee ein transparentes Label zu setzten war das erste und dies halt
im vordergrund zu haben. Aber das wollte nicht so wie ich wollte ;-)

Den Rest werde ich am WE einmal alles ausprobieren.

Vielen herzlichen Dank an alle.


René R.Fo. - Fr 15.01.10 14:15

user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
wie gibst du denn dein Bild auf dem Panel aus?

in meinem 1.Beitrag der Code Zeile 49-50
user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
i.A. solltest du mit element.canvas.drawtext o.ä. funktionen gut hinkommen.
Ansonsten wäre auch transparente Labels eine Lösung.

Canvas geht nicht muss man mit timer jede hundertstel Sekunde wiederholen werden und es flackert trotz Form1.DoubleBuffered := True
tranzperentes Label Gute idee Geht aber auch nicht verschwindet in diesem fall
Mit meiner oben im an-gehangenen Version wird erst das bild nochmal kopiert und in einem Image wiedergeben dann geht es mit Label


Flamefire - Fr 15.01.10 15:27

Ok, dann mal folgendes: capCreateCaptureWindow erstellt ein Fenster mit Parent-Window Panel1
Jetzt müsste man aber doch mit diesem Fenster arbeiten können. Also z.b. via WinAPI elemente (Subfenster) darauf unterbringen können.
Schon mal naiv versucht, den Parent eines Labels auf dieses Fenster zu setzen?


Roboman - Mi 27.01.10 09:47

Sorry Leute,

PC hat sich in Schall und Rauch aufgelöst. Lüfter fest und dann ist es mächtig heiß geworden und bruzel bruzel PC kaputt. Sitze grad auf der Arbeit.

Muss erst einmal wieder alles erneuern. Kann leider was dauern..

Danke schon mal im voraus.

Gruß von der Front


Roboman - Di 23.03.10 15:02

Servus Leute,

hat was länger gedauert nach ner Tour (beruflich) durch Schweden und Norddeutschland.

Jo hab das ganze ausprobiert und hab festgestellt, das das ganze wunderbar funktioniert. Ist zwar umständlich aber wenn halt
nicht anders realisierbar dann ist es halt so. Ich dachte es wäre einfacher. Halt wie hier ein Label drüber und fertig.

Gut vielen herzlichen Dank an alles.

Ihr habt mir weiter geholfen.


ifkv - Fr 26.03.10 00:51

Hallo,
ich habe die Diskussion mit Interesse verfolgt.
Ich versuche auch Bilder von einer Webcam zu grabben.

Mein Problem:
Die USB-Kamera funktioniert mit der Software aus dem Projekt von Rene problemlos auf einem XP-Rechner mit SP2,
aber nicht mit XP und SP3 sowie Win7. Dann bleibt das Bildfenster einfach schwarz.
Wird die Kamera mitb einer anderen Software ( z.B. vlc-mediaplayer) geöffnet, erhalte ich sowohl mit SP2 als auch SP3 sowie Win 7 ein Bild.


Irgendwelche Hinweise??


Roboman - Fr 26.03.10 13:56

Sorry das du erst jetzt ne Meldung bekommst, war die Woche unterwegs.

Ähmmm, komisch, ich verwende Win7 zu Hause auch und das mit Delphi2007. Und das klappt ganz gut, das Projekt funktioniert jedenfalls
bei mir.

Deinstallier die Kamera nochmal. Dann abkoppeln und neu installieren. Dann erst wieder ankoppeln.


platzwart - Fr 26.03.10 14:13

Hallo,

ich verwende ebenfalls Win7 und Delphi2007. Das Projekt funktioniert bei mir nicht...


Roboman - Fr 26.03.10 15:48

Das ist seltsam, da ich einfach Delphi2007 auf dem Laptop installiert habe. Es ist Win7 Home.


ifkv - Fr 26.03.10 15:48

Hallo Roboman,

ich verwende ein altes Delpi 7 Personal

Kannst Du deine Exe zum Testen zur Verfügung stellen?


Danke


delphi10 - Sa 27.03.10 15:55

user profile iconRoboman hat folgendes geschrieben Zum zitierten Posting springen:
Servus Leute,

also ich habe ein kleines Problem, und ja ich habe auch schon einmal gegoogelt. ;-)

Es dreht sich um folgendes. Ich lese das Livebild einer Kamra ein die auf nem Roboter von mit aufgebaut ist.


In der Überschrift steht "Funkkamera" im Verlauf des Thread immer wieder USB-Webcam. Wenn es denn nun wirklich eine Funkkamera ist, welchen Empfänger hast Du den wie angeschlossen bzw. ausgelesen. Ich habe eine 2,3Ghz FunkKamera Kanal3 deren Empfänger ein Video - und Audosignal liefert. Wenn ich dieses Signal in meine TerraTec zum Grabben einspeise, kommt nur weißes Rauschen dabei raus. Also, falls wirklich Funkkamera bei Dir, wäre ich für einen Hinweis dankbar.
cu delphi10


ifkv - So 28.03.10 11:46

Hi,

das Problem unter XP und SP3 scheint daran zu liegen, dass auf diesen Rechner noch ein alter Treiber für eine Terratec-USB-Kamera im System rumturnt
und die AVICAP32.DLL glaubt, auch ohne die angeschlossene Hardware darauf zugreifen zu können.

Gelöst habe ich das Problem mit einer anderen Delphi-Software, die mehrere Kameras gleichzeitig auslesen kann.
http://www.grizzlymotion.com/Download/Werkstatt/VSampleDemo/vsampledemo.html

Dort werden in einer Liste alle vom System als verfügbar bezeichneten Kamears dargestellt.


Roboman - Mo 11.04.11 09:00

Hallo zusammen,
eine dicke Entschuldigung wenn ich mich jetzt erst melde. War leider die letzten Wochen verhinder
und hatte keine Zeit zu Hause irgendwas zu machen außer zu pennen.

Also richtig es geht um eine Funkkamera von ELRO mit einem C910 Receiver der über einen AV-USB-Grabber
am Laptop angeschlossen ist. Der USB2.0 Capture ist von Conrad. Die mitgelieferte Software ULEAD Video
klappt und ich bekomme ein Bild rein. Also muss es auch irgendwie in Delphi möglich sein.

Problem ist nur dass die Kamera über Funk im 2,4GHz-Bereich arbeitet und somit mein WLAN stört. Deshalb
habe ich immer zum Testen eine USB-Webcam damit ich weiter im WLAN arbeiten kann. Es ist das gleiche.
Ich hab vor ein paar Jahren mit der Funkkamera mal nen Robi gesteuerte unter Delphi6 und WinXP und da hat
alles funktioniert nur jetzt unter Win7 bekomme ich mit Delphi2009 das nicht hin.