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

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

14.08.2012, 21:13. Показов 19882. Ответов 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.09.2012, 22:28  [ТС]
Студворк — интернет-сервис помощи студентам
И снова улучшил процедуру. В этот раз изображение развёрнуто на всю ширину и высоту. Жопой чую верно иду.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
Procedure FrameCallback(lwnd.l, *lpVHdr.VIDEOHDR)
  ;190 * 270 = 51300  
  StartDrawing(ImageOutput(ImgOld))
  *Dbuf = DrawingBuffer()
  StopDrawing()
  For x=0 To widthImg - 1
    For y=0 To heightImg - 1
      Color = PeekB(*lpVHdr\lpData + (y * widthImg) + x)
      PokeB(*Dbuf + (y * widthImg * 3) + x * 3, Color)
    Next
  Next
  SetGadgetState(1, ImageID(ImgOld))
EndProcedure
Результат:
Миниатюры
Обработка изображения с веб камеры на предмет движущихся объектов\изменившихся пикселей  
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
17.09.2012, 12:27
ЦарьКащей, извини конечно, но я не вижу связи тех объяснений "работы с памятью"
с нейросетями. Да и сама теория нейросетей не из лёгких, я помню давно ещё, когда в ВУЗе
учился, сколько не пытался, не осилил её, там буквально гора дискретки.
Шумы отделяются частотными фильтрами, всё как в аудио обработке, ничего нового не
изобрели и не изобретут. Нейросети юзаются для экспертных систем и распознавания
полезной информации, а не для устранения шума.

Добавлено через 5 часов 41 минуту
Это уже не важно
А вы не думали что изображение может быть 16 битным? Про форматы я пытался вам донести
ещё в этом посте.
И соотв. 190*270*3 ~ 320*240*2. Очевидно же, что кроме как у вас прога больше
ни у кого не заработает если формат будет различаться, т.к. будет задан изначально, а не
получен ф-циями библиотеки.

В общем случае 16 битных формата всего 2:
  • По 5 бит на R, G, B
  • По 5 бит на R, B и 6 бит на G

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
Procedure FrameCallback(lwnd.l, *lpVHdr.VIDEOHDR)
  StartDrawing(ImageOutput(ImgOld))
  *Dbuf = DrawingBuffer()
  StopDrawing()
   ;  Это берём из библиотеки
  BytePerPixel = 2          ; 16 бит
  widthImg = 320
  heightImg = 240
    BuffWidth = heightImg * BytePerPixel   ; Размер одной строки пикселей в нашем Image
  Adr.l = *lpVHdr\lpData
  A = 255
  For y = 0 To heightImg - 1
    For x = 0 To widthImg - 1
      Color = PeekW(Adr): Adr + 2
        ;__ Вариант 1
        R = Color & 31
        G = (Color >> 5) & 31
        B = Color >> 11
        ;__ Вариант 2
        ;R = Color & 31
        ;G = (Color >> 5) & 63
        ;B = Color >> 11
        ;__ Вариант 3
        ;R = Color & 31
        ;G = (Color >> 6) & 31
        ;B = Color >> 11
        ;__ Вариант 4
        ;R = Color & 31
        ;G = (Color >> 5) & 31
        ;B = (Color >> 10) & 31
      Cv.l = B + G << 8 + R << 16 + A << 24
      PixAdr = x * BytePerPixel + ((heightImg - 1) - y) * BuffWidth
      PokeL(*Dbuf + PixAdr,  Cv)
    Next
  Next
  SetGadgetState(1, ImageID(ImgOld))
EndProcedure
Если будет показывать, но будет R компонента вместо B компоненты и/или картинка
перевёрнутая с ног на голову, то значит и есть 16 битный формат, нужно только подобрать
соотв. вариант. Возможные варианты в коде, откомментируем строчки и смотрим.
1
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
17.09.2012, 19:12  [ТС]
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
ЦарьКащей, извини конечно, но я не вижу связи тех объяснений "работы с памятью"
Не суть. Просто получились выводы, которые увеличили во мне количество опыта на основе тех знаний что я получил.
Шумы - когда доделаю, обязательно где нибудь приложу. На словах будет трудно объяснить как оно работает. Хотя попытаюсь. Самая суть - объединение нескольких пикселей в один - шум таким образом станет явлением менее значительным если он не на много разнится в диапазоне с соседними пикселями.

PureBasic
1
2
Да и сама теория нейросетей не из лёгких, я помню давно ещё, когда в ВУЗе
учился, сколько не пытался, не осилил её, там буквально гора дискретки.
А теперь прикинь что тебя студента обучали выводам матёрых математиков, которые не одну собаку и не за один год съели на этой теме. ясное дело неподготовленному мозгу не осилить как бы он ни старался.

