I try to record a movie with 25 frames per second, i need write every frame at just moment or openCV do this automatic?
I use this code from cam_writeframe1 file, with a little modifications.
when play recorded movie is very fast, like buster keaton or charles chaplin in old film, quickly..
How can save a movie with real speed?
Thanks for help and greetings!
Code: Select all
IncludeFile "includes/cv_functions.pbi"
Global lpPrevWndFunc
#CV_WINDOW_NAME = "PureBasic Interface to OpenCV"
#CV_DESCRIPTION = "Video is saved to a folder." + Chr(10) + Chr(10) +
                  "Double-Click the window to open the folder where the video is saved."
ProcedureC WindowCallback(hWnd, Msg, wParam, lParam)
  Shared CaptureCV.b, exitCV.b
  Select Msg
    Case #WM_COMMAND
      Select wParam
        Case 1
          If CaptureCV
            SetMenuItemText(0, 1, "Capture")
            CaptureCV = #False
          Else
            SetMenuItemText(0, 1, "Pause")
            CaptureCV = #True
          EndIf
        Case 10
          exitCV = #True
      EndSelect
    Case #WM_DESTROY
      exitCV = #True
  EndSelect
  ProcedureReturn CallWindowProc_(lpPrevWndFunc, hWnd, Msg, wParam, lParam)
EndProcedure
ProcedureC CvMouseCallback(event, x, y, flags, *param.USER_INFO)
  Select event
    Case #CV_EVENT_RBUTTONDOWN
      DisplayPopupMenu(0, *param\uValue)
    Case #CV_EVENT_LBUTTONDBLCLK
      RunProgram("explorer", "..\Videos", "")
  EndSelect
EndProcedure
recfps=25 
defWidth=720
defHeight=576
deffps=25
Repeat
  nCreate + 1
  *capture = cvCreateCameraCapture(0)
Until nCreate = 5 Or *capture
If *capture
  cvNamedWindow(#CV_WINDOW_NAME, #CV_WINDOW_AUTOSIZE)
  window_handle = cvGetWindowHandle(#CV_WINDOW_NAME)
  *window_name = cvGetWindowName(window_handle)
  lpPrevWndFunc = SetWindowLongPtr_(window_handle, #GWL_WNDPROC, @WindowCallback())
  If CreatePopupImageMenu(0, #PB_Menu_ModernLook)
    MenuItem(1, "Pause")
    MenuBar()
    MenuItem(10, "Exit")
  EndIf
  hWnd = GetParent_(window_handle)
  opencv = LoadImage_(GetModuleHandle_(0), @"icons/opencv.ico", #IMAGE_ICON, 35, 32, #LR_LOADFROMFILE)
  SendMessage_(hWnd, #WM_SETICON, 0, opencv)
  wStyle = GetWindowLongPtr_(hWnd, #GWL_STYLE)
  SetWindowLongPtr_(hWnd, #GWL_STYLE, wStyle & ~(#WS_MAXIMIZEBOX | #WS_MINIMIZEBOX | #WS_SIZEBOX))
  cvMoveWindow(#CV_WINDOW_NAME, 20, 20)
  ToolTip(window_handle, #CV_DESCRIPTION)
  If FileSize("../Videos") <> -2 : CreateDirectory("../Videos") : EndIf
  sVideo.s = "../Videos/" + FormatDate("%mm-%dd-%yyyy %hh-%ii-%ss", Date()) + ".avi"
  
  ;set resolution and fps
  cvSetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_WIDTH, defWidth)
  cvSetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_HEIGHT, defHeight)
  cvSetCaptureProperty(*capture, #CV_CAP_PROP_FPS, deffps)
  
  ;Verify resolution and fps
  FrameWidth = cvGetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_WIDTH)
  FrameHeight = cvGetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_HEIGHT)
  Framefps = cvGetCaptureProperty(*capture, #CV_CAP_PROP_FPS)
  Debug FrameWidth
  Debug FrameHeight
  Debug Framefps
  
  *writer = cvCreateVideoWriter(sVideo, CV_FOURCC("D", "I", "V", "X"), recfps, FrameWidth, FrameHeight, #True)
  If Not *writer : cvCreateVideoWriter(sVideo, CV_FOURCC("M", "S", "V", "C"), recfps, FrameWidth, FrameHeight, #True) : MessageRequester("","MSVC Codec en uso"): EndIf
  If *writer
    CaptureCV.b = #True
    *image.IplImage
    *param.USER_INFO = AllocateMemory(SizeOf(USER_INFO))
    *param\uValue = window_handle
    cvSetMouseCallback(*window_name, @CvMouseCallback(), *param)
    Repeat
      *image = cvQueryFrame(*capture)
      If *image
        cvFlip(*image, #Null, 1)
        If CaptureCV : cvWriteFrame(*writer, *image) : EndIf
        cvShowImage(#CV_WINDOW_NAME, *image)
        keyPressed = cvWaitKey(100)
      EndIf
    Until keyPressed = 27 Or exitCV
    FreeMemory(*param)
    cvReleaseVideoWriter(@*writer)
  EndIf
  cvDestroyWindow(#CV_WINDOW_NAME)
  cvReleaseCapture(@*capture)
Else
  MessageBox_(0, "No hay cámara.", #CV_WINDOW_NAME, #MB_ICONERROR)
EndIf
