PureBasic Interface to OpenCV
Re: PureBasic Interface to OpenCV
Hi, JHPJHP!
I tested your last pack and found an error in the example cv_minarea_2.pb:
PureBasic - Linker error
POLINK: error: Unresolved external symbol '_cvMinEnclosingTriangle'
POLINK: fatal error: 1 unresolved external(s).
Windows XP 32 bit.
Good luck!
			
			
									
									
						I tested your last pack and found an error in the example cv_minarea_2.pb:
PureBasic - Linker error
POLINK: error: Unresolved external symbol '_cvMinEnclosingTriangle'
POLINK: fatal error: 1 unresolved external(s).
Windows XP 32 bit.
Good luck!
Re: PureBasic Interface to OpenCV
Hi infratec,
Thank you very much, that means a lot coming from you.
----------------------------------------------------
Hi AAT,
As always you're my second set of eyes. Thank you for all your support :: starting from the first example.
----------------------------------------------------
Updated:
- PureBasic Interface to OpenCV 3.0 Gold (32bit / 64bit)
-- fix the problem reported by AAT in the previous post
In my hast to release a clean working set of binaries with the least amount of changes, I neglected to apply my initial update.
NB*: If there's a requirement for the updated [ OpenCV 3.0 Gold ] individual binaries I can post a link.
			
			
									
									Thank you very much, that means a lot coming from you.
----------------------------------------------------
Hi AAT,
As always you're my second set of eyes. Thank you for all your support :: starting from the first example.
----------------------------------------------------
Updated:
- PureBasic Interface to OpenCV 3.0 Gold (32bit / 64bit)
-- fix the problem reported by AAT in the previous post
In my hast to release a clean working set of binaries with the least amount of changes, I neglected to apply my initial update.
NB*: If there's a requirement for the updated [ OpenCV 3.0 Gold ] individual binaries I can post a link.
If you're not investing in yourself, you're falling behind.
My PureBasic Stuff ➤ FREE STUFF, Scripts & Programs.
My PureBasic Forum ➤ Questions, Requests & Comments.
Re: PureBasic Interface to OpenCV
Hi, JHPJHP!
cv_minarea_2.pb - it's OK now.
Many thanks and good luck!
			
			
									
									
						cv_minarea_2.pb - it's OK now.
Many thanks and good luck!
Re: PureBasic Interface to OpenCV
Hello,
I hoop to find some time this vacation to do some software for my little robot.
One of the challenges in the robot club are,
to find 5 cans (cola, red ones) and to bring them to one central point on the robot zone.
So,
the robot is moving around and the cans are static on the ground.
is this possible to detect cans with OpenCV,
even as the image of the cans are changing during the robot vision.
What I want to say is that the front view of the cans and the top view are very different.
top views are circular.
I already made some 3D simulation program,
now I only need to integrate the OpenCV camera detections.

thanks,
marc
			
			
									
									I hoop to find some time this vacation to do some software for my little robot.
One of the challenges in the robot club are,
to find 5 cans (cola, red ones) and to bring them to one central point on the robot zone.
So,
the robot is moving around and the cans are static on the ground.
is this possible to detect cans with OpenCV,
even as the image of the cans are changing during the robot vision.
What I want to say is that the front view of the cans and the top view are very different.
top views are circular.
I already made some 3D simulation program,
now I only need to integrate the OpenCV camera detections.

thanks,
marc
- every professional was once an amateur - greetings from Pajottenland - Belgium -
PS: sorry for my english I speak flemish ...
						PS: sorry for my english I speak flemish ...
Re: PureBasic Interface to OpenCV
Hi marc_256,
I think the example closest to what your looking for is le_nearest_neighbor.pb, but you may want to combine techniques:
- cv_cam_track_color.pb: modify the script to test for matching colors
- cv_find_shapes.pb: test for shapes with a certain number of points
- cv_cam_haar_training_1.pb: this example is geared towards faces, but with a few small changes a file can be created to match your criteria
NB*: A general understanding of the process would help chances for returning accurate results; the reference file haarcascade.txt is a good start.
The following examples may also provide some benefit:
- cv_norm.pb
- cv_template.pb
Good luck.
			
			
									
									I think the example closest to what your looking for is le_nearest_neighbor.pb, but you may want to combine techniques:
