Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1

Куда утекает память при копировании изображения в буфер обмена

12.08.2012, 16:48. Показов 4360. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В цикле Repeat копирую изображение в буфер обмена. Вроде освобождаю, но количество памяти занимаемой приложением ростёт по 19 - 21 Кб в секунду.

PureBasic
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
#WM_CAP_START = #WM_USER
 
#WM_CAP_SET_CALLBACK_ERROR = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_STATUS = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7
 
#WM_CAP_DRIVER_CONNECT        =  #WM_USER + 10
#WM_CAP_DRIVER_DISCONNECT     =  #WM_USER + 11
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14
 
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43
 
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_GET_STATUS = #WM_CAP_START + 54
 
#WM_CAP_FILE_SAVEDIB          =  #WM_USER + 25
#WM_CAP_SET_SCALE             =  #WM_USER + 53
 
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85
 
hWnd = OpenWindow(0, 0, 0, 500, 300, "WebCamTest", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
If OpenLibrary(0, "AVICAP32.DLL")
 
  hWebcam = CallFunction(0, "capCreateCaptureWindowA", 0, #WS_VISIBLE + #WS_CHILD, 10, 10, 200, 160, hWnd, 0)
 
  SendMessage_(hWebcam, #WM_CAP_DRIVER_CONNECT          , 0 , 0)
  SendMessage_(hWebcam, #WM_CAP_SET_SCALE               , 1 , 0)
  SendMessage_(hWebcam, #WM_CAP_SET_PREVIEWRATE         , 10, 0)
  SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW             , 1 , 0)
  
  Repeat
    SendMessage_(hWebcam,#WM_CAP_EDIT_COPY,0,0)
    img.l=GetClipboardImage(#PB_Any)
    ClearClipboard()
    
    Event = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver  
  SendMessage_(hWebcam,#WM_CAP_STOP,0,0) 
  SendMessage_(hWebcam, #WM_CAP_DRIVER_DISCONNECT, 0, 0)
  CloseWindow(hWebcam)
  CloseLibrary(0)
EndIf
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.08.2012, 16:48
Ответы с готовыми решениями:

Не понимаю, куда утекает память при заупске процесса, хотя все free
Пишу Shell в си коде. Вводится строка, ее разбиваю на слова и заношу все это в двумерный динамический массив. До этого момента с памятью...

Кодировка при копировании в буфер обмена 7.7.
Иногда возникает необходимость скопировать данные из справочника или отчета в приложения Windows через буфер обмена. Например, word или...

Показать форму при копировании IP в буфер обмена.
Программа весит в трее и когда скопировал в буфер обмена что либо (а именно мне надо сделать по шаблону IP адреса, т.е. как нибудь...

21
Эксперт по электронике
6575 / 3202 / 335
Регистрация: 28.10.2011
Сообщений: 12,482
Записей в блоге: 7
12.08.2012, 16:56
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
Вроде освобождаю
Где?
Я вижу что создаются Image, но не уничтожаются - вот память и утекает.
1
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
12.08.2012, 20:44  [ТС]
Спасибо, теперь понял и проблему устранил.

Добавлено через 3 часа 35 минут
Помнится видел некую функцию заставляющую окно обработать очередь сообщений, подскажите где копнуть? или подкиньте пример отрисовки очереди изображений на ImageGadget.
0
Эксперт по электронике
6575 / 3202 / 335
Регистрация: 28.10.2011
Сообщений: 12,482
Записей в блоге: 7
12.08.2012, 21:08
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
видел некую функцию заставляющую окно обработать очередь сообщений
Наверное имеется в виду функция WindowEvent().

Если требуется выводить ряд изображений, но лучше это делать либо по таймеру, либо из отдельного потока.
1
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
12.08.2012, 21:18  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Наверное имеется в виду функция WindowEvent().
Не. WindowEvent() ожидает события, а ета фигня очередь полученных событий окна принудительно прогоняет и эффект как от отдельного потока, только скорость меньше.

Но это не суть. У меня первый кадр апосля скромной обработки появляется, а дальше ступор. Думаю что это либо надо как ты советуеш поток отдельный, либо то о чём спрашивал. Жалко не помню как правильно называется. Или самый плохой вариант - я чтото неправильно написал.
Код прилагаю.
PureBasic
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
#WM_CAP_START = #WM_USER
 
#WM_CAP_SET_CALLBACK_ERROR = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_STATUS = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7
 
#WM_CAP_DRIVER_CONNECT        =  #WM_USER + 10
#WM_CAP_DRIVER_DISCONNECT     =  #WM_USER + 11
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14
 
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43
 
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_GET_STATUS = #WM_CAP_START + 54
 
#WM_CAP_FILE_SAVEDIB          =  #WM_USER + 25
#WM_CAP_SET_SCALE             =  #WM_USER + 53
 
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85
 
    Global x = 200       ; Первый параметр размерности массива
    Global y = 160       ; Второй параметр размерности массива
    Global Min = 60      ; Предел сходства значения ниже 100%
    Global Max = 140      ; Предел сходства значения выше 100%
    Global Dim  B.l (x, y) ; Новый массив для сравнения
    Global Dim  C.l (x, y) ; Результат эвристического сравнения массивов в процентном соотношении сходства
    
    CreateImage(1, x, y)
    
    Procedure UpdateImage()
      StartDrawing(ImageOutput(1))
      For xn = 0 To x - 1 
        For yn = 0 To y - 1 
          color = C(xn, yn)
          Plot(xn, yn, color)
        Next
      Next
      StopDrawing()
      SetGadgetState(1,ImageID(1)) 
    EndProcedure
    
    hWnd = OpenWindow(0, 0, 0, 500, 300, "WebCamTest", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ImageGadget(1, 220, 10, 200, 160, result)
    
    If OpenLibrary(0, "AVICAP32.DLL")
      hWebcam = CallFunction(0, "capCreateCaptureWindowA", 0, #WS_VISIBLE + #WS_CHILD, 0, 0, 0, 0, hWnd, 0)
      SendMessage_(hWebcam, #WM_CAP_DRIVER_CONNECT          , 0 , 0)
      SendMessage_(hWebcam, #WM_CAP_SET_SCALE               , 1 , 0)
      SendMessage_(hWebcam, #WM_CAP_SET_PREVIEWRATE         , 10, 0)
      SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW             , 1 , 0)
      
      Repeat
        
        SendMessage_(hWebcam,#WM_CAP_EDIT_COPY,0,0)
        img.l=GetClipboardImage(#PB_Any)
        ;==================================================================================================================================================
        ResizeImage(img, x, y, #PB_Image_Smooth)
        
        StartDrawing(ImageOutput(img))
        For xn = 0 To x - 1 
          For yn = 0 To y - 1 
            color = Point(xn, yn)
            SA = Color / 100
            SB = B(xn, yn)
            
            If SA = 0 ; делить на 0 нельзя
              Shodstvo = 0
            Else
              Shodstvo =  SB / SA
              If Shodstvo < 100 And shodstvo > Min Or Shodstvo > 100 And Shodstvo < Max
                C(xn, yn) = 0
              Else
                C(xn, yn) = color
              EndIf
            EndIf
          Next
        Next
        StopDrawing()
        UpdateImage()
        Debug "Updated!"
        ;==================================================================================================================================================
        FreeImage(img)
        ClearClipboard() 
        
        Event = WindowEvent()
        Select Event
          Case #PB_Event_CloseWindow
            End
        EndSelect
      ForEver  
      SendMessage_(hWebcam,#WM_CAP_STOP,0,0)
      SendMessage_(hWebcam, #WM_CAP_DRIVER_DISCONNECT, 0, 0)
      CloseWindow(hWebcam)
      CloseLibrary(0)
    EndIf
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
12.08.2012, 22:48
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
а ета фигня очередь полученных событий окна принудительно прогоняет и эффект как от отдельного потока, только скорость меньше.
Похоже на WaitWindowEvent([Timeout]) . Если явно указать Timeout, то события будут принудительно генерироваться с указанным интервалом.

Добавлено через 46 минут
Исправил код до рабочего состояния - исправления прокомментировал.
PureBasic
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
#WM_CAP_START = #WM_USER
 
#WM_CAP_SET_CALLBACK_ERROR = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_STATUS = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7
 
#WM_CAP_DRIVER_CONNECT        =  #WM_USER + 10
#WM_CAP_DRIVER_DISCONNECT     =  #WM_USER + 11
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14
 
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43
 
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_GET_STATUS = #WM_CAP_START + 54
 
#WM_CAP_FILE_SAVEDIB          =  #WM_USER + 25
#WM_CAP_SET_SCALE             =  #WM_USER + 53
#WM_CAP_GET_FRAME             =  #WM_USER + 60 
 
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85
 
    Global x = 200       ; Первый параметр размерности массива
    Global y = 160       ; Второй параметр размерности массива
    Global Min = 60      ; Предел сходства значения ниже 100%
    Global Max = 140      ; Предел сходства значения выше 100%
    Global Dim  B.l (x, y) ; Новый массив для сравнения
    Global Dim  C.l (x, y) ; Результат эвристического сравнения массивов в процентном соотношении сходства
    
    CreateImage(1, x, y)
    
    Procedure UpdateImage()
      StartDrawing(ImageOutput(1))
      For xn = 0 To x - 1 
        For yn = 0 To y - 1 
          color = C(xn, yn)
          Plot(xn, yn, color)
        Next
      Next
      StopDrawing()
      SetGadgetState(1,ImageID(1)) 
    EndProcedure
    
    hWnd = OpenWindow(0, 0, 0, 600, 300, "WebCamTest", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ImageGadget(1, 220, 10, 200, 160, result)
    
    
    If OpenLibrary(0, "AVICAP32.DLL")
      hWebcam = CallFunction(0, "capCreateCaptureWindowA", 0, #WS_VISIBLE + #WS_CHILD, 0, 0, 0, 0, hWnd, 0)
      SendMessage_(hWebcam, #WM_CAP_DRIVER_CONNECT          , 0 , 0)
      SendMessage_(hWebcam, #WM_CAP_SET_SCALE               , 1 , 0)
      SendMessage_(hWebcam, #WM_CAP_SET_PREVIEWRATE         , 10, 0)
      SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW             , 1 , 0)
      SendMessage_(hWebcam, #WM_CAP_DLG_VIDEOSOURCE, 0, 0) ; Выбор устройства захвата - вдруг их много?
      Repeat
        Event = WaitWindowEvent(500)
        SendMessage_(hWebcam, #WM_CAP_GET_FRAME, 0, 0)  ; захват кадра 
        SendMessage_(hWebcam,#WM_CAP_EDIT_COPY,0,0)     ; и помещение его в буфер
        img.l=GetClipboardImage(#PB_Any)
        
        ;==================================================================================================================================================
        ResizeImage(img, x, y, #PB_Image_Smooth)
        
        StartDrawing(ImageOutput(img))
        For xn = 0 To x - 1 
          For yn = 0 To y - 1 
            color = Point(xn, yn)
            SA = Color / 100
            SB = B(xn, yn)
            
            If SA = 0 ; делить на 0 нельзя
              Shodstvo = 0
            Else
              Shodstvo =  SB / SA
              If Shodstvo < 100 And shodstvo > Min Or Shodstvo > 100 And Shodstvo < Max
                C(xn, yn) = 0
              Else
                C(xn, yn) = color
              EndIf
            EndIf
          Next
        Next
        StopDrawing()
        UpdateImage()
        Debug "Updated!"
        ;==================================================================================================================================================
        FreeImage(img)
        ClearClipboard() 
        
        
        Select Event
          Case #PB_Event_CloseWindow
            ;End так не будет выполняться остальной код, нужен Break!
            Break
        EndSelect
      ForEver  
      SendMessage_(hWebcam,#WM_CAP_STOP,0,0)
      SendMessage_(hWebcam, #WM_CAP_DRIVER_DISCONNECT, 0, 0)
      CloseWindow(0)
      CloseLibrary(0)
    EndIf
Результаты и сам код "эвристического сравнения" на твоей совести, не трогаю
А вот Event = WindowEvent() можно оставить, это не влияет.
1
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
12.08.2012, 23:41  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Результаты и сам код "эвристического сравнения" на твоей совести, не трогаю.
Не смейся товарищ, я долгие 30 минут провёл над придумыванием способа обойти зашумлённость без фильтрации и способ себя оправдал. Но стыдно признаться - в HiAsm - е.

А вот исправления - кроме вставки break не увидел. Может плохо смотрел. Посмотрю ещё раз. И спасибо.

Добавлено через 2 минуты
Вывод диалога выбора устройства ты зря вставил из за первого нолика в етой строке он вылазит по умолчанию
PureBasic
1
      SendMessage_(hWebcam, #WM_CAP_DRIVER_CONNECT          , 0 , 0)
Добавлено через 5 минут
Вай кайфушки. Вижу за своими движениями симпатишный шлейф. область которая не изменялась. Осталось настроить.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
13.08.2012, 06:52
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
Вывод диалога выбора устройства ты зря вставил из за первого нолика в етой строке он вылазит по умолчанию
Естественно, в реальной проге он должен быть где то в меню в настройках. Тут привел его для себя любимого - в системе два устройства: TV тюнер и Вебка, как то же надо было ими рулить?

Цитата Сообщение от ЦарьКащей Посмотреть сообщение
кроме вставки break не увидел
Главное изменение это строка ( и соотв. константа)
SendMessage_(hWebcam, #WM_CAP_GET_FRAME, 0, 0)
реально твоя ошибка в коде ( видать не полностью разобрался с работой AVICAP32)


Цитата Сообщение от ЦарьКащей Посмотреть сообщение
Осталось настроить.
Опять же, для реальной проги работа основанная на непрерывном использовании буфера обмена - дурной тон. Это может нарушить работу с другими программами. Зря не разобрался с FrameCallback, так было бы правильней. Примеров работы с AVICAP32 не мало на как на русскоязычном форуме PureBasic так и на английском. В том числе и по анализу изображения и детектированию движения.
1
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
13.08.2012, 12:27  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Опять же, для реальной проги работа основанная на непрерывном использовании буфера обмена - дурной тон. Это может нарушить работу с другими программами. Зря не разобрался с FrameCallback, так было бы правильней. Примеров работы с AVICAP32 не мало на как на русскоязычном форуме PureBasic так и на английском. В том числе и по анализу изображения и детектированию движения.
Да вот пытаюсь паралельно разобраться. Вижу и понимаю что там в структуре лежат либо данные либо указатель на них, ну и пробую извлечь.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
13.08.2012, 12:58
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
Да вот пытаюсь паралельно разобраться.
Там примерно всё то же самое, только надо из памяти вытянуть данные в Image, а не из буфера обмена
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Procedure FrameCallback(hWnd.l, *lpVHdr.VIDEOHDR)
   Protected *VideoMemoryAdress1.SBGR = *lpVHdr\lpData
  Protected y,x, hsv.HSV,hsvR.HSVREF,rc.rect,ma,cx,cy,tc,mhigh
  StartDrawing(ImageOutput(img1))
 
  For y = 240 - 1 To 0 Step -1
    For x = 0 To 320 - 1
      Plot(x, y, RGB(*VideoMemoryAdress1\r & $FF, *VideoMemoryAdress1\g & $FF, *VideoMemoryAdress1\b & $FF))
      *VideoMemoryAdress1 + 3
    Next
  Next
   StopDrawing()
  SetGadgetState(1,ImageID(img1))
 EndProcedure
1
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
13.08.2012, 18:10  [ТС]
Пример просто замечательный, за исключением парочки "но".

Что это за переменные и структуры, да и нужны ли они вообще?
PureBasic
1
hsv.HSV,hsvR.HSVREF,rc.rect,ma,cx,cy,tc,mhigh
Почему один цикл идёт задом на перёд - это прихоть кодописателя или нечто важное?
PureBasic
1
2
  For y = 240 - 1 To 0 Step -1
    For x = 0 To 320 - 1
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
13.08.2012, 18:40
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
исключением парочки "но"
Там всё важно и нужно! Просто, как можно догадаться, процедура выдрана из рабочего кода. Найди этот код и посмотри, что к чему. Я бы дал ссылку, да тут на другие форумы нельзя
1
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
13.08.2012, 23:57  [ТС]
Та чо уж там, я весь коды примера выложу

PureBasic
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#WM_CAP_START = #WM_USER 
 
#WM_CAP_SET_CALLBACK_ERROR = #WM_CAP_START + 2 
#WM_CAP_SET_CALLBACK_STATUS = #WM_CAP_START + 3 
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4 
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5 
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6 
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7 
 
#WM_CAP_DRIVER_CONNECT        =  #WM_USER + 10 
#WM_CAP_DRIVER_DISCONNECT     =  #WM_USER + 11 
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14 
 
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41 
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42 
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43 
 
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50 
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52 
#WM_CAP_GET_STATUS = #WM_CAP_START + 54 
 
#WM_CAP_FILE_SAVEDIB          =  #WM_USER + 25 
#WM_CAP_SET_SCALE             =  #WM_USER + 53 
 
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85 
 
Structure VIDEOHDR 
  lpData.l 
  dwBufferLength.l 
  dwBytesUsed.l 
  dwTimeCaptured.l 
  dwUser.l 
  dwFlags.l 
  dwReserved.l[3] 
EndStructure 
 
Structure CAPSTATUS 
  uiImageWidth.l 
  uiImageHeight.l 
  fLiveWindow.l 
  fOverlayWindow.l 
  fScale.l 
  ptScroll.Point 
  fUsingDefaultPalette.l 
  fAudioHardware.l 
  fCapFileExists.l 
  dwCurrentVideoFrame.l 
  dwCurrentVideoFramesDropped.l 
  dwCurrentWaveSamples.l 
  dwCurrentTimeElapsedMS.l 
  hPalCurrent.l 
  fCapturingNow.l 
  dwReturn.l 
  wNumVideoAllocated.l 
  wNumAudioAllocated.l 
EndStructure 
 
 
CompilerIf #PB_Compiler_Unicode = 1 
  Import "avicap32.lib" 
    capCreateCaptureWindow.l(name.s, style.l, x.l, y.l, width.l, height.l, hWndParent.l, nId.l) As "_capCreateCaptureWindowA@32" 
    capGetDriverDescription.l(index.l, name.l, cbName.l, ver.l, cbVer.l) As "_capGetDriverDescriptionA@20" 
  EndImport 
  CompilerElse 
  Import "avicap32.lib" 
    capCreateCaptureWindow.l(name.s, style.l, x.l, y.l, width.l, height.l, hWndParent.l, nId.l) As "_capCreateCaptureWindowW@32" 
    capGetDriverDescription.l(index.l, name.l, cbName.l, ver.l, cbVer.l) As "_capGetDriverDescriptionW@20" 
  EndImport 
CompilerEndIf 
 
ExamineDesktops() 
 
; Macro GetColorXY(DataPointer, PixelX, PixelY, ImageWidth, ImageHeight) 
;   PeekL(DataPointer + ((ImageHeight - PixelY) * ImageWidth + PixelX) * 3) & $00FFFFFF 
; EndMacro 
 
Structure SBGR 
  b.b 
  g.b 
  r.b 
EndStructure 
 
Global *oldMem.BYTE, oldPosX, oldPosY, made 
 
*oldMem = AllocateMemory(320 * 240 * 3) 
made = 0 
 
CreateImage(0, 320, 240) 
 
Procedure FrameCallback(hWnd.l, *lpVHdr.VIDEOHDR) 
  Protected *VideoMemoryAdress1.SBGR = *lpVHdr\lpData 
  Protected *VideoMemoryAdress2.SBGR = *oldMem 
  Protected leftred1, leftred2, leftgreen1, leftgreen2, leftblue1, leftblue2 
  Protected red1, red2, green1, green2, blue1, blue2 
  Protected density1, density2 
  Protected maxChange, change 
  Protected posX, posY 
 
  If made <= 0 
    CopyMemory(*lpVHdr\lpData, *oldMem, 320 * 240 * 3) 
    made = 1 
  EndIf 
 
  maxChange = 0 
 
  For y = 240 - 1 To 0 Step -1 
 
    blue1  = *VideoMemoryAdress1\b & $FF 
    green1 = *VideoMemoryAdress1\g & $FF 
    red1   = *VideoMemoryAdress1\r & $FF 
 
    blue2  = *VideoMemoryAdress2\b & $FF 
    green2 = *VideoMemoryAdress2\g & $FF 
    red2   = *VideoMemoryAdress2\r & $FF 
 
    *VideoMemoryAdress1 + 3 
    *VideoMemoryAdress2 + 3 
 
    For x = 320 - 1 To 1 Step -1 
 
      leftblue1  = blue1 
      leftgreen1 = green1 
      leftred1   = red1 
 
      leftblue2  = blue2 
      leftgreen2 = green2 
      leftred2   = red2 
 
      blue1  = (*VideoMemoryAdress1\b & $FF + leftblue1) * 0.5 
      green1 = (*VideoMemoryAdress1\g & $FF + leftgreen1) * 0.5 
      red1   = (*VideoMemoryAdress1\r & $FF + leftred1) * 0.5 
 
      blue2  = (*VideoMemoryAdress2\b & $FF + leftblue2) * 0.5 
      green2 = (*VideoMemoryAdress2\g & $FF + leftgreen2) * 0.5 
      red2   = (*VideoMemoryAdress2\r & $FF + leftred2) * 0.5 
 
      density1 = (red1 + green1 + blue1) * 0.3333 
      density2 = (red2 + green2 + blue2) * 0.3333 
 
      change = Pow(density2 - density1, 2) * 0.1 
 
      *VideoMemoryAdress1\b = change 
      *VideoMemoryAdress1\g = *VideoMemoryAdress1\b 
      *VideoMemoryAdress1\r = *VideoMemoryAdress1\b 
 
      ;       change * (320 * 320 + 240 * 240) * 3 / (Pow(x - oldPosX, 2) + Pow(y - oldPosY, 2)) 
 
      If maxChange < change 
        maxChange = change 
        posX = x 
        posY = y 
      EndIf 
 
      *VideoMemoryAdress1 + 3 
      *VideoMemoryAdress2 + 3 
    Next x 
  Next y 
 
  posX = Int((DesktopWidth(0)  / (320.0 * 2)) * posX) * 2 
  posY = Int((DesktopHeight(0) / (240.0 * 2)) * posY) * 2 
  
  *VideoMemoryAdress1 = *lpVHdr\lpData 
 
  StartDrawing(ImageOutput(0)) 
  For y = 240 - 1 To 0 Step -1 
    For x = 0 To 320 - 1 
      Plot(x, y, RGB(*VideoMemoryAdress1\r & $FF, *VideoMemoryAdress1\g & $FF, *VideoMemoryAdress1\b & $FF)) 
      *VideoMemoryAdress1 + 3 
    Next 
  Next 
  StopDrawing() 
 
  If maxChange > 130 
    posX = oldPosX + (posX - oldPosX) * 0.25 
    posY = oldPosY + (posY - oldPosY) * 0.25 
 
    SetWindowTitle(0, Str(posX) + ":" + Str(posY)) 
    SetCursorPos_(posX, posY) 
    oldPosX = posX 
    oldPosY = posY 
  EndIf 
 
EndProcedure 
 
hWnd = OpenWindow(0, 0, 0, 640, 480, "Touchpad", #PB_Window_SystemMenu) 
 
hWebcam = capCreateCaptureWindow("Bradan.Eu - Touchpad", #WS_VISIBLE | #WS_CHILD, 0, 0, 640, 480, hWnd, 0) 
 
SendMessage_(hWebcam, #WM_CAP_DRIVER_CONNECT          , 0, 0) 
SendMessage_(hWebcam, #WM_CAP_SET_SCALE               , 1, 0) 
SendMessage_(hWebcam, #WM_CAP_SET_PREVIEWRATE         , 10, 0) 
SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW             , 1, 0) 
SendMessage_(hWebcam, #WM_CAP_SET_CALLBACK_FRAME      , 0, @FrameCallback()) 
 
Repeat 
Until WaitWindowEvent(3) = #PB_Event_CloseWindow 
End
Добавлено через 58 секунд
И вот какая ерунда. Тут таких структур нету, а что о нём писали по читал, так оно должно работать

Добавлено через 1 час 5 минут
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
PureBasic
1
2
  For y = 240 - 1 To 0 Step -1
    For x = 0 To 320 - 1
Въехал. Разворачивает картинку.

Добавлено через 3 часа 53 минуты
разобрался, почти справился. Код приложил и надеюсь последний раз прошу о помощи.
Строчка
PureBasic
1
color = RGB(*VideoMemoryAdress1\r & $FF, *VideoMemoryAdress1\g & $FF, *VideoMemoryAdress1\b & $FF)
ругается ошибкой доступа к памяти. А так вроде рисовать мона. Тока окно пришлось сделать видимым, без него будто и кадр в памяти неоткуда взять и функция обратного вызова не .... незапускается. В принципе мона всё в памяти отрисовать на одном кадре без заморочек и тутже на показ."эвристический анализ" я чуть поправил. Если шумы находятся в процентном диапазоне (пиксель 2-го кадра непохож на пиксель 1 - го(100%) на столькото процентов от сотни в + или -), при градациях серого отлично фильтрует(при мне фильтровало) изменение пикселей при сравнении кадров разделяя их в двух кадрах на похожие(0) и совсем разные(цвет). Ели интересно - пользуйся. а я дальше буду творить дополненную реальность, распознавание объектов. Мне бы тока предварительные ласки закончить - получение кадра. Ну и может когда ещё загляну, только уже в другой теме.

PureBasic
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
#WM_CAP_START = #WM_USER
#WM_CAP_SET_CALLBACK_ERROR = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_STATUS = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7
#WM_CAP_DRIVER_CONNECT        =  #WM_USER + 10
#WM_CAP_DRIVER_DISCONNECT     =  #WM_USER + 11
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_GET_STATUS = #WM_CAP_START + 54
#WM_CAP_FILE_SAVEDIB          =  #WM_USER + 25
#WM_CAP_SET_SCALE             =  #WM_USER + 53
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85
 
 
 
;------------------------------------------------------------------------------------------------------------
 
 
 
Structure VIDEOHDR
  lpData.l
  dwBufferLength.l
  dwBytesUsed.l
  dwTimeCaptured.l
  dwUser.l
  dwFlags.l
  dwReserved.l[3]
EndStructure
 
Structure SBGR
  b.b
  g.b
  r.b  
EndStructure
 
Global width = 300
Global height = 260
Global Min = 90
Global Max = 110
Global Dim  B (width, height)
Global Dim  C (width, height) 
 
Enumeration
  #Step = 1
  #Rezultat = 2
  #B = 4
EndEnumeration
 
CreateImage(1, width, height)
CreateImage(#B, width, height)
 
 
 
;------------------------------------------------------------------------------------------------------------
 
 
  
Procedure FrameCallback(hWnd, *lpVHdr.VIDEOHDR)
  Protected *VideoMemoryAdress1.SBGR = *lpVHdr\lpData
  Protected xn,yn, color, SA, SB
  StartDrawing(ImageOutput(1))
  For xn = height - 1 To 0 Step - 1
    For yn = 0 To width - 1 Step #Step
      
      color = RGB(*VideoMemoryAdress1\r & $FF, *VideoMemoryAdress1\g & $FF, *VideoMemoryAdress1\b & $FF)
      *VideoMemoryAdress1 + 3
      
      SA = color / 100
      SB = B(yn, xn)
      B(yn, xn) = color
      If SA = 0 ; делить на 0 нельзя
        Shodstvo = 0
      Else
        Shodstvo =  SB / SA
        If Shodstvo < 100 And shodstvo > Min Or Shodstvo > 100 And Shodstvo < Max
          Plot(yn, xn, RGB(0, 0, 0))
        Else
          Plot(yn, xn, color)
        EndIf
      EndIf
      
    Next
  Next
  Debug "Кадр + 1"
  ResizeImage(1, width, height)
  StopDrawing()
  ;SetGadgetState(#Rezultat,ImageID(1))
 EndProcedure    
    
    
 
 
;------------------------------------------------------------------------------------------------------------
 
 
 
 
hWnd = OpenWindow(0, 0, 0, width + 4, height + 60, "", #PB_Window_SystemMenu| #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
;ImageGadget(#Rezultat, 2, 20, width, height, result)
;SetGadgetState(#Rezultat, ImageID(#B))
 
 
 
 
;------------------------------------------------------------------------------------------------------------
 
 
 
 
If OpenLibrary(0, "AVICAP32.DLL")
  hWebcam = CallFunction(0, "capCreateCaptureWindowA", 0, #WS_VISIBLE+#WS_CHILD, 2, 20, width, height, hWnd, 0)
  SendMessage_(hWebcam, #WM_CAP_DRIVER_CONNECT          , 0 , 0)
  SendMessage_(hWebcam, #WM_CAP_SET_SCALE               , 1 , 0)
  SendMessage_(hWebcam, #WM_CAP_SET_PREVIEWRATE         , 50, 0)
  SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW             , 1 , 0)
  SendMessage_(hWebcam, #WM_CAP_SET_CALLBACK_FRAME      , 0 , @FrameCallback())
  
  
  
;------------------------------------------------------------------------------------------------------------
  
  
  
 
Repeat
  
  Event = WindowEvent()
  Select Event
      
    Case #PB_Event_CloseWindow
      Break
      
  EndSelect
ForEver
  
  
  
  
;------------------------------------------------------------------------------------------------------------
  
  
  
  
  SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW       , 0, 0)
  SendMessage_(hWebcam, #WM_CAP_DRIVER_DISCONNECT, @"BLUBBER", 0)
  CloseWindow(0)
  CloseLibrary(0)
EndIf
End
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
14.08.2012, 07:23
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
Строчка
Код Basic4GL
1
color = RGB(*VideoMemoryAdress1\r & $FF, *VideoMemoryAdress1\g & $FF, *VideoMemoryAdress1\b & $FF)
ругается ошибкой доступа к памяти.
Тут такая фигня - ошибка происходит только в том случае, если размер Image не соответствует ( больше) чем реальный размер кадра
У тебя в коде
Global width = 300
Global height = 260
А у меня реально 320х240. Ну и сам понимаешь, когда из памяти просят не существующие данные, то кирдык
А реально размер может быть какой угодно - зависит от настройки и возможности камеры. Надо его определить заранее. Смотри в сторону #WM_CAP_GET_STATUS ( ну или на крайний случай можно 1 раз вытащить размеры из буфера обмена)
1
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
14.08.2012, 18:30  [ТС]
Помогите устранить проблему. Двум переменным widthImg и heightImg присвоить значение из структуры capstatus. Вроде как в учебниках переменна = указатель + элемент структуры, но он ругается что указатель нулевой, я думал от того что указатель на структуру поздновато в коде появляется у и пихнул переменные апосля отправки сообщений библиотеке. Но он начал ругаться что переменная уже объявлена с другим типом. Я офигел и мои руки опустились.

PureBasic
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#WM_CAP_START                          = #WM_USER
#WM_CAP_SET_CALLBACK_ERROR             = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_CAPCONTROL_STATUS = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_YIELD             = #WM_CAP_START + 4
#WM_CAP_SET_CALLBACK_FRAME             = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_VIDEOSTREAM       = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM        = #WM_CAP_START + 7
#WM_CAP_GET_STATUS                     = #WM_CAP_START + 54;-------------------
#WM_CAP_DRIVER_CONNECT                 =  #WM_USER + 10
#WM_CAP_DRIVER_DISCONNECT              =  #WM_USER + 11
#WM_CAP_DRIVER_GET_CAPS                = #WM_CAP_START + 14
#WM_CAP_DLG_VIDEOFORMAT                = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE                = #WM_CAP_START + 42
#WM_CAP_DLG_VIDEODISPLAY               = #WM_CAP_START + 43
#WM_CAP_SET_PREVIEW                    = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE                = #WM_CAP_START + 52
#WM_CAP_GET_STATUS                     = #WM_CAP_START + 54
#WM_CAP_FILE_SAVEDIB                   =  #WM_USER + 25
#WM_CAP_SET_SCALE                      =  #WM_USER + 53
#WM_CAP_SET_CALLBACK_CAPCONTROL        = #WM_CAP_START + 85
 
 
 
;------------------------------------------------------------------------------------------------------------
 
Structure CAPSTATUS 
  uiImageWidth.l 
  uiImageHeight.l 
  fLiveWindow.l 
  fOverlayWindow.l 
  fScale.l 
  ptScroll.Point 
  fUsingDefaultPalette.l 
  fAudioHardware.l 
  fCapFileExists.l 
  dwCurrentVideoFrame.l 
  dwCurrentVideoFramesDropped.l 
  dwCurrentWaveSamples.l 
  dwCurrentTimeElapsedMS.l 
  hPalCurrent.l 
  fCapturingNow.l 
  dwReturn.l 
  wNumVideoAllocated.l 
  wNumAudioAllocated.l 
EndStructure
 
*CapStat.CAPSTATUS
 
Structure VIDEOHDR
  lpData.l
  dwBufferLength.l
  dwBytesUsed.l
  dwTimeCaptured.l
  dwUser.l
  dwFlags.l
  dwReserved.l[3]
EndStructure
 
Structure SBGR
  b.b
  g.b
  r.b  
EndStructure
 
 
Global width     = 300
Global height    = 240
 
Global widthImg  = *CapStat\uiImageWidth
Global heightImg = *CapStat\uiImageHeight
 
Global Min       = 90
Global Max       = 110
 
Global Dim  B (widthImg, heightImg)
Global Dim  C (widthImg, heightImg) 
 
Enumeration
  #Step        = 1
  #Menu        = 2
  #C           = 3
  #B           = 4
EndEnumeration
 
Enumeration
  #Menu_Device = 5
  #Menu_exit   = 6
  #Menu_Pause  = 7
EndEnumeration
 
CreateImage(#C, widthimg, heightimg)
CreateImage(#B, widthimg, heightimg)
 
 
 
;------------------------------------------------------------------------------------------------------------
 
 
  
Procedure FrameCallback(hWnd, *lpVHdr.VIDEOHDR)
  Protected *VideoMemoryAdress1.SBGR = *lpVHdr\lpData
  Protected xn,yn, color, SA, SB
  StartDrawing(ImageOutput(#C))
  For xn = heightImg - 1 To 0 Step - 1
    For yn = 0 To widthImg - 1 Step #Step
      
      color = RGB(*VideoMemoryAdress1\r & $FF, *VideoMemoryAdress1\g & $FF, *VideoMemoryAdress1\b & $FF)
      *VideoMemoryAdress1 + 3
      
      SA = color / 100
      SB = B(yn, xn)
      B(yn, xn) = color
      If SA = 0 ; делить на 0 нельзя
        Shodstvo = 0
      Else
        Shodstvo =  SB / SA
        If Shodstvo < 100 And shodstvo > Min Or Shodstvo > 100 And Shodstvo < Max
          Plot(yn, xn, RGB(0, 0, 0))
        Else
          Plot(yn, xn, color)
        EndIf
      EndIf
      
    Next
  Next
  Debug "Кадр + 1"
  StopDrawing()
 EndProcedure    
    
    
 
 
;------------------------------------------------------------------------------------------------------------
 
 
 
 
hWnd = OpenWindow(0, 0, 0, width + 4, height + 60, "", #PB_Window_SystemMenu| #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
 
If CreateMenu(#Menu, WindowID(0))
  MenuTitle("Программа")
    MenuItem(#Menu_exit, "Выключить")
      MenuBar()
    MenuItem(#Menu_Pause, "?")
  MenuTitle("Настройки")
    MenuItem(#Menu_Device, "Сменить устройство")
EndIf
 
 
 
;------------------------------------------------------------------------------------------------------------
 
 
 
 
If OpenLibrary(0, "AVICAP32.DLL")
  hWebcam = CallFunction(0, "capCreateCaptureWindowA", 0, #WS_VISIBLE+#WS_CHILD, 2, 20, width, height, hWnd, 0)
  
  SendMessage_(hWebcam, #WM_CAP_DRIVER_CONNECT          , 0 , 0)
  SendMessage_(hWebcam, #WM_CAP_SET_SCALE               , 1 , 0)
  SendMessage_(hWebcam, #WM_CAP_SET_PREVIEWRATE         , 50, 0)
  SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW             , 1 , 0)
  
  SendMessage_(hWebcam, #WM_CAP_GET_STATUS              , SizeOf(CAPSTATUS), *CapStat);------------
  SendMessage_(hWebcam, #WM_CAP_SET_CALLBACK_FRAME      , 0 , @FrameCallback())
  
  
  
;------------------------------------------------------------------------------------------------------------
  
  
  
 
Repeat
  
  Event = WindowEvent()
  Select Event
      
    Case #PB_Event_CloseWindow
      Break
      
    Case #PB_Event_Menu
      Select EventMenu()
        Case #Menu_exit
          Break
          
          Case #Menu_Pause
            
          Case #Menu_Device
            
        EndSelect
      
  EndSelect
ForEver
  
  
  
  
;------------------------------------------------------------------------------------------------------------
  
  
  
  
  SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW       , 0, 0)
  SendMessage_(hWebcam, #WM_CAP_DRIVER_DISCONNECT, @"BLUBBER", 0)
  
  CloseWindow(0)
  CloseLibrary(0)
  
EndIf
 
End
0
Эксперт по электронике
6575 / 3202 / 335
Регистрация: 28.10.2011
Сообщений: 12,482
Записей в блоге: 7
14.08.2012, 19:23
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
Двум переменным widthImg и heightImg присвоить значение из структуры capstatus.
Им нужно присваивать значения когда структура уже заполнена, а не при старте программы, ведь тогда там еще нет данных.
Т. е. это нужно сделать после строки.
PureBasic
1
SendMessage_(hWebcam, #WM_CAP_GET_STATUS              , SizeOf(CAPSTATUS), *CapStat);------------
1
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
14.08.2012, 19:51  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Им нужно присваивать значения когда структура уже заполнена, а не при старте программы, ведь тогда там еще нет данных.
Т. е. это нужно сделать после строки.
PureBasic
1
SendMessage_(hWebcam, #WM_CAP_GET_STATUS              , SizeOf(CAPSTATUS), *CapStat);------------
Это я догадался, но щас котелок плохо варит, когда начал переносить выяснилось что многое зависит от етих переменных. Ну раз проблема только в этом то тогда буду думать.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
14.08.2012, 20:07
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
указатель + элемент структуры,
* в твоем случае ни какой не указатель, а просто переменная такая. Запомни - * в Пурике - это не * в Си (хотя в структурах именно указатель, НО потому, что структуры унифицированы для работы с ACM) В общем должно быть как то так:
CapStat.CAPSTATUS
и дальше
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
If OpenLibrary(0, "AVICAP32.DLL")
  hWebcam = CallFunction(0, "capCreateCaptureWindowA", 0, #WS_VISIBLE+#WS_CHILD, 2, 20, width, height, hWnd, 0)
  SendMessage_(hWebcam, #WM_CAP_DRIVER_CONNECT          , 0 , 0)
  SendMessage_(hWebcam, #WM_CAP_SET_SCALE               , 1 , 0)
  SendMessage_(hWebcam, #WM_CAP_SET_PREVIEWRATE         , 50, 0)
  SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW             , 1 , 0)
  SendMessage_(hWebcam, #WM_CAP_DLG_VIDEOSOURCE, 0, 0) ; Выбор устройства захвата - вдруг их много?
  SendMessage_(hWebcam, #WM_CAP_GET_STATUS, SizeOf(capstatus), @capStat)
  Debug capStat\uiImageWidth
  Debug capStat\uiImageHeight
  
  SendMessage_(hWebcam, #WM_CAP_SET_CALLBACK_FRAME      , 0 , @FrameCallback())
  
  ...
Ну вместо Debug ес-но присваивание куда надо.
1
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
14.08.2012, 20:43  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
* в твоем случае ни какой не указатель, а просто переменная такая. Запомни - * в Пурике - это не * в Си (хотя в структурах именно указатель, НО потому, что структуры унифицированы для работы с ACM) В общем должно быть как то так:
CapStat.CAPSTATUS
и дальше
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
If OpenLibrary(0, "AVICAP32.DLL")
  hWebcam = CallFunction(0, "capCreateCaptureWindowA", 0, #WS_VISIBLE+#WS_CHILD, 2, 20, width, height, hWnd, 0)
  SendMessage_(hWebcam, #WM_CAP_DRIVER_CONNECT          , 0 , 0)
  SendMessage_(hWebcam, #WM_CAP_SET_SCALE               , 1 , 0)
  SendMessage_(hWebcam, #WM_CAP_SET_PREVIEWRATE         , 50, 0)
  SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW             , 1 , 0)
  SendMessage_(hWebcam, #WM_CAP_DLG_VIDEOSOURCE, 0, 0) ; Выбор устройства захвата - вдруг их много?
  SendMessage_(hWebcam, #WM_CAP_GET_STATUS, SizeOf(capstatus), @capStat)
  Debug capStat\uiImageWidth
  Debug capStat\uiImageHeight
  
  SendMessage_(hWebcam, #WM_CAP_SET_CALLBACK_FRAME      , 0 , @FrameCallback())
  
  ...
Ну вместо Debug ес-но присваивание куда надо.
ОЙЯДУРАК!!! Щас константы лишние убрал, всё объявил, потом пере...пере... короче новые значения сделал.
Теперь о главном - CapStat.CAPSTATUS как гдето было писано, простое объявление структуры. Ёханый бабай. Поменял - работает!
0
14.08.2012, 20:46

Не по теме:

Цитата Сообщение от Pro_grammer Посмотреть сообщение
НО потому, что структуры унифицированы для работы с ACM
Какая связь между указателем на структуру и ассемблером?
Это для размышлений.
PureBasic
1
2
3
4
5
6
7
8
x.RECT
*x.RECT
 
Debug SizeOf(x)  ; 16 (4*4).
Debug SizeOf(*x) ; В x86 только 4 байта.
                 ; Сразу видно что это указатель на структуру, а не сама структура.
x\left = 0
*x\left = 0 ; Тут прога падает, т. к. указатель на структуру не проинициализирован!

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.08.2012, 20:46
Помогаю со студенческими работами здесь

Замена текста при копировании в буфер обмена
Как сделать так чтобы при копировании в буфер обмена происходила замена на рандомный текст но с таким же кол-вом символов? и как сделать...

Word зависает при копировании в буфер обмена
Если вырезать/скопировать какой-нибудь текст, то программа зависает секунд на 5-10, после начинает работать. Понимаю, что нужно смотреть на...

При копировании в буфер обмена дописывать ссылку на источник
Здравствуйте! Как сделать, чтоб при копировании текста из определенного элемента, в буфер обмана копировался не только выделенный текст, но...

При копировании текста в буфер обмена, должно происходить событие
Как сделать что бы при копировании в буфер обмена, определенного текста происходило событие? Например при копировании из адресной строки...

Куда утекает память
Бесполезный код проверяет время работы функции. Память выделяется под массив и высвобождается перед выходом из функции. Тем не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru