Hi,
The original example cv_histogram_2.pb from OpenCV 3.1 affecting image brightness/Contrast is working with only Image Gray mode.
So
Code:
*image.IplImage = cvLoadImage(ImageFile, #CV_LOAD_IMAGE_ANYCOLOR | #CV_LOAD_IMAGE_ANYDEPTH) ;#CV_LOAD_IMAGE_GRAYSCALE)
causing fail on
Code:
cvCalcHist(@*clone, *histogram, #False, #Null)
line
Code:
IncludeFile "includes/cv_functions.pbi"
Global openCV, *save.IplImage, exitCV, lpPrevWndFunc, nBrightness, nContrast, Dim lut.b(256)
#CV_WINDOW_NAME = "PureBasic Interface to OpenCV"
#CV_DESCRIPTION = "Calculates a histogram based on brightness and contrast levels." + #LF$ + #LF$ +
"- TRACKBAR 1: Adjust the brightness." + #LF$ + #LF$ +
"- TRACKBAR 2: Adjust the contrast."
Procedure WindowCallback(hWnd, Msg, wParam, lParam)
Select Msg
Case #WM_COMMAND
Select wParam
Case 1
openCV = #True
keybd_event_(#VK_ESCAPE, 0, 0, 0)
Case 2
FileName.s = SaveCVImage()
If FileName
params.SAVE_INFO
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, Msg, wParam, lParam)
EndProcedure
ProcedureC CvMouseCallback(event, x.l, y.l, flags, *param.USER_INFO)
Select event
Case #CV_EVENT_RBUTTONDOWN
*save = *param\uPointer1
DisplayPopupMenu(0, *param\uValue)
EndSelect
EndProcedure
Procedure UpdateBrightnessContrast()
Dim lut.b(256)
brightness = nBrightness - 100
contrast = nContrast - 100
If contrast > 0
delta.d = 127 * contrast / 100
a.d = 255 / (255 - delta * 2)
b.d = a * (brightness - delta)
Else
delta.d = -128 * contrast / 100
a.d = (256 - delta * 2) / 255
b.d = a * brightness + delta
EndIf
For i = 0 To 256 - 1
v = Round(a * i + b, #PB_Round_Nearest)
If v < 0 : v = 0 : EndIf
If v > 255 : v = 255 : EndIf
lut(i) = v
Next
EndProcedure
ProcedureC CvTrackbarCallback1(pos)
nBrightness = pos
UpdateBrightnessContrast()
keybd_event_(#VK_RETURN, 0, 0, 0)
EndProcedure
ProcedureC CvTrackbarCallback2(pos)
nContrast = pos
UpdateBrightnessContrast()
keybd_event_(#VK_RETURN, 0, 0, 0)
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))
Debug "OK0"
*image.IplImage = cvLoadImage(ImageFile, #CV_LOAD_IMAGE_GRAYSCALE);#CV_LOAD_IMAGE_ANYCOLOR );| #CV_LOAD_IMAGE_ANYDEPTH);, #CV_LOAD_IMAGE_GRAYSCALE)
Debug "OK1"
dtWidth = DesktopWidth(0)
dtHeight = DesktopHeight(0)
If *image\width >= dtWidth - 100 Or *image\height >= dtHeight - (100 + 48 + 42)
iWidth = dtWidth - 100
iRatio1.d = iWidth / *image\width
iHeight = dtHeight - (100 + 48 + 42)
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 + 48 + 42)
PokeL(@*size, iWidth) : PokeL(@*size + 4, iHeight)
*resize.IplImage = cvCreateImage(*size, #IPL_DEPTH_8U, *image\nChannels)
cvResize(*image, *resize, #CV_INTER_AREA)
Else
cvResizeWindow(#CV_WINDOW_NAME, *image\width, *image\height + 48 + 42)
*resize.IplImage = cvCloneImage(*image)
EndIf
cvMoveWindow(#CV_WINDOW_NAME, 20, 20)
ToolTip(window_handle, #CV_DESCRIPTION)
Debug "OK2"
If *resize\width > 200 And *resize\height > 200
nBrightness = 100 : nContrast = 100
cvCreateTrackbar("Brightness", #CV_WINDOW_NAME, @nBrightness, 201, @CvTrackbarCallback1())
cvCreateTrackbar("Contrast", #CV_WINDOW_NAME, @nContrast, 201, @CvTrackbarCallback2())
*clone.IplImage = cvCloneImage(*resize)
PokeL(@*size, 193) : PokeL(@*size + 4, 100)
*hist.IplImage = cvCreateImage(*size, #IPL_DEPTH_8U, 1)
cvGetSize(@*get_size, *resize)
*gray.IplImage = cvCreateImage(*get_size, #IPL_DEPTH_8U, 1)
*color.IplImage = cvCreateImage(*get_size, #IPL_DEPTH_8U, 3)
*lut = cvCreateMatHeader(1, 256, CV_MAKETYPE(#CV_8U, 1))
bins = 64 : Dim range.f(2) : range(0) = 0 : range(1) = 256
*ranges.FLOAT : PokeL(@*ranges, @range())
*histogram.CvHistogram = cvCreateHist(1, @bins, #CV_HIST_ARRAY, @*ranges, #True)
cvSetData(*lut, @lut(), 0)
UpdateBrightnessContrast()
*param.USER_INFO = AllocateMemory(SizeOf(USER_INFO))
*param\uPointer1 = *gray
*param\uValue = window_handle
cvSetMouseCallback(*window_name, @CvMouseCallback(), *param)
color1.CvScalar : color1\val[0] = 0 : color1\val[1] = 0 : color1\val[2] = 0 : color1\val[3] = 0
color2.CvScalar : color2\val[0] = 0 : color2\val[1] = 255 : color2\val[2] = 255 : color2\val[3] = 0
value1.CvScalar : value1\val[0] = 255 : value1\val[1] = 255 : value1\val[2] = 255 : value1\val[3] = 0
value2.CvScalar : value2\val[0] = 0 : value2\val[1] = 0 : value2\val[2] = 0 : value2\val[3] = 0
rect.CvRect : rect\x = 20 : rect\y = 20 : rect\width = 193 : rect\height = 100
r.CvRect : r\x = 19 : r\y = 19 : r\width = 193 + 2 : r\height = 100 + 2
Debug "OK3"
Repeat
If *resize
cvSetZero(*clone)
Debug "OK4"
cvLUT(*resize, *clone, *lut)
Debug "OK5"
cvCalcHist(@*clone, *histogram, #False, #Null)
Debug "OK6"
cvGetMinMaxHistValue(*histogram, #Null, @max_value.f, #Null, #Null)
Debug "OK7"
cvConvertScale(*histogram\bins, *histogram\bins, *hist\height / max_value, 0)
Debug "OK8"
cvSet(*hist, @value1, #Null)
bin = Round(*hist\width / bins, #PB_Round_Nearest)
For i = 0 To bins - 1
x1 = i * bin
y1 = *hist\height
x2 = (i + 1) * bin
y2 = *hist\height - Round(cvGetReal1D(*histogram\bins, i), #PB_Round_Nearest)
PokeL(@*pt1, x1) : PokeL(@*pt1 + 4, y1)
PokeL(@*pt2, x2) : PokeL(@*pt2 + 4, y2)
cvRectangle(*hist, *pt1, *pt2, @color1, #CV_FILLED, #CV_AA, #Null)
Next
cvCopy(*clone, *gray, #Null)
cvSetImageROI(*gray, @rect)
cvAndS(*gray, @value2, *gray, #Null)
cvAdd(*gray, *hist, *gray, #Null)
cvResetImageROI(*gray)
cvCvtColor(*gray, *color, #CV_GRAY2BGR, 1)
cvRectangleR(*color, @r, @color2, 2, #CV_AA, #Null)
cvShowImage(#CV_WINDOW_NAME, *color)
keyPressed = cvWaitKey(0)
EndIf
Until keyPressed = 27 Or exitCV
FreeMemory(*param)
cvReleaseImage(@*resize)
cvReleaseImage(@*image)
cvDestroyAllWindows()
If openCV
openCV = #False
exitCV = #False
OpenCV(OpenCVImage())
EndIf
Else
MessageRequester(#CV_WINDOW_NAME, ImageFile + #LF$ + #LF$ + "... does not meet the size requirements, please try another image.", #MB_ICONERROR)
cvReleaseHist(@*histogram)
cvReleaseMat(@*lut)
cvReleaseImage(@*color)
cvReleaseImage(@*gray)
cvReleaseImage(@*hist)
cvReleaseImage(@*clone)
cvReleaseImage(@*resize)
cvReleaseImage(@*image)
cvDestroyAllWindows()
exitCV = #False
OpenCV(OpenCVImage())
EndIf
EndIf
EndProcedure
ExamineDesktops()
OpenCV("images/building.jpg")
Thank You very much