- cv_cam_track_color.pb: modify the script to test for matching colors
- cv_find_shapes.pb: test for shapes with a certain number of points
- cv_cam_haar_training_1.pb: this example is geared towards faces, but with a few small changes a file can be created to match your criteria
NB*: A general understanding of the process would help chances for returning accurate results; the reference file haarcascade.txt is a good start.
The following examples may also provide some benefit:
- cv_norm.pb
- cv_template.pb
Good luck.
If you're not investing in yourself, you're falling behind.
My PureBasic Stuff ➤ FREE STUFF, Scripts & Programs.
My PureBasic Forum ➤ Questions, Requests & Comments.
Re: PureBasic Interface to OpenCV
hi JHPJHP,
thanks for the tips,
marc
			
			
									
									thanks for the tips,
marc
- every professional was once an amateur - greetings from Pajottenland - Belgium -
PS: sorry for my english I speak flemish ...
						PS: sorry for my english I speak flemish ...
Re: PureBasic Interface to OpenCV
Hello ,
in the example "cv_cam_track_color.pb"
there is a memory leak apparently,
when checking the gestionaire of taches (Ctrl+Alt+Del), the memory occupied, increases continuously
how to fix this problem?
			
			
													in the example "cv_cam_track_color.pb"
there is a memory leak apparently,
when checking the gestionaire of taches (Ctrl+Alt+Del), the memory occupied, increases continuously
how to fix this problem?
					Last edited by dobro on Mon Jul 13, 2015 12:55 pm, edited 1 time in total.
									
			
									
						Re: PureBasic Interface to OpenCV
fixed here to avoid leaking memory   
			
			
									
									
						Code: Select all
IncludeFile "includes/cv_functions.pbi"
Global lpPrevWndFunc, *imgTracking.IplImage, lastX, lastY, nCursor
#CV_WINDOW_NAME = "PureBasic Interface to OpenCV"
#CV_DESCRIPTION = "Tracks red objects demonstrated by drawing a line that traces its location." + Chr(10) + Chr(10) +
"- SPACEBAR: Toggle mouse tracking." + Chr(10) + Chr(10) +
"- ENTER: Clear the traced line."
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.l, y.l, flags, *param.USER_INFO)
	Select event
		Case #CV_EVENT_RBUTTONDOWN
		DisplayPopupMenu(0, *param\uValue)
	EndSelect
