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

Обработка изображения с веб камеры на предмет движущихся объектов\изменившихся пикселей

14.08.2012, 21:13. Показов 19597. Ответов 94
Метки нет (Все метки)

Специально для тех кто долго дрючил свои мозги, перерыл пол гугля и нихрена не нашёл выкладываю готовый пример обработки изображения с веб камеры.

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
#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  = 0
Global heightImg = 0
 
Global Min       = 90
Global Max       = 110
 
Global Dim  B (0, 0);Объявление двух массивов, один для хранения старых данных, второй для записи в него результата
Global Dim  C (0, 0) ; Redim
 
 
 
Enumeration
  #STP         = 1;Шаг цикла. Если менять то надо в "*VideoMemoryAdress1 + 3" тройку умножать на шаг. Суть шага такова, что если он = 2 то скорость обработки увеличивается вдвое а качество тудаже уменьшается. 
  #Menu        = 1;Это всё про меню, оно для красоты
  #Menu_Device = 2
  #Menu_exit   = 3
  #Menu_Pause  = 4
EndEnumeration
 
 
 
;------------------------------------------------------------------------------------------------------------
 
 
 
Procedure FrameCallback(hWnd, *lpVHdr.VIDEOHDR);
  Protected *VideoMemoryAdress1.SBGR = *lpVHdr\lpData;Пошоль просесс
  Protected xn,yn, color, SA, SB
  For xn = heightImg - 1 To 0 Step - #STP
    For yn = 0 To widthImg - 1 Step #STP
      
      color = RGB(*VideoMemoryAdress1\r & $FF, *VideoMemoryAdress1\g & $FF,;считываем цвет *VideoMemoryAdress1\b & $FF)
      *VideoMemoryAdress1 + 3 ;перескакиваем на следующие 3 байта
      
      SA = color / 100;Один процент цвета 
      SB = B(yn, xn);Извлекаем цвет из предыдущего кадра, он в виде цифры в массиве
      B(yn, xn) = color;Присваиваем туда же новое значение, обновляя кадр
      If SA = 0 ; делить на 0 нельзя
        Shodstvo = 0
      Else
        Shodstvo =  SB / SA; Точка отсчёта равна ста процентам, а дальше дело техники, 110 мньше 100 на 10, 120 больше 100 на 20, чем больше разница - Shodstvo - 100, тем больше различий между пикселями в 2-х кадрах в одном и том же месте 
        If Shodstvo < 100 And shodstvo > Min Or Shodstvo > 100 And Shodstvo < Max
          С(yn, xn) = RGB(0, 0, 0))
        Else
          С(yn, xn) = color);Если ещё немного подшаманить и сдеать отрисовку результата а не присвоение значений элементам массива, то получим чёрный экран на котором будут видны только подвижные объекты. Хорошо фильтрует серую картинку, по тому что чем меньше диапазон значений, тем меньше разница между якобы похожими пикселями
        EndIf
      EndIf
      
    Next
  Next
 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);------------
  widthImg  = CapStat\uiImageWidth;Устанавливаем ширину
  heightImg = CapStat\uiImageHeight;высоту
  ReDim B(widthImg, heightImg);устанавливаем размеры массивов, чтоб всё соответсвовало всему
  ReDim C(widthImg, heightImg)
  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
Конец

Добавлено через 41 секунду
Там только надо память очищать чтоб не утекла.

Добавлено через 4 минуты
По остальным вопросам лазим тут: http://msdn.microsoft.com/en-u... s.85).aspx
тут: http://purebasic.ru/manual.php?id=1104&lng=rus
тут: http://www.google.ru/webhp?source=search_app
и здесь.
2
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.08.2012, 21:13
Ответы с готовыми решениями:

Обработка изображения(группировка пикселей)
Здравствуйте, почитал статью http://job-interview.ru/articles/post/362 и захотел реализовать тоже самое, но что-то не получилось. В чем...

Обработка изображения размером 800х600 пикселей
Здравствуйте,подскажите пожалуйста, что не так. Есть исходное изображение размером 800х600 пикселей. Вырезаю из него фрагмент и хочу...

