Here is an enhanced version of the webcam control program.
It uses constants to set the horizontal and vertical resolutions, making it possible to have 16:9 images. The resolutions were previously hard coded.
There is an oscilloscope-like display to check video levels. I'm not sure why there are black horizontal lines in the scope display.
There are graticules at 254, 235, 16 and 1. In Rec.709, values of 0 and 255 are forbidden; values between 16 and 235 are known as "studio swing".
It may yet be a little buggy. It sometimes crashes upon closing -- not sure why.
Code: Select all
IncludeFile "includes/cv_functions.pbi"
InitKeyboard():InitSprite()
#WIDTH =1280/2 ;1920/2
#HEIGHT =720/2 ;1080/2
#KR = 0.2126:#KG = 0.7152:#KB = 0.0722 ;REC.709 COEFFICIENTS
#SCOPE_Y_OFFSET = 275
Dim scopeLum(#HEIGHT*2,#WIDTH*2)
Enumeration 20
#gadBrightness
#gadContrast
#gadGamma
#gadSaturation
#gadHue
#gadSharpness
#gadExposure
#scopeGadget
#gadBright2
#gadCont2
EndEnumeration
Global *capture
Global DefBrightness.d, MaxBrightness.d, MinBrightness.d, DefContrast.d, MaxContrast.d, MinContrast.d
Global DefGamma.d, MaxGamma.d, MinGamma.d, DefSaturation.d, MaxSaturation.d, MinSaturation.d
Global DefHue.d, MaxHue.d, MinHue.d, DefSharpness.d, MaxSharpness.d, MinSharpness.d
Global DefExposure.d, MaxExposure.d, MinExposure.d
#CV_WINDOW_NAME = "WebCam Settings"
#CamDataName = "camdata.dat"
Procedure ReadCamData()
If OpenPreferences(GetCurrentDirectory() + #CamDataName)
DefBrightness = ReadPreferenceLong("DefBrightness", 1)
DefContrast = ReadPreferenceLong("DefContrast", 1)
DefGamma = ReadPreferenceLong("DefGamma", 1)
DefSaturation = ReadPreferenceLong("DefSaturation", 1)
DefHue = ReadPreferenceLong("DefHue", 1)
DefSharpness = ReadPreferenceLong("DefSharpness", 1)
DefExposure = ReadPreferenceLong("DefExposure", 1)
MaxBrightness = ReadPreferenceLong("MaxBrightness", 1)
MaxContrast = ReadPreferenceLong("MaxContrast", 1)
MaxGamma = ReadPreferenceLong("MaxGamma", 1)
MaxSaturation = ReadPreferenceLong("MaxSaturation", 1)
MaxHue = ReadPreferenceLong("MaxHue", 1)
MaxSharpness = ReadPreferenceLong("MaxSharpness", 1)
MinBrightness = ReadPreferenceLong("MinBrightness", 1)
MinContrast = ReadPreferenceLong("MinContrast", 1)
MinGamma = ReadPreferenceLong("MinGamma", 1)
MinSaturation = ReadPreferenceLong("MinSaturation", 1)
MinHue = ReadPreferenceLong("MinHue", 1)
MinSharpness = ReadPreferenceLong("MinSharpness", 1)
MaxExposure = ReadPreferenceLong("MaxExposure", 1)
MinExposure = ReadPreferenceLong("MinExposure", 1)
cvSetCaptureProperty(*capture, #CV_CAP_PROP_BRIGHTNESS, DefBrightness)
cvSetCaptureProperty(*capture, #CV_CAP_PROP_CONTRAST, DefContrast)
cvSetCaptureProperty(*capture, #CV_CAP_PROP_GAMMA, DefGamma)
cvSetCaptureProperty(*capture, #CV_CAP_PROP_SATURATION, DefSaturation)
cvSetCaptureProperty(*capture, #CV_CAP_PROP_HUE, DefHue)
cvSetCaptureProperty(*capture, #CV_CAP_PROP_SHARPNESS, DefSharpness)
;THERE IS A BUG HERE cvSetCaptureProperty(*capture, #CV_CAP_PROP_EXPOSURE, DefExposure)
Else
CreatePreferences(GetCurrentDirectory()+"camdata.dat")
retvalue.d = 0
value.d = 0
DefValue.d
;{ #CV_CAP_PROP_BRIGHTNESS
DefValue = cvGetCaptureProperty(*capture,#CV_CAP_PROP_BRIGHTNESS)
WritePreferenceLong("DefBrightness", DefValue)
DefBrightness = DefValue
For k=DefValue To 1000 Step 1
value = k
cvSetCaptureProperty(*capture, #CV_CAP_PROP_BRIGHTNESS, value)
retvalue=cvGetCaptureProperty(*capture, #CV_CAP_PROP_BRIGHTNESS)
If value > retvalue
Break
EndIf
Next
WritePreferenceLong("MaxBrightness", cvGetCaptureProperty(*capture,#CV_CAP_PROP_BRIGHTNESS))
MaxBrightness = retvalue
For k=DefValue To 0 Step -1
value = k
cvSetCaptureProperty(*capture, #CV_CAP_PROP_BRIGHTNESS, value)
retvalue=cvGetCaptureProperty(*capture, #CV_CAP_PROP_BRIGHTNESS)
If value > retvalue
Break
EndIf
Next
WritePreferenceLong("MinBrightness", cvGetCaptureProperty(*capture,#CV_CAP_PROP_BRIGHTNESS))
MinBrightness = retvalue
cvSetCaptureProperty(*capture, #CV_CAP_PROP_BRIGHTNESS, DefValue)
;{ #CV_CAP_PROP_CONTRAST
DefValue = cvGetCaptureProperty(*capture,#CV_CAP_PROP_CONTRAST)
WritePreferenceLong("DefContrast", DefValue)
DefContrast = DefValue
For k=DefValue To 1000 Step 1
value = k
cvSetCaptureProperty(*capture, #CV_CAP_PROP_CONTRAST, value)
retvalue=cvGetCaptureProperty(*capture, #CV_CAP_PROP_CONTRAST)
If value > retvalue
Break
EndIf
Next
WritePreferenceLong("MaxContrast", cvGetCaptureProperty(*capture,#CV_CAP_PROP_CONTRAST))
MaxContrast = retvalue
For k=DefValue To 0 Step -1
value = k
cvSetCaptureProperty(*capture, #CV_CAP_PROP_CONTRAST, value)
retvalue=cvGetCaptureProperty(*capture, #CV_CAP_PROP_CONTRAST)
If value < retvalue
Break
EndIf
Next
WritePreferenceLong("MinContrast", cvGetCaptureProperty(*capture,#CV_CAP_PROP_CONTRAST))
MinContrast = retvalue
cvSetCaptureProperty(*capture, #CV_CAP_PROP_CONTRAST, DefValue)
;}
;{ #CV_CAP_PROP_GAMMA
DefValue = cvGetCaptureProperty(*capture,#CV_CAP_PROP_GAMMA)
WritePreferenceLong("DefGamma", DefValue)
DefGamma = DefValue
For k = DefValue To 1000 Step 5
value = k
cvSetCaptureProperty(*capture,#CV_CAP_PROP_GAMMA, value)
retvalue=cvGetCaptureProperty(*capture, #CV_CAP_PROP_GAMMA)
If value > retvalue
Break
EndIf
Next
WritePreferenceLong("MaxGamma", cvGetCaptureProperty(*capture,#CV_CAP_PROP_GAMMA))
MaxGamma = retvalue
For k = DefValue To 0 Step -5
value = k
cvSetCaptureProperty(*capture,#CV_CAP_PROP_GAMMA, value)
retvalue=cvGetCaptureProperty(*capture, #CV_CAP_PROP_GAMMA)
If value < retvalue
Break
EndIf
Next
WritePreferenceLong("MinGamma", cvGetCaptureProperty(*capture,#CV_CAP_PROP_GAMMA))
MinGamma = retvalue
cvSetCaptureProperty(*capture, #CV_CAP_PROP_GAMMA, DefValue)
;{ #CV_CAP_PROP_SATURATION
DefValue = cvGetCaptureProperty(*capture,#CV_CAP_PROP_SATURATION)
WritePreferenceLong("DefSaturation", DefValue)
DefSaturation = DefValue
For k = DefValue To 1000 Step 1
value = k
cvSetCaptureProperty(*capture,#CV_CAP_PROP_SATURATION, value)
retvalue = cvGetCaptureProperty(*capture, #CV_CAP_PROP_SATURATION)
If value > retvalue
Break
EndIf
Next
WritePreferenceLong("MaxSaturation" , cvGetCaptureProperty(*capture,#CV_CAP_PROP_SATURATION))
MaxSaturation = retvalue
For k = DefValue To 0 Step -1
value = k
cvSetCaptureProperty(*capture,#CV_CAP_PROP_SATURATION, value)
retvalue = cvGetCaptureProperty(*capture, #CV_CAP_PROP_SATURATION)
If value < retvalue
Break
EndIf
Next
WritePreferenceLong("MinSaturation", cvGetCaptureProperty(*capture,#CV_CAP_PROP_SATURATION))
MinSaturation = retvalue
cvSetCaptureProperty(*capture, #CV_CAP_PROP_SATURATION, DefValue)
;{ #CV_CAP_PROP_HUE
DefValue = cvGetCaptureProperty(*capture,#CV_CAP_PROP_HUE)
WritePreferenceLong("DefHue", DefValue)
DefHue = DefValue
For k = DefValue To 1000 Step 1
value = k
cvSetCaptureProperty(*capture,#CV_CAP_PROP_HUE, value)
retvalue = cvGetCaptureProperty(*capture, #CV_CAP_PROP_HUE)
If value > retvalue
Break
EndIf
Next
WritePreferenceLong("MaxHue", cvGetCaptureProperty(*capture,#CV_CAP_PROP_HUE))
MaxHue = retvalue
For k = DefValue To 0 Step -1
value = k
cvSetCaptureProperty(*capture,#CV_CAP_PROP_HUE, value)
retvalue = cvGetCaptureProperty(*capture, #CV_CAP_PROP_HUE)
If value < retvalue
Break
EndIf
Next
WritePreferenceLong("MinHue", cvGetCaptureProperty(*capture,#CV_CAP_PROP_HUE))
MinHue = retvalue
cvSetCaptureProperty(*capture, #CV_CAP_PROP_HUE, DefValue)
;{ #CV_CAP_PROP_SHARPNESS
DefValue = cvGetCaptureProperty(*capture,#CV_CAP_PROP_SHARPNESS)
WritePreferenceLong("DefSharpness", DefValue)
DefSharpness = DefValue
For k = DefValue To 1000 Step 1
value = k
cvSetCaptureProperty(*capture,#CV_CAP_PROP_SHARPNESS, value)
retvalue = cvGetCaptureProperty(*capture, #CV_CAP_PROP_SHARPNESS)
If value > retvalue
Break
EndIf
Next
WritePreferenceLong("MaxSharpness", cvGetCaptureProperty(*capture,#CV_CAP_PROP_SHARPNESS))
MaxSharpness = retvalue
For k = DefValue To 0 Step -1
value = k
cvSetCaptureProperty(*capture,#CV_CAP_PROP_SHARPNESS, value)
retvalue = cvGetCaptureProperty(*capture, #CV_CAP_PROP_SHARPNESS)
If value < retvalue
Break
EndIf
Next
WritePreferenceLong("MinSharpness", cvGetCaptureProperty(*capture,#CV_CAP_PROP_SHARPNESS))
MinSharpness = retvalue
cvSetCaptureProperty(*capture, #CV_CAP_PROP_SHARPNESS, DefValue)
;{ #CV_CAP_PROP_EXPOSURE
DefValue = cvGetCaptureProperty(*capture,#CV_CAP_PROP_EXPOSURE)
WritePreferenceLong("DefExposure", DefValue)
DefExposure = DefValue
For k = DefValue To 1000 Step 1
value = k
cvSetCaptureProperty(*capture,#CV_CAP_PROP_EXPOSURE, value)
retvalue = cvGetCaptureProperty(*capture, #CV_CAP_PROP_EXPOSURE)
If value > retvalue
Break
EndIf
Next
WritePreferenceLong("MaxExposure", cvGetCaptureProperty(*capture,#CV_CAP_PROP_EXPOSURE))
MaxExposure = retvalue
For k = DefValue To 0 Step -1
value = k
cvSetCaptureProperty(*capture,#CV_CAP_PROP_EXPOSURE, value)
retvalue = cvGetCaptureProperty(*capture, #CV_CAP_PROP_EXPOSURE)
If value < retvalue
Break
EndIf
Next
WritePreferenceLong("MinExposure", cvGetCaptureProperty(*capture,#CV_CAP_PROP_EXPOSURE))
MinExposure = retvalue
cvSetCaptureProperty(*capture, #CV_CAP_PROP_EXPOSURE, DefValue)
CloseWindow(1)
EndIf
EndProcedure
Procedure Spin20Handler();BRIGHTNESS
Shared window_handle
val.d = GetGadgetState(20)
cvSetCaptureProperty(*capture,#CV_CAP_PROP_BRIGHTNESS, val)
WritePreferenceLong("DefBrightness", val)
EndProcedure
Procedure Spin21Handler();CONTRAST
Shared window_handle
val.d = GetGadgetState(21)
cvSetCaptureProperty(*capture,#CV_CAP_PROP_CONTRAST, val)
WritePreferenceLong("DefContrast", val)
EndProcedure
Procedure Spin22Handler();GAMMA
Shared window_handle
val.d = GetGadgetState(22)
cvSetCaptureProperty(*capture,#CV_CAP_PROP_GAMMA, val)
WritePreferenceLong("DefGamma", val)
EndProcedure
Procedure Spin23Handler()
Shared window_handle
val.d = GetGadgetState(23);SATURATION
cvSetCaptureProperty(*capture,#CV_CAP_PROP_SATURATION, val)
WritePreferenceLong("DefSaturation", val)
EndProcedure
Procedure Spin24Handler();HUE
Shared window_handle
val.d = GetGadgetState(24)
cvSetCaptureProperty(*capture,#CV_CAP_PROP_HUE, val)
WritePreferenceLong("DefHue", val)
EndProcedure
Procedure Spin25Handler();SHARPNESS
Shared window_handle
val.d = GetGadgetState(25)
cvSetCaptureProperty(*capture,#CV_CAP_PROP_SHARPNESS, val)
WritePreferenceLong("DefSharpness", val)
EndProcedure
Procedure Spin26Handler();EXPOSURE
Shared window_handle
val.d = GetGadgetState(26)
cvSetCaptureProperty(*capture,#CV_CAP_PROP_EXPOSURE, val)
WritePreferenceLong("DefExposure", val)
EndProcedure
Procedure Spin27Handler();BRIGHT2
; Shared window_handle
; val.d = GetGadgetState(#gadBright2)
; cvSetCaptureProperty(*capture,#CV_CAP_PROP_BRIGHTNESS, val)
; WritePreferenceLong("DefBrightness", val)
EndProcedure
Procedure Spin28Handler();CONT2
; Shared window_handle
; val.d = GetGadgetState(#gadCont2)
; cvSetCaptureProperty(*capture,#CV_CAP_PROP_CONTRAST, val)
; WritePreferenceLong("DefContrast", val)
EndProcedure
Repeat
nCreate + 1
*capture = cvCreateCameraCapture(0)
;Delay(500)
Until nCreate = 5 Or *capture
If *capture
*image.IplImage
*edges.IplImage
cvNamedWindow(#CV_WINDOW_NAME, #CV_WINDOW_NORMAL)
;cvMoveWindow(#CV_WINDOW_NAME, -1000, -1000)
cvResizeWindow(#CV_WINDOW_NAME, #WIDTH, #HEIGHT)
window_handle = cvGetWindowHandle(#CV_WINDOW_NAME)
hWnd = GetParent_(window_handle)
ShowWindow_(hWnd, #SW_HIDE)
ReadCamData()
cvSetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_WIDTH,#WIDTH)
cvSetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_HEIGHT,#HEIGHT)
If OpenWindow(0, 0, 0, #WIDTH+200, #HEIGHT*2, #CV_WINDOW_NAME, #PB_Window_SystemMenu)
;OpenWindowedScreen(WindowID(0), 0, 0, #WIDTH+200, #HEIGHT*2)
SetParent_(window_handle, WindowID(0))
TextGadget(10, 670, 25, 75, 20, "Brightness", #PB_Text_Right)
TextGadget(11, 670, 50, 75, 20, "Contrast", #PB_Text_Right)
TextGadget(12, 670, 75, 75, 20, "Gamma", #PB_Text_Right)
TextGadget(13, 670, 100, 75, 20, "Saturation", #PB_Text_Right)
TextGadget(14, 670, 125, 75, 20, "Hue", #PB_Text_Right)
TextGadget(15, 670, 150, 75, 20, "Sharpness", #PB_Text_Right)
TextGadget(16, 670, 175, 75, 20, "Exposure", #PB_Text_Right)
;TextGadget(17, 670, 405, 75, 20, "Bright")
;TextGadget(18, 670, 405, 75, 20, "Cont")
AddKeyboardShortcut(0, #PB_Shortcut_Escape, #PB_Shortcut_Escape) ;"ESCAPE" KEY TO QUIT PROGRAM
SpinGadget(#gadBrightness, 750, 20, 50, 20, MinBrightness, MaxBrightness, #PB_Spin_Numeric) : SetGadgetState(20, DefBrightness)
SpinGadget(#gadContrast, 750, 45, 50, 20, MinContrast, MaxContrast, #PB_Spin_Numeric) : SetGadgetState(21, DefContrast)
SpinGadget(#gadGamma, 750, 70, 50, 20, MinGamma, MaxGamma, #PB_Spin_Numeric) : SetGadgetState(22, DefGamma)
SpinGadget(#gadSaturation, 750, 95, 50, 20, MinSaturation, MaxSaturation, #PB_Spin_Numeric) : SetGadgetState(23, DefSaturation)
SpinGadget(#gadHue, 750, 120, 50, 20, MinHue, MaxHue, #PB_Spin_Numeric) : SetGadgetState(24, DefHue)
SpinGadget(#gadSharpness, 750, 145, 50, 20, MinSharpness, MaxSharpness, #PB_Spin_Numeric) : SetGadgetState(25, DefSharpness)
SpinGadget(#gadExposure, 750, 170, 50, 20, MinExposure, MaxExposure, #PB_Spin_Numeric) : SetGadgetState(26, DefExposure)
; TrackBarGadget(#gadBright2, 650,200,30,200,0,255,#PB_TrackBar_Vertical)
; TrackBarGadget(#gadCont2, 700,200,30,200,0,255,#PB_TrackBar_Vertical)
BindGadgetEvent(#gadBrightness, @Spin20Handler())
BindGadgetEvent(#gadContrast, @Spin21Handler())
BindGadgetEvent(#gadGamma, @Spin22Handler())
BindGadgetEvent(#gadSaturation, @Spin23Handler())
BindGadgetEvent(#gadHue, @Spin24Handler())
BindGadgetEvent(#gadSharpness, @Spin25Handler())
BindGadgetEvent(#gadExposure, @Spin26Handler())
; BindGadgetEvent(#gadBright2, @Spin27Handler())
; BindGadgetEvent(#gadCont2, @Spin28Handler())
CreateImage(2,#WIDTH,#HEIGHT,24)
ImageGadget(#scopeGadget,0,#HEIGHT+4,#WIDTH,#HEIGHT/2,ImageID(2))
Repeat
*image = cvQueryFrame(*capture)
If *image
cvShowImage(#CV_WINDOW_NAME, *image)
StartDrawing(WindowOutput(0))
GrabDrawingImage(1,0,1,#WIDTH,#HEIGHT)
StopDrawing()
StartDrawing(ImageOutput(1))
For y=0 To #HEIGHT-1: For X=0 To #WIDTH-1
pixCol = Point(x,y)
rf.f=Red(pixCol):gf.f=Green(pixCol):bf.f=Blue(pixCol)
;scopeLum(x,y) = (Red(pixCol)*#KR) + (Green(pixCol)*#KG) + (Blue(pixCol)*#KB)
scopeLum(x,y) = (rf*#KR) + (gf*#KG) + (bf*#KB)
Next:Next
StopDrawing()
StartDrawing(ImageOutput(2))
Box(0,0,#WIDTH, #HEIGHT,#Black) ;BLANK SCOPE
For y=0 To #HEIGHT-1: For x=0 To #WIDTH-1
Plot(x, (#SCOPE_Y_OFFSET - scopeLum(x,y)), $00cc00)
Next:Next
LineXY(30,#SCOPE_Y_OFFSET-254, #WIDTH,#SCOPE_Y_OFFSET-254);MAX LEGAL
LineXY(30,#SCOPE_Y_OFFSET-235, #WIDTH,#SCOPE_Y_OFFSET-235);STUDIO SWING
LineXY(30,#SCOPE_Y_OFFSET-16, #WIDTH,#SCOPE_Y_OFFSET-16);STUDIO SWING
LineXY(30,#SCOPE_Y_OFFSET-1, #WIDTH,#SCOPE_Y_OFFSET-1);MIN LEGAL
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(2,265-254, "254", $00ffff)
DrawText(2,265-235, "235", $00ffff)
DrawText(2,265-16, "16", $00ffff)
DrawText(2,265-1, " 1", $00ffff)
StopDrawing()
SetGadgetState(#scopeGadget,ImageID(2))
cvWaitKey(1)
EndIf
Until WindowEvent() = #PB_Event_CloseWindow
EndIf
cvDestroyWindow(#CV_WINDOW_NAME)
FreeGadget(#scopeGadget)
CloseWindow(0)
FreeImage(1):FreeImage(2)
cvReleaseCapture(@*capture)
;cvReleaseImage(@*image);NOT NEEDED
ClosePreferences()
EndIf