Re: PureBasic Interface to OpenCV
Posted: Fri May 08, 2015 2:31 pm
Hi, bbanelli
If you use multiple webcams you will get troubles with an USB passband.bbanelli wrote: Namely, I wanted to have multiple display sources in one window, something like this.
You can use ROI like in the JHPJHP's example "cv_cam_split_merge.pb":...In addition to that, is there a better way to handle resize of picture, since capture is 640x480 and I'd like to display 320x240 images (or any other resolution)? Image size must be 640x480 since I use CopyMemory and if resolution is changed, there's a memory violation.
Code: Select all
IncludeFile "includes/cv_functions.pbi"
Global lpPrevWndFunc
#CV_WINDOW_NAME = "PureBasic Interface to OpenCV"
#CV_DESCRIPTION = "Merge 4 images to 1 with ROI"
ProcedureC WindowCallback(hWnd, Msg, wParam, lParam)
Shared exitCV.b
Select Msg
Case #WM_COMMAND
Select wParam
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)
EndSelect
EndProcedure
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(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)
FrameWidth = cvGetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_WIDTH) / 2
FrameHeight = cvGetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_HEIGHT) / 2
*image.IplImage
*dst.IplImage = cvCreateImage(FrameWidth * 2, FrameHeight * 2, #IPL_DEPTH_8U, 3)
*img1.IplImage = cvCreateImage(FrameWidth, FrameHeight, #IPL_DEPTH_8U, 3)
*img2.IplImage = cvCreateImage(FrameWidth, FrameHeight, #IPL_DEPTH_8U, 3)
*img3.IplImage = cvCreateImage(FrameWidth, FrameHeight, #IPL_DEPTH_8U, 3)
*img4.IplImage = cvCreateImage(FrameWidth, FrameHeight, #IPL_DEPTH_8U, 3)
*param.USER_INFO = AllocateMemory(SizeOf(USER_INFO))
*param\uValue = window_handle
cvSetMouseCallback(*window_name, @CvMouseCallback(), *param)
Repeat
*image = cvQueryFrame(*capture)
If *image
cvResize(*image, *img1, #CV_INTER_AREA)
cvFlip(*img1, *img2, -1)
cvFlip(*img1, *img3, 0)
cvFlip(*img1, *img4, 1)
cvSetImageROI(*dst, 0, 0, FrameWidth, FrameHeight)
cvAndS(*img1, 0, 0, 0, 0, *dst, #Null)
cvAdd(*dst, *img1, *dst, #Null)
cvResetImageROI(*dst)
cvSetImageROI(*dst, FrameWidth, 0, FrameWidth, FrameHeight)
cvAndS(*img2, 0, 0, 0, 0, *dst, #Null)
cvAdd(*dst, *img2, *dst, #Null)
cvResetImageROI(*dst)
cvSetImageROI(*dst, FrameWidth, FrameHeight, FrameWidth, FrameHeight)
cvAndS(*img3, 0, 0, 0, 0, *dst, #Null)
cvAdd(*dst, *img3, *dst, #Null)
cvResetImageROI(*dst)
cvSetImageROI(*dst, 0, FrameHeight, FrameWidth, FrameHeight)
cvAndS(*img4, 0, 0, 0, 0, *dst, #Null)
cvAdd(*dst, *img4, *dst, #Null)
cvResetImageROI(*dst)
cvShowImage(#CV_WINDOW_NAME, *dst)
keyPressed = cvWaitKey(10)
EndIf
Until keyPressed = 27 Or exitCV
FreeMemory(*param)
cvReleaseImage(@*image)
cvReleaseImage(@*dst)
cvReleaseImage(@*img1)
cvReleaseImage(@*img2)
cvReleaseImage(@*img3)
cvReleaseImage(@*img4)
cvDestroyWindow(#CV_WINDOW_NAME)
cvReleaseCapture(@*capture)
Else
MessageBox_(0, "Unable to connect to a webcam - operation cancelled.", #CV_WINDOW_NAME, #MB_ICONERROR)
EndIf