Обработка изображения: поиск пикселей определённого цвета
Добрый вечер! Имеется такое задание: есть изображение, нужно найти пиксели определенного цвета и записать их координаты в массив. В...

94
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
16.08.2012, 19:40  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Справку почитай, компилятор правильно пишет.
ААаааааааааааааааааааааааааааааааааааааа а... Что проще - изменить размер массива или заменить его на более динамичный аналог - картинку?
0
Эксперт по электронике
6995 / 3311 / 341
Регистрация: 28.10.2011
Сообщений: 12,996
Записей в блоге: 7
16.08.2012, 19:41
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Сомневаюсь, что 32 разрядная DLL вдруг станет работать в х64 режиме!
Представь себе, x64 битные приложения импортируют функции из таких библиотек как KERNEL32.dll, USER32.dll, OLE32.dll, GDI32.dll и других! Неожиданно, правда?
1
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
16.08.2012, 21:36  [ТС]


Добавлено через 12 минут
widthImg = 320
heightImg = 240
f = 0 а должно бы быть 1
Где справедливость??? Ширина и высота есть, а доступа к высоте ширине - нет.


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
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
#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
 
Enumeration
  #STP         = 1
  #Menu        = 1
  #Menu_Device = 2
  #Menu_exit   = 3
  #Menu_Stop   = 4
  #Menu_Start  = 5
EndEnumeration
 
 
 
 
;------------------------------------------------------------------------------------------------------------
 
 
 
 
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
 
Stat.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     = 320
Global height    = 240
Global widthImg  = 0
Global heightImg = 0
Global Min       = 90
Global Max       = 110
 
ImgOld = CreateImage(0, 1, 1)
ImgRez = CreateImage(1, 1, 1)
 
 
 
;------------------------------------------------------------------------------------------------------------
 
 
 