Из прочитанного в интрнете - простая нейросеть действует следующим образом:
При обучении - Берёт данные или диапазон данных(кусок массива) из первого массива по координатам, назовём это так, затем складывает это в кучу - например вычисляя среднее арифметическое того что было взято. Затем во втором массиве по относительно тем же координатам увеличивает значение на некоторую величину(это есть скорость запоминания).
При распознавании - сравнивает каждый взятый и сложенный в кучу кусок из первого массива со значением во втором массиве и так все данные.
Вычисляет общее сходство всех сравненных данных и выдаёт на сколько(например процентов) подставленный(первый) массив похож на то что находится во втором массиве после обучения - и который массив будет наиболее похож, тот значит и будет выдан результатом распознавания.

Теперь по терминам:
Первый массив это "входы"
Второй это "Слой нейронов" ну или просто память
"Вес сигнала" или просто "Вес" это например процентное сходство или ещё что.
"Выход" - это результат того же сравнения, по каждому элементу массива или по всем сразу.

Такое освоит даже школьник если ему понятно объяснить.
Дискретная математика это раздутая наука, с её помощью можно выгодно определить поведение нейросети в целом, но так как высшая математика - дано далеко не каждому.

Я могу и ошибаться, но это всё что я понял из "понятного", где пишут на простом русском языке для олухов вроде меня.

По этому складывая сразу гору пикселей, я какбы перемешиваю все краски и размазываю шум по пикселю, где он будет смотреться не так ярко.

Щаз на этой основе я загорелся проектиком в виде dll работающей с указателями на память и чтобы не парится со считыванием данных из памяти как одной строки в многомерный массив, придумал значит для себя методы позволяющие обрабаывать ето дело "одной строкой" используя парочку твикс "Х" и "У".
Фууухх. прям душу излил.

Тперь о:
А вы не думали что изображение может быть 16 битным? Про форматы я пытался вам донести
ещё в этом посте.
Думал. Но почитав про форматы пришёл к выводу что ето скорее всего полноцветка 24 битная. Я же профан, только неделю на пурике упражнялся на тот момент когда был выложен пост.

Добавлено через 6 минут
Если будет показывать, но будет R компонента вместо B компоненты и/или картинка
перевёрнутая с ног на голову, то значит и есть 16 битный формат, нужно только подобрать
соотв. вариант. Возможные варианты в коде, откомментируем строчки и смотрим.
Третий вариант уже ничо, три копии картинки, в правильном положении и полностью, но наложенные друг на друга и белыми контрастными цветами. Думаю полезного всёж можно почерпнуть.
0
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
17.09.2012, 19:13  [ТС]
Вот ________________________________________ _
Миниатюры
Обработка изображения с веб камеры на предмет движущихся объектов\изменившихся пикселей  
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
18.09.2012, 03:40
Я могу и ошибаться, но это всё что я понял из "понятного"
Если бы всё было так просто, то дискретка была бы бесполезна.

Третий вариант уже ничо, три копии картинки, в правильном положении и полностью, но наложенные друг на друга и белыми контрастными цветами.
Накосячил я, в 6 строчке правильно будет BytePerPixel = 4
т.к. это выходной формат, входной плюсуется непосредственно.
Исправьте и снова проверьте все варианты.
1
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
18.09.2012, 18:49  [ТС]
Если бы всё было так просто, то дискретка была бы бесполезна.
глянь длинный код по ссылкеhttp://purebasic.info/phpBB2/viewtopic.php?p=19025 на что похоже?
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
18.09.2012, 19:46
Самая суть - объединение нескольких пикселей в один
А каким боком соседние пиксели к шуму относятся, у них свои шумы.

Если хотите серьёзно этим заняться то вот литература:
http://dsp-book.narod.ru/books.html
0
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
18.09.2012, 20:00  [ТС]
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
Если хотите серьёзно этим заняться то вот литература:
http://dsp-book.narod.ru/books.html
Не, ну я конечно всё понимаю, но же не академик такое читать. В конце концов можно одно и тоже реализовать разными способами - можно по простому, а можно как ты предлагаеш начинать с изучения высшей математики. А если результаты похожи, зачем изучать больше?
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
18.09.2012, 20:21
В конце концов можно одно и тоже реализовать разными способами.
Так нам говорил препод по диф. урам, умнейший был мужик.
Можно конечно. Можно нормали искать методом аппроксимаций, а можно 1-й формулой.
Математика всегда сильнее подхода в лоб, просто подход в лоб иногда не критичен.
Решать, конечно программисту.
0
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
18.09.2012, 20:22  [ТС]
А каким боком соседние пиксели к шуму относятся, у них свои шумы.
Странный вопрос. думал всё вполне логично. Допустим шум у нас имеет значение 4, в то время как самый яркий цвет на картинке равен 3-м а остальные одному и двум. складываем 1 + 2 + 3 + 4 = 10 / 4 = 2,5-------2,5 ближе к 3 чем 4, следовательно и более похож на рядом лежащие пиксели чем шум. Но это один пиксель.
Шум в моём понимании может быть 2-х видов - пиксель сильно отличающийся от окружающих пикселей, который может иметь произвольное значение и пиксель немного разнящийся своим значением с соседними. Единственный признак того что ето шум, то, что значение пикселя которое должно быть постоянным непрерывно изменяется. Этим макаром можно сильную разницу разделить между постоянными значениями соседних пикселей, после чего она станет незначительной.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
18.09.2012, 20:51
Этим макаром можно сильную разницу разделить между постоянными значениями соседних пикселей, после чего она станет незначительной.
Это обычный blur фильтр, который делается матрицей весовых коэф-ов.
Для соседних пикселей можно 1-й формулой. Я расскажу, почему этот фильтр портит всё
исходное изображение.
Дело в том, что всё видимое пространство вашей Web-камеры - непрерывное, при переводе в
цифру оно дробится и полезная информация сохраняется в каждом пикселе. Однако у каждого
пикселя есть погрешность, которая и порождает этот шум. Blur тут к сожалению не панацея.
На ровных тонах он идеален(т.к. ликвидирует высокочастотные шумы), но чёткие текстуристые
изображения он убивает вмясо. В аудио эта проблема лечится качественными шумоподавителями
и конечно аппаратурой в первую очередь, в видео тоже самое. Попробуйте зафиксировать
вашу веб камеру, снять 10 кадров и смиксовать эти кадры(сложить кадры по компонентам, а
потом поделить каждую компоненту на 10), получите хороший чёткий кадр почти без шумов.
На вопрос почему, полагаю, найдёте ответ сами.