EndProcedure
ProcedureC GetThresholdedImage(*imgHSV.IplImage)
	*imgThresh.IplImage = cvCreateImage(*imgHSV\width, *imgHSV\height, #IPL_DEPTH_8U, 1)
	cvInRangeS(*imgHSV, 160, 140, 40, 0, 179, 255, 255, 0, *imgThresh)
	ProcedureReturn *imgThresh
EndProcedure
ProcedureC TrackObject(*imgThresh.IplImage)
	moments.CvMoments
	cvMoments(*imgThresh, @moments, 1)
	moment10.d = moments\m10
	moment01.d = moments\m01
	area.d = moments\m00
	
	If area > 1000
		posX = moment10 / area
		posY = moment01 / area
		
		If lastX >= 0 And lastY >= 0 And posX >= 0 And posY >= 0
			cvLine(*imgTracking, posX, posY, lastX, lastY, 0, 0, 255, 0, 4, #CV_AA, #Null)
			
			If nCursor : SetCursorPos_(posX + 25, posY + 45) : EndIf
			
		EndIf
		lastX = posX
		lastY = posY
	EndIf
EndProcedure
Repeat
	nCreate + 1
	*capture.CvCapture = cvCreateCameraCapture(#CV_CAP_ANY)
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)
	FrameHeight = cvGetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_HEIGHT)
	*imgTracking = cvCreateImage(FrameWidth, FrameHeight, #IPL_DEPTH_8U, 3)
	cvSetZero(*imgTracking)
	lastX = -1
	lastY = -1
	*imgHSV.IplImage = cvCreateImage(FrameWidth, FrameHeight, #IPL_DEPTH_8U, 3)
	*imgThresh.IplImage
	*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)
			cvSmooth(*image, *image, #CV_GAUSSIAN, 3, 3, 0, 0)
			cvCvtColor(*image, *imgHSV, #CV_BGR2HSV, 1)
			*imgThresh = GetThresholdedImage(*imgHSV)
			cvSmooth(*imgThresh, *imgThresh, #CV_GAUSSIAN, 3, 3, 0, 0)
			TrackObject(*imgThresh)
			cvAdd(*image, *imgTracking, *image, #Null)
			cvShowImage(#CV_WINDOW_NAME, *image)
			keyPressed = cvWaitKey(10)
			cvReleaseImage(@*imgThresh) ; <<<<<<<<<<<<<<<<<fixed here to avoid leaking memory  (By Dobro )
			
			Select keyPressed
				Case 13
				cvSetZero(*imgTracking)
				lastX = -1
				lastY = -1
				Case 32
				nCursor ! 1
			EndSelect
		EndIf
	Until keyPressed = 27 Or exitCV
	FreeMemory(*param)
	cvReleaseImage(@*imgThresh)
	cvReleaseImage(@*imgHSV)
	cvReleaseImage(@*imgTracking)
	cvDestroyAllWindows()
	cvReleaseCapture(@*capture)
Else
	MessageBox_(0, "Unable to connect to a webcam - operation cancelled.", #CV_WINDOW_NAME, #MB_ICONERROR)
EndIf
; IDE Options = PureBasic 5.31 (Windows - x64)
; CursorPosition = 1
; Folding = -
; EnableXP
; DisableDebugger
; CurrentDirectory = binaries\
; Epb
Re: PureBasic Interface to OpenCV
Hi, dobro.
I think, that the problem is in the procedure GetThresholdedImage: мemory is allocated for each procedure call and is not released
*imgThresh.IplImage = cvCreateImage...
Look at this code with little changes marked by ";!!!", I think it will fix a memory leakage.
Good luck!
P.S. Dobro, i was late
			
			
									
									
						I think, that the problem is in the procedure GetThresholdedImage: мemory is allocated for each procedure call and is not released
*imgThresh.IplImage = cvCreateImage...
Look at this code with little changes marked by ";!!!", I think it will fix a memory leakage.
Code: Select all
  Repeat
    *image = cvQueryFrame(*capture)
    If *image
      cvFlip(*image, #Null, 1)
      cvSmooth(*image, *image, #CV_GAUSSIAN, 3, 3, 0, 0)
      cvCvtColor(*image, *imgHSV, #CV_BGR2HSV, 1)
;      *imgThresh = GetThresholdedImage(*imgHSV)                                             ;!!!!       
      *imgThresh.IplImage = cvCreateImage(*imgHSV\width, *imgHSV\height, #IPL_DEPTH_8U, 1)  ;!!!!        
      cvInRangeS(*imgHSV, 160, 140, 40, 0, 179, 255, 255, 0, *imgThresh)                    ;!!!!
      cvSmooth(*imgThresh, *imgThresh, #CV_GAUSSIAN, 3, 3, 0, 0)
      TrackObject(*imgThresh)
      cvAdd(*image, *imgTracking, *image, #Null)
      cvShowImage(#CV_WINDOW_NAME, *image)          
      cvReleaseImage(@*imgThresh)                                                           ;!!!!   
      keyPressed = cvWaitKey(10)
      Select keyPressed
        Case 13
          cvSetZero(*imgTracking)
          lastX = -1
          lastY = -1
        Case 32
          nCursor ! 1
      EndSelect
    EndIf
  Until keyPressed = 27 Or exitCV
  FreeMemory(*param)
;  cvReleaseImage(@*imgThresh)                                                            ;!!!! 
  cvReleaseImage(@*imgHSV)
  cvReleaseImage(@*imgTracking)P.S. Dobro, i was late
Re: PureBasic Interface to OpenCV
yes, in my code above, I had finally found the solution
I added "
cvReleaseImage (@ * imgThresh); <<<<<<<<<<<<<<<<< fixed here to Avoid leaking memory (By Dobro) "
Thanks
ps: no problems
			
			
									
									
						I added "
cvReleaseImage (@ * imgThresh); <<<<<<<<<<<<<<<<< fixed here to Avoid leaking memory (By Dobro) "
Code: Select all
 cvFlip(*image, #Null, 1)
         cvSmooth(*image, *image, #CV_GAUSSIAN, 3, 3, 0, 0)
         cvCvtColor(*image, *imgHSV, #CV_BGR2HSV, 1)
         *imgThresh = GetThresholdedImage(*imgHSV)
         cvSmooth(*imgThresh, *imgThresh, #CV_GAUSSIAN, 3, 3, 0, 0)
         TrackObject(*imgThresh)
         cvAdd(*image, *imgTracking, *image, #Null)
         cvShowImage(#CV_WINDOW_NAME, *image)
         keyPressed = cvWaitKey(10)
         cvReleaseImage(@*imgThresh) ; <<<<<<<<<<<<<<<<<fixed here to avoid leaking memory  (By Dobro )
Thanks
ps: no problems
Re: PureBasic Interface to OpenCV
Hi dobro, AAT,
Thank you for error-checking the example: cv_cam_track_color.pb, pointing out the problem and fix.
NB*: The various packages have been updated.
			
			
									
									Thank you for error-checking the example: cv_cam_track_color.pb, pointing out the problem and fix.
NB*: The various packages have been updated.
If you're not investing in yourself, you're falling behind.
My PureBasic Stuff ➤ FREE STUFF, Scripts & Programs.
My PureBasic Forum ➤ Questions, Requests & Comments.
Re: PureBasic Interface to OpenCV
@JHPJHP :  
Essayez avec cette orthographe : Merci à toi, pour ton travail
Thank you to you, for your work
			
			
									
									
						Essayez avec cette orthographe : Merci à toi, pour ton travail
Thank you to you, for your work
Re: PureBasic Interface to OpenCV
Hi! I see in examples how change resolution.
But how can set fps to capture card, is this posible?
Thanks!
			
			
									
									But how can set fps to capture card, is this posible?
Thanks!
If translation=Error: reply="Sorry, Im Spanish": Endif
						Re: PureBasic Interface to OpenCV
Hi minimy,
If you need to set the FPS while recording webcam frames or copying movie frames, see the examples:
- cv_cam_writeframe_1.pb, cv_cam_writeframe_2.pb, cv_mov_writeframe.pb
/references/manual.pdf:
- cvGetCaptureProperty, cvSetCaptureProperty
/references/manual.pdf:
			
			
									
									If you need to set the FPS while recording webcam frames or copying movie frames, see the examples:
- cv_cam_writeframe_1.pb, cv_cam_writeframe_2.pb, cv_mov_writeframe.pb
/references/manual.pdf:
Otherwise the following functions can be used with the Constant: #CV_CAP_PROP_FPSCvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 )
- cvGetCaptureProperty, cvSetCaptureProperty
/references/manual.pdf:
double cvGetCaptureProperty(CvCapture* capture, int property_id)
int cvSetCaptureProperty(CvCapture* capture, int property_id, double value)
If you're not investing in yourself, you're falling behind.
My PureBasic Stuff ➤ FREE STUFF, Scripts & Programs.
My PureBasic Forum ➤ Questions, Requests & Comments.
Re: PureBasic Interface to OpenCV
Yes! a lot of thanks!!
Work perfect, thank again!
			
			
									
									Work perfect, thank again!
If translation=Error: reply="Sorry, Im Spanish": Endif
						

