PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Webcam


Webcam

Сообщений 1 страница 12 из 12

1

Я нашёл шикарный код, вот он работает так с помощью тела можно перемещать мышку, давайте что нибудь придумаем все вместе на этой основе

Код:
#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 = 0 
  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

0

2

Arei написал(а):

Я нашёл шикарный код, вот он работает так с помощью тела можно перемещать мышку, давайте что нибудь придумаем все вместе на этой основе

Какие доп. библиотеки нужны для программы…? У меня не запускается, пишет не найдена библиотека avicap32.lib…

0

3

Вот файл http://pure-basic.narod.ru/miscfiles/lib/avicap32.lib
Его нужно либо поместить в одну папку с исходным текстом (для скомпилированой программы он не нужен) либо в PureBasic\PureLibraries\Windows\Libraries\

0

4

Пётр написал(а):

Вот файл http://pure-basic.narod.ru/miscfiles/lib/avicap32.lib

Спасибо, Петь!! Потестируем... :)

0

5

Чето я не догоняю, как это работает... Мышь колбасит и всё!???

0

6

надо его дополнить

0

7

вот давайте его сделаем вместе

0

8

Arei написал(а):

надо его дополнить

А через какие технические средства тело влияет на движение мыши? Веб камера или что-то еще???

0

9

я сейчас с телефона так что много не напишу ближе к вечеру опишу все

0

10

я тут спрашивайте.

0

11

На какой версии Пурика этот код работает? У меня на 5.62 не запускается
Хотелось бы переделать так, что бы при помощи лазерной указки управлять мышью

0

12

Закомментируйте константы на которые указывает компилятор и проверьте работу кода.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Webcam