P.S: Я хотел сказать, что даже для анализа - стоит его применять только с конкретной целью,
например, выделить высокочастотную часть изображения, т.к. полезную информацию он
нещадно порежет.
0
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
18.09.2012, 21:15  [ТС]
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
Это обычный blur фильтр, который делается матрицей весовых коэф-ов..
От ненадо. Я сам себе придумал фильтр на основе полученнх знаний и это достижение а не изобретение велосипеда заново.

Попробуйте зафиксировать
вашу веб камеру, снять 10 кадров и смиксовать эти кадры(сложить кадры по компонентам, а
потом поделить каждую компоненту на 10), получите хороший чёткий кадр почти без шумов.
На вопрос почему, полагаю, найдёте ответ сами.
Подавлять шум десятью кадрами при скорости около 15 кадров в секунду както расточительно.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
18.09.2012, 21:33
Подавлять шум десятью кадрами при скорости около 15 кадров в секунду както расточительно.
Я и не говорил, чтобы вы так делали, хотел лишь объяснить суть того, что есть полезная
информация. Вы можете, например, использовать стек кадров и производить нелинейную
интерполяцию, не на 10 кадрах конечно же))).

Я сам себе придумал фильтр на основе полученнх знаний и это достижение а не изобретение велосипеда заново.
Ммм, авторский алгоритм, звучит аппетитно, подождём реализации.
Может вы реально гений, кто знает. К слову, разработка, которая бы эффективно
устраняла шумы стоила бы немалых денег. В аудио для бюджетного сегмента, это
очень актуально, я много прог крутил, единицы делают это более менее сносно.
В видео, впрочем, это не так актуально люди предпочитают решать вопрос оборудованием.
0
Ты за кого меня держиш!?
 Аватар для ЦарьКащей
22 / 23 / 7
Регистрация: 26.10.2011
Сообщений: 308
Записей в блоге: 1
18.09.2012, 22:05  [ТС]
Вы можете, например, использовать стек кадров и производить нелинейную
интерполяцию, не на 10 кадрах конечно же))).
Пардон. Об этом я както не подумал.

Ммм, авторский алгоритм, звучит аппетитно, подождём реализации.
Может вы реально гений, кто знает.
Звучит как потворство. Я достаточно хорошо знаю свои возможности и не думаю что сделаю нечто прогрессивное.
0
1 / 1 / 0
Регистрация: 22.11.2017
Сообщений: 9
12.04.2024, 23:27
Я в шоке. Работает! Спасибо! Win10 x64 PB5.7 Webcam простейшая.

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
;#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     = 704
Global height    = 576
 
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
  #video
EndEnumeration
 
 
 
;------------------------------------------------------------------------------------------------------------
 
 
 Procedure FrameCallback(lwnd.l, *lpVHdr.VIDEOHDR)
  ;190 * 270 = 51300  
  StartDrawing(ImageOutput(ImgOld))
  *Dbuf = DrawingBuffer()
  StopDrawing()
  For x=0 To widthImg - 1
    For y=0 To heightImg - 1
      Color = PeekB(*lpVHdr\lpData + (y * widthImg) + x)
      PokeB(*Dbuf + (y * widthImg * 3) + x * 3, Color)
    Next
  Next
  SetGadgetState(#video, ImageID(ImgOld))
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("Settings")
    MenuItem(#Menu_Device, "RECONECT")
EndIf
 
 CreateImage(ImgOld,width,height)
 ImageGadget(#video,0,0,width, height, ImageID(imgold))
;------------------------------------------------------------------------------------------------------------
 
 
 
 
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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.04.2024, 23:27

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
95
Ответ Создать тему
Новые блоги и статьи
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru