Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

25.06.2011, 18:08

Kameramaus

Hallo,
ich habe nur mal so aus Spaß (;)) meine Webcam mit schwer lichtdurchlässiger Folie beklebt.
Wenn ich nun mit einem Licht darauf leuchte, bekomme ich das Bild im Anhang.
Meine Frage nun: Ist es sehr schwer die Position des Lichtes nun in Mauskoordinaten zu übersetzen um Windows so zu steuern?
Vielen Dank schonmal,
Gruß
»#Sound~Wave#« hat folgendes Bild angehängt:
  • input.png

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

2

25.06.2011, 18:12

Das dürfte nicht so schwer sein. Du musst eben das Bild der Webcam auslesen, den Lichtpunkt erkennen und seine Position relativ zum Gesammtbild in Mauskoordinaten umrechnen.

3

25.06.2011, 18:13

Schon klar, habe aber leider noch nie mit einer Kamera gearbeitet :(
Ansatz?
EDIT: Also wie soll ich es einlesen?
Danke!

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

4

25.06.2011, 18:19

Ich hatte vor kurzem auch das Problem, dass ich meine Webcam auslesen wollte. Habs so gelöst (erzeugt ein Childfenster, in dem der Webcamstream zu sehen ist, in einem (von dir erstellten) Win32-Fenster):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
    hVideo = capCreateCaptureWindow("Meine WebCam", WS_CHILD | WS_VISIBLE, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, hWinWindow, 1); 
    if(!hVideo) { 
        MessageBox(hWinWindow, "Webcam Render-Windeo kann nicht erstellt werden...", "Fehler", MB_ICONERROR);
        return 0; 
    } 
    if(!capDriverConnect(hVideo, 0)) { 
        MessageBox(hWinWindow, "Treiber für die Webcam kann nicht geladen werden...", "Fehler", MB_ICONERROR);
        return 0; 
    }            
    capPreviewRate(hVideo, 30);
    capPreview(hVideo, true); 
    capGetDriverDescription(0, acDeviceName, sizeof(acDeviceName), acDeviceVersion, sizeof(acDeviceVersion));

Wie ich jetzt ein Einzelbild als Bitmap bekomme, muss ich auch noch herausfinden.

EDIT:
Du musst vfw.h einbinden und gegen vfw32.lib linken.

5

25.06.2011, 18:34

Leider stürzt mein Programm mit dem Aufruf
capCreateCaptureWindow()
ab...
EDIT: Scheinbar müsste ich mich in OpenCV einarbeiten...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »#Sound~Wave#« (25.06.2011, 18:57)


BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

6

25.06.2011, 20:26

Poste mal deinen Quelltext.
Was hat OpenCV damit zu tun?

7

25.06.2011, 21:40

Der Queltext ist deiner.
Mit OpenCV geht so Kamera-"Kram" einfach.

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

8

25.06.2011, 22:03

Ja schon klar, dass das meiner ist, aber wohl falsch angewandt ;)

Hier mal mein kompletter Quelltext:

C-/C++-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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
// Webcam Test.cpp : Definiert den Einstiegspunkt für die Anwendung.
//

#include "stdafx.h"
#include "Webcam Test.h"

#define MAX_LOADSTRING 100

// Globale Variablen:
HINSTANCE hInst;                                // Aktuelle Instanz
TCHAR szTitle[MAX_LOADSTRING];                  // Titelleistentext
TCHAR szWindowClass[MAX_LOADSTRING];            // Klassenname des Hauptfensters
HWND hWindow, hVideo;
char acDriverInfo[256];


// Vorwärtsdeklarationen der in diesem Codemodul enthaltenen Funktionen:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
void                Draw(HWND hWnd);


// WinMain Einstiegspunkt
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: Hier Code einfügen.
    MSG msg;
    HACCEL hAccelTable;

    // Globale Zeichenfolgen initialisieren
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_WEBCAMTEST, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Anwendungsinitialisierung ausführen:
    if(!InitInstance(hInstance, nCmdShow))
    {
        return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WEBCAMTEST));

    // Hauptnachrichtenschleife:
    while(GetMessage(&msg, NULL, 0, 0))
    {
        if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        //qtApp->processEvents();
    }

    return (int)msg.wParam;
}


// Registriert die Fensterklasse
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize         = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WEBCAMTEST));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_WEBCAMTEST);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    return RegisterClassEx(&wcex);
}

// Speichert das Instanzenhandle und erstellt das Hauptfenster
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    hInst = hInstance; // Instanzenhandle in der globalen Variablen speichern

    HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, IMAGE_WIDTH * 2 + 10, IMAGE_HEIGHT + 100, NULL, NULL, hInstance, NULL);
    if(!hWnd) {
        return FALSE;
    }
    hWindow = hWnd;
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    InvalidateRect(hWnd, NULL, true);

    // Webcamtreiber laden und Videostream in Childfenster anzeigen
    char acDeviceName[100], acDeviceVersion[100];
    hVideo = capCreateCaptureWindow((LPSTR) "Meine WebCam", WS_CHILD | WS_VISIBLE, 0, 0, 640, 480, hWnd, 1); 
    if(!capDriverConnect(hVideo, 0)) { 
            MessageBox(hWnd, "Treiber für die Webcam kann nicht geladen werden...", "Fehler", MB_ICONERROR);
            return FALSE; 
    }            
    capPreviewRate(hVideo, 30);
    capPreview(hVideo, TRUE); 
    capGetDriverDescription(0, acDeviceName, sizeof(acDeviceName), acDeviceVersion, sizeof(acDeviceVersion));
    sprintf(acDriverInfo, "%s, %s", acDeviceName, acDeviceVersion); 
}
    
// Verarbeitet Meldungen vom Hauptfenster.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;

    switch (message) 
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Menüauswahl bearbeiten:
        switch (wmId)
        {
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        // TODO: Hier den Zeichnungscode hinzufügen.
        Draw(hWnd);
        break;
    case WM_DESTROY:
        capPreview(hVideo, FALSE) ; 
        capDriverDisconnect(hVideo) ; 
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }

    return 0;
}

// zeichnet den Inhalt des Fensters
void Draw(HWND hWnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd, &ps);
    RECT rect;
    rect.top = IMAGE_HEIGHT + 20;
    rect.left = 0;
    rect.right = IMAGE_WIDTH;
    rect.bottom = IMAGE_HEIGHT + 100;
    DrawText(hdc, acDriverInfo, strlen(acDriverInfo), &rect, DT_LEFT);
    EndPaint(hWnd, &ps);
}


Du musst noch IMAGE_WIDTH und IMAGE_HEIGHT mit der gewünschten Auflösung definieren.

DarioFrodo

Treue Seele

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

9

27.06.2011, 09:56

Ich würde dir auch OpenCv dafür empfehlen.
Damit kannst du bereits mit 3 Befehlen ein Bild von der Webcam auf die Festplatte schreiben.
Oder du musst ein wenig mehr aufwand betreiben, wenn du das Bild (als Pixel Array) direkt in deinem Programm verwenden möchtest.
Dann kannst du alle Pixel in einer Schleife durchlaufen um festzustellen an welcher Stelle die Pixel heller sind.

Oder du arbeitest dich noch mehr in OpenCV ein und verwendest die ganzen Bildbearbeitungsfunktionen mit denen du unter anderem Kanten erkennen kannst (und deren Koordinaten zurückgegeben bekommst) und noch viele andere Dinge.
Wenn du OpenCV voll ausnutzt, sparst du dir auch die Folie vor deiner Webcam.
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann

Man verkauft die Erde nicht, auf der die Menschen wandeln.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

Werbeanzeige