It is currently Mon Dec 11, 2017 5:13 am

All times are UTC + 1 hour




Post new topic Reply to topic  [ 778 posts ]  Go to page Previous  1 ... 48, 49, 50, 51, 52
Author Message
 Post subject: Re: PureBasic Interface to OpenCV
PostPosted: Wed Oct 04, 2017 11:02 am 
Offline
Addict
Addict
User avatar

Joined: Sat Feb 19, 2005 2:46 pm
Posts: 1684
Location: Pas-de-Calais, France
Ok, thank you both !

_________________
Prehistoric games - Bobble Puzzle, Purebreaker 3 ~> http://djes.free.fr


Top
 Profile  
Reply with quote  
 Post subject: Re: PureBasic Interface to OpenCV
PostPosted: Sun Oct 15, 2017 5:33 pm 
Offline
Enthusiast
Enthusiast

Joined: Fri Apr 20, 2012 8:09 pm
Posts: 248
I used OpenCV32 to add text as an image to a jpg image and that worked well, ( it was fun ).
So I figured I would create a sample adding a different font as a PB image. When I did it with a jpeg it was just adding transparent text and the text was white so no big deal. For my sample I added color to the text and that didn't look good so I figured I have to create a mask, inverse the mask, merge the mask with ROI then add image to result but no joy.

This sample code reads the first 60 frames of ball.mp4 which is located in the /binaries/video
writes outtext.avi to /Videos
here is my test code in case someone wants to give it a go. ( it has a lot of comments of things I have tried )
Code:
;OpenCV32
UseJPEGImageDecoder()
UseJPEGImageEncoder()

IncludeFile "includes/cv_functions.pbi"
EnableExplicit
Global PBfont=LoadFont(#PB_Any ,"Arial",18,#PB_Font_HighQuality|#PB_Font_Bold )
Global *writer , *capture.CvCapture,*decode.IplImage,*image.IplImage,*convert.iplImage
Global video_W=360,Video_H=288,FPS=30
Define nCreate,cnt,movex,FrameCount.d

Procedure PBPutText(text.s="add image demo")
  Protected img,w,h,*buffer,*mat.CvMat
 
  img= CreateImage(#PB_Any, 100, 30,32)
  If img And StartDrawing(ImageOutput(img))
    DrawingFont(FontID(PBfont)) 
    DrawingMode( #PB_2DDrawing_Transparent  )
    DrawText(5, 4, text,$00410000)
    DrawText(1,1, text,$000C7CC5)
    StopDrawing()
  EndIf
  If IsImage(img)   
    *buffer = EncodeImage(img, #PB_ImagePlugin_JPEG)
    *mat = cvCreateMatHeader(ImageWidth(img), ImageHeight(img), CV_MAKETYPE(#CV_8U, 3))
      cvSetData(*mat, *buffer, #CV_AUTOSTEP)   
      *decode = cvDecodeImage(*mat,#CV_LOAD_IMAGE_COLOR); #CV_LOAD_IMAGE_COLOR)
     FreeImage(img)
  EndIf
 
EndProcedure

PBPutText("JHPJHP")

*writer = cvCreateVideoWriter("/videos/outtext.avi", CV_FOURCC("D", "I", "V", "X"), FPS,video_W,video_H, #True); 360,300,#True);960,720, #True)
Repeat
  nCreate + 1
  *capture = cvCreateFileCapture("binaries/videos/ball.mp4")
Until nCreate = 5 Or *capture
FrameCount = cvGetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_COUNT)
movex=1

Repeat
  *image = cvQueryFrame(*capture)
  If *image
   
    cvSetImageROI(*image,movex,10,100,20) ; Location of moving text
    Define        *iroi.IplImage = cvCreateImage(100, 20, *image\depth, *image\nChannels) ;section of image to transform
    cvcopy(*image, *iroi,#Null)
    *convert = cvCreateImage(100, 20, *decode\depth, *decode\nChannels) ; in case the image I create is a different size
    cvResize(*decode, *convert, #CV_INTER_AREA)
    ;cvcvtcolor(*decode,*convert,#CV_RGBA2BGR,1)  ;I wish It was as simple as changing color
   
    Define        *tgray.IplImage = cvCreateImage(100, 20, #IPL_DEPTH_8U, 1)  ; create temp gray image
    cvCvtColor(*convert, *tgray, #CV_BGR2GRAY,1) ; get our letters turn them gray 1 channel
    Define    *gray.IplImage = cvCreateImage(100, 20, #IPL_DEPTH_8U, 3)  ; go back to 3 channels

    cvThreshold(*tgray, *tgray, 50, 255, #CV_THRESH_BINARY )   ; mask
    cvCvtColor(*tgray, *gray, #CV_GRAY2BGR,1) ; back to 3 channel
   
    Define    *notgray.IplImage = cvCreateImage(100, 20, #IPL_DEPTH_8U, 3) ; I want to not the LETTERS so that iroi displays fine
    cvnot(*gray,*notgray)
    ;cvand(*iroi,*notgray,*iroi, #Null)  ;  and notgray to create mask
    ;cvand(*convert,*iroi,*convert,#Null)  add mask to original LETTERS
    cvAdd(*image,*convert,*image,#Null)

    cvResetImageROI(*image)
   
    cvWriteFrame(*writer, *image)
    Debug cnt
  Else
    Break
  EndIf
  cnt+1
  movex +5
  If movex > 250 : movex=250:EndIf
  Until cnt> 60
;Until cnt>FrameCount

cvReleaseVideoWriter(@*writer)

[edit] My keyboard is acting up. I cannot even do a copy and paste :shock:
deleted double paste Oct 16,2017. thank you @AAT
Norm.

_________________
google Translate;Makes my jokes fall flat- Fait mes blagues tombent à plat- Machte meine Witze verpuffen- Eh cumpari ci vo sunari


Last edited by normeus on Mon Oct 16, 2017 4:09 pm, edited 1 time in total.

Top
 Profile  
Reply with quote  
 Post subject: Re: PureBasic Interface to OpenCV
PostPosted: Sat Oct 21, 2017 12:48 am 
Offline
Addict
Addict
User avatar

Joined: Sat Oct 09, 2010 3:47 am
Posts: 1368
Hi normeus,

Sorry, I am not sure I correctly understood your goal, was it to add text to a video using any font?

The simple solution is to use the Function cvPutText to directly write to each video frame; see cv_video_writeframe.pb.

This can be combined with the logic provided by AAT in the example cv_pb_font.pb, where PureBasic is combined with OpenCV to draw text onto an image.

NB*: I really like your example demonstrating the "Ken Burnes effect", and when time permits will include it into the OpenCV packages.

_________________
ImageMy PureBasic Stuff


Top
 Profile  
Reply with quote  
 Post subject: Re: PureBasic Interface to OpenCV
PostPosted: Sat Oct 21, 2017 3:18 am 
Offline
Enthusiast
Enthusiast

Joined: Fri Apr 20, 2012 8:09 pm
Posts: 248
JHPJHP,

actually my trouble began with me wanting to use white text on an image. Like you can with cvputText().
I was not able to do it.

I should have known that you had a working example of what I was trying to do.
My original code was in C++ with another library so I decided it would be easier to do it in PureBasic using an image.

I will try to at least read the names of the examples. Examples are there for a reason!!!

@AAT, Sorry about the confusion, about the example you had already created.



Thank you.
Norm.

_________________
google Translate;Makes my jokes fall flat- Fait mes blagues tombent à plat- Machte meine Witze verpuffen- Eh cumpari ci vo sunari


Top
 Profile  
Reply with quote  
 Post subject: Re: PureBasic Interface to OpenCV
PostPosted: Sat Oct 21, 2017 2:56 pm 
Offline
Enthusiast
Enthusiast

Joined: Sun Jun 15, 2008 3:13 am
Posts: 220
Location: Russia
normeus wrote:
I will try to at least read the names of the examples. Examples are there for a reason!!!

Sometimes I think it would be useful to make a guide to the examples.
Sometimes I think that reading a few lines of "#CV_DESCRIPTION =..." in the example is not very difficult, it's even possible to write a script that will make a general description for all examples from this lines.
Sometimes...


Top
 Profile  
Reply with quote  
 Post subject: Re: PureBasic Interface to OpenCV
PostPosted: Sat Oct 21, 2017 4:02 pm 
Offline
Enthusiast
Enthusiast

Joined: Fri Apr 20, 2012 8:09 pm
Posts: 248
So the problem was that I wanted to use white text with a black shadow just like cvputText().
On the library I was using I had to turn to gray, mask the inverse, etc... So I came to PB with that mindset.

On the cv_pb_font.pb example, I fixed the colors to black and white and created a second image.
Had to use "DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_Gradient)" to create text.
Then cvSub shadow then cvAdd white font.
Still kicking myself for not looking at the examples
[edit] Adding blur as recommended by AAT in the comment below. It looks a lot better
Code:
IncludeFile "includes/cv_functions.pbi"

Global openCV, *save.IplImage, exitCV, lpPrevWndFunc

#CV_WINDOW_NAME = "PureBasic Interface to OpenCV"
#CV_DESCRIPTION = "Draw text using PureBasic commands with any font onto an OpenCV generated image." + #LF$ + #LF$ +
                  "SPACEBAR    " + #TAB$ + ": Change to another font."

Procedure WindowCallback(hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_COMMAND
      Select wParam
        Case 1
          openCV = #True
          keybd_event_(#VK_ESCAPE, 0, 0, 0)
        Case 2
          FileName.s = SaveCVImage()

          If FileName
            params.CvSaveData

            Select LCase(GetExtensionPart(FileName))
              Case "bmp", "dib"
              Case "jpeg", "jpg", "jpe"
                params\paramId = #CV_IMWRITE_JPEG_QUALITY
                params\paramValue = 95
              Case "jp2"
              Case "png"
                params\paramId = #CV_IMWRITE_PNG_COMPRESSION
                params\paramValue = 3
              Case "ppm", "pgm", "pbm"
                params\paramId = #CV_IMWRITE_PXM_BINARY
                params\paramValue = 1
              Case "sr", "ras"
              Case "tiff", "tif"
              Default
                Select SelectedFilePattern()
                  Case 0
                    FileName + ".bmp"
                  Case 1
                    FileName + ".jpg"
                    params\paramId = #CV_IMWRITE_JPEG_QUALITY
                    params\paramValue = 95
                  Case 2
                    FileName + ".jp2"
                  Case 3
                    FileName + ".png"
                    params\paramId = #CV_IMWRITE_PNG_COMPRESSION
                    params\paramValue = 3
                  Case 4
                    FileName + ".ppm"
                    params\paramId = #CV_IMWRITE_PXM_BINARY
                    params\paramValue = 1
                  Case 5
                    FileName + ".sr"
                  Case 6
                    FileName + ".tiff"
                EndSelect
            EndSelect
            cvSaveImage(FileName, *save, @params)
          EndIf
        Case 10
          keybd_event_(#VK_ESCAPE, 0, 0, 0)
      EndSelect
    Case #WM_DESTROY
      exitCV = #True
  EndSelect
  ProcedureReturn CallWindowProc_(lpPrevWndFunc, hWnd, uMsg, wParam, lParam)
EndProcedure

Procedure CvMouseCallback(event, x.l, y.l, flags, *param.CvUserData)
  Select event
    Case #CV_EVENT_RBUTTONDOWN
      *save = *param\Pointer1
      DisplayPopupMenu(0, *param\Value)
  EndSelect
EndProcedure

Procedure OpenCV(ImageFile.s)
  If FileSize(ImageFile) > 0
    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, "Open")
      MenuBar()
      MenuItem(2, "Save")
      MenuBar()
      MenuItem(10, "Exit")
    EndIf
    hWnd = GetParent_(window_handle)
    iconCV = LoadImage_(GetModuleHandle_(0), @"icons/opencv.ico", #IMAGE_ICON, 35, 32, #LR_LOADFROMFILE)
    SendMessage_(hWnd, #WM_SETICON, 0, iconCV)
    wStyle = GetWindowLongPtr_(hWnd, #GWL_STYLE)
    SetWindowLongPtr_(hWnd, #GWL_STYLE, wStyle & ~(#WS_MAXIMIZEBOX | #WS_MINIMIZEBOX | #WS_SIZEBOX))
    *image.IplImage = cvLoadImage(ImageFile, #CV_LOAD_IMAGE_ANYDEPTH | #CV_LOAD_IMAGE_ANYCOLOR)
    dtWidth = DesktopWidth(0) : dtHeight = DesktopHeight(0)

    If *image\width >= dtWidth - 100 Or *image\height >= dtHeight - 100
      iWidth = dtWidth - 100
      iRatio1.d = iWidth / *image\width
      iHeight = dtHeight - 100
      iRatio2.d = iHeight / *image\height

      If iRatio1 < iRatio2
        iWidth = *image\width * iRatio1
        iHeight = *image\height * iRatio1
      Else
        iWidth = *image\width * iRatio2
        iHeight = *image\height * iRatio2
      EndIf
      cvResizeWindow(#CV_WINDOW_NAME, iWidth, iHeight)
      *resize.IplImage = cvCreateImage(iWidth, iHeight, #IPL_DEPTH_8U, *image\nChannels)
      cvResize(*image, *resize, #CV_INTER_AREA)
    Else
      cvResizeWindow(#CV_WINDOW_NAME, *image\width, *image\height)
      *resize.IplImage = cvCloneImage(*image)
    EndIf
    cvMoveWindow(#CV_WINDOW_NAME, 20, 20)
    ToolTip(window_handle, #CV_DESCRIPTION)

    If *resize\width >= 640 And *resize\height >= 480 And *resize\nChannels = 3
      *reset.IplImage = cvCloneImage(*resize)
      *mask.IplImage = cvCreateImage(*resize\width, 80, #IPL_DEPTH_8U, *resize\nChannels)
      *maskShadow.IplImage = cvCloneImage(*mask)
      pbImage = CreateImage(#PB_Any, *mask\width, 80, 24, RGB(0, 0, 0))
      pbImageShadow = CreateImage(#PB_Any, *mask\width, 80, 24, RGB(0, 0, 0))
      fontName.s = "Comic Sans MS"
      nFont = LoadFont(#PB_Any, fontName, 36, #PB_Font_HighQuality)

      If *resize\width = 640 : fontX = 20 : Else : fontX = (*resize\width - 640) / 2 + 20 : EndIf : fontY = 5

      font.CvFont : cvInitFont(@font, #CV_FONT_HERSHEY_COMPLEX | #CV_FONT_ITALIC, 1, 1, #Null, 1, #CV_AA)
      *param.CvUserData = AllocateMemory(SizeOf(CvUserData))
      *param\Pointer1 = *resize
      *param\Value = window_handle
      cvSetMouseCallback(*window_name, @CvMouseCallback(), *param)

      Repeat
        If *resize
          cvSetZero(*mask)
          cvSetZero(*maskShadow)
          If StartDrawing(ImageOutput(pbImage))
            DrawingFont(FontID(nFont))
           DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_Gradient   )
            DrawText(fontX, fontY, "Use any font with OpenCV!", $00000000)
            *mask\imageData = DrawingBuffer()
            StopDrawing()
          EndIf
          If StartDrawing(ImageOutput(pbImageShadow))
            DrawingFont(FontID(nFont))
            DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_Gradient   )
            DrawText(fontX+5, fontY+5, "Use any font with OpenCV!", $FFFFFFFF) ; +5 to see the effect
            *maskShadow\imageData = DrawingBuffer()
            StopDrawing()
          cvSmooth(*maskShadow, *maskShadow, #CV_GAUSSIAN, 13, 13, 0, 0) ; <----- blurring the shadow
          EndIf         
          cvFlip(*mask, #Null, 0)
          cvFlip(*maskShadow, #Null, 0)
          cvSetImageROI(*resize, 0, *resize\height - 100, *resize\width, 80)
          ;cvAddS(*resize, 70, 70, 70, 0, *resize, 0)
          cvSub(*resize, *maskShadow, *resize, 0)
          cvAdd(*resize, *mask, *resize, 0)
          cvResetImageROI(*resize)
          cvPutText(*resize, fontName, 7, 30, @font, 0, 0, 0, 0)
          cvPutText(*resize, fontName, 5, 28, @font, 255, 255, 255, 0)
          cvShowImage(#CV_WINDOW_NAME, *resize)
          keyPressed = cvWaitKey(0)

          If keyPressed = 32
            newfont = (newfont + 1) % 10
            FreeFont(nFont)

            Select newfont
              Case 0
                fontName = "Comic Sans MS"
                fontY = 5
                nFont = LoadFont(#PB_Any, "Comic Sans MS", 36, #PB_Font_HighQuality)
              Case 1
                fontName = "Arial"
                fontY = 12
                nFont = LoadFont(#PB_Any, "Arial", 37, #PB_Font_HighQuality)
              Case 2
                fontName = "Impact"
                fontY = 8
                nFont = LoadFont(#PB_Any, "Impact", 42, #PB_Font_HighQuality)
              Case 3
                fontName = "Times New Roman"
                fontY = 10
                nFont = LoadFont(#PB_Any, "Times New Roman", 40, #PB_Font_HighQuality)
              Case 4
                fontName = "Verdana"
                fontY = 14
                nFont = LoadFont(#PB_Any, "Verdana", 33, #PB_Font_HighQuality)
              Case 5
                fontName = "Courier New"
                fontY = 22
                nFont = LoadFont(#PB_Any, "Courier New", 30, #PB_Font_HighQuality)
              Case 6
                fontName = "Tahoma"
                fontY = 8
                nFont = LoadFont(#PB_Any, "Tahoma", 38, #PB_Font_HighQuality)
              Case 7
                fontName = "Modern"
                fontY = 8
                nFont = LoadFont(#PB_Any, "Modern", 44, #PB_Font_Bold | #PB_Font_HighQuality)
              Case 8
                fontName = "Georgia"
                fontY = 14
                nFont = LoadFont(#PB_Any, "Georgia", 37, #PB_Font_HighQuality)
              Case 9
                fontName = "Garamond"
                fontY = 12
                nFont = LoadFont(#PB_Any, "Garamond", 37, #PB_Font_HighQuality)
            EndSelect
          EndIf
          cvReleaseImage(@*resize)
          *resize = cvCloneImage(*reset)
        EndIf
      Until keyPressed = 27 Or exitCV
      FreeMemory(*param)
      FreeFont(nFont)
      FreeImage(pbImage)
      cvReleaseImage(@*mask)
      cvReleaseImage(@*reset)
      cvReleaseImage(@*resize)
      cvReleaseImage(@*image)
      cvDestroyAllWindows()

      If openCV
        openCV = #False
        exitCV = #False
        OpenCV(OpenCVImage())
      EndIf
    Else
      If *resize\nChannels = 3
        MessageRequester(#CV_WINDOW_NAME, ImageFile + #LF$ + #LF$ + "... does not meet the size requirements, please try another image.", #MB_ICONERROR)
      Else
        MessageRequester(#CV_WINDOW_NAME, ImageFile + #LF$ + #LF$ + "... does not meet the channel requirements, please try another image.", #MB_ICONERROR)
      EndIf
      cvReleaseImage(@*resize)
      cvReleaseImage(@*image)
      cvDestroyAllWindows()
      exitCV = #False
      OpenCV(OpenCVImage())
    EndIf
  EndIf
EndProcedure

ExamineDesktops()
OpenCV("images/colors.jpg")


Norm.

_________________
google Translate;Makes my jokes fall flat- Fait mes blagues tombent à plat- Machte meine Witze verpuffen- Eh cumpari ci vo sunari


Last edited by normeus on Sun Oct 22, 2017 9:50 pm, edited 1 time in total.

Top
 Profile  
Reply with quote  
 Post subject: Re: PureBasic Interface to OpenCV
PostPosted: Sun Oct 22, 2017 9:18 am 
Offline
Enthusiast
Enthusiast

Joined: Sun Jun 15, 2008 3:13 am
Posts: 220
Location: Russia
Hi, normeus

Try to blur the shadow, it will see more realistic. Forexample
Code:
...
          If StartDrawing(ImageOutput(pbImageShadow))
            DrawingFont(FontID(nFont))
            DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_Gradient   )
            DrawText(fontX+5, fontY+5, "Use any font with OpenCV!", $FFFFFFFF)
            *maskShadow\imageData = DrawingBuffer()
            StopDrawing()
            cvSmooth(*maskShadow, *maskShadow, #CV_GAUSSIAN, 13, 13, 0, 0) ; <----- blurring the shadow
          EndIf
...


Top
 Profile  
Reply with quote  
 Post subject: Re: PureBasic Interface to OpenCV
PostPosted: Thu Nov 09, 2017 1:59 pm 
Offline
Enthusiast
Enthusiast
User avatar

Joined: Fri Oct 06, 2006 3:57 pm
Posts: 456
Location: England
Hi,

Been mucking about with this excellent library recently and have been using it to view a RTSP feed.

The ip camera i'm using has an output of 1920*1080, but is there a way to scale resize the output on the screen to a smaller image - quality isn't important.

Any advice appreciated.

Cheers


Top
 Profile  
Reply with quote  
 Post subject: Re: PureBasic Interface to OpenCV
PostPosted: Thu Nov 09, 2017 3:49 pm 
Offline
Enthusiast
Enthusiast
User avatar

Joined: Fri Oct 06, 2006 3:57 pm
Posts: 456
Location: England
Nevermind - found it :

Code:
cvResizeWindow()
is what i was after.

On another item is is there a correct way to change feeds ? I want to cycle through 6 different ip cameras.

Thanks


Top
 Profile  
Reply with quote  
 Post subject: Re: PureBasic Interface to OpenCV
PostPosted: Thu Nov 09, 2017 6:01 pm 
Offline
Addict
Addict
User avatar

Joined: Sat Oct 09, 2010 3:47 am
Posts: 1368
Hi captain_skank,

captain_skank wrote:
On another item is is there a correct way to change feeds ? I want to cycle through 6 different ip cameras.

NOTE: You could also include an option to have all six cameras displaying at the same time; relatively easy using OpenCV.

Windows / OpenCV 32
- set Compiler--Compiler Options--Compile/Run--Current directory: binaries\

Instead of cvResizeWindow see the following example that uses cvResize:
- KEYS 1 - 7 (allow time for cameras to load)
Code:
IncludeFile "includes/cv_functions.pbi"

Global lpPrevWndFunc

#CV_WINDOW_NAME = "PureBasic Interface to OpenCV"
#CV_DESCRIPTION = "View RTSP (Real Time Streaming Protocol) feeds." + #LF$ + #LF$ +
                  "[ 1-7 ] KEYS" + #TAB$ + ": Change Feed."

Procedure WindowCallback(hWnd, uMsg, wParam, lParam)
  Shared exitCV

  Select uMsg
    Case #WM_COMMAND
      Select wParam
        Case 10
          exitCV = #True
      EndSelect
    Case #WM_DESTROY
      exitCV = #True
  EndSelect
  ProcedureReturn CallWindowProc_(lpPrevWndFunc, hWnd, uMsg, wParam, lParam)
EndProcedure

Procedure CaptureFeed(Array arrRTSP.s(1), nFeed)
  *capture.CvCapture

  If *capture : cvReleaseCapture(@*capture) : EndIf

  Repeat
    nCreate + 1
    *capture = cvCreateFileCapture(arrRTSP(nFeed) + "?Transport=multicast")
  Until nCreate = 5 Or *capture
  ProcedureReturn *capture
EndProcedure

Procedure ResizeFrame(*capture, MaxSize)
  FrameWidth = cvGetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_WIDTH)
  FrameHeight = cvGetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_HEIGHT)

  If FrameWidth > MaxSize
    nRatio.d = MaxSize / FrameWidth
    FrameWidth * nRatio : FrameHeight * nRatio
  EndIf
  *frame.IplImage

  If *frame : cvReleaseImage(@*frame) : EndIf

  *frame = cvCreateImage(FrameWidth, FrameHeight, #IPL_DEPTH_8U, 3)
  ProcedureReturn *frame
EndProcedure

Dim arrRTSP.s(7)
arrRTSP(0) = "http://live.wazcam.net/live/quds.stream/playlist.m3u8"
arrRTSP(1) = "http://live.wazcam.net/live/kana.stream/playlist.m3u8"
arrRTSP(2) = "http://live.wazcam.net/live/tamra.stream/playlist.m3u8"
arrRTSP(3) = "http://live.wazcam.net/live/big.stream/playlist.m3u8"
arrRTSP(4) = "http://live.wazcam.net/live/city2.stream/playlist.m3u8"
arrRTSP(5) = "http://live.wazcam.net/live/mashhad.stream/playlist.m3u8"
arrRTSP(6) = "http://live.wazcam.net/live/reneh.stream/playlist.m3u8"
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())
hWnd = GetParent_(window_handle)
iconCV = LoadImage_(GetModuleHandle_(0), @"icons/opencv.ico", #IMAGE_ICON, 35, 32, #LR_LOADFROMFILE)
SendMessage_(hWnd, #WM_SETICON, 0, iconCV)
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)
*capture = CaptureFeed(arrRTSP(), 0)
*frame = ResizeFrame(*capture, 640)
*image.IplImage
font.CvFont : cvInitFont(@font, #CV_FONT_HERSHEY_COMPLEX_SMALL, 2, 2, #Null, 2, #CV_AA)

Repeat
  *image = cvQueryFrame(*capture)

  If *image
    cvResize(*image, *frame, #CV_INTER_AREA)
    cvPutText(*frame, "RTSP Feed: " + Str(nFeed + 1), 30, 60, @font, 0, 255, 255, 0)
    cvShowImage(#CV_WINDOW_NAME, *frame)
    keyPressed = cvWaitKey(10)

    Select keyPressed
      Case 49 To 55
        nFeed = keyPressed - 49
        *capture = CaptureFeed(arrRTSP(), nFeed)
        *frame = ResizeFrame(*capture, 640)
    EndSelect
  Else
    Break
  EndIf
Until keyPressed = 27 Or exitCV

If *frame : cvReleaseImage(@*frame) : EndIf

cvDestroyAllWindows()

If *capture : cvReleaseCapture(@*capture) : EndIf

_________________
ImageMy PureBasic Stuff


Last edited by JHPJHP on Fri Nov 10, 2017 2:05 pm, edited 1 time in total.

Top
 Profile  
Reply with quote  
 Post subject: Re: PureBasic Interface to OpenCV
PostPosted: Fri Nov 10, 2017 9:35 am 
Offline
Enthusiast
Enthusiast
User avatar

Joined: Fri Oct 06, 2006 3:57 pm
Posts: 456
Location: England
Hi JHPJHP,

Thanks for the reply and code.

Unfortunately the code provided won't run - it throws an error 'The code execution cannot proceed becasue opencv_world330.dll was not found'

I have checked and the .dll is in the binaries folder.

As an aside I did get a similar version of what you proposed working using cv_webcam_text.pb as a starting point. It's not pretty and will probably crash more times than a plane wihthout wings :)

I would be interested in knowing how to display multiple feeds at once though.

Cheers


Top
 Profile  
Reply with quote  
 Post subject: Re: PureBasic Interface to OpenCV
PostPosted: Fri Nov 10, 2017 10:38 am 
Offline
Addict
Addict
User avatar

Joined: Sat Oct 09, 2010 3:47 am
Posts: 1368
Hi captain_skank,

captain_skank wrote:
Unfortunately the code provided won't run - it throws an error 'The code execution cannot proceed becasue opencv_world330.dll was not found'

My fault, I should have asked which version of the interface you downloaded.

Not a problem, I can convert the code to work with the World version, but if you're not tied to that package, it might be better for you to download:
- Main Download: PureBasic Interface to OpenCV 2.4.13.3 :: 32 bit
-- more examples (includes the legacy Functions)
-- smaller size standalone applications (individual binaries)

captain_skank wrote:
I would be interested in knowing how to display multiple feeds at once though.

*** The previous (updated) / following example should only be used as a guide to a more robust solution ***

Very slow to load the six feeds; would be faster with local cameras or a better connection.
- Main Download: PureBasic Interface to OpenCV 2.4.13.3 :: 32 bit
Code:
IncludeFile "includes/cv_functions.pbi"

Global lpPrevWndFunc

#CV_WINDOW_NAME = "PureBasic Interface to OpenCV"
#CV_DESCRIPTION = "View 6 RTSP (Real Time Streaming Protocol) feeds."

Procedure WindowCallback(hWnd, uMsg, wParam, lParam)
  Shared exitCV

  Select uMsg
    Case #WM_COMMAND
      Select wParam
        Case 10
          exitCV = #True
      EndSelect
    Case #WM_DESTROY
      exitCV = #True
  EndSelect
  ProcedureReturn CallWindowProc_(lpPrevWndFunc, hWnd, uMsg, wParam, lParam)
EndProcedure

Dim arrRTSP.s(6) : Dim *capture.CvCapture(6)
arrRTSP(0) = "http://live.wazcam.net/live/quds.stream/playlist.m3u8"
arrRTSP(1) = "http://live.wazcam.net/live/kana.stream/playlist.m3u8"
arrRTSP(2) = "http://live.wazcam.net/live/tamra.stream/playlist.m3u8"
arrRTSP(3) = "http://live.wazcam.net/live/big.stream/playlist.m3u8"
arrRTSP(4) = "http://live.wazcam.net/live/city2.stream/playlist.m3u8"
arrRTSP(5) = "http://live.wazcam.net/live/mashhad.stream/playlist.m3u8"

For rtnCount = 0 To ArraySize(*capture()) - 1
  Repeat
    nCreate + 1
    *capture(rtnCount) = cvCreateFileCapture(arrRTSP(rtnCount) + "?Transport=multicast")
  Until nCreate = 5 Or *capture(rtnCount)
  nCreate = 0
Next
FrameWidth = cvGetCaptureProperty(*capture(0), #CV_CAP_PROP_FRAME_WIDTH)
FrameHeight = cvGetCaptureProperty(*capture(0), #CV_CAP_PROP_FRAME_HEIGHT)

If FrameWidth > 320
  nRatio.d = 320 / FrameWidth
  FrameWidth * nRatio : FrameHeight * nRatio
EndIf
*frame.IplImage = cvCreateImage(FrameWidth * 3, FrameHeight * 2, #IPL_DEPTH_8U, 3)
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())
hWnd = GetParent_(window_handle)
iconCV = LoadImage_(GetModuleHandle_(0), @"icons/opencv.ico", #IMAGE_ICON, 35, 32, #LR_LOADFROMFILE)
SendMessage_(hWnd, #WM_SETICON, 0, iconCV)
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)
*image1.IplImage : *image2.IplImage : *image3.IplImage : *image4.IplImage : *image5.IplImage : *image6.IplImage
font.CvFont : cvInitFont(@font, #CV_FONT_HERSHEY_COMPLEX_SMALL, 1, 1, #Null, 1, #CV_AA)

Repeat
  *image1 = cvQueryFrame(*capture(0)) : *image2 = cvQueryFrame(*capture(1)) : *image3 = cvQueryFrame(*capture(2))
  *image4 = cvQueryFrame(*capture(3)) : *image5 = cvQueryFrame(*capture(4)) : *image6 = cvQueryFrame(*capture(5))

  If *image1 And *image2 And *image3 And *image4 And *image5 And *image6
    cvSetImageROI(*frame, 0, 0, FrameWidth, FrameHeight)
    cvResize(*image1, *frame, #CV_INTER_AREA)
    cvResetImageROI(*frame)
    cvPutText(*frame, "----", 20, 30, @font, 0, 255, 255, 0)
    cvSetImageROI(*frame, FrameWidth, 0, FrameWidth, FrameHeight)
    cvResize(*image2, *frame, #CV_INTER_AREA)
    cvResetImageROI(*frame)
    cvPutText(*frame, "----", FrameWidth + 20, 30, @font, 0, 255, 255, 0)
    cvSetImageROI(*frame, FrameWidth * 2, 0, FrameWidth, FrameHeight)
    cvResize(*image3, *frame, #CV_INTER_AREA)
    cvResetImageROI(*frame)
    cvPutText(*frame, "----", FrameWidth * 2 + 20, 30, @font, 0, 255, 255, 0)
    cvSetImageROI(*frame, 0, FrameHeight, FrameWidth, FrameHeight)
    cvResize(*image4, *frame, #CV_INTER_AREA)
    cvResetImageROI(*frame)
    cvPutText(*frame, "----", 20, FrameHeight + 30, @font, 0, 255, 255, 0)
    cvSetImageROI(*frame, FrameWidth, FrameHeight, FrameWidth, FrameHeight)
    cvResize(*image5, *frame, #CV_INTER_AREA)
    cvResetImageROI(*frame)
    cvPutText(*frame, "----", FrameWidth + 20, FrameHeight + 30, @font, 0, 255, 255, 0)
    cvSetImageROI(*frame, FrameWidth * 2, FrameHeight, FrameWidth, FrameHeight)
    cvResize(*image6, *frame, #CV_INTER_AREA)
    cvResetImageROI(*frame)
    cvPutText(*frame, "----", FrameWidth * 2 + 20, FrameHeight + 30, @font, 0, 255, 255, 0)
    cvShowImage(#CV_WINDOW_NAME, *frame)
    keyPressed = cvWaitKey(10)
  Else
    Break
  EndIf
Until keyPressed = 27 Or exitCV
cvReleaseImage(@*frame)
cvDestroyAllWindows()

For rtnCount = 0 To ArraySize(*capture()) - 1
  If *capture(rtnCount) : cvReleaseCapture(@*capture(rtnCount)) : EndIf
Next

_________________
ImageMy PureBasic Stuff


Top
 Profile  
Reply with quote  
 Post subject: Re: PureBasic Interface to OpenCV
PostPosted: Fri Nov 10, 2017 2:43 pm 
Offline
Enthusiast
Enthusiast
User avatar

Joined: Fri Oct 06, 2006 3:57 pm
Posts: 456
Location: England
Awesome stuff JHPJHP.

Thanks for all the help.

Gotta say this is an exceptional piece of work.

cheers


Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 778 posts ]  Go to page Previous  1 ... 48, 49, 50, 51, 52

All times are UTC + 1 hour


Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  

 


Powered by phpBB © 2008 phpBB Group
subSilver+ theme by Canver Software, sponsor Sanal Modifiye