Procedure FrameCallback     (hWnd, *lpVHdr.VIDEOHDR)
  Protected *VideoMemoryAdress1.SBGR = *lpVHdr\lpData
  Protected xn,yn
  StartDrawing(ImageOutput(ImgOld))
  For xn = widthImg - 1 To 0 Step - #STP
    For yn = 1 To heightImg - 1 Step #STP
      Plot(xn, yn, RGB (*VideoMemoryAdress1\r & $FF, *VideoMemoryAdress1\g & $FF, *VideoMemoryAdress1\b & $FF))
      *VideoMemoryAdress1 + 3 * #STP
    Next
  Next
  StopDrawing()
 EndProcedure    
 
 
 
 Procedure DriverConnect    (hWebcam)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_DRIVER_CONNECT          , 0 , 0)
 EndProcedure 
 
 
 
 Procedure SetScale         (hWebcam)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_SET_SCALE               , 1 , 0)
 EndProcedure
 
 
 
 Procedure SetPreviewrate   (hWebcam)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_SET_PREVIEWRATE         , 50, 0)
 EndProcedure
 
 
 
 Procedure SetPreview       (hWebcam, Param)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_SET_PREVIEW             , Param , 0)
 EndProcedure
 
 
 
 Procedure DriverDisconnect (hWebcam)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_DRIVER_DISCONNECT       , 0, 0)
 EndProcedure
 
 
 
 Procedure GetStatus        (hWebcam, *CapStat.CAPSTATUS)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_GET_STATUS              , SizeOf (CAPSTATUS), *CapStat)
 EndProcedure
 
 
 
 Procedure CapCallbackFrame (hWebcam, *FrameCallback)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_SET_CALLBACK_FRAME      , 0 , @FrameCallback ())
 EndProcedure
 
 
 
 Procedure Resizer          (*CapStat.CAPSTATUS)
   widthImg  = *CapStat\uiImageWidth ;320
   heightImg = *CapStat\uiImageHeight;240
   ResizeImage(ImgOld,  widthImg, heightImg)
   ResizeImage(ImgRez,  widthImg, heightImg)
 EndProcedure
 
 
 
 Procedure Sravn() 
   
 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_Stop,   "Стоп")
  MenuItem (#Menu_Start,  "Старт")
  MenuBar  ()
  MenuItem (#Menu_exit,   "Выключить")
  MenuTitle("Настройки")
  MenuItem (#Menu_Device, "Сменить устройство")
EndIf
 
 
 
;------------------------------------------------------------------------------------------------------------
 
 
 
 
If OpenLibrary (0, "AVICAP32.DLL")
  hWebcam = CallFunction (0, "capCreateCaptureWindowA", 0, #WS_VISIBLE + #WS_CHILD, 2, 10, width, height, hWnd, 0)
  
  a = DriverConnect    (hWebcam)
  b = SetScale         (hWebcam)
  c = SetPreviewrate   (hWebcam)
  d = SetPreview       (hWebcam, 1)
  e = GetStatus        (hWebcam, @CapStat)
  f = Resizer          (@CapStat)
  g = CapCallbackFrame (hWebcam, @FrameCallback)
  
  
  Debug "a" + Str(a) + "b" + Str(b) + "c" + Str(c) + "d" + Str(d) + "e" + Str(e) + "f" + Str(f) + "g" + Str(g)
  ;------------------------------------------------------------------------------------------------------------
  
  
 
Repeat
  
  Event = WindowEvent ()
  Select Event
      
    Case #PB_Event_CloseWindow
      Break
      
    Case #PB_Event_Menu
      Select EventMenu ()
          
        Case #Menu_exit
          Break
          
        Case #Menu_Start
          DriverConnect    (hWebcam)
          SetScale         (hWebcam)
          SetPreviewrate   (hWebcam)
          SetPreview       (hWebcam, 1)
          GetStatus        (hWebcam, @CapStat)
          Resizer          (@CapStat)
          CapCallbackFrame (hWebcam, @FrameCallback)
          
        Case #Menu_Stop
          SetPreview       (hWebcam, 0)
          DriverDisconnect (hWebcam)
 
  
        Case #Menu_Device
          SendMessage_     (hWebcam, #WM_CAP_DLG_VIDEOSOURCE, 0, 0)
          
      EndSelect
      
  EndSelect
ForEver
  
  
  
  
;------------------------------------------------------------------------------------------------------------
 
 
SetPreview       (hWebcam, 0)
DriverDisconnect (hWebcam)
CloseWindow      (0)
CloseLibrary     (0)
 
EndIf
 
End
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
16.08.2012, 21:43
Цитата Сообщение от locm Посмотреть сообщение
Неожиданно, правда?
Наверно да, для тех, кто не вникал в рекомендации MSDN по переводу приложений на х64 платформу. Там все вопросы совместимости освещены вдоль и поперек - не имеет смысла их пересказывать.
А на форуме MSDN в разделе Visual Basic задавался вопрос о совместимости именно этой AVICAP32.DLL и её работе. Так вот ответ был о не полной совместимости в режиме х64.
Собственно возьми сам да и попробуй. У меня х64 только на работе к сожалению.
0
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
16.08.2012, 21:46  [ТС]
Реально картинка в памяти меньше чем было заявлено в процедуре.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
16.08.2012, 21:50
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
f = 0 а должно бы быть 1
Где процедура что то возвращает???

Procedure Resizer (*CapStat.CAPSTATUS)
widthImg = *CapStat\uiImageWidth ;320
heightImg = *CapStat\uiImageHeight;240
ResizeImage(ImgOld, widthImg, heightImg)
ResizeImage(ImgRez, widthImg, heightImg)
EndProcedure
Код кстати работает, рисует картинку.
1
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
16.08.2012, 22:03  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Где процедура что то возвращает???
Чуть поглазей, там есть длинная строчка
PureBasic
1
Debug "a" + Str(a) + "b" + Str(b) + "c" + Str(c) + "d" + Str(d) + "e" + Str(e) + "f" + Str(f) + "g" + Str(g)
И там же имя процедуры чуть выше
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Код кстати работает, рисует картинку.
Не понял. а как же ошибка доступа к памяти?

Добавлено через 6 минут
plot в FrameCallback ругает меня этим уже не первый раз.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
16.08.2012, 22:09
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
Чуть поглазей, там есть длинная строчка
Для особо глазастых, но сидящих в танке ещё раз обьясняю, что процедура возвращает значение если есть оператор ProcedureReturn, а где он у тебя тут
PureBasic
1
2
3
4
5
6
Procedure Resizer (*CapStat.CAPSTATUS)
widthImg = *CapStat\uiImageWidth ;320
heightImg = *CapStat\uiImageHeight;240
ResizeImage(ImgOld, widthImg, heightImg)
ResizeImage(ImgRez, widthImg, heightImg)
EndProcedure

Цитата Сообщение от ЦарьКащей Посмотреть сообщение
Не понял. а как же ошибка доступа к памяти?
Ты сейчас для какой системы и в каком режиме спрашиваешь? У меня с компилятором для х86 всё работает. И мой код работает. И вообще нет проблем!
0
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
16.08.2012, 22:12  [ТС]
Ты сейчас для какой системы и в каком режиме спрашиваешь? У меня с компилятором для х86 всё работает. И мой код работает. И вообще нет проблем!
Система win 7 x64 компилятор 4.51 (Windows - x86).
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
16.08.2012, 23:21
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
win 7 x64
Дома нет такой системы. Завтра на работе найду проверю.

Добавлено через 1 час 5 минут
Я тут посмотрел исходники на С.
И вот до чего допер - структура CAPSTATUS, в PureBasic задекларирована как long, а вообще это должно быть IntPtr которое составляет 8 байт на x64 и 4 байт на x86. Т.о. в стоке
SendMessage_ (hWebcam, #WM_CAP_GET_STATUS , SizeOf (CAPSTATUS), *CapStat)
SizeOf (CAPSTATUS) всегда считает, как 4 bytes - из за этого ошибка в размере структуры, и выдает размер картитки 0х0.
В общем когда компилируешь PureBasic (х64) надо строчку так изменить:
SendMessage_(hWebcam, #WM_CAP_GET_STATUS , SizeOf(CAPSTATUS)*4, CapStat)
И всё должно работать.
Проверь! А я завтра уж проверю.
1
Эксперт по электронике
6995 / 3311 / 341
Регистрация: 28.10.2011
Сообщений: 12,996
Записей в блоге: 7
16.08.2012, 23:31
Цитата Сообщение от Pro_grammer Посмотреть сообщение
И вот до чего допер - структура CAPSTATUS, в PureBasic задекларирована как long
Ну и я о том же писал.
Цитата Сообщение от locm Посмотреть сообщение
ИМХО как минимум структуры нужно переписать с учетом того, что будет работать на x64

Цитата Сообщение от Pro_grammer Посмотреть сообщение
В общем когда компилируешь PureBasic (х64) надо строчку так изменить:
SendMessage_(hWebcam, #WM_CAP_GET_STATUS , SizeOf(CAPSTATUS)*4, CapStat)
И всё должно работать.
Не будет работать! И знаешь почему?
Недостаточно установить требуемый размер структуры, нужно еще чтобы ее поля были на своих местах, иначе получим искаженные данные (прочитанные не оттуда, откуда надо) и возникнет уже другая ошибка.
0
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
17.08.2012, 00:03  [ТС]
Неа. не пропала.

Добавлено через 26 минут
нужно еще чтобы ее поля были на своих местах
Какие поля?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
17.08.2012, 00:05
Цитата Сообщение от locm Посмотреть сообщение
Не будет работать! И знаешь почему?
Специально попросил своего знакомого скомпилировать этот пример под х64
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
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
#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
 
Enumeration
  #STP         = 1
  #Menu        = 1
  #Menu_Device = 2
  #Menu_exit   = 3
  #Menu_Stop   = 4
  #Menu_Start  = 5
EndEnumeration
 
 
 
 
;------------------------------------------------------------------------------------------------------------
 
 
 
 
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
 
Stat.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     = 320
Global height    = 240
Global widthImg  = 0
Global heightImg = 0
Global Min       = 90
Global Max       = 110
 
ImgOld = CreateImage(0, 1, 1)
ImgRez = CreateImage(1, 1, 1)
 
 
 
;------------------------------------------------------------------------------------------------------------
 
 
 
Procedure FrameCallback     (hWnd, *lpVHdr.VIDEOHDR)
  Protected *VideoMemoryAdress1.SBGR = *lpVHdr\lpData
  Protected xn,yn
  StartDrawing(ImageOutput(ImgOld))
  For xn = widthImg - 1 To 0 Step - #STP
    For yn = 1 To heightImg - 1 Step #STP
      Plot(xn, yn, RGB (*VideoMemoryAdress1\r & $FF, *VideoMemoryAdress1\g & $FF, *VideoMemoryAdress1\b & $FF))
      *VideoMemoryAdress1 + 3 * #STP
    Next
  Next
  StopDrawing()
 EndProcedure    
 
 
 
 Procedure DriverConnect    (hWebcam)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_DRIVER_CONNECT          , 0 , 0)
 EndProcedure 
 
 
 
 Procedure SetScale         (hWebcam)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_SET_SCALE               , 1 , 0)
 EndProcedure
 
 
 
 Procedure SetPreviewrate   (hWebcam)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_SET_PREVIEWRATE         , 50, 0)
 EndProcedure
 
 
 
 Procedure SetPreview       (hWebcam, Param)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_SET_PREVIEW             , Param , 0)
 EndProcedure
 
 
 
 Procedure DriverDisconnect (hWebcam)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_DRIVER_DISCONNECT       , 0, 0)
 EndProcedure
 
 
 
 Procedure GetStatus        (hWebcam, *CapStat.CAPSTATUS)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_GET_STATUS              , SizeOf (CAPSTATUS)*4, *CapStat)
 EndProcedure
 
 
 
 Procedure CapCallbackFrame (hWebcam, *FrameCallback)
   ProcedureReturn  SendMessage_ (hWebcam, #WM_CAP_SET_CALLBACK_FRAME      , 0 , @FrameCallback ())
 EndProcedure
 
 
 
 Procedure Resizer          (*CapStat.CAPSTATUS)
   widthImg  = *CapStat\uiImageWidth ;320
   heightImg = *CapStat\uiImageHeight;240
   ResizeImage(ImgOld,  widthImg, heightImg)
   ResizeImage(ImgRez,  widthImg, heightImg)
 EndProcedure
 
 
 
 Procedure Sravn() 
   
 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_Stop,   "Стоп")
  MenuItem (#Menu_Start,  "Старт")
  MenuBar  ()
  MenuItem (#Menu_exit,   "Выключить")
  MenuTitle("Настройки")
  MenuItem (#Menu_Device, "Сменить устройство")
EndIf
 
 
 
;------------------------------------------------------------------------------------------------------------
 
 
 
 
If OpenLibrary (0, "AVICAP32.DLL")
  hWebcam = CallFunction (0, "capCreateCaptureWindowA", 0, #WS_VISIBLE + #WS_CHILD, 2, 10, width, height, hWnd, 0)
  
  a = DriverConnect    (hWebcam)
  b = SetScale         (hWebcam)
  c = SetPreviewrate   (hWebcam)
  d = SetPreview       (hWebcam, 1)
  e = GetStatus        (hWebcam, @CapStat)
  f = Resizer          (@CapStat)
  g = CapCallbackFrame (hWebcam, @FrameCallback)
  
  
  Debug "a" + Str(a) + "b" + Str(b) + "c" + Str(c) + "d" + Str(d) + "e" + Str(e) + "f" + Str(f) + "g" + Str(g)
  ;------------------------------------------------------------------------------------------------------------
  
  
 
Repeat
  
  Event = WindowEvent ()
  Select Event
      
    Case #PB_Event_CloseWindow
      Break
      
    Case #PB_Event_Menu
      Select EventMenu ()
          
        Case #Menu_exit
          Break
          
        Case #Menu_Start
          DriverConnect    (hWebcam)
          SetScale         (hWebcam)
          SetPreviewrate   (hWebcam)
          SetPreview       (hWebcam, 1)
          GetStatus        (hWebcam, @CapStat)
          Resizer          (@CapStat)
          CapCallbackFrame (hWebcam, @FrameCallback)
          
        Case #Menu_Stop
          SetPreview       (hWebcam, 0)
          DriverDisconnect (hWebcam)
 
  
        Case #Menu_Device
          SendMessage_     (hWebcam, #WM_CAP_DLG_VIDEOSOURCE, 0, 0)
          
      EndSelect
      
  EndSelect
ForEver
  
  
  
  
;------------------------------------------------------------------------------------------------------------
 
 
SetPreview       (hWebcam, 0)
DriverDisconnect (hWebcam)
CloseWindow      (0)
CloseLibrary     (0)
 
EndIf
 
End
И он только что пристал мне результат. ВСЁ РАБОТАЕТ!
У кого есть Win7 х64 может проверить. Я проверю завтра на работе.
Вложения
Тип файла: zip WebCam.zip (36.1 Кб, 42 просмотров)
0
Эксперт по электронике
6995 / 3311 / 341
Регистрация: 28.10.2011
Сообщений: 12,996
Записей в блоге: 7
17.08.2012, 00:12
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
Какие поля?
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
Structure CAPSTATUS  ;Тут нас интересуют высота и ширина(первые две строчки)
  uiImageWidth.i 
  uiImageHeight.i 
  fLiveWindow.l 
  fOverlayWindow.l 
  fScale.l 
  ptScroll.Point 
  fUsingDefaultPalette.l 
  fAudioHardware.l 
  fCapFileExists.l 
  dwCurrentVideoFrame.l 
  dwCurrentVideoFramesDropped.l 
  dwCurrentWaveSamples.l 
  dwCurrentTimeElapsedMS.l 
  hPalCurrent.i 
  fCapturingNow.l 
  dwReturn.l 
  wNumVideoAllocated.i 
  wNumAudioAllocated.i 
EndStructure
 
Structure VIDEOHDR; в этой структуре первая строчка - кадр
  *lpData
  dwBufferLength.l
  dwBytesUsed.l
  dwTimeCaptured.l
  dwUser.l
  dwFlags.l
  dwReserved.l[3]
EndStructure
Добавлено через 2 минуты
Цитата Сообщение от Pro_grammer Посмотреть сообщение
И он только что пристал мне результат. ВСЁ РАБОТАЕТ!
Цитата Сообщение от Pro_grammer Посмотреть сообщение
lpData.l
Слабо верится.
Указатель в x64 имеет какой размер, 4 или 8 байт? Тип лонг какой имеет размер?

Вообще, вот структуры.
http://msdn.microsoft.com/en-u... s.85).aspx
http://msdn.microsoft.com/en-u... s.85).aspx
0
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
17.08.2012, 00:20  [ТС]
Всё както проще оказалось. Ошибка пропала когда я по полтинничку отнял от циклов. Значит была прибавка в 100 х 3 = 300 байт в размере кадра
PureBasic
1
2
3
4
5
6
7
8
StartDrawing(ImageOutput(ImgOld))
  For xn = widthImg - 50 To 0 Step - #STP
    For yn = 0 To heightImg - 50 Step #STP
      Plot(xn, yn, RGB (*VideoMemoryAdress1\r & $FF, *VideoMemoryAdress1\g & $FF, *VideoMemoryAdress1\b & $FF))
      *VideoMemoryAdress1 + 3 * #STP
    Next
  Next
  StopDrawing()
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
17.08.2012, 10:06
Цитата Сообщение от locm Посмотреть сообщение
Слабо верится.
Проверил. Действительно работает! Не веришь - сам проверь. Проверял на Win7 (x64) Ultimate, компилятор PureBasic 4.60 ( x64).
Как только размер структуры * на 4 сразу правильно отобразился размер изображения
PureBasic
1
2
widthImg  = *CapStat\uiImageWidth ;320
   heightImg = *CapStat\uiImageHeight;240
В этой строчке:
PureBasic
1
Plot(xn, yn, RGB (*VideoMemoryAdress1\r & $FF, *VideoMemoryAdress1\g & $FF, *VideoMemoryAdress1\b & $FF))
вообще ни когда ошибок не было, не в х64, не тем более в х86.

Почему работает точно не скажу, я не голимый теоретик, а практик
0
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
17.08.2012, 19:05  [ТС]
Не в компиляторе дело. Драйвер может кривоват.
0
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
19.08.2012, 18:48  [ТС]
В чём может быть причина такого поведения?Исходное изображение в виде углеродного волокна. Стильно, но неправильно.
Миниатюры
Обработка изображения с веб камеры на предмет движущихся объектов\изменившихся пикселей  
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
19.08.2012, 21:01
Цитата Сообщение от ЦарьКащей Посмотреть сообщение
Стильно, но неправильно.
У тебя х64 система? Там какой то косяк вот в этом месте
PureBasic
1
2
3
4
5
6
7
8
StartDrawing(ImageOutput(img1))
 
  For y = heightImg - 1 To 0 Step -1
    For x = 0 To widthImg - 1
      Plot(x, y, RGB(*VideoMemoryAdress1\r & $FF, *VideoMemoryAdress1\g & $FF, *VideoMemoryAdress1\b & $FF))
      *VideoMemoryAdress1 + 3
    Next
  Next
Не верно строится изображение в img1. Ты же говорил, что что то там менял, типа "Ошибка пропала когда я по полтинничку отнял от циклов" Как то в памяти х64 пиксели располагаются, не так как в х86.
0
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
20.08.2012, 17:57  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Не верно строится изображение в img1. Ты же говорил, что что то там менял, типа "Ошибка пропала когда я по полтинничку отнял от циклов" Как то в памяти х64 пиксели располагаются, не так как в х86.
Исправил считывание байт на это
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  Len = *lpVHdr\dwBufferLength
  *Old = ReAllocateMemory(*Old, Len)
 
  For n=1 To Len
    Color = PeekB(*lpVHdr\lpData+n)
    If PeekB(*lpVHdr\lpData+n) = PeekB(*Old+n)
      Debug Color = PeekB(*Old + n)
      PokeB(*lpVHdr\lpData+n, RGB(Red(0), Green(0),Blue(0) ))
    Else
      PokeB(*lpVHdr\lpData+n, RGB(Red(Color), Green(Color),Blue(Color) ))
    EndIf
  Next
  
  CopyMemory(*lpVHdr\lpData, *Old, Len )
Считывается. Но есть вопросы:
1) Отрицательное значение Color имеет право на существование?
2) Считывание из памяти по указателю *Old всегда возвращает нолики, а это значит туда ничего не записывается и ничего от туда не считывается, может по тому что указатель на область памяти не передаётся в структуру?
3) Как правильно организовать работу с памятью в данном случае?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.08.2012, 17:57

Анализ изображения с веб-камеры
Всем привет! Буду очень признателен, если вы подскажете мне на каком языке проще и/или удобнее сделать следующий алгоритм. Принимает...

Захват изображения с веб-камеры
Привет всем! Накипело, много статеек пересмотрел как это сделать, везде свои касяки, т.к. статейки-то страые. Ну в общем как захватить...

Захват изображения с веб камеры
Здравствуйте Я как начинающий программист, в начале своего обучения столкнулся с тем, что мне нужно сделать захват изображения с веб...

Захват видео изображения с веб-камеры
Возникли проблемы при создании массива в C#.В общем дело обстоит так: имеется захват видео изображения с веб-камеры,необходимо сделать,...

Обработка кадров с веб камеры
Здрасти, задался вот таким вот вопросом: Дано два пятна определённого цвета, произвольного диаметра, расположенных в одной плоскости по...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru