From 9a6dabf3b53990ed8c5226d7ba5c3a5f242c55ab Mon Sep 17 00:00:00 2001 From: Andrews Sobral <andrewssobral@gmail.com> Date: Sun, 16 Feb 2014 22:47:36 +0100 Subject: [PATCH] bgslibrary v1.9.0 35 algorithms available --- CMakeLists.txt | 52 + COPYING.txt | 674 ++++++ Config.h | 22 + Demo.cpp | 182 ++ FrameProcessor.cpp | 557 +++++ FrameProcessor.h | 235 ++ IFrameProcessor.h | 26 + LICENSE.txt | 12 + Main.cpp | 82 + PreProcessor.cpp | 146 ++ PreProcessor.h | 49 + README.txt | 16 + VideoAnalysis.cpp | 130 + VideoAnalysis.h | 45 + VideoCapture.cpp | 275 +++ VideoCapture.h | 63 + bgslibrary_vs2010_opencv.txt | 39 + config/FrameProcessor.xml | 38 + config/PreProcessor.xml | 6 + config/VideoCapture.xml | 13 + dataset/video.avi | Bin 0 -> 1049784 bytes demos/DemoFrameDifferenceBGS.cpp | 49 + demos/DemoMultiLayerBGS.cpp | 49 + package_analysis/ForegroundMaskAnalysis.cpp | 101 + package_analysis/ForegroundMaskAnalysis.h | 42 + package_bgs/AdaptiveBackgroundLearning.cpp | 111 + package_bgs/AdaptiveBackgroundLearning.h | 50 + .../AdaptiveSelectiveBackgroundLearning.cpp | 131 + .../AdaptiveSelectiveBackgroundLearning.h | 49 + package_bgs/FrameDifferenceBGS.cpp | 83 + package_bgs/FrameDifferenceBGS.h | 44 + package_bgs/GMG.cpp | 99 + package_bgs/GMG.h | 45 + package_bgs/IBGS.h | 33 + package_bgs/MixtureOfGaussianV1BGS.cpp | 95 + package_bgs/MixtureOfGaussianV1BGS.h | 47 + package_bgs/MixtureOfGaussianV2BGS.cpp | 98 + package_bgs/MixtureOfGaussianV2BGS.h | 47 + package_bgs/StaticFrameDifferenceBGS.cpp | 79 + package_bgs/StaticFrameDifferenceBGS.h | 45 + package_bgs/WeightedMovingMeanBGS.cpp | 122 + package_bgs/WeightedMovingMeanBGS.h | 47 + package_bgs/WeightedMovingVarianceBGS.cpp | 161 ++ package_bgs/WeightedMovingVarianceBGS.h | 48 + package_bgs/ae/KDE.cpp | 128 + package_bgs/ae/KDE.h | 58 + package_bgs/ae/KernelTable.cpp | 116 + package_bgs/ae/KernelTable.h | 71 + package_bgs/ae/NPBGSubtractor.cpp | 1160 +++++++++ package_bgs/ae/NPBGSubtractor.h | 154 ++ package_bgs/ae/NPBGmodel.cpp | 127 + package_bgs/ae/NPBGmodel.h | 111 + package_bgs/av/TBackground.cpp | 166 ++ package_bgs/av/TBackground.h | 51 + package_bgs/av/TBackgroundVuMeter.cpp | 380 +++ package_bgs/av/TBackgroundVuMeter.h | 67 + package_bgs/av/VuMeter.cpp | 116 + package_bgs/av/VuMeter.h | 53 + package_bgs/ck/LbpMrf.cpp | 87 + package_bgs/ck/LbpMrf.h | 44 + package_bgs/ck/MEDefs.cpp | 40 + package_bgs/ck/MEDefs.hpp | 83 + package_bgs/ck/MEHistogram.cpp | 508 ++++ package_bgs/ck/MEHistogram.hpp | 348 +++ package_bgs/ck/MEImage.cpp | 1472 ++++++++++++ package_bgs/ck/MEImage.hpp | 999 ++++++++ package_bgs/ck/MotionDetection.cpp | 1425 +++++++++++ package_bgs/ck/MotionDetection.hpp | 401 ++++ package_bgs/ck/README.TXT | 135 ++ package_bgs/ck/block.h | 286 +++ package_bgs/ck/graph.cpp | 80 + package_bgs/ck/graph.h | 180 ++ package_bgs/ck/maxflow.cpp | 514 ++++ package_bgs/db/IndependentMultimodalBGS.cpp | 54 + package_bgs/db/IndependentMultimodalBGS.h | 29 + package_bgs/db/imbs.cpp | 748 ++++++ package_bgs/db/imbs.hpp | 178 ++ package_bgs/dp/AdaptiveMedianBGS.cpp | 140 ++ package_bgs/dp/AdaptiveMedianBGS.h | 89 + package_bgs/dp/Bgs.h | 67 + package_bgs/dp/BgsParams.h | 59 + package_bgs/dp/DPAdaptiveMedianBGS.cpp | 104 + package_bgs/dp/DPAdaptiveMedianBGS.h | 56 + package_bgs/dp/DPEigenbackgroundBGS.cpp | 106 + package_bgs/dp/DPEigenbackgroundBGS.h | 56 + package_bgs/dp/DPGrimsonGMMBGS.cpp | 105 + package_bgs/dp/DPGrimsonGMMBGS.h | 56 + package_bgs/dp/DPMeanBGS.cpp | 105 + package_bgs/dp/DPMeanBGS.h | 56 + package_bgs/dp/DPPratiMediodBGS.cpp | 107 + package_bgs/dp/DPPratiMediodBGS.h | 57 + package_bgs/dp/DPTextureBGS.cpp | 156 ++ package_bgs/dp/DPTextureBGS.h | 60 + package_bgs/dp/DPWrenGABGS.cpp | 105 + package_bgs/dp/DPWrenGABGS.h | 56 + package_bgs/dp/DPZivkovicAGMMBGS.cpp | 104 + package_bgs/dp/DPZivkovicAGMMBGS.h | 56 + package_bgs/dp/Eigenbackground.cpp | 190 ++ package_bgs/dp/Eigenbackground.h | 101 + package_bgs/dp/Error.cpp | 57 + package_bgs/dp/Error.h | 36 + package_bgs/dp/GrimsonGMM.cpp | 332 +++ package_bgs/dp/GrimsonGMM.h | 150 ++ package_bgs/dp/Image.cpp | 76 + package_bgs/dp/Image.h | 364 +++ package_bgs/dp/MeanBGS.cpp | 131 + package_bgs/dp/MeanBGS.h | 98 + package_bgs/dp/PratiMediodBGS.cpp | 276 +++ package_bgs/dp/PratiMediodBGS.h | 142 ++ package_bgs/dp/TextureBGS.cpp | 153 ++ package_bgs/dp/TextureBGS.h | 55 + package_bgs/dp/WrenGA.cpp | 174 ++ package_bgs/dp/WrenGA.h | 120 + package_bgs/dp/ZivkovicAGMM.cpp | 411 ++++ package_bgs/dp/ZivkovicAGMM.h | 160 ++ package_bgs/jmo/BGS.h | 216 ++ package_bgs/jmo/BackgroundSubtractionAPI.h | 158 ++ package_bgs/jmo/BlobExtraction.cpp | 1490 ++++++++++++ package_bgs/jmo/BlobExtraction.h | 76 + package_bgs/jmo/BlobLibraryConfiguration.h | 62 + package_bgs/jmo/BlobResult.cpp | 920 +++++++ package_bgs/jmo/BlobResult.h | 213 ++ package_bgs/jmo/CMultiLayerBGS.cpp | 2128 +++++++++++++++++ package_bgs/jmo/CMultiLayerBGS.h | 313 +++ package_bgs/jmo/LocalBinaryPattern.cpp | 314 +++ package_bgs/jmo/LocalBinaryPattern.h | 103 + package_bgs/jmo/MultiLayerBGS.cpp | 332 +++ package_bgs/jmo/MultiLayerBGS.h | 101 + package_bgs/jmo/OpenCvDataConversion.h | 224 ++ package_bgs/jmo/blob.cpp | 1149 +++++++++ package_bgs/jmo/blob.h | 853 +++++++ package_bgs/lb/BGModel.cpp | 87 + package_bgs/lb/BGModel.h | 78 + package_bgs/lb/BGModelFuzzyGauss.cpp | 210 ++ package_bgs/lb/BGModelFuzzyGauss.h | 75 + package_bgs/lb/BGModelFuzzySom.cpp | 298 +++ package_bgs/lb/BGModelFuzzySom.h | 95 + package_bgs/lb/BGModelGauss.cpp | 200 ++ package_bgs/lb/BGModelGauss.h | 73 + package_bgs/lb/BGModelMog.cpp | 309 +++ package_bgs/lb/BGModelMog.h | 83 + package_bgs/lb/BGModelSom.cpp | 291 +++ package_bgs/lb/BGModelSom.h | 92 + package_bgs/lb/LBAdaptiveSOM.cpp | 109 + package_bgs/lb/LBAdaptiveSOM.h | 56 + package_bgs/lb/LBFuzzyAdaptiveSOM.cpp | 109 + package_bgs/lb/LBFuzzyAdaptiveSOM.h | 56 + package_bgs/lb/LBFuzzyGaussian.cpp | 105 + package_bgs/lb/LBFuzzyGaussian.h | 55 + package_bgs/lb/LBMixtureOfGaussians.cpp | 105 + package_bgs/lb/LBMixtureOfGaussians.h | 55 + package_bgs/lb/LBSimpleGaussian.cpp | 100 + package_bgs/lb/LBSimpleGaussian.h | 54 + package_bgs/lb/Types.h | 99 + package_bgs/my/MyBGS.cpp | 26 + package_bgs/my/MyBGS.h | 22 + package_bgs/pt/PBAS.cpp | 586 +++++ package_bgs/pt/PBAS.h | 207 ++ .../pt/PixelBasedAdaptiveSegmenter.cpp | 124 + package_bgs/pt/PixelBasedAdaptiveSegmenter.h | 58 + package_bgs/sjn/SJN_MultiCueBGS.cpp | 2062 ++++++++++++++++ package_bgs/sjn/SJN_MultiCueBGS.h | 243 ++ package_bgs/tb/FuzzyChoquetIntegral.cpp | 204 ++ package_bgs/tb/FuzzyChoquetIntegral.h | 55 + package_bgs/tb/FuzzySugenoIntegral.cpp | 204 ++ package_bgs/tb/FuzzySugenoIntegral.h | 55 + package_bgs/tb/FuzzyUtils.cpp | 511 ++++ package_bgs/tb/FuzzyUtils.h | 54 + package_bgs/tb/MRF.cpp | 339 +++ package_bgs/tb/MRF.h | 107 + package_bgs/tb/PerformanceUtils.cpp | 521 ++++ package_bgs/tb/PerformanceUtils.h | 54 + package_bgs/tb/PixelUtils.cpp | 351 +++ package_bgs/tb/PixelUtils.h | 61 + package_bgs/tb/T2FGMM.cpp | 337 +++ package_bgs/tb/T2FGMM.h | 135 ++ package_bgs/tb/T2FGMM_UM.cpp | 111 + package_bgs/tb/T2FGMM_UM.h | 58 + package_bgs/tb/T2FGMM_UV.cpp | 111 + package_bgs/tb/T2FGMM_UV.h | 58 + package_bgs/tb/T2FMRF.cpp | 432 ++++ package_bgs/tb/T2FMRF.h | 164 ++ package_bgs/tb/T2FMRF_UM.cpp | 140 ++ package_bgs/tb/T2FMRF_UM.h | 64 + package_bgs/tb/T2FMRF_UV.cpp | 140 ++ package_bgs/tb/T2FMRF_UV.h | 64 + run_camera.sh | 3 + run_demo.sh | 3 + run_video.sh | 3 + vs2010/bgslibrary.sln | 20 + vs2010/bgslibrary.suo | Bin 0 -> 11776 bytes vs2010/bgslibrary.vcxproj | 220 ++ vs2010/bgslibrary.vcxproj.filters | 444 ++++ vs2010/bgslibrary.vcxproj.user | 8 + 194 files changed, 39237 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 COPYING.txt create mode 100644 Config.h create mode 100644 Demo.cpp create mode 100644 FrameProcessor.cpp create mode 100644 FrameProcessor.h create mode 100644 IFrameProcessor.h create mode 100644 LICENSE.txt create mode 100644 Main.cpp create mode 100644 PreProcessor.cpp create mode 100644 PreProcessor.h create mode 100644 README.txt create mode 100644 VideoAnalysis.cpp create mode 100644 VideoAnalysis.h create mode 100644 VideoCapture.cpp create mode 100644 VideoCapture.h create mode 100644 bgslibrary_vs2010_opencv.txt create mode 100644 config/FrameProcessor.xml create mode 100644 config/PreProcessor.xml create mode 100644 config/VideoCapture.xml create mode 100644 dataset/video.avi create mode 100644 demos/DemoFrameDifferenceBGS.cpp create mode 100644 demos/DemoMultiLayerBGS.cpp create mode 100644 package_analysis/ForegroundMaskAnalysis.cpp create mode 100644 package_analysis/ForegroundMaskAnalysis.h create mode 100644 package_bgs/AdaptiveBackgroundLearning.cpp create mode 100644 package_bgs/AdaptiveBackgroundLearning.h create mode 100644 package_bgs/AdaptiveSelectiveBackgroundLearning.cpp create mode 100644 package_bgs/AdaptiveSelectiveBackgroundLearning.h create mode 100644 package_bgs/FrameDifferenceBGS.cpp create mode 100644 package_bgs/FrameDifferenceBGS.h create mode 100644 package_bgs/GMG.cpp create mode 100644 package_bgs/GMG.h create mode 100644 package_bgs/IBGS.h create mode 100644 package_bgs/MixtureOfGaussianV1BGS.cpp create mode 100644 package_bgs/MixtureOfGaussianV1BGS.h create mode 100644 package_bgs/MixtureOfGaussianV2BGS.cpp create mode 100644 package_bgs/MixtureOfGaussianV2BGS.h create mode 100644 package_bgs/StaticFrameDifferenceBGS.cpp create mode 100644 package_bgs/StaticFrameDifferenceBGS.h create mode 100644 package_bgs/WeightedMovingMeanBGS.cpp create mode 100644 package_bgs/WeightedMovingMeanBGS.h create mode 100644 package_bgs/WeightedMovingVarianceBGS.cpp create mode 100644 package_bgs/WeightedMovingVarianceBGS.h create mode 100644 package_bgs/ae/KDE.cpp create mode 100644 package_bgs/ae/KDE.h create mode 100644 package_bgs/ae/KernelTable.cpp create mode 100644 package_bgs/ae/KernelTable.h create mode 100644 package_bgs/ae/NPBGSubtractor.cpp create mode 100644 package_bgs/ae/NPBGSubtractor.h create mode 100644 package_bgs/ae/NPBGmodel.cpp create mode 100644 package_bgs/ae/NPBGmodel.h create mode 100644 package_bgs/av/TBackground.cpp create mode 100644 package_bgs/av/TBackground.h create mode 100644 package_bgs/av/TBackgroundVuMeter.cpp create mode 100644 package_bgs/av/TBackgroundVuMeter.h create mode 100644 package_bgs/av/VuMeter.cpp create mode 100644 package_bgs/av/VuMeter.h create mode 100644 package_bgs/ck/LbpMrf.cpp create mode 100644 package_bgs/ck/LbpMrf.h create mode 100644 package_bgs/ck/MEDefs.cpp create mode 100644 package_bgs/ck/MEDefs.hpp create mode 100644 package_bgs/ck/MEHistogram.cpp create mode 100644 package_bgs/ck/MEHistogram.hpp create mode 100644 package_bgs/ck/MEImage.cpp create mode 100644 package_bgs/ck/MEImage.hpp create mode 100644 package_bgs/ck/MotionDetection.cpp create mode 100644 package_bgs/ck/MotionDetection.hpp create mode 100644 package_bgs/ck/README.TXT create mode 100644 package_bgs/ck/block.h create mode 100644 package_bgs/ck/graph.cpp create mode 100644 package_bgs/ck/graph.h create mode 100644 package_bgs/ck/maxflow.cpp create mode 100644 package_bgs/db/IndependentMultimodalBGS.cpp create mode 100644 package_bgs/db/IndependentMultimodalBGS.h create mode 100644 package_bgs/db/imbs.cpp create mode 100644 package_bgs/db/imbs.hpp create mode 100644 package_bgs/dp/AdaptiveMedianBGS.cpp create mode 100644 package_bgs/dp/AdaptiveMedianBGS.h create mode 100644 package_bgs/dp/Bgs.h create mode 100644 package_bgs/dp/BgsParams.h create mode 100644 package_bgs/dp/DPAdaptiveMedianBGS.cpp create mode 100644 package_bgs/dp/DPAdaptiveMedianBGS.h create mode 100644 package_bgs/dp/DPEigenbackgroundBGS.cpp create mode 100644 package_bgs/dp/DPEigenbackgroundBGS.h create mode 100644 package_bgs/dp/DPGrimsonGMMBGS.cpp create mode 100644 package_bgs/dp/DPGrimsonGMMBGS.h create mode 100644 package_bgs/dp/DPMeanBGS.cpp create mode 100644 package_bgs/dp/DPMeanBGS.h create mode 100644 package_bgs/dp/DPPratiMediodBGS.cpp create mode 100644 package_bgs/dp/DPPratiMediodBGS.h create mode 100644 package_bgs/dp/DPTextureBGS.cpp create mode 100644 package_bgs/dp/DPTextureBGS.h create mode 100644 package_bgs/dp/DPWrenGABGS.cpp create mode 100644 package_bgs/dp/DPWrenGABGS.h create mode 100644 package_bgs/dp/DPZivkovicAGMMBGS.cpp create mode 100644 package_bgs/dp/DPZivkovicAGMMBGS.h create mode 100644 package_bgs/dp/Eigenbackground.cpp create mode 100644 package_bgs/dp/Eigenbackground.h create mode 100644 package_bgs/dp/Error.cpp create mode 100644 package_bgs/dp/Error.h create mode 100644 package_bgs/dp/GrimsonGMM.cpp create mode 100644 package_bgs/dp/GrimsonGMM.h create mode 100644 package_bgs/dp/Image.cpp create mode 100644 package_bgs/dp/Image.h create mode 100644 package_bgs/dp/MeanBGS.cpp create mode 100644 package_bgs/dp/MeanBGS.h create mode 100644 package_bgs/dp/PratiMediodBGS.cpp create mode 100644 package_bgs/dp/PratiMediodBGS.h create mode 100644 package_bgs/dp/TextureBGS.cpp create mode 100644 package_bgs/dp/TextureBGS.h create mode 100644 package_bgs/dp/WrenGA.cpp create mode 100644 package_bgs/dp/WrenGA.h create mode 100644 package_bgs/dp/ZivkovicAGMM.cpp create mode 100644 package_bgs/dp/ZivkovicAGMM.h create mode 100644 package_bgs/jmo/BGS.h create mode 100644 package_bgs/jmo/BackgroundSubtractionAPI.h create mode 100644 package_bgs/jmo/BlobExtraction.cpp create mode 100644 package_bgs/jmo/BlobExtraction.h create mode 100644 package_bgs/jmo/BlobLibraryConfiguration.h create mode 100644 package_bgs/jmo/BlobResult.cpp create mode 100644 package_bgs/jmo/BlobResult.h create mode 100644 package_bgs/jmo/CMultiLayerBGS.cpp create mode 100644 package_bgs/jmo/CMultiLayerBGS.h create mode 100644 package_bgs/jmo/LocalBinaryPattern.cpp create mode 100644 package_bgs/jmo/LocalBinaryPattern.h create mode 100644 package_bgs/jmo/MultiLayerBGS.cpp create mode 100644 package_bgs/jmo/MultiLayerBGS.h create mode 100644 package_bgs/jmo/OpenCvDataConversion.h create mode 100644 package_bgs/jmo/blob.cpp create mode 100644 package_bgs/jmo/blob.h create mode 100644 package_bgs/lb/BGModel.cpp create mode 100644 package_bgs/lb/BGModel.h create mode 100644 package_bgs/lb/BGModelFuzzyGauss.cpp create mode 100644 package_bgs/lb/BGModelFuzzyGauss.h create mode 100644 package_bgs/lb/BGModelFuzzySom.cpp create mode 100644 package_bgs/lb/BGModelFuzzySom.h create mode 100644 package_bgs/lb/BGModelGauss.cpp create mode 100644 package_bgs/lb/BGModelGauss.h create mode 100644 package_bgs/lb/BGModelMog.cpp create mode 100644 package_bgs/lb/BGModelMog.h create mode 100644 package_bgs/lb/BGModelSom.cpp create mode 100644 package_bgs/lb/BGModelSom.h create mode 100644 package_bgs/lb/LBAdaptiveSOM.cpp create mode 100644 package_bgs/lb/LBAdaptiveSOM.h create mode 100644 package_bgs/lb/LBFuzzyAdaptiveSOM.cpp create mode 100644 package_bgs/lb/LBFuzzyAdaptiveSOM.h create mode 100644 package_bgs/lb/LBFuzzyGaussian.cpp create mode 100644 package_bgs/lb/LBFuzzyGaussian.h create mode 100644 package_bgs/lb/LBMixtureOfGaussians.cpp create mode 100644 package_bgs/lb/LBMixtureOfGaussians.h create mode 100644 package_bgs/lb/LBSimpleGaussian.cpp create mode 100644 package_bgs/lb/LBSimpleGaussian.h create mode 100644 package_bgs/lb/Types.h create mode 100644 package_bgs/my/MyBGS.cpp create mode 100644 package_bgs/my/MyBGS.h create mode 100644 package_bgs/pt/PBAS.cpp create mode 100644 package_bgs/pt/PBAS.h create mode 100644 package_bgs/pt/PixelBasedAdaptiveSegmenter.cpp create mode 100644 package_bgs/pt/PixelBasedAdaptiveSegmenter.h create mode 100644 package_bgs/sjn/SJN_MultiCueBGS.cpp create mode 100644 package_bgs/sjn/SJN_MultiCueBGS.h create mode 100644 package_bgs/tb/FuzzyChoquetIntegral.cpp create mode 100644 package_bgs/tb/FuzzyChoquetIntegral.h create mode 100644 package_bgs/tb/FuzzySugenoIntegral.cpp create mode 100644 package_bgs/tb/FuzzySugenoIntegral.h create mode 100644 package_bgs/tb/FuzzyUtils.cpp create mode 100644 package_bgs/tb/FuzzyUtils.h create mode 100644 package_bgs/tb/MRF.cpp create mode 100644 package_bgs/tb/MRF.h create mode 100644 package_bgs/tb/PerformanceUtils.cpp create mode 100644 package_bgs/tb/PerformanceUtils.h create mode 100644 package_bgs/tb/PixelUtils.cpp create mode 100644 package_bgs/tb/PixelUtils.h create mode 100644 package_bgs/tb/T2FGMM.cpp create mode 100644 package_bgs/tb/T2FGMM.h create mode 100644 package_bgs/tb/T2FGMM_UM.cpp create mode 100644 package_bgs/tb/T2FGMM_UM.h create mode 100644 package_bgs/tb/T2FGMM_UV.cpp create mode 100644 package_bgs/tb/T2FGMM_UV.h create mode 100644 package_bgs/tb/T2FMRF.cpp create mode 100644 package_bgs/tb/T2FMRF.h create mode 100644 package_bgs/tb/T2FMRF_UM.cpp create mode 100644 package_bgs/tb/T2FMRF_UM.h create mode 100644 package_bgs/tb/T2FMRF_UV.cpp create mode 100644 package_bgs/tb/T2FMRF_UV.h create mode 100644 run_camera.sh create mode 100644 run_demo.sh create mode 100644 run_video.sh create mode 100644 vs2010/bgslibrary.sln create mode 100644 vs2010/bgslibrary.suo create mode 100644 vs2010/bgslibrary.vcxproj create mode 100644 vs2010/bgslibrary.vcxproj.filters create mode 100644 vs2010/bgslibrary.vcxproj.user diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..9e26507 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,52 @@ + +cmake_minimum_required(VERSION 2.8) + +project(bgs) + +set(CMAKE_CXX_FLAGS "${CMAKE_CSS_FLAGS} -std=gnu++0x") + +find_package(OpenCV REQUIRED) + +if(${OpenCV_VERSION} VERSION_LESS 2.3.1) + message (FATAL_ERROR "OpenCV version is not compatible: ${OpenCV_VERSION}") +endif() + +file(GLOB sources FrameProcessor.cpp PreProcessor.cpp VideoAnalysis.cpp VideoCapture.cpp) +file(GLOB main Main.cpp) +file(GLOB demo Demo.cpp) + +list(REMOVE_ITEM sources ${demo}) + +file(GLOB_RECURSE analysis package_analysis/*.cpp) +file(GLOB_RECURSE bgs package_bgs/*.cpp) +file(GLOB_RECURSE bgs_include package_bgs/*.h) + +# GMG is not available in older OpenCV versions +if(${OpenCV_VERSION} VERSION_LESS 2.4.3) + file(GLOB gmg package_bgs/GMG.cpp) + list(REMOVE_ITEM bgs ${gmg}) +endif() + +include_directories(${CMAKE_SOURCE_DIR}) + +add_library(bgs SHARED ${sources} ${bgs} ${analysis}) +target_link_libraries(bgs ${OpenCV_LIBS}) +set_property(TARGET bgs PROPERTY PUBLIC_HEADER ${bgs_include}) + +add_executable(bgs_bin ${main}) +target_link_libraries(bgs_bin ${OpenCV_LIBS} bgs) +set_target_properties(bgs_bin + PROPERTIES OUTPUT_NAME bgs) + +add_executable(bgs_demo ${demo}) +target_link_libraries(bgs_demo ${OpenCV_LIBS} bgs) + +INSTALL(TARGETS bgs + bgs_demo + bgs_bin + RUNTIME DESTINATION bin COMPONENT app + LIBRARY DESTINATION lib COMPONENT runtime + ARCHIVE DESTINATION lib COMPONENT runtime + PUBLIC_HEADER DESTINATION include/package_bgs COMPONENT dev + FRAMEWORK DESTINATION "/Library/Frameworks" +) diff --git a/COPYING.txt b/COPYING.txt new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/COPYING.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/Config.h b/Config.h new file mode 100644 index 0000000..01cf721 --- /dev/null +++ b/Config.h @@ -0,0 +1,22 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +const int KEY_REPEAT = 'r'; +const int KEY_SPACE = 32; +const int KEY_ESC = 27; +const int KEY_ESC2 = 'q'; diff --git a/Demo.cpp b/Demo.cpp new file mode 100644 index 0000000..3936976 --- /dev/null +++ b/Demo.cpp @@ -0,0 +1,182 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "package_bgs/FrameDifferenceBGS.h" +#include "package_bgs/StaticFrameDifferenceBGS.h" +#include "package_bgs/WeightedMovingMeanBGS.h" +#include "package_bgs/WeightedMovingVarianceBGS.h" +#include "package_bgs/MixtureOfGaussianV1BGS.h" +#include "package_bgs/MixtureOfGaussianV2BGS.h" +#include "package_bgs/AdaptiveBackgroundLearning.h" +#include "package_bgs/AdaptiveSelectiveBackgroundLearning.h" + +#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3 +#include "package_bgs/GMG.h" +#endif + +#include "package_bgs/dp/DPAdaptiveMedianBGS.h" +#include "package_bgs/dp/DPGrimsonGMMBGS.h" +#include "package_bgs/dp/DPZivkovicAGMMBGS.h" +#include "package_bgs/dp/DPMeanBGS.h" +#include "package_bgs/dp/DPWrenGABGS.h" +#include "package_bgs/dp/DPPratiMediodBGS.h" +#include "package_bgs/dp/DPEigenbackgroundBGS.h" +#include "package_bgs/dp/DPTextureBGS.h" + +#include "package_bgs/tb/T2FGMM_UM.h" +#include "package_bgs/tb/T2FGMM_UV.h" +#include "package_bgs/tb/T2FMRF_UM.h" +#include "package_bgs/tb/T2FMRF_UV.h" +#include "package_bgs/tb/FuzzySugenoIntegral.h" +#include "package_bgs/tb/FuzzyChoquetIntegral.h" + +#include "package_bgs/lb/LBSimpleGaussian.h" +#include "package_bgs/lb/LBFuzzyGaussian.h" +#include "package_bgs/lb/LBMixtureOfGaussians.h" +#include "package_bgs/lb/LBAdaptiveSOM.h" +#include "package_bgs/lb/LBFuzzyAdaptiveSOM.h" + +#if !defined(_WIN32) +// Currently this method works only on Linux platform. +#include "package_bgs/ck/LbpMrf.h" +#endif + +#include "package_bgs/jmo/MultiLayerBGS.h" +#include "package_bgs/pt/PixelBasedAdaptiveSegmenter.h" +#include "package_bgs/av/VuMeter.h" +#include "package_bgs/ae/KDE.h" +#include "package_bgs/db/IndependentMultimodalBGS.h" +#include "package_bgs/sjn/SJN_MultiCueBGS.h" + +void main(int argc, char **argv) +{ + std::cout << "Using OpenCV " << CV_MAJOR_VERSION << "." << CV_MINOR_VERSION << "." << CV_SUBMINOR_VERSION << std::endl; + + CvCapture *capture = 0; + int resize_factor = 100; + + if(argc > 1) + { + std::cout << "Openning: " << argv[1] << std::endl; + capture = cvCaptureFromAVI(argv[1]); + } + else + { + capture = cvCaptureFromCAM(0); + resize_factor = 50; // set size = 50% of original image + } + + if(!capture) + { + std::cerr << "Cannot initialize video!" << std::endl; + return; + } + + IplImage *frame_aux = cvQueryFrame(capture); + IplImage *frame = cvCreateImage(cvSize((int)((frame_aux->width*resize_factor)/100) , (int)((frame_aux->height*resize_factor)/100)), frame_aux->depth, frame_aux->nChannels); + cvResize(frame_aux, frame); + + /* Background Subtraction Methods */ + IBGS *bgs; + + /*** Default Package ***/ + bgs = new FrameDifferenceBGS; + //bgs = new StaticFrameDifferenceBGS; + //bgs = new WeightedMovingMeanBGS; + //bgs = new WeightedMovingVarianceBGS; + //bgs = new MixtureOfGaussianV1BGS; + //bgs = new MixtureOfGaussianV2BGS; + //bgs = new AdaptiveBackgroundLearning; + //bgs = new AdaptiveSelectiveBackgroundLearning; + //bgs = new GMG; + + /*** DP Package (thanks to Donovan Parks) ***/ + //bgs = new DPAdaptiveMedianBGS; + //bgs = new DPGrimsonGMMBGS; + //bgs = new DPZivkovicAGMMBGS; + //bgs = new DPMeanBGS; + //bgs = new DPWrenGABGS; + //bgs = new DPPratiMediodBGS; + //bgs = new DPEigenbackgroundBGS; + //bgs = new DPTextureBGS; + + /*** TB Package (thanks to Thierry Bouwmans, Fida EL BAF and Zhenjie Zhao) ***/ + //bgs = new T2FGMM_UM; + //bgs = new T2FGMM_UV; + //bgs = new T2FMRF_UM; + //bgs = new T2FMRF_UV; + //bgs = new FuzzySugenoIntegral; + //bgs = new FuzzyChoquetIntegral; + + /*** JMO Package (thanks to Jean-Marc Odobez) ***/ + //bgs = new MultiLayerBGS; + + /*** PT Package (thanks to Martin Hofmann, Philipp Tiefenbacher and Gerhard Rigoll) ***/ + //bgs = new PixelBasedAdaptiveSegmenter; + + /*** LB Package (thanks to Laurence Bender) ***/ + //bgs = new LBSimpleGaussian; + //bgs = new LBFuzzyGaussian; + //bgs = new LBMixtureOfGaussians; + //bgs = new LBAdaptiveSOM; + //bgs = new LBFuzzyAdaptiveSOM; + + /*** LBP-MRF Package (thanks to Csaba Kertész) ***/ + //bgs = new LbpMrf; + + /*** AV Package (thanks to Lionel Robinault and Antoine Vacavant) ***/ + //bgs = new VuMeter; + + /*** EG Package (thanks to Ahmed Elgammal) ***/ + //bgs = new KDE; + + /*** DB Package (thanks to Domenico Daniele Bloisi) ***/ + //bgs = new IndependentMultimodalBGS; + + /*** SJN Package (thanks to SeungJong Noh) ***/ + //bgs = new SJN_MultiCueBGS; + + int key = 0; + while(key != 'q') + { + frame_aux = cvQueryFrame(capture); + if(!frame_aux) break; + + cvResize(frame_aux, frame); + + cv::Mat img_input(frame); + cv::imshow("input", img_input); + + cv::Mat img_mask; + cv::Mat img_bkgmodel; + bgs->process(img_input, img_mask, img_bkgmodel); // by default, it shows automatically the foreground mask image + + //if(!img_mask.empty()) + // cv::imshow("Foreground", img_mask); + // do something + + key = cvWaitKey(33); + } + + delete bgs; + + cvDestroyAllWindows(); + cvReleaseCapture(&capture); +} diff --git a/FrameProcessor.cpp b/FrameProcessor.cpp new file mode 100644 index 0000000..585cb9b --- /dev/null +++ b/FrameProcessor.cpp @@ -0,0 +1,557 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "FrameProcessor.h" + +FrameProcessor::FrameProcessor() : firstTime(true), frameNumber(0), duration(0), tictoc(""), frameToStop(0) +{ + std::cout << "FrameProcessor()" << std::endl; + + loadConfig(); + saveConfig(); +} + +FrameProcessor::~FrameProcessor() +{ + std::cout << "~FrameProcessor()" << std::endl; +} + +void FrameProcessor::init() +{ + if(enablePreProcessor) + preProcessor = new PreProcessor; + + if(enableFrameDifferenceBGS) + frameDifference = new FrameDifferenceBGS; + + if(enableStaticFrameDifferenceBGS) + staticFrameDifference = new StaticFrameDifferenceBGS; + + if(enableWeightedMovingMeanBGS) + weightedMovingMean = new WeightedMovingMeanBGS; + + if(enableWeightedMovingVarianceBGS) + weightedMovingVariance = new WeightedMovingVarianceBGS; + + if(enableMixtureOfGaussianV1BGS) + mixtureOfGaussianV1BGS = new MixtureOfGaussianV1BGS; + + if(enableMixtureOfGaussianV2BGS) + mixtureOfGaussianV2BGS = new MixtureOfGaussianV2BGS; + + if(enableAdaptiveBackgroundLearning) + adaptiveBackgroundLearning = new AdaptiveBackgroundLearning; + +#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3 + if(enableGMG) + gmg = new GMG; +#endif + + if(enableDPAdaptiveMedianBGS) + adaptiveMedian = new DPAdaptiveMedianBGS; + + if(enableDPGrimsonGMMBGS) + grimsonGMM = new DPGrimsonGMMBGS; + + if(enableDPZivkovicAGMMBGS) + zivkovicAGMM = new DPZivkovicAGMMBGS; + + if(enableDPMeanBGS) + temporalMean = new DPMeanBGS; + + if(enableDPWrenGABGS) + wrenGA = new DPWrenGABGS; + + if(enableDPPratiMediodBGS) + pratiMediod = new DPPratiMediodBGS; + + if(enableDPEigenbackgroundBGS) + eigenBackground = new DPEigenbackgroundBGS; + + if(enableDPTextureBGS) + textureBGS = new DPTextureBGS; + + if(enableT2FGMM_UM) + type2FuzzyGMM_UM = new T2FGMM_UM; + + if(enableT2FGMM_UV) + type2FuzzyGMM_UV = new T2FGMM_UV; + + if(enableT2FMRF_UM) + type2FuzzyMRF_UM = new T2FMRF_UM; + + if(enableT2FMRF_UV) + type2FuzzyMRF_UV = new T2FMRF_UV; + + if(enableFuzzySugenoIntegral) + fuzzySugenoIntegral = new FuzzySugenoIntegral; + + if(enableFuzzyChoquetIntegral) + fuzzyChoquetIntegral = new FuzzyChoquetIntegral; + + if(enableLBSimpleGaussian) + lbSimpleGaussian = new LBSimpleGaussian; + + if(enableLBFuzzyGaussian) + lbFuzzyGaussian = new LBFuzzyGaussian; + + if(enableLBMixtureOfGaussians) + lbMixtureOfGaussians = new LBMixtureOfGaussians; + + if(enableLBAdaptiveSOM) + lbAdaptiveSOM = new LBAdaptiveSOM; + + if(enableLBFuzzyAdaptiveSOM) + lbFuzzyAdaptiveSOM = new LBFuzzyAdaptiveSOM; + + #if !defined(_WIN32) + if(enableLbpMrf) + lbpMrf = new LbpMrf; + #endif + + if(enableMultiLayerBGS) + multiLayerBGS = new MultiLayerBGS; + + if(enablePBAS) + pixelBasedAdaptiveSegmenter = new PixelBasedAdaptiveSegmenter; + + if(enableVuMeter) + vuMeter = new VuMeter; + + if(enableKDE) + kde = new KDE; + + if(enableForegroundMaskAnalysis) + foregroundMaskAnalysis = new ForegroundMaskAnalysis; +} + +void FrameProcessor::process(std::string name, IBGS *bgs, const cv::Mat &img_input, cv::Mat &img_bgs) +{ + if(tictoc == name) + tic(name); + + cv::Mat img_bkgmodel; + bgs->process(img_input, img_bgs, img_bkgmodel); + + if(tictoc == name) + toc(); +} + +void FrameProcessor::process(const cv::Mat &img_input) +{ + frameNumber++; + + if(enablePreProcessor) + preProcessor->process(img_input, img_prep); + + if(enableFrameDifferenceBGS) + process("FrameDifferenceBGS", frameDifference, img_prep, img_framediff); + + if(enableStaticFrameDifferenceBGS) + process("StaticFrameDifferenceBGS", staticFrameDifference, img_prep, img_staticfdiff); + + if(enableWeightedMovingMeanBGS) + process("WeightedMovingMeanBGS", weightedMovingMean, img_prep, img_wmovmean); + + if(enableWeightedMovingVarianceBGS) + process("WeightedMovingVarianceBGS", weightedMovingVariance, img_prep, img_movvar); + + if(enableMixtureOfGaussianV1BGS) + process("MixtureOfGaussianV1BGS", mixtureOfGaussianV1BGS, img_prep, img_mog1); + + if(enableMixtureOfGaussianV2BGS) + process("MixtureOfGaussianV2BGS", mixtureOfGaussianV2BGS, img_prep, img_mog2); + + if(enableAdaptiveBackgroundLearning) + process("AdaptiveBackgroundLearning", adaptiveBackgroundLearning, img_prep, img_bkgl_fgmask); + +#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3 + if(enableGMG) + process("GMG", gmg, img_prep, img_gmg); +#endif + + if(enableDPAdaptiveMedianBGS) + process("DPAdaptiveMedianBGS", adaptiveMedian, img_prep, img_adpmed); + + if(enableDPGrimsonGMMBGS) + process("DPGrimsonGMMBGS", grimsonGMM, img_prep, img_grigmm); + + if(enableDPZivkovicAGMMBGS) + process("DPZivkovicAGMMBGS", zivkovicAGMM, img_prep, img_zivgmm); + + if(enableDPMeanBGS) + process("DPMeanBGS", temporalMean, img_prep, img_tmpmean); + + if(enableDPWrenGABGS) + process("DPWrenGABGS", wrenGA, img_prep, img_wrenga); + + if(enableDPPratiMediodBGS) + process("DPPratiMediodBGS", pratiMediod, img_prep, img_pramed); + + if(enableDPEigenbackgroundBGS) + process("DPEigenbackgroundBGS", eigenBackground, img_prep, img_eigbkg); + + if(enableDPTextureBGS) + process("DPTextureBGS", textureBGS, img_prep, img_texbgs); + + if(enableT2FGMM_UM) + process("T2FGMM_UM", type2FuzzyGMM_UM, img_prep, img_t2fgmm_um); + + if(enableT2FGMM_UV) + process("T2FGMM_UV", type2FuzzyGMM_UV, img_prep, img_t2fgmm_uv); + + if(enableT2FMRF_UM) + process("T2FMRF_UM", type2FuzzyMRF_UM, img_prep, img_t2fmrf_um); + + if(enableT2FMRF_UV) + process("T2FMRF_UV", type2FuzzyMRF_UV, img_prep, img_t2fmrf_uv); + + if(enableFuzzySugenoIntegral) + process("FuzzySugenoIntegral", fuzzySugenoIntegral, img_prep, img_fsi); + + if(enableFuzzyChoquetIntegral) + process("FuzzyChoquetIntegral", fuzzyChoquetIntegral, img_prep, img_fci); + + if(enableLBSimpleGaussian) + process("LBSimpleGaussian", lbSimpleGaussian, img_prep, img_lb_sg); + + if(enableLBFuzzyGaussian) + process("LBFuzzyGaussian", lbFuzzyGaussian, img_prep, img_lb_fg); + + if(enableLBMixtureOfGaussians) + process("LBMixtureOfGaussians", lbMixtureOfGaussians, img_prep, img_lb_mog); + + if(enableLBAdaptiveSOM) + process("LBAdaptiveSOM", lbAdaptiveSOM, img_prep, img_lb_som); + + if(enableLBFuzzyAdaptiveSOM) + process("LBFuzzyAdaptiveSOM", lbFuzzyAdaptiveSOM, img_prep, img_lb_fsom); + + #if !defined(_WIN32) + if(enableLbpMrf) + process("LbpMrf", lbpMrf, img_prep, img_lbp_mrf); + #endif + + if(enableMultiLayerBGS) + { + multiLayerBGS->setStatus(MultiLayerBGS::Status::MLBGS_LEARN); + //multiLayerBGS->setStatus(MultiLayerBGS::Status::MLBGS_DETECT); + process("MultiLayerBGS", multiLayerBGS, img_prep, img_mlbgs); + } + + if(enablePBAS) + process("PBAS", pixelBasedAdaptiveSegmenter, img_prep, img_pt_pbas); + + if(enableVuMeter) + process("VuMeter", vuMeter, img_prep, img_vumeter); + + if(enableKDE) + process("KDE", kde, img_prep, img_kde); + + if(enableForegroundMaskAnalysis) + { + foregroundMaskAnalysis->stopAt = frameToStop; + foregroundMaskAnalysis->img_ref_path = imgref; + + foregroundMaskAnalysis->process(frameNumber, "FrameDifferenceBGS", img_framediff); + foregroundMaskAnalysis->process(frameNumber, "StaticFrameDifferenceBGS", img_staticfdiff); + foregroundMaskAnalysis->process(frameNumber, "WeightedMovingMeanBGS", img_wmovmean); + foregroundMaskAnalysis->process(frameNumber, "WeightedMovingVarianceBGS", img_movvar); + foregroundMaskAnalysis->process(frameNumber, "MixtureOfGaussianV1BGS", img_mog1); + foregroundMaskAnalysis->process(frameNumber, "MixtureOfGaussianV2BGS", img_mog2); + foregroundMaskAnalysis->process(frameNumber, "AdaptiveBackgroundLearning", img_bkgl_fgmask); +#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3 + foregroundMaskAnalysis->process(frameNumber, "GMG", img_gmg); +#endif + foregroundMaskAnalysis->process(frameNumber, "DPAdaptiveMedianBGS", img_adpmed); + foregroundMaskAnalysis->process(frameNumber, "DPGrimsonGMMBGS", img_grigmm); + foregroundMaskAnalysis->process(frameNumber, "DPZivkovicAGMMBGS", img_zivgmm); + foregroundMaskAnalysis->process(frameNumber, "DPMeanBGS", img_tmpmean); + foregroundMaskAnalysis->process(frameNumber, "DPWrenGABGS", img_wrenga); + foregroundMaskAnalysis->process(frameNumber, "DPPratiMediodBGS", img_pramed); + foregroundMaskAnalysis->process(frameNumber, "DPEigenbackgroundBGS", img_eigbkg); + foregroundMaskAnalysis->process(frameNumber, "DPTextureBGS", img_texbgs); + foregroundMaskAnalysis->process(frameNumber, "T2FGMM_UM", img_t2fgmm_um); + foregroundMaskAnalysis->process(frameNumber, "T2FGMM_UV", img_t2fgmm_uv); + foregroundMaskAnalysis->process(frameNumber, "T2FMRF_UM", img_t2fmrf_um); + foregroundMaskAnalysis->process(frameNumber, "T2FMRF_UV", img_t2fmrf_uv); + foregroundMaskAnalysis->process(frameNumber, "FuzzySugenoIntegral", img_fsi); + foregroundMaskAnalysis->process(frameNumber, "FuzzyChoquetIntegral", img_fci); + foregroundMaskAnalysis->process(frameNumber, "LBSimpleGaussian", img_lb_sg); + foregroundMaskAnalysis->process(frameNumber, "LBFuzzyGaussian", img_lb_fg); + foregroundMaskAnalysis->process(frameNumber, "LBMixtureOfGaussians", img_lb_mog); + foregroundMaskAnalysis->process(frameNumber, "LBAdaptiveSOM", img_lb_som); + foregroundMaskAnalysis->process(frameNumber, "LBFuzzyAdaptiveSOM", img_lb_fsom); + #if !defined(_WIN32) + foregroundMaskAnalysis->process(frameNumber, "LbpMrf", img_lbp_mrf); + #endif + foregroundMaskAnalysis->process(frameNumber, "MultiLayerBGS", img_mlbgs); + foregroundMaskAnalysis->process(frameNumber, "PBAS", img_pt_pbas); + foregroundMaskAnalysis->process(frameNumber, "VuMeter", img_vumeter); + foregroundMaskAnalysis->process(frameNumber, "KDE", img_kde); + } + + firstTime = false; +} + +void FrameProcessor::finish(void) +{ + /*if(enableMultiLayerBGS) + multiLayerBGS->finish(); + + if(enableLBSimpleGaussian) + lbSimpleGaussian->finish(); + + if(enableLBFuzzyGaussian) + lbFuzzyGaussian->finish(); + + if(enableLBMixtureOfGaussians) + lbMixtureOfGaussians->finish(); + + if(enableLBAdaptiveSOM) + lbAdaptiveSOM->finish(); + + if(enableLBFuzzyAdaptiveSOM) + lbFuzzyAdaptiveSOM->finish();*/ + + if(enableForegroundMaskAnalysis) + delete foregroundMaskAnalysis; + + if(enableKDE) + delete kde; + + if(enableVuMeter) + delete vuMeter; + + if(enablePBAS) + delete pixelBasedAdaptiveSegmenter; + + if(enableMultiLayerBGS) + delete multiLayerBGS; + + if(enableLBFuzzyAdaptiveSOM) + delete lbFuzzyAdaptiveSOM; + + if(enableLBAdaptiveSOM) + delete lbAdaptiveSOM; + + if(enableLBMixtureOfGaussians) + delete lbMixtureOfGaussians; + + if(enableLBFuzzyGaussian) + delete lbFuzzyGaussian; + + if(enableLBSimpleGaussian) + delete lbSimpleGaussian; + + #if !defined(_WIN32) + if(enableLbpMrf) + delete lbpMrf; + #endif + + if(enableFuzzyChoquetIntegral) + delete fuzzyChoquetIntegral; + + if(enableFuzzySugenoIntegral) + delete fuzzySugenoIntegral; + + if(enableT2FMRF_UV) + delete type2FuzzyMRF_UV; + + if(enableT2FMRF_UM) + delete type2FuzzyMRF_UM; + + if(enableT2FGMM_UV) + delete type2FuzzyGMM_UV; + + if(enableT2FGMM_UM) + delete type2FuzzyGMM_UM; + + if(enableDPTextureBGS) + delete textureBGS; + + if(enableDPEigenbackgroundBGS) + delete eigenBackground; + + if(enableDPPratiMediodBGS) + delete pratiMediod; + + if(enableDPWrenGABGS) + delete wrenGA; + + if(enableDPMeanBGS) + delete temporalMean; + + if(enableDPZivkovicAGMMBGS) + delete zivkovicAGMM; + + if(enableDPGrimsonGMMBGS) + delete grimsonGMM; + + if(enableDPAdaptiveMedianBGS) + delete adaptiveMedian; + +#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3 + if(enableGMG) + delete gmg; +#endif + + if(enableAdaptiveBackgroundLearning) + delete adaptiveBackgroundLearning; + + if(enableMixtureOfGaussianV2BGS) + delete mixtureOfGaussianV2BGS; + + if(enableMixtureOfGaussianV1BGS) + delete mixtureOfGaussianV1BGS; + + if(enableWeightedMovingVarianceBGS) + delete weightedMovingVariance; + + if(enableWeightedMovingMeanBGS) + delete weightedMovingMean; + + if(enableStaticFrameDifferenceBGS) + delete staticFrameDifference; + + if(enableFrameDifferenceBGS) + delete frameDifference; + + if(enablePreProcessor) + delete preProcessor; +} + +void FrameProcessor::tic(std::string value) +{ + processname = value; + duration = static_cast<double>(cv::getTickCount()); +} + +void FrameProcessor::toc() +{ + duration = (static_cast<double>(cv::getTickCount()) - duration)/cv::getTickFrequency(); + std::cout << processname << "\ttime(sec):" << std::fixed << std::setprecision(6) << duration << std::endl; +} + +void FrameProcessor::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/FrameProcessor.xml", 0, CV_STORAGE_WRITE); + + cvWriteString(fs, "tictoc", tictoc.c_str()); + + cvWriteInt(fs, "enablePreProcessor", enablePreProcessor); + + cvWriteInt(fs, "enableForegroundMaskAnalysis", enableForegroundMaskAnalysis); + + cvWriteInt(fs, "enableFrameDifferenceBGS", enableFrameDifferenceBGS); + cvWriteInt(fs, "enableStaticFrameDifferenceBGS", enableStaticFrameDifferenceBGS); + cvWriteInt(fs, "enableWeightedMovingMeanBGS", enableWeightedMovingMeanBGS); + cvWriteInt(fs, "enableWeightedMovingVarianceBGS", enableWeightedMovingVarianceBGS); + cvWriteInt(fs, "enableMixtureOfGaussianV1BGS", enableMixtureOfGaussianV1BGS); + cvWriteInt(fs, "enableMixtureOfGaussianV2BGS", enableMixtureOfGaussianV2BGS); + cvWriteInt(fs, "enableAdaptiveBackgroundLearning", enableAdaptiveBackgroundLearning); +#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3 + cvWriteInt(fs, "enableGMG", enableGMG); +#endif + + cvWriteInt(fs, "enableDPAdaptiveMedianBGS", enableDPAdaptiveMedianBGS); + cvWriteInt(fs, "enableDPGrimsonGMMBGS", enableDPGrimsonGMMBGS); + cvWriteInt(fs, "enableDPZivkovicAGMMBGS", enableDPZivkovicAGMMBGS); + cvWriteInt(fs, "enableDPMeanBGS", enableDPMeanBGS); + cvWriteInt(fs, "enableDPWrenGABGS", enableDPWrenGABGS); + cvWriteInt(fs, "enableDPPratiMediodBGS", enableDPPratiMediodBGS); + cvWriteInt(fs, "enableDPEigenbackgroundBGS", enableDPEigenbackgroundBGS); + cvWriteInt(fs, "enableDPTextureBGS", enableDPTextureBGS); + + cvWriteInt(fs, "enableT2FGMM_UM", enableT2FGMM_UM); + cvWriteInt(fs, "enableT2FGMM_UV", enableT2FGMM_UV); + cvWriteInt(fs, "enableT2FMRF_UM", enableT2FMRF_UM); + cvWriteInt(fs, "enableT2FMRF_UV", enableT2FMRF_UV); + cvWriteInt(fs, "enableFuzzySugenoIntegral", enableFuzzySugenoIntegral); + cvWriteInt(fs, "enableFuzzyChoquetIntegral", enableFuzzyChoquetIntegral); + + cvWriteInt(fs, "enableLBSimpleGaussian", enableLBSimpleGaussian); + cvWriteInt(fs, "enableLBFuzzyGaussian", enableLBFuzzyGaussian); + cvWriteInt(fs, "enableLBMixtureOfGaussians", enableLBMixtureOfGaussians); + cvWriteInt(fs, "enableLBAdaptiveSOM", enableLBAdaptiveSOM); + cvWriteInt(fs, "enableLBFuzzyAdaptiveSOM", enableLBFuzzyAdaptiveSOM); + + #if !defined(_WIN32) + cvWriteInt(fs, "enableLbpMrf", enableLbpMrf); + #endif + + cvWriteInt(fs, "enableMultiLayerBGS", enableMultiLayerBGS); + cvWriteInt(fs, "enablePBAS", enablePBAS); + cvWriteInt(fs, "enableVuMeter", enableVuMeter); + cvWriteInt(fs, "enableKDE", enableKDE); + + cvReleaseFileStorage(&fs); +} + +void FrameProcessor::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/FrameProcessor.xml", 0, CV_STORAGE_READ); + + tictoc = cvReadStringByName(fs, 0, "tictoc", ""); + + enablePreProcessor = cvReadIntByName(fs, 0, "enablePreProcessor", true); + + enableForegroundMaskAnalysis = cvReadIntByName(fs, 0, "enableForegroundMaskAnalysis", false); + + enableFrameDifferenceBGS = cvReadIntByName(fs, 0, "enableFrameDifferenceBGS", false); + enableStaticFrameDifferenceBGS = cvReadIntByName(fs, 0, "enableStaticFrameDifferenceBGS", false); + enableWeightedMovingMeanBGS = cvReadIntByName(fs, 0, "enableWeightedMovingMeanBGS", false); + enableWeightedMovingVarianceBGS = cvReadIntByName(fs, 0, "enableWeightedMovingVarianceBGS", false); + enableMixtureOfGaussianV1BGS = cvReadIntByName(fs, 0, "enableMixtureOfGaussianV1BGS", false); + enableMixtureOfGaussianV2BGS = cvReadIntByName(fs, 0, "enableMixtureOfGaussianV2BGS", false); + enableAdaptiveBackgroundLearning = cvReadIntByName(fs, 0, "enableAdaptiveBackgroundLearning", false); +#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3 + enableGMG = cvReadIntByName(fs, 0, "enableGMG", false); +#endif + + enableDPAdaptiveMedianBGS = cvReadIntByName(fs, 0, "enableDPAdaptiveMedianBGS", false); + enableDPGrimsonGMMBGS = cvReadIntByName(fs, 0, "enableDPGrimsonGMMBGS", false); + enableDPZivkovicAGMMBGS = cvReadIntByName(fs, 0, "enableDPZivkovicAGMMBGS", false); + enableDPMeanBGS = cvReadIntByName(fs, 0, "enableDPMeanBGS", false); + enableDPWrenGABGS = cvReadIntByName(fs, 0, "enableDPWrenGABGS", false); + enableDPPratiMediodBGS = cvReadIntByName(fs, 0, "enableDPPratiMediodBGS", false); + enableDPEigenbackgroundBGS = cvReadIntByName(fs, 0, "enableDPEigenbackgroundBGS", false); + enableDPTextureBGS = cvReadIntByName(fs, 0, "enableDPTextureBGS", false); + + enableT2FGMM_UM = cvReadIntByName(fs, 0, "enableT2FGMM_UM", false); + enableT2FGMM_UV = cvReadIntByName(fs, 0, "enableT2FGMM_UV", false); + enableT2FMRF_UM = cvReadIntByName(fs, 0, "enableT2FMRF_UM", false); + enableT2FMRF_UV = cvReadIntByName(fs, 0, "enableT2FMRF_UV", false); + enableFuzzySugenoIntegral = cvReadIntByName(fs, 0, "enableFuzzySugenoIntegral", false); + enableFuzzyChoquetIntegral = cvReadIntByName(fs, 0, "enableFuzzyChoquetIntegral", false); + + enableLBSimpleGaussian = cvReadIntByName(fs, 0, "enableLBSimpleGaussian", false); + enableLBFuzzyGaussian = cvReadIntByName(fs, 0, "enableLBFuzzyGaussian", false); + enableLBMixtureOfGaussians = cvReadIntByName(fs, 0, "enableLBMixtureOfGaussians", false); + enableLBAdaptiveSOM = cvReadIntByName(fs, 0, "enableLBAdaptiveSOM", false); + enableLBFuzzyAdaptiveSOM = cvReadIntByName(fs, 0, "enableLBFuzzyAdaptiveSOM", false); + + #if !defined(_WIN32) + enableLbpMrf = cvReadIntByName(fs, 0, "enableLbpMrf", false); + #endif + + enableMultiLayerBGS = cvReadIntByName(fs, 0, "enableMultiLayerBGS", false); + enablePBAS = cvReadIntByName(fs, 0, "enablePBAS", false); + enableVuMeter = cvReadIntByName(fs, 0, "enableVuMeter", false); + enableKDE = cvReadIntByName(fs, 0, "enableKDE", false); + + cvReleaseFileStorage(&fs); +} diff --git a/FrameProcessor.h b/FrameProcessor.h new file mode 100644 index 0000000..44ad2aa --- /dev/null +++ b/FrameProcessor.h @@ -0,0 +1,235 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once +#pragma warning(disable : 4482) + +#include "IFrameProcessor.h" +#include "PreProcessor.h" + +#include "package_bgs/IBGS.h" + +#include "package_bgs/FrameDifferenceBGS.h" +#include "package_bgs/StaticFrameDifferenceBGS.h" +#include "package_bgs/WeightedMovingMeanBGS.h" +#include "package_bgs/WeightedMovingVarianceBGS.h" +#include "package_bgs/MixtureOfGaussianV1BGS.h" +#include "package_bgs/MixtureOfGaussianV2BGS.h" +#include "package_bgs/AdaptiveBackgroundLearning.h" +#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3 +#include "package_bgs/GMG.h" +#endif + +#include "package_bgs/dp/DPAdaptiveMedianBGS.h" +#include "package_bgs/dp/DPGrimsonGMMBGS.h" +#include "package_bgs/dp/DPZivkovicAGMMBGS.h" +#include "package_bgs/dp/DPMeanBGS.h" +#include "package_bgs/dp/DPWrenGABGS.h" +#include "package_bgs/dp/DPPratiMediodBGS.h" +#include "package_bgs/dp/DPEigenbackgroundBGS.h" +#include "package_bgs/dp/DPTextureBGS.h" + +#include "package_bgs/tb/T2FGMM_UM.h" +#include "package_bgs/tb/T2FGMM_UV.h" +#include "package_bgs/tb/T2FMRF_UM.h" +#include "package_bgs/tb/T2FMRF_UV.h" +#include "package_bgs/tb/FuzzySugenoIntegral.h" +#include "package_bgs/tb/FuzzyChoquetIntegral.h" + +#include "package_bgs/lb/LBSimpleGaussian.h" +#include "package_bgs/lb/LBFuzzyGaussian.h" +#include "package_bgs/lb/LBMixtureOfGaussians.h" +#include "package_bgs/lb/LBAdaptiveSOM.h" +#include "package_bgs/lb/LBFuzzyAdaptiveSOM.h" + +#if !defined(_WIN32) +#include "package_bgs/ck/LbpMrf.h" +#endif + +#include "package_bgs/jmo/MultiLayerBGS.h" +#include "package_bgs/pt/PixelBasedAdaptiveSegmenter.h" +#include "package_bgs/av/VuMeter.h" +#include "package_bgs/ae/KDE.h" + +#include "package_analysis/ForegroundMaskAnalysis.h" + +class FrameProcessor : public IFrameProcessor +{ +private: + bool firstTime; + long frameNumber; + std::string processname; + double duration; + std::string tictoc; + + cv::Mat img_prep; + PreProcessor* preProcessor; + bool enablePreProcessor; + + cv::Mat img_framediff; + FrameDifferenceBGS* frameDifference; + bool enableFrameDifferenceBGS; + + cv::Mat img_staticfdiff; + StaticFrameDifferenceBGS* staticFrameDifference; + bool enableStaticFrameDifferenceBGS; + + cv::Mat img_wmovmean; + WeightedMovingMeanBGS* weightedMovingMean; + bool enableWeightedMovingMeanBGS; + + cv::Mat img_movvar; + WeightedMovingVarianceBGS* weightedMovingVariance; + bool enableWeightedMovingVarianceBGS; + + cv::Mat img_mog1; + MixtureOfGaussianV1BGS* mixtureOfGaussianV1BGS; + bool enableMixtureOfGaussianV1BGS; + + cv::Mat img_mog2; + MixtureOfGaussianV2BGS* mixtureOfGaussianV2BGS; + bool enableMixtureOfGaussianV2BGS; + + cv::Mat img_bkgl_fgmask; + AdaptiveBackgroundLearning* adaptiveBackgroundLearning; + bool enableAdaptiveBackgroundLearning; + +#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3 + cv::Mat img_gmg; + GMG* gmg; + bool enableGMG; +#endif + + cv::Mat img_adpmed; + DPAdaptiveMedianBGS* adaptiveMedian; + bool enableDPAdaptiveMedianBGS; + + cv::Mat img_grigmm; + DPGrimsonGMMBGS* grimsonGMM; + bool enableDPGrimsonGMMBGS; + + cv::Mat img_zivgmm; + DPZivkovicAGMMBGS* zivkovicAGMM; + bool enableDPZivkovicAGMMBGS; + + cv::Mat img_tmpmean; + DPMeanBGS* temporalMean; + bool enableDPMeanBGS; + + cv::Mat img_wrenga; + DPWrenGABGS* wrenGA; + bool enableDPWrenGABGS; + + cv::Mat img_pramed; + DPPratiMediodBGS* pratiMediod; + bool enableDPPratiMediodBGS; + + cv::Mat img_eigbkg; + DPEigenbackgroundBGS* eigenBackground; + bool enableDPEigenbackgroundBGS; + + cv::Mat img_texbgs; + DPTextureBGS* textureBGS; + bool enableDPTextureBGS; + + cv::Mat img_t2fgmm_um; + T2FGMM_UM* type2FuzzyGMM_UM; + bool enableT2FGMM_UM; + + cv::Mat img_t2fgmm_uv; + T2FGMM_UV* type2FuzzyGMM_UV; + bool enableT2FGMM_UV; + + cv::Mat img_t2fmrf_um; + T2FMRF_UM* type2FuzzyMRF_UM; + bool enableT2FMRF_UM; + + cv::Mat img_t2fmrf_uv; + T2FMRF_UV* type2FuzzyMRF_UV; + bool enableT2FMRF_UV; + + cv::Mat img_fsi; + FuzzySugenoIntegral* fuzzySugenoIntegral; + bool enableFuzzySugenoIntegral; + + cv::Mat img_fci; + FuzzyChoquetIntegral* fuzzyChoquetIntegral; + bool enableFuzzyChoquetIntegral; + + cv::Mat img_lb_sg; + LBSimpleGaussian* lbSimpleGaussian; + bool enableLBSimpleGaussian; + + cv::Mat img_lb_fg; + LBFuzzyGaussian* lbFuzzyGaussian; + bool enableLBFuzzyGaussian; + + cv::Mat img_lb_mog; + LBMixtureOfGaussians* lbMixtureOfGaussians; + bool enableLBMixtureOfGaussians; + + cv::Mat img_lb_som; + LBAdaptiveSOM* lbAdaptiveSOM; + bool enableLBAdaptiveSOM; + + cv::Mat img_lb_fsom; + LBFuzzyAdaptiveSOM* lbFuzzyAdaptiveSOM; + bool enableLBFuzzyAdaptiveSOM; + + #if !defined(_WIN32) + cv::Mat img_lbp_mrf; + LbpMrf* lbpMrf; + bool enableLbpMrf; + #endif + + cv::Mat img_mlbgs; + MultiLayerBGS* multiLayerBGS; + bool enableMultiLayerBGS; + + cv::Mat img_pt_pbas; + PixelBasedAdaptiveSegmenter* pixelBasedAdaptiveSegmenter; + bool enablePBAS; + + cv::Mat img_vumeter; + VuMeter* vuMeter; + bool enableVuMeter; + + cv::Mat img_kde; + KDE* kde; + bool enableKDE; + + ForegroundMaskAnalysis* foregroundMaskAnalysis; + bool enableForegroundMaskAnalysis; + +public: + FrameProcessor(); + ~FrameProcessor(); + + long frameToStop; + std::string imgref; + + void init(); + void process(const cv::Mat &img_input); + void finish(void); + +private: + void process(std::string name, IBGS *bgs, const cv::Mat &img_input, cv::Mat &img_bgs); + void tic(std::string value); + void toc(); + + void saveConfig(); + void loadConfig(); +}; diff --git a/IFrameProcessor.h b/IFrameProcessor.h new file mode 100644 index 0000000..ef50b1f --- /dev/null +++ b/IFrameProcessor.h @@ -0,0 +1,26 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <cv.h> + +class IFrameProcessor +{ + public: + virtual void process(const cv:: Mat &input) = 0; + virtual ~IFrameProcessor(){} +}; \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..e2ce0d8 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,12 @@ +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. \ No newline at end of file diff --git a/Main.cpp b/Main.cpp new file mode 100644 index 0000000..4e59ee5 --- /dev/null +++ b/Main.cpp @@ -0,0 +1,82 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "Config.h" +#include "VideoAnalysis.h" +#include <iostream> + +class Main +{ +private: + Main(); + +public: + static void start(int argc, const char **argv) + { + std::cout << "-----------------------------------------" << std::endl; + std::cout << "Background Subtraction Library v1.7.0 " << std::endl; + std::cout << "http://code.google.com/p/bgslibrary " << std::endl; + std::cout << "by: " << std::endl; + std::cout << "Andrews Sobral (andrewssobral@gmail.com) " << std::endl; + std::cout << "-----------------------------------------" << std::endl; + std::cout << "Using OpenCV version " << CV_VERSION << std::endl; + + try + { + int key = KEY_ESC; + + do + { + VideoAnalysis* videoAnalysis = new VideoAnalysis; + + if(videoAnalysis->setup(argc, argv)) + { + videoAnalysis->start(); + + std::cout << "Processing finished, enter:" << std::endl; + std::cout << "R - Repeat" << std::endl; + std::cout << "Q - Quit" << std::endl; + + key = cv::waitKey(); + } + + cv::destroyAllWindows(); + delete videoAnalysis; + + }while(key == KEY_REPEAT); + } + catch(const std::exception& ex) + { + std::cout << "std::exception:" << ex.what() << std::endl; + return; + } + catch(...) + { + std::cout << "Unknow error" << std::endl; + return; + } + +#ifdef WIN32 + //system("pause"); +#endif + } +}; + +int main(int argc, const char **argv) +{ + Main::start(argc, argv); + return 0; +} diff --git a/PreProcessor.cpp b/PreProcessor.cpp new file mode 100644 index 0000000..834996b --- /dev/null +++ b/PreProcessor.cpp @@ -0,0 +1,146 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "PreProcessor.h" + +PreProcessor::PreProcessor() : firstTime(true), equalizeHist(false), gaussianBlur(false) +{ + std::cout << "PreProcessor()" << std::endl; +} + +PreProcessor::~PreProcessor() +{ + std::cout << "~PreProcessor()" << std::endl; +} + +void PreProcessor::setEqualizeHist(bool value) +{ + equalizeHist = value; +} + +void PreProcessor::setGaussianBlur(bool value) +{ + gaussianBlur = value; +} + +cv::Mat PreProcessor::getGrayScale() +{ + return img_gray.clone(); +} + +void PreProcessor::process(const cv::Mat &img_input, cv::Mat &img_output) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + img_input.copyTo(img_output); + + // Converts image from one color space to another + // http://opencv.willowgarage.com/documentation/cpp/miscellaneous_image_transformations.html#cv-cvtcolor + cv::cvtColor(img_input, img_gray, CV_BGR2GRAY); + //img_gray.copyTo(img_output); + + // Equalizes the histogram of a grayscale image + // http://opencv.willowgarage.com/documentation/cpp/histograms.html#cv-equalizehist + if(equalizeHist) + cv::equalizeHist(img_output, img_output); + + // Smoothes image using a Gaussian filter + // http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html#GaussianBlur + if(gaussianBlur) + cv::GaussianBlur(img_output, img_output, cv::Size(7,7), 1.5); + + if(enableShow) + cv::imshow("Pre Processor", img_output); + + firstTime = false; +} + +void PreProcessor::rotate(const cv::Mat &img_input, cv::Mat &img_output, float angle) +{ + IplImage* image = new IplImage(img_input); + + //IplImage *rotatedImage = cvCreateImage(cvSize(480,320), IPL_DEPTH_8U, image->nChannels); + //IplImage *rotatedImage = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, image->nChannels); + IplImage* rotatedImage = cvCreateImage(cvSize(image->height,image->width), IPL_DEPTH_8U, image->nChannels); + + CvPoint2D32f center; + //center.x = 160; + //center.y = 160; + center.x = (image->height / 2); + center.y = (image->width / 2); + + CvMat* mapMatrix = cvCreateMat(2, 3, CV_32FC1); + + cv2DRotationMatrix(center, angle, 1.0, mapMatrix); + cvWarpAffine(image, rotatedImage, mapMatrix, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS, cvScalarAll(0)); + + cv::Mat img_rot(rotatedImage); + img_rot.copyTo(img_output); + + cvReleaseImage(&image); + cvReleaseImage(&rotatedImage); + cvReleaseMat(&mapMatrix); +} + +void PreProcessor::applyCanny(const cv::Mat &img_input, cv::Mat &img_output) +{ + if(img_input.empty()) + return; + + //------------------------------------------------------------------ + // Canny + // Finds edges in an image using Canny algorithm. + // http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html#cv-canny + //------------------------------------------------------------------ + + cv::Mat img_canny; + cv::Canny( + img_input, // image � Single-channel 8-bit input image + img_canny, // edges � The output edge map. It will have the same size and the same type as image + 100, // threshold1 � The first threshold for the hysteresis procedure + 200); // threshold2 � The second threshold for the hysteresis procedure + cv::threshold(img_canny, img_canny, 128, 255, cv::THRESH_BINARY_INV); + + img_canny.copyTo(img_output); +} + +void PreProcessor::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/PreProcessor.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "equalizeHist", equalizeHist); + cvWriteInt(fs, "gaussianBlur", gaussianBlur); + cvWriteInt(fs, "enableShow", enableShow); + + cvReleaseFileStorage(&fs); +} + +void PreProcessor::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/PreProcessor.xml", 0, CV_STORAGE_READ); + + equalizeHist = cvReadIntByName(fs, 0, "equalizeHist", false); + gaussianBlur = cvReadIntByName(fs, 0, "gaussianBlur", false); + enableShow = cvReadIntByName(fs, 0, "enableShow", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/PreProcessor.h b/PreProcessor.h new file mode 100644 index 0000000..9a04623 --- /dev/null +++ b/PreProcessor.h @@ -0,0 +1,49 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +class PreProcessor +{ +private: + bool firstTime; + bool equalizeHist; + bool gaussianBlur; + cv::Mat img_gray; + bool enableShow; + +public: + PreProcessor(); + ~PreProcessor(); + + void setEqualizeHist(bool value); + void setGaussianBlur(bool value); + cv::Mat getGrayScale(); + + void process(const cv::Mat &img_input, cv::Mat &img_output); + + void rotate(const cv::Mat &img_input, cv::Mat &img_output, float angle); + void applyCanny(const cv::Mat &img_input, cv::Mat &img_output); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..b7fe6c5 --- /dev/null +++ b/README.txt @@ -0,0 +1,16 @@ +# +# HOW TO COMPILE ON LINUX +# +# Requirements: +# cmake >= 2.8 +# opencv >= 2.3.1 + +cd build +cmake .. +make +cd .. + +chmod +x run_video.sh run_camera.sh run_demo.sh +./run_video.sh +./run_camera.sh +./run_demo.sh diff --git a/VideoAnalysis.cpp b/VideoAnalysis.cpp new file mode 100644 index 0000000..0123933 --- /dev/null +++ b/VideoAnalysis.cpp @@ -0,0 +1,130 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "VideoAnalysis.h" + +VideoAnalysis::VideoAnalysis() : use_file(false), use_camera(false), cameraIndex(0), use_comp(false), frameToStop(0) +{ + std::cout << "VideoAnalysis()" << std::endl; +} + +VideoAnalysis::~VideoAnalysis() +{ + std::cout << "~VideoAnalysis()" << std::endl; +} + +bool VideoAnalysis::setup(int argc, const char **argv) +{ + bool flag = false; + + const char* keys = + "{hp|help|false|Print help message}" + "{uf|use_file|false|Use video file}" + "{fn|filename||Specify video file}" + "{uc|use_cam|false|Use camera}" + "{ca|camera|0|Specify camera index}" + "{co|use_comp|false|Use mask comparator}" + "{st|stopAt|0|Frame number to stop}" + "{im|imgref||Specify image file}" + ; + cv::CommandLineParser cmd(argc, argv, keys); + + if(argc <= 1 || cmd.get<bool>("help") == true) + { + std::cout << "Usage: " << argv[0] << " [options]" << std::endl; + std::cout << "Avaible options:" << std::endl; + cmd.printParams(); + return false; + } + + use_file = cmd.get<bool>("use_file"); + if(use_file) + { + filename = cmd.get<std::string>("filename"); + + if(filename.empty()) + { + std::cout << "Specify filename"<< std::endl; + return false; + } + + flag = true; + } + + use_camera = cmd.get<bool>("use_cam"); + if(use_camera) + { + cameraIndex = cmd.get<int>("camera"); + flag = true; + } + + if(flag == true) + { + use_comp = cmd.get<bool>("use_comp"); + if(use_comp) + { + frameToStop = cmd.get<int>("stopAt"); + imgref = cmd.get<std::string>("imgref"); + + if(imgref.empty()) + { + std::cout << "Specify image reference"<< std::endl; + return false; + } + } + } + + return flag; +} + +void VideoAnalysis::start() +{ + do + { + videoCapture = new VideoCapture; + frameProcessor = new FrameProcessor; + + frameProcessor->init(); + frameProcessor->frameToStop = frameToStop; + frameProcessor->imgref = imgref; + + videoCapture->setFrameProcessor(frameProcessor); + + if(use_file) + videoCapture->setVideo(filename); + + if(use_camera) + videoCapture->setCamera(cameraIndex); + + videoCapture->start(); + + if(use_file || use_camera) + break; + + frameProcessor->finish(); + + int key = cvWaitKey(500); + if(key == KEY_ESC) + break; + + delete frameProcessor; + delete videoCapture; + + }while(1); + + delete frameProcessor; + delete videoCapture; +} \ No newline at end of file diff --git a/VideoAnalysis.h b/VideoAnalysis.h new file mode 100644 index 0000000..74eacf7 --- /dev/null +++ b/VideoAnalysis.h @@ -0,0 +1,45 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <sstream> + +#include "VideoCapture.h" +#include "FrameProcessor.h" + +class VideoAnalysis +{ +private: + VideoCapture* videoCapture; + FrameProcessor* frameProcessor; + bool use_file; + std::string filename; + bool use_camera; + int cameraIndex; + bool use_comp; + long frameToStop; + std::string imgref; + +public: + VideoAnalysis(); + ~VideoAnalysis(); + + bool setup(int argc, const char **argv); + void start(); +}; + diff --git a/VideoCapture.cpp b/VideoCapture.cpp new file mode 100644 index 0000000..8952053 --- /dev/null +++ b/VideoCapture.cpp @@ -0,0 +1,275 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "VideoCapture.h" + +namespace VC_ROI +{ + IplImage* img_input1 = 0; + IplImage* img_input2 = 0; + int roi_x0 = 0; + int roi_y0 = 0; + int roi_x1 = 0; + int roi_y1 = 0; + int numOfRec = 0; + int startDraw = 0; + bool roi_defined = false; + bool use_roi = true; + bool disable_event = false; + + void reset(void) + { + disable_event = false; + startDraw = false; + } + + void VideoCapture_on_mouse(int evt, int x, int y, int flag, void* param) + { + if(use_roi == false || disable_event == true) + return; + + if(evt == CV_EVENT_LBUTTONDOWN) + { + if(!startDraw) + { + roi_x0 = x; + roi_y0 = y; + startDraw = 1; + } + else + { + roi_x1 = x; + roi_y1 = y; + startDraw = 0; + roi_defined = true; + disable_event = true; + } + } + + if(evt == CV_EVENT_MOUSEMOVE && startDraw) + { + //redraw ROI selection + img_input2 = cvCloneImage(img_input1); + cvRectangle(img_input2, cvPoint(roi_x0,roi_y0), cvPoint(x,y), CV_RGB(255,0,0), 1); + cvShowImage("Input", img_input2); + cvReleaseImage(&img_input2); + //startDraw = false; + //disable_event = true; + } + } +} + +VideoCapture::VideoCapture() : key(0), start_time(0), delta_time(0), freq(0), fps(0), frameNumber(0), stopAt(0), + useCamera(false), useVideo(false), input_resize_percent(100), showOutput(true), enableFlip(false) +{ + std::cout << "VideoCapture()" << std::endl; +} + +VideoCapture::~VideoCapture() +{ + std::cout << "~VideoCapture()" << std::endl; +} + +void VideoCapture::setFrameProcessor(IFrameProcessor* frameProcessorPtr) +{ + frameProcessor = frameProcessorPtr; +} + +void VideoCapture::setCamera(int index) +{ + useCamera = true; + cameraIndex = index; + + useVideo = false; +} + +void VideoCapture::setUpCamera() +{ + std::cout << "Camera index:" << cameraIndex << std::endl; + capture = cvCaptureFromCAM(cameraIndex); + + if(!capture) + std::cerr << "Cannot open initialize webcam!\n" << std::endl; +} + +void VideoCapture::setVideo(std::string filename) +{ + useVideo = true; + videoFileName = filename; + + useCamera = false; +} + +void VideoCapture::setUpVideo() +{ + capture = cvCaptureFromFile(videoFileName.c_str()); + + if(!capture) + std::cerr << "Cannot open video file "<< videoFileName << std::endl; +} + +void VideoCapture::start() +{ + loadConfig(); + + if(useCamera) setUpCamera(); + if(useVideo) setUpVideo(); + if(!capture) std::cerr << "Capture error..." << std::endl; + + int input_fps = cvGetCaptureProperty(capture,CV_CAP_PROP_FPS); + std::cout << "input->fps:" << input_fps << std::endl; + + IplImage* frame1 = cvQueryFrame(capture); + frame = cvCreateImage(cvSize((int)((frame1->width*input_resize_percent)/100) , (int)((frame1->height*input_resize_percent)/100)), frame1->depth, frame1->nChannels); + //cvCreateImage(cvSize(frame1->width/input_resize_factor, frame1->height/input_resize_factor), frame1->depth, frame1->nChannels); + std::cout << "input->resize_percent:" << input_resize_percent << std::endl; + std::cout << "input->width:" << frame->width << std::endl; + std::cout << "input->height:" << frame->height << std::endl; + + double loopDelay = 33.333; + if(input_fps > 0) + loopDelay = (1./input_fps)*1000.; + std::cout << "loopDelay:" << loopDelay << std::endl; + + bool firstTime = true; + do + { + frameNumber++; + + frame1 = cvQueryFrame(capture); + if(!frame1) break; + + cvResize(frame1, frame); + + if(enableFlip) + cvFlip(frame, frame, 0); + + if(VC_ROI::use_roi == true && VC_ROI::roi_defined == false && firstTime == true) + { + VC_ROI::reset(); + + do + { + cv::Mat img_input(frame); + + if(showOutput) + { + cv::imshow("Input", img_input); + + std::cout << "Set ROI (press ESC to skip)" << std::endl; + VC_ROI::img_input1 = new IplImage(img_input); + cvSetMouseCallback("Input", VC_ROI::VideoCapture_on_mouse, NULL); + key = cvWaitKey(0); + delete VC_ROI::img_input1; + } + else + key = KEY_ESC; + + if(key == KEY_ESC) + { + std::cout << "ROI disabled" << std::endl; + VC_ROI::reset(); + VC_ROI::use_roi = false; + break; + } + + if(VC_ROI::roi_defined) + { + std::cout << "ROI defined (" << VC_ROI::roi_x0 << "," << VC_ROI::roi_y0 << "," << VC_ROI::roi_x1 << "," << VC_ROI::roi_y1 << ")" << std::endl; + break; + } + else + std::cout << "ROI undefined" << std::endl; + + }while(1); + } + + if(VC_ROI::use_roi == true && VC_ROI::roi_defined == true) + { + CvRect rect = cvRect(VC_ROI::roi_x0, VC_ROI::roi_y0, VC_ROI::roi_x1 - VC_ROI::roi_x0, VC_ROI::roi_y1 - VC_ROI::roi_y0); + cvSetImageROI(frame, rect); + } + + cv::Mat img_input(frame); + + if(showOutput) + cv::imshow("Input", img_input); + + if(firstTime) + saveConfig(); + + start_time = cv::getTickCount(); + frameProcessor->process(img_input); + int64 delta_time = cv::getTickCount() - start_time; + freq = cv::getTickFrequency(); + fps = freq / delta_time; + //std::cout << "FPS: " << fps << std::endl; + + cvResetImageROI(frame); + + key = cvWaitKey(loopDelay); + //std::cout << "key: " << key << std::endl; + + if(key == KEY_SPACE) + key = cvWaitKey(0); + + if(key == KEY_ESC) + break; + + if(stopAt > 0 && stopAt == frameNumber) + key = cvWaitKey(0); + + firstTime = false; + }while(1); + + cvReleaseCapture(&capture); +} + +void VideoCapture::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/VideoCapture.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "stopAt", stopAt); + cvWriteInt(fs, "input_resize_percent", input_resize_percent); + cvWriteInt(fs, "enableFlip", enableFlip); + cvWriteInt(fs, "use_roi", VC_ROI::use_roi); + cvWriteInt(fs, "roi_defined", VC_ROI::roi_defined); + cvWriteInt(fs, "roi_x0", VC_ROI::roi_x0); + cvWriteInt(fs, "roi_y0", VC_ROI::roi_y0); + cvWriteInt(fs, "roi_x1", VC_ROI::roi_x1); + cvWriteInt(fs, "roi_y1", VC_ROI::roi_y1); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void VideoCapture::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/VideoCapture.xml", 0, CV_STORAGE_READ); + + stopAt = cvReadIntByName(fs, 0, "stopAt", 0); + input_resize_percent = cvReadIntByName(fs, 0, "input_resize_percent", 100); + enableFlip = cvReadIntByName(fs, 0, "enableFlip", false); + VC_ROI::use_roi = cvReadIntByName(fs, 0, "use_roi", true); + VC_ROI::roi_defined = cvReadIntByName(fs, 0, "roi_defined", false); + VC_ROI::roi_x0 = cvReadIntByName(fs, 0, "roi_x0", 0); + VC_ROI::roi_y0 = cvReadIntByName(fs, 0, "roi_y0", 0); + VC_ROI::roi_x1 = cvReadIntByName(fs, 0, "roi_x1", 0); + VC_ROI::roi_y1 = cvReadIntByName(fs, 0, "roi_y1", 0); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/VideoCapture.h b/VideoCapture.h new file mode 100644 index 0000000..caf6f6c --- /dev/null +++ b/VideoCapture.h @@ -0,0 +1,63 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "Config.h" +#include "IFrameProcessor.h" + +class VideoCapture +{ +private: + IFrameProcessor* frameProcessor; + CvCapture* capture; + IplImage* frame; + int key; + int64 start_time; + int64 delta_time; + double freq; + double fps; + long frameNumber; + long stopAt; + bool useCamera; + int cameraIndex; + bool useVideo; + std::string videoFileName; + int input_resize_percent; + bool showOutput; + bool enableFlip; + +public: + VideoCapture(); + ~VideoCapture(); + + void setFrameProcessor(IFrameProcessor* frameProcessorPtr); + void setCamera(int cameraIndex); + void setVideo(std::string filename); + void start(); + +private: + void setUpCamera(); + void setUpVideo(); + + void saveConfig(); + void loadConfig(); +}; + diff --git a/bgslibrary_vs2010_opencv.txt b/bgslibrary_vs2010_opencv.txt new file mode 100644 index 0000000..6ea8256 --- /dev/null +++ b/bgslibrary_vs2010_opencv.txt @@ -0,0 +1,39 @@ +--------------------------------------------------- +BGSLibrary with Visual Studio 2010 and Opencv 2.4.5 +--------------------------------------------------- + +1) Check our example project at [vs2010] folder +http://code.google.com/p/bgslibrary/source/browse/trunk/vs2010 + + +Or configure manually by: + + +1) Install OpenCV +1.a) Download OpenCV 2.4.5 from http://opencv.org/ +2.b) Install in: C:\OpenCV2.4.5 +2.c) Add OpenCV binaries in your Path +C:\OpenCV2.4.5\build\x86\vc10\bin + +2) Download BGSLibrary +2.a) Checkout bgslibrary SVN at C:\bgslibrary + +3) Start Visual Studio 2010 +3.a) Create New Project +3.b) Select Visual C++ -> Win32 -> Win32 Console Application +3.c) Set project location: C:\bgslibrary +3.d) Set project name: bgslibrary +3.e) Set Empty project +3.f) Add Demo.cpp in [Source Files] +3.g) Add content of c:\bgslibrary\package_bgs\*.* in [Header Files] +3.h) Add content of c:\bgslibrary\package_analysis\*.* in [Header Files] +3.i) Change to [Release] [Win32] mode +3.j) Click on Project->Properties +3.k) Change [Output Directory] to ..\ +3.l) Add OpenCV include in [C/C++] -> [Additional Include Directories] +C:\OpenCV2.4.5\build\include;C:\OpenCV2.4.5\build\include\opencv; +3.m) Add OpenCV libraries in [Linker]->[Input] +C:\OpenCV2.4.5\build\x86\vc10\lib\*.lib +3.n) Click in Build and wait +3.o) Run C:\bgslibrary\bgslibrary.exe +Enjoy! \ No newline at end of file diff --git a/config/FrameProcessor.xml b/config/FrameProcessor.xml new file mode 100644 index 0000000..c76f826 --- /dev/null +++ b/config/FrameProcessor.xml @@ -0,0 +1,38 @@ +<?xml version="1.0"?> +<opencv_storage> +<tictoc>""</tictoc> +<enablePreProcessor>1</enablePreProcessor> +<enableForegroundMaskAnalysis>0</enableForegroundMaskAnalysis> +<enableFrameDifferenceBGS>1</enableFrameDifferenceBGS> +<enableStaticFrameDifferenceBGS>0</enableStaticFrameDifferenceBGS> +<enableWeightedMovingMeanBGS>0</enableWeightedMovingMeanBGS> +<enableWeightedMovingVarianceBGS>0</enableWeightedMovingVarianceBGS> +<enableMixtureOfGaussianV1BGS>0</enableMixtureOfGaussianV1BGS> +<enableMixtureOfGaussianV2BGS>0</enableMixtureOfGaussianV2BGS> +<enableAdaptiveBackgroundLearning>0</enableAdaptiveBackgroundLearning> +<enableGMG>0</enableGMG> +<enableDPAdaptiveMedianBGS>0</enableDPAdaptiveMedianBGS> +<enableDPGrimsonGMMBGS>0</enableDPGrimsonGMMBGS> +<enableDPZivkovicAGMMBGS>0</enableDPZivkovicAGMMBGS> +<enableDPMeanBGS>0</enableDPMeanBGS> +<enableDPWrenGABGS>0</enableDPWrenGABGS> +<enableDPPratiMediodBGS>0</enableDPPratiMediodBGS> +<enableDPEigenbackgroundBGS>0</enableDPEigenbackgroundBGS> +<enableDPTextureBGS>0</enableDPTextureBGS> +<enableT2FGMM_UM>0</enableT2FGMM_UM> +<enableT2FGMM_UV>0</enableT2FGMM_UV> +<enableT2FMRF_UM>0</enableT2FMRF_UM> +<enableT2FMRF_UV>0</enableT2FMRF_UV> +<enableFuzzySugenoIntegral>0</enableFuzzySugenoIntegral> +<enableFuzzyChoquetIntegral>0</enableFuzzyChoquetIntegral> +<enableLBSimpleGaussian>0</enableLBSimpleGaussian> +<enableLBFuzzyGaussian>0</enableLBFuzzyGaussian> +<enableLBMixtureOfGaussians>0</enableLBMixtureOfGaussians> +<enableLBAdaptiveSOM>0</enableLBAdaptiveSOM> +<enableLBFuzzyAdaptiveSOM>0</enableLBFuzzyAdaptiveSOM> +<enableLbpMrf>0</enableLbpMrf> +<enableMultiLayerBGS>0</enableMultiLayerBGS> +<enablePBAS>0</enablePBAS> +<enableVuMeter>0</enableVuMeter> +<enableKDE>0</enableKDE> +</opencv_storage> diff --git a/config/PreProcessor.xml b/config/PreProcessor.xml new file mode 100644 index 0000000..e58b318 --- /dev/null +++ b/config/PreProcessor.xml @@ -0,0 +1,6 @@ +<?xml version="1.0"?> +<opencv_storage> +<equalizeHist>0</equalizeHist> +<gaussianBlur>0</gaussianBlur> +<enableShow>1</enableShow> +</opencv_storage> diff --git a/config/VideoCapture.xml b/config/VideoCapture.xml new file mode 100644 index 0000000..60dd9aa --- /dev/null +++ b/config/VideoCapture.xml @@ -0,0 +1,13 @@ +<?xml version="1.0"?> +<opencv_storage> +<stopAt>0</stopAt> +<input_resize_percent>100</input_resize_percent> +<enableFlip>0</enableFlip> +<use_roi>0</use_roi> +<roi_defined>0</roi_defined> +<roi_x0>0</roi_x0> +<roi_y0>0</roi_y0> +<roi_x1>0</roi_x1> +<roi_y1>0</roi_y1> +<showOutput>1</showOutput> +</opencv_storage> diff --git a/dataset/video.avi b/dataset/video.avi new file mode 100644 index 0000000000000000000000000000000000000000..a29f00658be7d05b10344859e6bee9a501a7a2b1 GIT binary patch literal 1049784 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ü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%0DOBjHZ}0zW=cniIiGQi5 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 z%0D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ⅇo_@D0_ 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̽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%0AC0p0bmfKcqxpDc% zbuYhr|2eF&+V82l#nxcIxA~b*rrp+8dOmI4r1jH!b*lP{Z{8}?+IDUZ@1HDX>t&%A z8$LD0Jna0^75gCg{3pXa^VJDEL-nU=&zpAn)T-`37v*Oyzq3^H^J0g_1=U$+m)ujy z2tBvBefG6$!i~Nk%J@U<-kd-G&QK?{;LWX-A?B0ZOf980*uSrOI`i)GgG~}ntM=J( zII{59?C}tC<a7Lg{6LL|P;Enn1RrOC_m}(8Uz6{IEq=9VmEE7eKT>Y}(GoaT_Iuh% zk<E89Y>e11v2nQG|C#^T>-MwlKkF9VG;TY!`*6tHEBnK@J^$FfbLy5tkyhh=?gTlG zgtN^2O#+H8Cl7WP+uWZjzRcrPY2yDIOE;Tc{GoZZ`uZ%{4Tm%LJ{3=s-}1_F2Ae*c zK3g)&lIB<QgI0h0Be_v&xvcTeq>5{XjhqudYkksBm;6|?W6{5N^EK*j#hXrFr4n~; z@!q{H4Ra#oJU6YKqx$r0)FIas2bMqBBe(qD_x1nQtL&`*{l4r^B}=UA#Y^kIRR5iK z<ISd%m1%iLS9?S(xgfx@gZC+uXN4(?piUjnsuqQ8dnW;d2}`^fE@Z6ZRAi`A74LLp zs9D!y70-Sss!{*ck%cb{3qE*tEkE6$H@(xVySx3$?u!AxrdOZZ`)Z|6>wyB1gbEK1 z*Nd@TqAT?D=6#=flILHQ#<rWrGd6pENc|f0|LFIdtCs!0#pO0-Dqmaj{xy7#1wCEj zw|zJhSLivqZhgU4*<RXwCBxuWyMe1h&RlibVz=o9tx+f3{kO%cXzluSd1^GXNMay= z=DKwmk5f*(OJ1&b?7r8}j+oFqucvlLAGhqCnWn~4=y&vlocr#7JKsHw)fP`#6>?{? z;dB+ryEY=%PpQ4zZh3m`Un7x|y)8_Cr_a8<eT(beG`D5n3~#qT|DSeqw%XZy_a6I* zPGWZYfB)pRleJy8(vj09`^=eIeo(9^HFs0l?a3QtCM_~!JFzTB;K+i+4?oJ-k2kMp zs53cWP<LR$-2MIB`?nqV+naB6C;R)YbJ=x?o%OroMNJ)a^qLPistIi1XS|RjwCPNy z`6O}Qohp-WzAvBTsq#ouWm1vFriK6i&we)heEid+_8;??-AuXr<^Q@fd$y~8^tV`6 z^6S8X0?GNzOmixq{J50#pZ`kr)xB$st{ESV|7<<)?ES5_Yd22MT6=qTndfJXWucJ@ z_w7TbM1%yNymw>Eg9UqT1|=PQSO5KwV6{zT4)3CwH@b3PGKd_kk1*Phn)>h4q^IHc z<!fE<S6>ccsM_>idqMG4-%s5i?@rw_S-EkA(W*G!hJ*Z<>lq&;NZ<dsYK20xr|2@- zs?!&Rzopo%ja_h8@5lFx5pv%@U!Q+8=&H<|7w<Zb9o(nNP+`X3VCu4|MSxGA;r(yZ zkk&{3ExXqJPu=-GG;VEm*%nEU)4_|Awz$as`E}>*Hbdhq-G>4qU#2>?H2v1BFb%QY ze8rnX{FBFm%BOMv-=@k$eE1pgLd1R-@71i@eX=R?oWbdre``ITdLZfJ$BJJsel=wL zP^drTezlXy!CC0V1oq<v9{Oyo3_telJN==JqcY=__WcV^c6R$Yyk2NHSnSj0aDBD+ zYutx7yZ`^)q1wsF!@oLArPK8xhosA=O+QwzTBkYx(}uG#Up8H}oir!>sq<>_FZ*uJ zxh5{bE9Kwv(fC#K<KE5ne<mkx*tfBvta)KW(A&%ZoJxBOejl06d%K)dE<Q7rbF=;$ zotv9xPTe;r<7HJ=(caywe0t{IOE}MR@Agd|qgUTO`=;h@n|^-c_rHF>to)Z*Ub*sh z=OrbxwP6p9Rvi<*%`aZLJLj}clV)7%vEqUWT;-Xnr`+{2+oqV$);o2G^V9COXWnzZ z_(yr4{ijlNWbKy=B6pXD+>M(jAN{N-Zd0|0e(v1n71q1D8$7+z<lkM}tdunIYNkl! z+n1A?9fA+uTGM(dI_tUP)E^>J>$a@>^(%UZ_4Mo4S^R%S?XN#`v`q5b-R_WsO{cfX za9b>sT%@L+G>>V95yz^|tnUA|HnAU7gZ6pwF8=D|zi7qrCG!0HLw_GK+Vtsb@vOKN z`{r{b1vvjdvi_omWW=;J%-zrTtrBN0jQ{*Qq($hdSA%K%+Nt4(1PtUCNW`uBC*CRY z<LUKuvmyhbM>Bg)-hBODbVZPHnC(u5*Qz)7&Huwxo|#p4u2rkWphe}P^3g|*1ygt% zxj(1xS+FyF-TjrJqJ^RRpRJl3{P$$`Re#1edZ8Mh_!c`9-}|QZO4Imuuj%@~drqo+ zlhS=_s&Z^o?(NA|mP?+-{VFKfW&Kk+<&xULb6VG4zN)?E9Y0Z$OWx0jPjcd}-y)Aw zJa5?Q@%H!3R$6!Wu}s36fTu?n*|Xl=eZ;X#p<rtTpL9=`r}Row18o+g0_VRfYnj5M zVsnMlgXS%dz9w7}qWmtsqD6eq!j=a~H=hfBe|_R|b=Wc1lf`TEU6e9q(`54>x=DCV zy<M3fWIcV7#CEHS{#=t5m*bXN#nUdoJjt1>?0H|~@N$n;Ta#2T??|5#aXRLruY}pQ zr*{sy)Z92+v^K%Ds)=dOg2@^|&in7}E|{pd?VORJz_x>j8mjC6pYgnXq>AbK(QYnJ zx2rkpyehoj^29D_OkQ?*!o295Kl`(TR&{yYo|YYPYMQ{-eY*m#U&(e8_?Fijx4ZIE z&DQ28ao?Be^UEt0Ti)B&6P9ZEKue|f?h@X)Z?h$HY?OM;=5<Zp@?g>BZ3j<VYs+}A zWS7aw{<X+2Z0icXyNbuAt!+B`(DmB-)ZJ%3)s?JG5_5fX?ZKr_+uVao=D6NWR`D~- zl~sDG%W2%hGku1W*ycIuks1G)8C!P?_pJNyHNWg$K_~zADajl`-}Qs`x38O{wm;+3 z>z@Vlu8aJtJ*0iC=j1M5|7GcSjQ!`I74FFV>!)KPE9e|iYV$>5xf0(7KEE7IbG1tn zGg!s0G2T^5o?^nXVChG84T~c0&Q&H0l$K;Y&|N!YhHz4X6j%K|_7#kF&&`vo6CHXc zElZL+SKjP(_wby^ibG5e>sQOJnER|qKD>D`M_=58R;_(I7o~3~D8E(tAY%Wy-P8HI zs#pB-uMXOIy6R%vy+bNh!k&pHRuf--{_VGLYvGIE{>pQei-M2F&f9s(#i~ou^sv*e zT^bc4`Cj`KQ=A!lUffg&mv}vC`LVXd^r;0g|5EY`8(u2x+{wJ4bKwTdUHV+H0v3<{ zu=9BexgBR^HE8cBZ``qZ;S2qS&9A1tiDXcZ)GM`4cqgdJt|WTqYKwpuS8e}}>+!zY zQ_fxfV`Tile^b^G`^#(ogr^(z9D95J#ARQ}?cqB%el4x-XPWoL|HIv7?|lqz{z#qP zv+~r0KGwZnmC4C_8P1z;RQwQMyZ2&a=&h;KircTRDpfROn_U$4a(P#6@utj$+!<#@ zt$)_sZV?J|o_6_*4%d7ugVmd+$X@K-(aM>nm^Rgn&y3al-*U;*cdrF?%@EDf+4CaH zaJQihOHflGi%f~epWeg_%a1F}Qye1Rg?TlW@JZX<ytCw>_q1(uOb>60*br^nI6L>d zTnJ}!|FuU&awk$WJY#uEp5~mX5Ys)osH?``-}%9$S+~R8W8S`gWA4G0`QPfo`5*rM zf3nV%t<gW#a6n{l$?^+roA25#b(!)u-_=EQuHMQiPZgPNU-HaVu4cc!eP^zrq~7J= zbdIV2PboLDPhRt|sxRL+f8qJQJ4&}2?|n5~b)EH&ZGarBdZw=0!fwwfu4omeS<7E~ zmYq0r?A;8X<BADZa~yR#8dJAj`>wXdO!QdW={?SmrEW)_GxL~gbf#zaa|w3g?OFzf z3s$ZPd3N(=!?s6m0&>qK*@c+mceihdn!35sZ*5?Y_o9Vz#br8m^|#lz@BX{@Qr;DT z2cmyfr(CUjE0T8Qss;zEm+!lm+OM{X8!6j~?H9b_eoKw(XUPP=S2d;OlRb}!FBfnR zQn___di)_dc}eMa0<kR5T&MLqmT#GQAo|<xs8Yqv5q(U5l{OxHJ<Znu+~Zrw0~x!I zC=g~kxALNowYaYNo2y%kFFo9#5xxD)^WwF#DN}`A)!dG=`A*!R+TpbH=$nEJQH$ej zf>l$?qP-7gTnzA;BYdbo$3%zI%Q1=T+My?f3kv%tu;yn@c(Elr(IKNDMEto#RX}X3 zeAQjaMY@a^CM|H%aoeDK;d^PX8=o16`F?4uBhC>A*57)lntHO`R^PuW>NJnMdu(5~ z(B-G+rv+bEp74=BDEClhkNy2${qfKLPrCDc-}?VdU3>NahfRw5_VuCx-{C}m>E?+q z&rR-KvGYvE&M5~JxOT;DN_Or(a3^hkP;=+u1OAG8xA)%lD!jkr*7J~ydp>jBdopd$ z?7K<N9QJJw_Eh)htEg??F;m~W=(9x%SC#LwjS8>+D+~Pl%=%L?d1>e49eOPDy_1$J zYkR%XIM!Gu^6%umMK<Rn4#XU;InZMz5+T;;|K+w+b;$<tkIlIsZr41raFO@WXX=j) zHJo+jy~|~T*()`lg&XIb-d?q13s=^zFUO~4@46zx)^cO&hq9RlvBlLJRaxu9P0c=; zO=3^%2wJu=@X)*M(z8!GgfaR2x#DbjO0Iczqx+;UyPhOlEb}&3j_A$hGEV%Uaclk8 z9lDuD&I-?%EboY}UAsw!;e+Fy`C68er@EKl6ghcs+ngVv7tHunv~4(caZjnbxX?dv zPI1x)uUl6hA7AfyaC3}>@ejjU8;&nIyex0d!pta5zYN|bWo-F}Sv8iw^jTmKH)q}X z&8ay@CM!<cJ~el_f9jK&OZHdiT4db3+|HJJ?B?aw(bs&P=OivFZV2A8daBu@iU6%| z<*t{iPDai;q1{&eHtxF~%jf*8;Gnc3W5**4f<KgTU5!7VpZ4CG`D0;;{`XgLWnU%F z9MgOG|76aLRe#E7zclpt7+F_$`)Qo4*5CKfo}OK9bSG`Ap_bzGwQpuAFd0tJ{GreK z$@ipLdxu-q{NAv(uBrah`5)FS{TQ;pVS)aKU#r4(zkICP`RUc#@GBnd+%5C__x@UM zw?1SK^N|@Vm>q0`)+bD`6RNkd6`IN!AZ`2i`_<`{QA<+~EIRw`{NF6w<2UQBPVzR_ za`-U$cFsR<kw_!egbuDce$Le&%l{wsTDy1W%Wr$1+AlJWYu^7{WmfU!fBVB$)$xaF zGoSjaAF4g?`{y55&;NRQuFl5egTW8)5FYkFD$SgUEE0U_4L^$(@ch~uAaI45@z4v# zCbuZ|=Pna}{B>zQdA4ze1M{H(r+NPm?&DEy7H<*Mbu2LWBB9vna6m?t|MZbo*NXuY zRK0j&1X@-u<k+$M-lwHPwE^;rzb1dJ)2q2(7N^~061c19_}=vYKX=-!`d?i3vz@i> zL5sAa$G`WgFJ*Jvwy|>FzV?gHmiy@<#(+ICT#p<gE^i6yQH%S|ubT1P=yJg+*E{_a z7fGlq{SNAHk7+%*ET(<akJ9*P<Mr+}YXuLli1GH_v}^P3wWSIH$4z^7J=-b6;WFu# z%(5CyKfatReO10@>yP~~4vl_tbFZw}{B+Kyd7GoB<W4dCG-J`*NoD58X1_W!vCq_o z@7kdN9{p$Mb5GuyYo~wuZe+((-I%v?=e91owtMf~2W?u+NgwjnnEx{$GG#G!Uh2pn zS|L$%pyhPd@q6KA=d|ws*mm;H{S(XYtx7ZgpOX8e(M36_P}V;);iXs4rZV;P%lWt8 z?0((3zWMc;*-zfySZ-#=-TwM{SX|(QKqm)BHdcc+u2P;&R&uK{jS5WPul}|0pK+3F zLgvc)h}`vmTh{!R{1-1C_Izq}U1HSD^9z<vOVoW6HR<FnHJ4LnZ!YdVZCF=!@3wvz z-)<#kk2n2Xc>)LQwBGhsiF^Nis$>^wT(vCAujIx5$4|pA?5@|W`C0O7wSx45sxx~} z*#=fE^WJpMHoRryhv`qfjvtCFtXdoXRxfPz(`&0(Mc=QBwtx6E@BCqbeHucdd8@up zy(&L>Z}_7>vv^pA^V4P~+IU5UxGnNLyZ4pgA!CK$zm6*uZZkGI=e%Y6;PC%>s$9P# z)4k-ZRNeJ#a-Cf53#w|v+vn;3`2F~6rD?#=_z%^SciPvUth@5Iuwt6Z1%8fFmtR{` zA3w0+@R}O^HKD~W`1jL5uML*mE2f{7bM*@C+atN^!z2}k`h(qnR(Q)-MzAx!pWdSC z{Qqiw!~LaS!@Ji{?XR)hu){Od`|1DF`|Oyn{}cNE;QZa(PDX`YXXQ?xoxXBPFhkIi zspl_lK9FiC9Qw;(w%L_0H}v+_<tk2C^eX#k|J?06Z+Y$3W!@FxZ6JFfd^YQ@_?Ev~ z70SV$KYTuJdsQnPmwIn=bj#_$&M3F8&ue6}ZM?4k_H$Wa(l&L=%^Mxr1_j?d4NjbT z`DoT!%kY;sTh^|9b=b&u$^YEckIOP`UYu0UX`Z;L(tdLoW9wd9_Ns|%-6lkAF7M8~ zWc$z1w=?o~er?Z*Uy7L-CGJ{QO?*M0x6I)x;SXt9{kkmO;Ja33zR8qb8f){8Ex5br zVqy8!>K{vYrq0aQ`lFTkZ)cBD@iqU&c}*E2AM#gqb$9RAY7LCq-|;Q|>Vt3T8X6yc z1MQ2ixSd+YR-nit!OkS%6t?btDF5@TTP=0YeE8!2L0-;(RnD%{Q!n4y^i{_)M5B4l zF|}t(<(m@Yy@Ps|C9^dw{Tn*{f5yKH&hq`IpEvS&3c2j>Op5sHe$Zuww|r;n(?=eE z_!*ZvEZqOGXyK*RiU)PP<v5c+<mz`Vm>kNlS@G5Xvq|Noxag;WY3r32cnXVheks2# zagK+juH&-wy<;M&n#b#3v3sfB)|&nM$R)n5yppDuoSOOM{`Tg3HhR9VJ~+{ZwIwAZ zg8R~cpSG(@i__+H8T_cINP0Xe_4b~;t!q^}c-^wOKP}ScR_7GFt+HnMg+f*SlWn)B zWyt6YRGBDD=!w2{I)<+yx}t5q<Asl6U(3W-t`+FI7hrnj(FX6`p&G2SyQ<2bdl#A~ z?o3a3w)v9MT(hVbj^|of()`OUS|s{6TCSWvrSZgF9s9>OIu45G%>HU7=)O~R)x4B5 z8?rsS@;+%^_te&1Q@iyX+wtiaFFdeP$k-wyFV9u~^pM!SriEMw4=&`WXG}KAu*m36 zk&!Q$v8vsd;mTqr`KY2T*JZU0CVX1EbcsP)*p}G`&vhidmbv$^>33|%or2l9FYCTE z-f6w{=~lMuoiAd`xA`u=Jm+quUr^+6f#@L9tVy1|1t+ynT9+uPJehRl__61Vtm|JM zd!8O9tiQ+e7Wb_kE+UbMGd4Or(a~hRtkKn^-st)}urEZ>)_C>iy!m-4E#CQ@t@e&- z7fx*~Y0%AZ%ixjKynOerUHECsM|+K{FXcKHrJnVTHO^ZmA-wi(mFe9(r!FR??D#hM zRkF*yYqk4$q}NS4{n}?<w_oYOAL)y>U$km2Wz@dS_e13N+Nc*NN-o~KJb!DpH{(gp z%4Oah4x6{Xo6s$!&MvmDjOmExr?;DhnSL*LuvOQO&!aYPxt+piM@tQhuyZq($lSc} zz|!gTacjlWtQ#&<T9R@vJ3owGCn>*&`)}U2!w;seUE^}=fa0m0H_a1I3R-2ZJF;ZY z#p)ApcdDL#Z0T!u^2V+6D|bAOVqO@l8M0uxK{EeY6~X9lx*TD-mrP76g8y>NnX!!N zT;H<d`i=X1oGhB%q~e<UmMd}F3A;#fUDy`0^Y9OaiyR@MpRPGCSiWPA7JCwVZ_kI- zjtSa_Cwm(-Y++-HyZ(7?_6;+WJ2iO^C+aQ9W_ok0plnV$)5X~_dAXPG+`0Vvy=Tsv z?%8I3vz|YhW1H{Sf9sKrRs22otznNhU0>eJqTTe@YF_1voP{rVIHq56_x6_;(w{iN zDqD|BT=!IwyYq9W<%=0lSadHgi0+GGPYOB5<zr)eY;qcR;ie1jUd260VK=NcXdkE$ zsoPP)b<utLobQh^CN?heS(tfcPtF{!_;77MKFyc!)V(;@bPE~rnH{ifI8eA=o8^R@ zi0-EPs@`Y^|HMEIg}g73%Z&XGKTLg;(pDDnQ)srs$xE@jJrAekF)dy8tL?$z?>9VN ze66Z&<8P|ltIjQIwc(t=krrp}6!q`>ce#AHDfVsO%@;wh-rxUIzG8Oh8q0ffEXv-W zKC~2-g<aaEwEUo_-~DT^mkEXhu{X){n9Pwe<g!aRe=Yj#k&apS#FWd@)voRi>+}+q z&sfEDYFkK%p}>bfFYZo=2-)4RD=nnyfOg%QZ;{ngjW~2(MKd1ZZf=Z9aXEbW?97Ts zds5eb?CjLs>5=%~Xhx65eZ^$G(p!5a)AWp|nJRnFlPb!(lHFpdpIl?YmYO_kdT4P| z(P<ft6<LWAVaqlrFKlrR@|md|d#RTD&_pfwxgyg~8~MDndHKSDwff(R%Bo#;PVvk# zOt)h{toS`ORPyq}?6OVXFC{WQgL^7hnV>zD2g?7mOQQ12OXmHLuDw)t_tV--i^b;r zPd2~%eR=u)+FN&*YhT_H75ku-y~6tHO`Usof^str!dT^-H^hGV#(4i1<5A{I@9S4x z`PO*9TBNGzjL?<UUw*vcuh)F|K`#7*y^Ttzk@oagTO=yh?D3i_xWeG`sr|FK0>9t- z9BWrvI78%*Y|H)n*Dv*-PWqM|y7P#rOw~pOuaH$Mh1?&=sjT?bD*li$WWl2E-<kvz z{12F?xh5$}us2jpiG4r)*BSY9{f)Dk4?q0dy#7la`|ITMx7P56mf!rXy(+BpP5uR* zo_49$g1teDex`Q)wcq!C)y&1qwv|s;a+WHtS`)rAf9t+izvqV+q_7&KTz2@VwAu04 zm3(9O`tR+5UOV+4eE)o*+~Irs;$NHAhnCxFA3whLUHx^I{NFGBma6(oZQT56!}MD% zkq=pw>vg!=a#>8}PTQXOv@~w^PFur}Yeg24uBq-0-=EyOkSNuk@WQ<-)$ifIgf}kw zt7>o7t8R7QZ+r8{)oHG`HvB)b+GhRE1NMb=b-x(xoFpE~34E!FS-Un!wO*<4+dH$X zAGy~5kzV>~+Zyj}Y7N!*Gvzt*PydNob-PF-bpK8D_Sxq7#yUAOYCo!m{i~_{|NqsL z)5ZsC9e#SPunkk~bPAtxR4z2M|M=x^=eB%a=%ZeDD|o~E<)PIkZWGF9pJQx|K9;}q z*xzS!AAdO~RlfJm-P_f5&u-tp_0%Nz)jpdKng&^`IW9jt*fB-bfAys4bwB-91S;)M zkNWX9Xctf0?ckX<BGVQwb!$|S669Q_`tM$C)GqsdUF!S4mf!1MrMKWtXz2pm_i3M% zPrt0%_~28=sdCdfxz?qV_5V-s+daE}*REZ=woP1r`q$mNi+=mY+P?bs`<ux5z1I2B zGp%-4-<JOO`hNXx|J~OXHO?=&8*_W#w<qsrZ+miQ{@v~6D@#_cUibHMu{N*C6rt?& zu!p~w?#eH}cX#7A$mvy^1R<$AvOvf_V}sa&;JepiZXW2Cny{KRtgo-CGO;yVES={@ zn?Vg%*6PQWyc~aWn<KB?tKQb(Byez<O7~o*nODPuyl06OrTXrbiaT*P=IeBY8_^99 zF5G&1Qs+gHI@A1p$F0Mjh&4AxN3=b*I-0aEF48o+)peo&lc3qwS5~@<99=u*90xOl z=Ig)bOXqo71x*#MIiAt;E>73c>ZEm;o6u)T&&HxVcONIbo3e+?=KuMVdyX+no_Xwf zlvCo^{8AHl$3)}Z(Mn9yx5kMUPP%?#mYMJLw66@--7?#59ZL?7QP`XIJCfax*J1J6 z(0K(<j$LlE+?eOVePzvsNY6K`FI>Br5Tu>Lb?%sO=>3AmH1ov)8q?;y*<yHWk#9${ zOz+#5rl+Io?symp^v+AV^R^~^Pxt=&leit({}z8qt!SF{D*O68rK#Vh=cF!=R8<P! zyxa46ndtoY0yC6nyToXyeqCm$d28Qi#^V#$oHo@eo!Ibkdx;5;<sK=fdAHtPGjhuh z_mZ8QcJoBy&ghz+YbKfLRyQ9wD;fXs7o2}G<aEn|XTna4wD#qvyW8*ts&RLG+5hbw zuVL@Z6MC&u^_RkRqk2wg{MyU-b=${#5p5gWI6hwv=8>`Kc_e%Dc8m9OU!GSt`=8Bu z+2+<gPw~~{ll<0`wqM&E(Bm}gWJsCn%*fcwWf{C0PjaqDwk;~YbT9G1=Cjw%W^t~O zy<{gPXdfZhowD|$LRD#P+ojhBmVcX9rS3gfo3Y%uT-c~r+F;4w8FRAso|W1<T|8|A zcilC&g}!B5&n9&oni@B0ThG6+Uq6iu41$kIWiOUHZJZP%&gkp)f7{WC-+P{<UHK-u zziL^2a<t2*Wpm@@)%?m=AM_1cWHil;b58HlXG=I4mcL(>7B)R4^5nLx>p6^NSDzhS zv3~8AbBW2JDLs=a!#q2$#d5hEmcA3IH|3Gb$uq3>st5bE5@u=aO_cOl{W&*n->d#7 zX=MpDyWLmy%G^A(kYfT@?&@`(Q4+4=iu`W^ZpkzovdFqg-L<&7sYs~Rc3;n<C-P4x zTkPkLHu^em<HZ>jCuVXbF9`lxxiRnFw`JKSYbT#<SJ>uYk~_Kc=(RIvPMzKGLu9ts zQVmDzJ#&n=OcU5@9cE{=b;o&*kZ0Z|e@reWew>~!=n(V5Vm`mhg@QX-^G(;~%guHZ zHaBm3y0z^_QG9oD&OVQ-Gsk|p`7d3zd(Nq<fK0(p-_woeTq>U<_EyDhBlmB`qy3Xr zt{;9PcYj~j`%KOD*(HyTith{-Jbh;MJYPLkrP;?y(~Ha(+jAdSzW;Ib?R*_uQ<n|# z(>F^n`I^mKw!7SyGwk&Aoqu$nE%JLd%X!J~>RDH2^~~VPdv^Hu%gOrH%E^ve{m)x! zciuUpV}D=cuHa%7FZ*YiR&ysy^}b-y+B)a(f#44nwt=NfKl+?}eI_%mehPb<|JCg( z)1&<g6juo;?b(-{JO9s@?|WyhU;9h*%b(Dv^|A*qAK9AKzN&pnjf#g#r|YZZhoaVt z|6x8P@c&fHdW}V~^36;Qo<~#vhre`ezc=}k*5aG?4*I=6T{fM~(mSoAY!_qu-{^d~ z+HD(a*DMYPR(tm5r#B~^nsx1U<ca&07UzBbUw-vYYxY4ozo&m*h<9am&$?4EjYmbi zK%rv)se@DdU;KZy{{wFr7f1ZpL=NVE><MgI3@27;g{km!?}`0iZhkFVzLEbRgY*|k z&jL0rJ)x)Hmrrdm)Y%(YKeaag)q4KZ|9{%*oWI|Hye??*y)8!fqZT!uoGB82KV*YQ z{MQDb-$7SZAHS@fJH_+Xq=43!ACyhY8QtGax%+0f*|$`mL)-!{7o<8l*s%XtaG-&o z@t=nI!3XvyITSt!NOd|KeIUd8P(y;*k)=kJS&L2RfQ1LcgEro$@%oFuIx+?rHM9ww z-p9enrOkFA^W%dFYa}XSRt9ZoS+y!i^32RFU&9u~X$M<QEos`&rqU_T;S?*hcB<>l z)V#2j{-%3!UhI`zuyMXLb63wAKE8WKMT?gN?mjGJ^*&MK?3R*r<H@ERD>Ikuv3K{j zaq*isH>y|N&Fbl|XJRHTQ!O<=>DCKBWcIdwvMzU1T*Bn==TdfVYim3+RdVLvzH+0; zwR7@o_0qMsZk|{arR|ejd+ki>k=RvnleYKnP4DPkc_wep=2PY7a|KuH7A3uyZGSJK z^^d{)v-hIUZ43Cf?oI~p5w|yKm&*8C?I+#4X=ZY6iKg$GHm}ru`zB>|rybqwF0<>7 z@#{Bl@_VPOyH_wb{P^~>C%2m|+SU|j9{ho;z~;fWa-Eyo7d*?2Jdm?MLzKnrz=NqD zoHM+9*t2pLMJ<$^c2mC6K0j$~p6})^y>su<-#wq5f2rnV;UmBQYVAgxOO2`nd%`)R z+$s<H=lf?k9y#c*FRu~k{dbn?|Bo>Z`S%$feP|QV-_PjjzG2^uWh+B?r`wkNP?%oN z#3t^4Q8z$-W>@hm$Gu-8Eg#<aAyNI5dE3$xb*sbwvfZEFzi7QiNc<b-LoxX-lfE7J zbHHZR{rI4lPnA!<S{vQ)!BI%`&%O$8y>OQW?e7C@;#S5U2oQg>O83p*z{^^ysT+15 z-uNhTQfljzFjo6365cEfc?=alL&H@<ctgc+ht%Ca&=#i}=eyhC|KI6avo|hpNHB2z z)cE|(2|I=hZFa#a`x@Ff7^GiXZ!$fdy7}L<Qx%o}`P=8qt(s7y+TSuYZu|XL3$j^e zt!jLDWkxJ})N<~3vp)Rs*8efZp5dh93MV}_efFk?u<6q|y}YM(YPHXAXi=Ts=}_Sj zCZO>*{GYwP{B-`7e(ev6s~g&1NZx+4d)mb6;?Lh_PAXYArJZ4!_=m3b+W-H0?^pOx z`&0dK_|u=(YZDYhzK0b@R~~L?{J^Kr!Y|&C-m+1pE|&d^NRo$H{A$^&%14=;7B~w{ z{Uefk$YYAY@u&9>KKT9WszZ$i<MXH`{{j}d%(`(xv7!FTRo6FvcI;YlW}j?Ygdgi) zo4=o96}W0lh0mR~s+LxAv|zs3Ij!-Q%9G~89V(3e`|G5q7~1?=xX4g8Z<1_G^6EL2 zte#ckZk%rUXRj6f4tUhEWOp?i`^}r8=N73etX)-pwyk5@?`o4LC#HOTlJSvmY6-JS zu28nr&9)zmJj+&Poja+zXKw6~+PX)H%RU#J5jZTmHSbmOle+nt!sau4)xX@|d?H!6 zdTZ~q=jIki*E7vtf5`38#oUr-uCL2yMm@^uIJa`|+UT`O6ECKRz41MKcA1pP?UaUK z-~W>?^BQXI+;{fY-nlEPnTsn=@3dw<lgX$z`Fxg9z_NY8r;Se4C~BWMeR{jDxVLWS z;#`izpZhiDYG*Dev)!3`*5Bo})a3&?5i7SnH_qyIJN@al5=Yy)(j;Xa<^y$?cx>df z(<-E2{h7P7_`%_RPMy1{t5f!81}!_i@7AT*uxoeco!NV)@1OtV*@yPHrnqS6T-G(& z&6^y%?c%ZY-MMj}RpRd5_V>xJF?;A?DG;h`Em)9vvGk3^4$ap3N1y)xzQoj0qZ*pE ze)$@`z|;EOR}cN?O#bw=+L5P5WwpNEw&I)oEEX}bYK}S{LVH$*GT+nFyU*0YEAHxg ziQjZ-RLtVDFJBgwomHP!xl?)R-|giaC!bDx;#0vD`g-1dS0T^W^%ZROfB$y8{T+M# z<jOTu8~jUd=k48f*QrM5;jM@67N3^%$H<)EXPW+M^K!NaX60<=d3rl9$_pDwsi;f6 zby98Ha*+4il*jsWGqyV(zgVhi6!u){Vn>+#!$0rT=e+v+C}Mlzq5{oj|2G}pT;*wf z_NnicjBn=Z62>}jqfSj1dZN4HX02GEs1l3qzw=R7)_gZu^CYqKJzG|F<=RhcI`v+? zm7A+|abskQ?cs&4=R|Wvw%*BFr`R%e-Pz2BxK9ONAAZnW{o3Ji^zGhVy3@Nia2@0M zxVJlVe|fazwke%GubZYnJ+g7frN073vrk@o@noquZ|a7h0Tzdk#1}5vVd0_>e7Q8| z8FNp^>kz$S+vx}TgYK=V*VnE*$J-*fl6C6~hO`ei@;-X~;askreLCZMwdP&J(z#FE zR?0ljPFpgixpYO(Pr1o8fopg^%zV3<XX2LG!FicdecK8<3qNHZ%iC(Y$!}T3>Fu7k zPV`6fP0~pY_L(E4o+19o#vyjYUq!vH;uW7-XCFH%os!=$P2{hHAFpwU=*wl-?wL9- z-4J&<b-@N+hJfJT#YSc~tz}j}^_GzSDmiy&b?{<#wQ8AXK1U9$wG{I^pnlia)Pzxa zR;${bjn5)aHumT2mR4a=U$VVpatz~Jvtq;VzD$0%@80@6>-LGSQLmh1t&4jPNBDVe znZM=9*S(QXuDtYpal55HVD4GnpqEE2m5Qh5L^4k_-LCvSENb5LtR$Dq&TPBiXWBiE zdMP*M<ht(EgDJB!(&pdh`4(~S%lruwxAm!iGV*_HT-^Ug*KDSyisaViGY*x$kKxE% zmz8F3b@ApJHDk+bpL7&wJXUv_@9p_9@4eCd-PcyJ9Bpj-_Uh-|BX_3@iU!|#85G*` zo~!m+<e40nz^i-n!?ae4-<mIXz+$S6@aGa%w?gIvORq;Keb!B1Vc4Q#>SuC0=3tWA zjq7KYyq&=4vhDYr8&~r9l$X29%~-U=<in9{UiFG{rS_!cYmY5Vl<V&9p7DErmib)8 zg(=yYg4S=p|FCi{)k?ec_000erBD9d+`4I=U9e~9`gPMve#!c*_>n)Qai4;M)8>6E z&Q91eX{W62qG=1Qbhcy~tugxT?yy`h(`={2yU=43?oTo9)?YkfUYW#{1HGD;3T2CX zFISv*JZ#9v!B`Pob-YSWU3kh;nP)63#ca2g9Z`5(uzgK?wn?gDRDl4iefaIkdv4vZ zR%a{9TX=5K!<dNKtD+a!_VwI!U-(AL^RflULxsRU$=erf?W($~?DVa_uqJvvQ`fDf z_7im<E)mK2bZ~{<<n4R7?#-(cx^kS6Gcz~o$TYugErDwtvpZt;Z%sZuKdVc4-Ba@& zzjJmr+sSLjez}<@ol`!uhmFJaj!4Mz6Lw33wiZo}y0WA-c$cZ1%T?ohm+Bs;-%5{D znD{VKyN~1Ty4;%cnKsIg)c?7iZ}dBBS7)YuE?<CYPxH-cbLrK`f(y1zdwDH7^5mp- zG90=#n#+T~$X=Lt^H}-ZV~x_na!yUn6KDGKMen`ECm?OVOOYue_+yK;Ft_yFx!az3 zgtMqUel2-Mn#uB2JBPdO1D)Hh%bL#ZHd-PbuzF{4*^MM)qxHL;1I?B!Y<Rk)^pnMw z7H*SQXUcppnu^^L@A)}Bey8HJ%M0sGp0+zIUz!;iX>--Sa%P3=KK}%7kK7rFy3yBi zkYZPdECSRp!Vz0?0-rI>$nW#%hqZr#4j>^2*FWz#2@UyJstp5x{8nW?_r^WOQ` z-FfpR`ZJbmW$EP}XIi-8<}|iBe#RA|vf7`{ecp0E%Uet^*`r%?o#|QE9wy7zSFTGt z$Q)+$U9o7Z9?Q<+=zFgn-o&nYHCv!<&!Wn2>x<X6YgoNFw{gxZfu&Y&%`Bzoan(J{ zR=jG^sr%?H%a6@54R2+3mrKuP&f&H?>CmLB!MZ~6ckJYyC-!Y+Jh`Jj_q}#73)e56 zGNF%48&C5(?XQk}aMvQxu;pRwYjY2QgEL;LxIf$&^>gx<4=29$&DIgFs|yy;?U&sB zJ3?aa^qnU+PPW`p!d17n^yf*=1BYX;onJ0-m`OEK_?U3mmVNW;%U(8YTKMqg{<uTp zMh@KfzFfE>vg>yAwX+77choL^dDS$pK;tp{brX-0Tg$#1q>D-l?(>UqyD0ViN9tyU z;H}?g*<9qZysI9kswK17^47+tgDXV7{NH)l_U81`GA8?{&vkB{6`U>jp}g{l^s<mM z(<kdqyR;?qq=f(K-MMF8{gsj7s!F}gdxC4amb%WlEnN3{p1Sa5s!h^sIh}D?o=ey2 zhnvC+{k7jfS6mb|zuejIgj1qE$}2(Bu3Xr+qKH%VYw)*6d9E)WE)ppYvk+OS+p~Uo zS&ZaIi&OU}FR^h+yR*MOIWpYjlFRXB6I!LdNpzmHS#FfGq{jI5|Ad>5w2MQ`PXG9o zd3ar>w4cP!t%-AQxl4+ET{uhLcvr6Rv9im2EBl=z*KS>AEm;*8WZA#G>1ng$#tT|; z*YDc;h4r)f8yKV{he20RL_QE^ni^ZbxZX7+c6V^B;(9LkR}mdSmp-&^mYMV1^L_Yr zj%;Q1$7;;qOJv+cJ~tN>Zu30$@IiuQ#!JV8Y8P}&t!-47Dq4tS@1C|)WHGx?qIa%C zlo6i>k9KmvqQZj@nYT*lc+Je|ODePCyQF$qcWE!5>qGyDutHr6J_qLN%@RE)FZgc% zE!OxTgmd+8&4U@NV)r*_xU~Ea)+sL%IuVs25G%Ad_v5xGTfVf#YKk{iwrvwkHf4Tk zSyr;rCa<<vtyXxVt*EE}yzg&9Uw>1%tr8sI_bOf4>(c{^163QIB;0XJ5c#|9mXox) z=rNCVXH4_b%(Ak%n+h~<Y5h8=b$ZsJ4TT>HiV`^|h5g?9Y_WKUGwYTg6{&Ue-aWME z+~VW-)8v=eMN9YP%Pc19*={ryU1)hl=F+mZ#B}>J>h)GBI%^eoyqP(NOK*<IS9#tm z%YT;~==>gR#%D1>@X(Z76*etO;uj}=**e45RU!EL;R7Xx8*EBus%joM?7G?P%d{=6 zy9I1SKL2%fy`N!_B2(q*wd=C;9PaNzOU^{FF#7C!n{V<zc#W9(-FHO~+H!-OF0$yZ zmQ7l2!D?Gya{6*pRz>H8#R?X>dEV8YOr0;y${v00|6$R;$+%^IMwVq<E<1bR!$Shz zM_w|XILBDK-}gYl-c6U2wX_$DeY;oiIA{NcAg=#aEKUNkyYjy7VQ1fKWW0Xvj{C9Y z0y_#kKFP1Y6T3`ySI^ANXTBWw7kzi?y!G_>)L;ItTheZLp8PJ7S?#AAoUQWZ)?T&a z6SrL~-!`{6GJd;%N8Oj8)z_Zh?74R9Y4lcxEuT^pKX9^`hvwZ>I#P8lJ5lMHwBA-0 z+vH3?M*o8kKD|s|T|9-GTj%zh89|j1ue5&c|9@F$Tg;iXZ@ZY8dN;ihGQSw}!%=9R zM)SoNU%Wm{im{)=d_|<hL;m;GsHs7#CK&HdIn%pUF)@+vb5TsRV*#ko|5@+moZN{l zW>vNCrFdHpG(SjX-l5vxvQTCJ#lZT5Zj6tDmew(Uo*3}M`$7NvTF?3`zhVMEBriSu z>EWNyhdMi?xw~6-#HpMQ)bQ3n(6YjlBlYmXPrFnO1pecUlhdBu6>?*ZJRd{Z>_FWl z?;Z2{(mic#_iQfu+VaLbDfmF}hxrSNKi_|}=jQ9v-DlsncH699lwiXl7ox&x#A)Cu zKRq<bPg`i}bk3}wFXEp%MQ!@1R<onVPEYR7E^+?-BB6EiA0rElFYxA@OFu4Zop$ij z`eXZF-Z^vaLS#b6&J_{YTUdLSuxuz$w&>6Lw<VKt`}H2<K<?KfO{p<i994O{oCA42 zOkcicd3V&gU!l6yiQP9JE3GS?E50z}M5d+mOOp~CyW8)CrmoL=^lkP*_56=MYPUl4 zt(;?Tw|dLp+t%?a*-6d(F1xCY+$7%JrbTH#INr`;ns?68GGC2(8aMm>9sA4X`Z>QA z5U82|jA7a7Pmew-NcuN!y3_nW+v{u8qNiCaCdI7g?!Fp-QKR~6*3|PA(h7g0CIrf{ z{h0nV>v&Q8^wlA%zci<RsN!NxKAYhlKIv}iW|N(+;Sb;3uUa|ttL(QY*<W23FU=CE z`*qX)^>xnVr&&if{*kMwS1c^};rW04s;O~*X4x*%%l)d~u!#A$Wde)JtT}HV2V1dt z9Gd?>X{F27!kEyH-;dAVw|Hy74n<CzO@Xgk>jQJ9Z#wCDuw`o2UPcB9FL{r3PA_;r z@V%WP;l?K4A|H3M$!boVUT(k-fpz7VFVubww`YlpS@prSp`toj_}_QG7v|5q7p>%e zVepALfPaVGs;f=nhvW}QZOz)VD*h_#)5j-^R{p;#?y>B|Z;5+l2A=PpOiVi^A<=5e z#&99&L*j+W2h3LNU_R1XnVfa7eIZj}P1vei%f4^&JgznU#~I(mhbrDI0&N`1ADVdV z_4V|A$a5$^{P4#k^nnwH>*EipsfRzlaGo#JvQYm}_*G^mfoUq!`}f4D1lTvUx->Y4 z@JPP@TUvkHyS%e=&HuuT8orx3^H`OurgmkB{?AlfYISmDfN-PtrCJ?!KDLtiVK<}q zNDEAP%lcIJfp!4TLACk$e>{A{m6sgozwgocCL=MfWzMPPRaHG4wWd>oa%Z2GTK@A? z$%<J;s|wcFTDVMH<ytaNsVZy2GXdGP+}yLbdYbX&K2~8DRGs#Bd++B(3;_{QGuQ>b z?&tUxaXrdTc3P|UdjS>&*8+uY{}YnW#tK-wUUXUg>5c63(rL$ZO;@)b2o6}k?x6UT z*p)Xd@9Z_dq8%Z%+^DrF;paggC4uEj{sfkPyEBcoLGp(kn?A#%_Z2%lIFcNG#t69| zsK3WNb!oyWmWdY}h1UPx!rZdy{nfAko7bHy-D|B9DB@Sy@7Bs|Wc)z2(Z|H(n!ukG zHP&DLAHN?c>RRB<BC)ROo1;b@`-^{dF&p-+X1iu*|7-P+k3WkRJ&oTMFRm?rRQ2)y zmHP7i|5gTV74ek6__E?py-R|f{on9aZ~vZ-o0D0Ub$YV&tjq8I8UI<6Ys0Fy{q_TE z`+8G{&kczkZCb91rmKu+Z`~^++8t&5>73NA`+Ti>jW!cRJI<Fcc=G7(V!rJcS0-%H z{Cy~KgT>7=&xD?-xQOhTz1r`(;QA`TIYtM!Y>^2_nVf$sbMD1iA_p_tW`~HGcQhVd zCM<j~L-F;;C5ic;PG5_#yO=O@SrV64gv>*^Q=f#l3pdZsHDtKMuHtk-Tjqdj&s&Xv zFDK3`ODH(-S&40JJgmqf<M+Yyufk2igeBYC?}Wb8XunX*^l9Ig+g>6QYnQF@db~!$ zcm2!#Tg<9e_TDg6*z%uSuH{g!e*dHE{%?Gjn4G$O?B(qvvXTqqo8-E#rD~{iM9+R@ zP}tV`aDyJx?4vL5ESgzl^fXH^_oT%Bt$}H|&m*Q*<jq|0s9@3IS9}?7zFoVO&E<Af zPwT-Qt=HO28`M2|#5?UjWNhRW?UnRA%)auG|D~HviyzFpwZ*)m?&-_(hb$I8Txh;Y zIm-H)S61M{>dZ|+dsohDTRxr5OZ}36+B(yuPla~E%l)mb?l#-WxVTsOR-RRV+bcX} z$=n*1q!}*L4wefDeu#0=ojKXwZFA5)c^26(i#Hr7Ima`zrF@Tx$d?F@`JJ)M-vYQV zgfu+S*}X@bUAiLp$I+~78;ds1ikaEFy~IlE^2BXrUK|ItGY`#-exdE^88Dw^zURS% zuW#qgS;2T%!0lzWcxC4DMZMQwB>7*myOsLH`+M@1%T9H@p5J5VZ8_#pE*~XrslT#+ z&N}a?i;vqSpR_A#md}*bz2o<Y``r72mdu6riFOhGDVH5q*X~Yv_~H(mjoXbLUkklN z1CJRpVH*4rIs%Fhmc(qzD_;A-L`r6EM%T2WEkT>k&RfL!V11w1p@yA;8##Ay8}f)T zamW1oa_DhDtn%i0?>3pp-L>KVUMl=WpGEE7r<YbX%FE|?y{tRzyQ6ur*X<ospTw>B zrq?l#@1bcW->mYSiPkAO=WKa*3m>Y<-Q{%U@{ZYQSMNzEtPC=_xue7>>)qsSR}@{Z ztBExRy$t1w^$`10YCZdJLqO54v)+fpo_(xRPwrsU(U@Lcxbi|#t)eUA!HX?Nw+WrF z%I^6f6HzVwT;KVjk^CaLrh~Pw9Y2&fXkOD|mvn4+IK!IJBqi{qt;H*c)irTF-$IWi z`mbG68Nrg0p7~nO*iWZuk>tdGvD5t(6t@39(^AbW7Ip06x}rx0lh$ABkaM|fUY-8T zxY;G=-aVJ&zrN*)%}SU#eR|;@qa&hCM@@X^E^HE<A^LaggQS0xY&5q1FnsDN#V+}v z&0M%t;TrQq1F=@M%cYikyG{BRJmXO_3fiC}EYzyr&o}=-p*q(oC)ehO+)fLHT{^@& zg<DU`URF$>!B=HC=b>_T1fOKzmh{#BqThKeG?yFaoz|C-o|oTp^wQgGlj$u}zZ}r0 z4LYfll6ocm#SsCUNwZV4Dqm0NN%>$9w$S3#!+F8Y%YJHVvpd~a-sM@9=J99g<Usp$ zq4_G;!<Lm^d$Zxk%2m^P<+!}An)thwW%IN@_3T^n;)3Q%H<=>=6D6HpJ@kZqX9aXD zaZnd<OmA-C<El<CyR>jZ%gt}Q?yS+>llL-c@)_pli<J&XG&b&2WIV)}a6jRk-_y2i zDL!3Ywdah74Rn4l3F|4+$k@1O!v^O>1D(s=r?$;c$g+Mfb?EZu2@~@^&0yJ@8}qv@ z+~wJk_ZQCgS%^fr^!=I1?_=$BDBEPMX@ssQYrW;=I(wg3HKzNM?)?@rDbcAm_TT+= z-?C~@?_vq`Y?Y`2A+sOey63tY7XHc#IH7vJsOO2-0hQ{z2@PE0FT>9$uAVBdrNHI4 zhEMVBW8MIX9p@V!++LzwRG=yPw|1@IlmsQ#2>IszZ3?V0{>!dil#qzdO`G6&*kS+N zIFqw1AGF^8;hOGOsa3e+>A@XtT)uTC_a-Y!_BozwO%e!+`^WWDJv`;zZQ<R^uNbH6 z75p<gXlSpbbiLST?<&t}_xUDEZw)=S*mFli93S7=b7^-Tmp-=LvNh>~$hBDYFK_*3 ze$t!!UGhCATXjxE<vf#o$2h4OI>#8(%vcwRpK&l;+<wsclHdK5B{$OImrvU_OT0?$ z!GZA2E&SPU)kHr|mU%eA$?D${E!&GMVgcDp*<7S9a%lKCDiuZ?I()Tx;XFOQA|=Ib zGAv7-IQ-1N#B}p*a^YGxea^M*Et+$dU%jzRnT^r^Zgi|U<LQg5>Y7_Wv`%ZYGCxq1 zxRT%V_6)@Yz1z(aEjON8l+IDf`SITAZr&n+4i~doEC=sh)V>jt&b|0@?#mMq&*b&} zSDmVLd2lR8)%nTtza>v5U(OOZ)p9BJE%%ln4%7NCi<_ekdRTmxa#Apv@FDo~qI26< z_!yMbe)>C;r8;g;+PQ62iw!`H>PP!OtGrWx<;fgW^fJ8h)^q!|ig;Vyub<Z6V9(m` zYQT3^E{gr5|N3p!|8Axpp7y_T_S|EqO!Qt0_MPa_V4B~2DE`T9)th?XSy&FX|66_U z)H2U&&*}ru94ocBelPT^Bj2gTkHV&F>V?I`haRxcyXq7%MZkN($B?gA9Tsf6wW>em zzKw|L{qP3~f!caPQ%*bbcz$qZkyumt@caHp@3j^*aPi9Zmw)m6-f%5?>Sx_!&z@}w zp1Jz)zb2#EFRhd7{yw((uM{K2=)Yi^*t6f}DW9YF+{q|t`EavOS<81xlEeSUA5xt> zro^cRsxYT6e)RT((LxPR{ZC8lKbYOW^dXCv{nXWq-&?jig)uchy|QO#{MG*=cDeJW z|LfX6(SQ4?C;#}K{MlCL-*M_eztM*)XJ((QwztyySt8dN8oR^#|E3bRV{hXlt~>p( z5Iru=&Y|voYs<{7UtY9{aX&3yyS=bFd$P&zfQIS5%VzdJzJ9me`~E_|l`cy@GsZ;u z+`5wC|86S(c|9kQc~cTpm*{ASmaJ>uC2?%qVwPWC^DU=u`gEa)t+%0Q@7*KU6&HSg z|5NG09IwAyH7!Kmt=zTx`nPkRVwiTGIP%t?xBv7(z8^bw-EaKQzsG8oqibkWU#CN5 z{M5h?W;ycO9~8ywAAfay<ncGWW#bQn^lwk+W*(4I$(UxZ_q~1p|EZi>r>{=G__2J? z;?Ms=R^1kzewCp%R`BY-H&aShADq8)d-22x+k9_Z?eWlMn(uuoUX(@NwerTQoAt9F zq%xd(J4g2O)5Gsi8?Jd5e8^)${DS~T&3LoS@^??<4z$FFd^Y>BE1vP5=e0X=0!>m& zv;NxHhfa)|e?E2wyXddJ+4DD4>)f1qS^1&Lo}B>`*_S>(kR!iJ|I^Mc{YHm4JLXg0 zPTblb`E#z`bd6N=-NG{8j;+>acV}4stG~fc>%+8FTH!m`*PdG9-uiFX6+!Nec5hzq zS;frP(!F<)!^B_HA3qKMF+2N^sQeAaD+&i1T_!ZFtNXJz!a%P1qlN@OQ?IW)i~V$M zd9B6grmxnMtJ$5kv~r8Fd^P*L3Dqj0?_IrK$bRZr=wR%6_^ObG+=|ehSL000N=vR> z`M><{ZZmI@;-bxymp9#C)N+J(-Oi^!Zdh2>msYr)yJ?lYNd6oT*I5P0d69R*m%g2_ zWnJlH%V-^mYnj@7&KFp-lT}*g&1cheNOb-;SFmCEHjO#<<$51?&eEA1XfE<5c;56R zoweHz3tnF8bXS3C_WD(4SDMGI`W3x$x<Yz)^Mnazp*LMrawK$1a|McOG+SJnKD}C7 zGkK@mLXO@4Ik-a4Yp!~#w~zT^#P|Dq<fdzX)eBn{v-sfu{m+VJ1zrT)xSLqAFF0M$ z;aEzlG^0Q;TQiG-Lx`P_eP#i>wh;R&_XP)9c$)$y?!OTD$4jVXzk~C(|Di_%W4C8W z7FK&*)n0J;LjLs5po1USn`;!Ow-~h9ecEam-`)N|DlSgtXHb_-z>57Mp>hq!cTX=l z@Mc<hUd}a>C!K2x#G*A9t^QfH@mJ^9YW27GFW$MkUFgr<t?QzTw_RGJqOCf$O~``F z|1DP*chZ95nRX2`ikO)8mj_S!YH>c*X-@Ccf3w6IQs&6W%uaq`5uv~6p!DV-Dc9EK ziCMlPc^i`~v~$voPrc`5p3ZSQMaE1qbrNe&)BN{lxxTF5&TNYdi>b?&4wlta<&OFy zV<^Cw@-c3TOy${30n5D$d=}<e#9emD3@&*iDP}qSd-+<)*&1guKN@~*o9i(__(c4& zw?`Tt9nAM&<PFYzV=Ui(_&{-r!GYkn^KvKL(Pn2`cSEeX`LT^IyO>ULb6@jH&Z?+{ zT}!u{bnL&K8oS|>URUX4ztEkBAFq4)=)1PJl}bvs>6P=lr~eM}^WA>sL&kw6bKa)9 z)x5S>H8|YV@4ha1jz>M?+yDP(d_K<=t7+u9(nM_S=bj7|k;zLItCj0{sNJxL$P2uC z-6C;oOxoqXD2sc$9z15%{JCnUkziwaim&*qrB7a(XUx{sZc)#f%wg%dbVrWXS{LRC z)7stNTVD_3ZQ{(oX&~S9L3a69W-C57FR}2BuLmA-EE9IxwywEvxuzQTuh4}*0{9~4 z2$fCRc)*hR!d<%=4Rx2@*+2Xd-2OwJb57{pEfxE2`Sw}vm94IJN=o1Bw{}~~cK-s$ z^571(_6oO)7gp@L7`W+5!sFGfJk8zC42wQ}?7E!LapX|YxuWJt+mD+rW?Nm$QW&>9 zTT*1<i_=03UpG%*urqpx7uTx)Y<x}+!lG*zUwEm#>`$?d^NCBkQpFsv3}@T5p50ay zH}9#>rj#6>llGa7-fpr{J8m-Qzxyh1qHynHpRJoVb|n-XuwYle6ri(g-<+1BiUm14 zI0T$anwuBPZ!9QiG4#6cc;{lxwa&Em1G`lJnk<>KA<Obz^PK~1B_A(DT+P!^Z99^; zkvlo^kj%m!JJ(wweJ^Lbu~uC^oX~i2Yt8ILuHx4MOtWf#TY1&%s8<C}Uc%b7?7NR2 z=Or~Y{nsv&Qj%W&p5Yy?SS?s%`G{Mk`oYrt&#fsd8nRwC2TalYK1Yl7SaN2CY)h)e zj-@-hjf2&Md7GWrGPf-ZUa-|IS4yDB*rU8*hsc+W0@jPZa2zz**l=U(;XNzVS{`iw z{k@gF+gEpo(6!gzw`vb;eKlo*!A#a>m#yz!Y}h&5#AS2P8&%=UpI)|}blCoV?}sok zGY^^V!aG52H78hG?ST;2{j1mid1vS`9gknj{r0iu*8|aiHJ;p+6rIqj_ReMP2bt<9 z$?RiC4tj2K3tr05<0UK7<-&I8&mEcOzO_@C+miQeJi&O(>H5W4t_SO8$}C)PX98Ds z-kM97V^!V?H{bsMufj%T-2}0XN^h?on>y{7lf?}OF{Q_={#HG@)OU7&no-XBpK*zk z!hGHqJU%&f*`<H)cU}`<y3@ArhK1;oqYZl;j`J~kZ$DYO<A&bx{M(9?dwt$`)QEmk z`O$Il>BZ)b+xg}tU)R3f`}$yV{_;Kh)^(^>c`k}Qt+RJ(<BYwJmOm=LtI^)|w@Qq& zkVht|m+`2|LH|c-({A+qSIL_YkvGNe;$c<xuIm;ec{?mQ!cIPExfEx@r=dQ3iSo;q z2ag2%J-j7fX7C*8IB%O{Wh8QMW=v+q@vQUn-u9;6K6vs8<I0vhDF=d972PxAdQ+5m z!qW0~YI&*P8_kn}OegEN{Ccbw`-ZE%?n1!@CxM0pt>EY{TP9cRWPU&0^SA8fqp#MN zYh3bMv1j(;=kq%{_v&S*1xZf7blB1VeVNa>4^J+?X>R@1AXIp~VcD+IvYkuU%WJ14 zeNUU^V6=>3`NM)~bN&Y(`7&kCUYD<@&D`WvYxe96`Kx~~Wv1QI*gXNO?@j;y?eo1a z|NmFMtnbT`n?6<By<z!7gXu*ZukF-!joGEMO3zz$P2q}8K@0X8>AE$ZdR^^@AAZr( z3sd2&mtP$gXB*u0XAQH$gw=;nT<?BhI{)AA2d!^6-uqd>zB(kv?t?Q2SCj0%*2f<z zB-oBj{4r&*o`%p0Q~C7wPq#bR|NFk=s#&wlyZ7c&i@P=d{kyd={Ox2HkM32sR~pRW zsuSk^!>|2b*QIB9kl@;-YqxC@GDv7pncf`Gz{MM4Cx2?a*48*S+57*?qBu%CLSos= z88__zmNM11FZ9!+_xzcqOCP`Qzj`%f&;Cb|)m1iODyu_cUAER;l#z6B_};zZ_dWTT z1>!%=uiZ?RjP`Q<_-SeCtM02eMfr86U;np#cS*^FIs0qsHYpT2f1KsJm)G3K>-NUY z%D?}G-@Orj`+A|?ecv}vm30-o_Sv-sv9R4eYI~XS0{4{-Sz?uW1#di$g^NYp<df!# zS?+jv@`48+=1%)@hFyC7w$#ZB9yL~IzP+ux!gNAm=32pZ<x_N?o!Rny<DM(WHKIh$ ziY+d=-|w=5eQ&M8BzyhsU-(yrsfsrw7|7{|tgh88e=$krXtkY<(CG$?y`dkgR(#Es zZhd;{>YtjmVJn5&|LK1TvYCFMG-zjjYEaCY{TKLG$*&6i&9Wng{q)q@D|xS5%UKWl z3mp>QquN=1fALwpyyDxhRy{B8Qe9J4@?qMV-S?+|4E=f{zE-4f@6)VrkM{m*ylk$U zJ>xwmQ~ZAJssBP9ZrRD7XZ&GvAuu$4=AWy@Mdw!h*H`@bYXh&|*Kd&t8jOyAHeKb) z-81uM@#e|b-?W9V+5O4vyhKbGtMyt%4XG7h^`;j{yPv9B+@a^2pHzG)z(&>SeOW-0 z{r~OuUq!rxmi*fPTRHi)rOLKB3<r3H5~i(cG1Tx16L49xkZ0HLr`Pzea(ew+#rWvc z|4!!z?H>aASC)p@>2E*!?~nfXg$1n50gh~80u44^LJKA^9%S$ky2|f;WYWhE4s6V) zPG4;?{NV6MUR#Kf$Gi2^0gK8{5A`mpcr!o#9Xefmp4t7V+r>PMe?OMaym_x|fpnrq z(Dav|`5%SvJ8U}jy3sy9)<TUZAH$}-SHJCZwOVP@ci+{~OFfrenVX#w7B?&G_}Z5d z5#IUla~BkHI{llGAZ8!?%;enE_7{Cy!n~q(Sj^G<rEHq1w05VOX<(}>hhTe;@H5fg zhQ!1jEiZz(HXB>tc{Zt&Df}vn;ZyneP_MuCqBkA6g;wlavFrUBo%2;Gb0$xci2Rbl zYNJ);b+w7X{QdH)&HPO~^MbohU*+%K`|@9H%#XkE%h#V?+vV_R_v=~>**~>%;+$5h zoXQ6Rw7)ig{C?oYlz36C8Fuph-CF~z*8jisGiZNpc>5O-GuJA~m$UD@>^7E=DrQs> z*|oHx{_5|U#oPE6MRU8^Zdcu@9BjdKO;Ov+RQlyZ-pLD{4a6Mtleawg=8#v|^?jKp zYqLZVcVUfK$JdT)O8LTE%nP<IoN)4$n(v1tLJ?Z84(yCMp!si2Qu+D1I&W*Ksp?|M ziv-`q>GRxqloUGqp@3p-#j?BtnU{B_MV4l^>bCyAz2ruVjGOl78M{)C<vCw^Wl&_4 zar4{1i?(~OXIeSDo+G;VvB?wdJ(BDhA8cbz$*9I;A3fA!dr~?>oS~^abhGDoJ`P^d zhF2-tKW1cJnIL1X`a1E4_OU7nK21aE(`8*gi|^ih7k77(+NI6)w`b_(O|#iN_vyct z!nM~pBVulK9<rzr;&{H*R8KJYz~t#~o-EI_Do%8tx0JIxz+mUSs0~$?T2^ypv?^K` zYdwl%JMUjQhox{b!-Hd6h1r#6D3@L;pEgTB|Lv+HtzpxbJyr}Zk!^ah`Rj&>$AVfW zI_Jty-~Bp|g|~WD;dTB=Tm9czDlX()#;P+#q>bVG1jc<G4v!u4mp1HmnscDm`N9$X z_LokdAG&?EG<%nqU#ODM_}yoF$(FyqT)nOP=2vE1sV|5Z-x<El-(%g^sZG`!w)8$N z*`C^`v_JDQ?}V3&l4ma8=F_>wuYFcq_g<Z-ZE9TelwH*LXK)#A+7RE)(&(>azH)8n z0*e(VbE6$4cOD8mV%PHR)8`KF;3X-SRF4Q8C|t@eV3L}<DRA2pekoJmdz1Dw$C{o0 zsBuP1J+<eoU-h>ipAz#uZ(iy??OW8n^`h|F8ne(zCod^P++H2KadkVV?c-bv3(@BV zwq8t4=M5JzO?|?ytm?75By~-5ixOkMt`A?r?}Ue;(ma<GJ-CI|mwSZCu_W(h3Oa0} zle}r3;Ib!bCI0*wNnF3`ZWYeC)iU+T&09-8Ha}>&b=%o(OYVhjz2S<=xq`wajt`$4 z348a_`uOuh$KD;v6+gLda?J9G)oG;<+Lm0Zwf5Y0UA9K&L(5i$1~c((de>&n&9UNQ zt9seOAjPMp;Bry*EIWIOEPH_()AINF`a#RsgWR;j@*4gn$NGfraJzNr!sexBd=EnB z>N3i*v%W1WU6mmg@0llN^j0EEIpuWK22-)gjp<Ln{A>OH<~3V8Z*rgbTUD>yFMqZj zy7&Fc+Z}-$p4)?3QYsvf-4M|QLiQR~;-@YbTud~Ge#_39c}`S-Rqfd&DSoFqrYHG_ z7pq^KaYH8CF+rB;oxRfxnUf9sEaDw4MIyu-{dJTrJ`_CgQ^?TG6YF5PD1Sn$OvUu% zjMq(a4O8Vzd?jK!>%ur5PWw?Bzx+MVid|KzF}G}-xiUR0=C8bIATl$b@$`bCM?1>3 zO7!!Cj@?vXZIAamxF>5l<J(^sdDp(1@VNTP=^u4M-S_mh+fIMKdXdRTs?~h<#H~v& z{Iu+sowC@s>TKFBMJb&LQ@B+BT3hC)J<NP@)!e|5(I#t)zj3hlg(;e13KwRX9oQ>j zu_C_2UO-VipYaS!!s6?n7o|8nQh2hS>3C<|a>->Wmk)LOIbSm5xUJ$^V>DfNPKuRw z`{fTZDfWf->ozMqQfqx$75DLe!vl8(w_^<#j}<<Bwfk++^1}!A&5Cory=Hdk<4bD0 zXQ}r!mE6z1m=JtP?^^c{?E@aiE+3o4GU4}v-N|ka!QXCwN}Qej(1<HPXWr!<Q+N5F zdy+DTEB|4=@7$^Sijh0_HeLKQ^T?C9t~c|Zrrk~o<I8gKpLX+Pr&R@4oiOLw8TX5} zPqfxF(GPzb_S$OEImT9_M%jkLuJw9bcI^Kj&hV#Uk-VqY{Qs9$efW3w$5hcbTO$<3 zZ^V9$53!T~8Qrqz<Hy>0iyWq{sLfho+x$^6!tu+0UFNF+j%;)C(*JJVJL&OagVKbo zaOKm>j~97Xotfwq_gu+pGpO;kYpaZ`_r`sqkDcd9#CC?U>-fc}_P5OEjAOnL|2uX2 zA*ZDdMcQF2`1rdIvg|T{7m)bY_jTc^LmUo5wxJjJIFbS!=gD_w9hp#J|LgeC$4|o; z3VwJ9O=W8Jn8NrdBy5Fu*or+~@=WZHHtOu_RJg72L!OOcXUEP>r*cF7{aZDAW5D;2 zLWMJdSJuvV;#~akghk6<YZq?YSthR!S|8t+u<X^bPgnmm?S1v^<#F*_d8gGjZpysm zUf}8f&qGs7_(6>LW4?$M&Cf-AEVep_xz=>0zunV3d#$36anGp;Ge((2b8#(B!xV*m zuY6cfXs%V?79xLfciN1nXX>Y0cYc`0+7Qg?AD?pPtYO_cExrBo<W@fu_jY)dVKe`K z<-;r6_gH&BQ9SQftgo}-3HM^(8BBBEPiJ9he?PryRro`d8v78tRW0-R8QW9ug~YJ8 ze_C}kp83_1Kfl(eKfUfMK7Zby*)Nqujf*evgoXH@UGDwIUZ|1ZeM`0e>Gz9P*>tt< z-{gP5V)fw{3j;nmJ$kRz)yNgG{J^<Si@wI+etq+1NPU@M#f7dbPj9E#TkQ8#$=i1K z<pIrK4|%GVA7q}azRzxkQa}5ve>=o?&NOHd$Z%qNVc`7bZHOw1(Eoe|1C1u$nZZn5 zg;fb&`ud^n-})BT>ajIH)W5R-)S~q*iW(x!@4uaXsx{T~E_1M&JoAGl0ry9a71LDx z1NAzU0t?tz>+AiH|1pK}pU~CLD)v=N<9}^+3P12x{?$SiZ-#?E>sxk;b~4WD>G`VZ zcs^&}raRlWi!(9=EnSx9tzQ{sQ0JTG898sJpqo;%^zr+f=3Q^?mC2Zq%Xs`(7@t~p z#XjM;d0Tg97jsQmB2zPM%l9v$2aWWiSzaF0N_i|f$BtFoZ?)mN>>EWdW^n3zH6Gb< zfrl$gktNJ*=2L|p`8Dr2BDjk#`v|rg<j8uTxZNaJS@7x)-|aGu5bN-&Z6D=%PFpWE zJ+qPdVwaGFDRagW_J)5tJLfy(aX6gmPkpmxhXDI$%X2q(trztR2@_h_eo3g&Ely?I z#D)q9K?fT*&zU>z?EPY9)XqB}J@cbt<KNkh&nnk5uI|;`Gby|D$yeREw()saN}kNW zBc0p!GjPh}gXbUVZV2EC4_AG!^|5>^|5U9{i{8gymHWQ;J%85LtpDmu8cO5eJ<Hv; zJwBvbx5>V&SXjMfceMK3S7&Fl)^GQcVp$iHB7W-pzSg}0Dz0B5v_7&mUECrf<7WL) zuHe%#w~7Y^8}?3|W!UVZq4j4G$4R{}pBC^P`g~}wydaZz_xEkTdar%={(a$gXU9F` zs6LYtEAFmi-n_yI7IXQFb6;p5D&*ekWUM}sxg(i*LTqb&aC7Gjbss+IZpNd|ipR`M ze%8IZwL3RWF51CpLiEcsYJRoheg%J4#;$JKl)K(S!#nKR#2x<gBR6NZIRvhM%H~}l zdZ_Ni?LY%d%@>yy9#$XG-Euf-%i`vhvmBUz?({L5B4gTpnzw(4_O0(#+-l$04(u-1 zzqD=YlqW~`UAlIM^S9T*6|>p*Ht_t6c6g=5T|axHX@>Yzk%-624bj|}mOXr+`D$-! z$s)-m0vUD5%cWob5NkD=n`^N{<w~-4RbI)1uPp}t--}lBSnQ8!zP^@w-mB?-4_31t z-L)&_?xqU@j?7=~ZaEwgQGVsXZT^F2)_CnwDp)>k)|@(yf;`19lQ&ym=`oS#ywu!r z?7)-7fyeeS-B==H+8AAamvfOh|2>f!lQQ0LYrf^li=z!Y{sf&|_v5ghjJ%Hd^!s;{ zdo6Yz?tL$v@a_KpHE#uWa6izwThF?p@}3zt<AEDu$qi9GdKqgL$e8lC3Z6Uc(9tow zuQ6wS=BB*Nblz)sygEV;Y5BW)8<^<YTkSZhxaPk>dgM#h%RKe#xTRM<+_1~@)zqX( z{`F}SSL~aAO?d94`6AXX=UdnIEvR;Q<g#mm%*SqRHMc0S-fQe8#tA}B%QoD|liIU| zMKr^rb@9UVh=h-OSTklftYhttZu5_pX}a=cv0vwuKZ}>$m)=tF<gs!<(A!JicFqB< z9B2E&`zFU6S$^EB$fEjSh5FmPdQe+oA3L<I@Ic5uB18OM)b2y4zXvTZz0odFukvEw zVml-4U3@%&ESYU7?(q+`3<{dOWcS%Sc62)z3G55s_*cO3#7T$cOMmAiG%q>N&-TzM zEUS>e)KH{*kv3P?@A5ZlEL>0Cl`p#R$@1N;%iXy%)N1z@u2lbatHAS^MFN+u`MUQ! zyFUE<w{(U_pzjY$&Y7xr=5<Xoy7uF7^^^O4rwemjGU7f~r<fLmGp{PYxFGQBp3G&E zbsX-QQ(T?4o@|r9*K~7($6Lkddt%Ma&w26}v*a*$1T}ZwvwHO;XTC&L5}yk9uFfZM z(~~U)nP;r$V@xUCBg1tm?E8fHyNlWS`|pMOzS=ClEcNC4cdzsFww&XrirY3>VX-ee zmzZ=@5aT4VKXauT{bTno2~SB=;eLAGyZ6J#qW%BPd!^n>Ke4!$d$}RFMoswa-Y!G) z(v7=ygs&PKtDU>Ea8F6s{@bTct;}h@cw4&q?8(lzZ3n(jy&AtLvV3a#((|0A@mK5r zebfB3Q89e|^8dGNXV1CyQEsc5X;IU@-Pz%LBWx9z=C>aDbx-;1h4}YceXlD{B{Iza zCBS|tut0HDn7|>4X>00hR(R;^ak$<S5@k-kvri~w^#sM~j<VtHUstS(s+!&@C-j%G z;bW;h{~`WE3<h!`DlLYeHt-)v2$)_O^XJ3Vhf18zA3yw1n65ovKg9m@;zu99KVhp) zx0Igyze~PWYvZp)?-SnL_r5O{crz`iVEwjjq4V$GcQtgKyf1iX(Afs3c@Es~|6jke zry}xcrse;tvQHb^Z?Pn}EAT$hK31^pU2UVszmoaM)mDss6GeA<mvjZp`ckC%@|Lle zzWh1|ksW266?_M~+%7jyx0$}O@mK|)c$09gWoPx-VxjG4&FxOlT*Bz1T750Mq<eO{ zr>Mr}KSiJBY%_RW;m2zIuKQ}_*2@1!6+CLcGQ{uvT{`K-qWWulJVO@sANW{T8(6hc zKWCF~^WEvE*k`{#U3u=qkKeCOAKz>nx~lc&&yD_5G{fy;->i!MKXsMf`RPYx!rf2J zvD5#*-(qcOkX^WK!aMUfyH%$fXY>8-E^k!7yu4Xq`QNxp4;oc^wI>}2`B9(r;KK&~ zt*1|)*|)x-$v!N`PETL&%a1>DY>a#5tIh_+t?*<M%6)d~WJyNS3K2z47a`k_POZj9 zx0T_mCVj9_WvEcRVK;&Q;`hca3aj_5;+~q<*KE+peYLZI`M?jS1uZ;w@|^ZBCJ9Wf zVgBG1#`vJZ>uA>B4EBG_iREvZKX}ToTGid&eCflfLzfgEhi%n+`9ahD&ec6j|D9%U zeI>kgdAL;izc?<_;-jZd|NnpS`>Oez!4Jy#7j3Xv{p!HCtIk)Gw-#TFeOrC{^he)g zmKzTQR=-t{3|MEnvHI{Dog3P&2~Q66)vkT?9a2Zjv7Xp|-`{A)S=DeG%hZAkQ@BFz zpYwZN@J#9uuZu{duj#6PNoi-^%*o6sPZuuYZ8YCjTx4>)aF3R%j=3A7kD|*8{?7QW z(BC&F-JW*v`X=MKY%*K<Pe{1R<rEpj@mQF#Y%rU(AR(xK-va4I2FZzXQL_Dw9CeX8 zk8Jfjl~f-dad&8&<1Y6r!{CQ==(F0I8<P}Q35n+KeUtz1+Y`T&bw9SPI5W{L?0eXB z|A|+&m3+;v4!qhFIe&+%`nR|pMY^F5Uz$(8%=mnNQ##ASFY@Bq=Av35t8XoJT3==Q z;yvG$w~N=T^?SGe*rK#E|9u*B!`C%8-8147y(SqW%=XLaK;iy$H~xkBGE4=NeI{)+ zpA;2(apT`-Z?e881s=G%DX>PY`<9*cb#1A22M(luo$_cRhfLU<AN3aszeN_szG#f8 zv^Wtyb^WEr#k;FlzE-#E6V}sqOYD8<-;%Rl>zazri(Q-Ml@_j9mD}T)yMgDkrBvRz zdAT>{$W-zd`!csV1it^Y?bQxG{)36Z2HaK4o64*^E%^BQnvUHqIehh2%9LLrEd|C& zxlcKx5-%<)`=0Ne;a2vmX7yE-L$ke338n5?9XMm}k<j{OaUm|O(*Ncb^G+(d=T^R} zWrM@@Oy(oH%Y@!Fcbzj_bW5h;=iG)jGIsj9CiaU~^1l3h_4(A#7MvlUE6TXnE?**9 zRW<$Xu5(j07I4X3pVqUy;#Mt7SWL)?t7aw@;g{|<bm{4?jAp&DSIMt!Lzw8li+i*T zX1sEc=}F*tb#0f=6PFu%kLb<)a_jl!4Q11pHfl$ue*J5{=x6P6MYkyDOA)ty<XC#w zd5L^FTzSe#aUG|3cXv?pG^d(8W`U0fwFC+^<6oLDJ6LPJ&qDmFRfYcVT%l!mU5c5d zF77+%pt(CU{<GCTRomPbyWTE&J7?>T#moK)2rqvt=Ver``SPyaS&I+xckfu-`?yWE z{h>t#pRSQu31{X9S9ZM=J39sDX^IlDN17ADWS#izD)&2{Xu9?#TbMt}(&*l+u6tjS z(@ia(mN0bXD(q=`8<g}eQ}y9An~jIF>?0N3HyF>VvNb#R_O`{vpL@k_zZTr#+1~z6 z#)30ec*_%iO`o}8Tyi4cmpHx5%V$hGm7Bw=#I7j*!1fG7MXmS>#x!#mPUVE?R)1m9 zrts*Qrdu4HRd^?IZNIo9Pd&RJ*mKKDjh$-GCcm+bR$X4a;iTESFEjSXRHZwt-`_j$ z`xR$Rx7*Rj&dyoFwD&#NHcOkEM#57qpMz@g_0U>8ra;I(=EL5H=?S_q7c=;CP8_-; zZ|!)j@RvZr0sReMG=K29%zO}1`n~z~|Nob@m-V(;1?cB5Z}EF8Y?3`?!TlsB(_OFg zo?i<&!c*MA&ajnf-n`o$jfZ4yd5ww;z8sN?T=H1j!_A?GDZ+`n<yP+88s)9~^o%wB zCahiiA;Qz_tnJs0M{}mc{Z$vZa=}+x$EDTMQADb9yRt{g^sf)@6uIiVdM623S{z9Z z<6p*lOU{f>y&|M$rTmR+>Riu0Duj!z<ElxR*!<VUdn=E{KY^tmIV_gRy|750o80pD zk$@$`*}ZRnMDeM47fup4>XJ(gGu6%i_kQhS1;LksVNO9u+CRvci~f2wvwY4y-9;^` z3wANJ{?3nFk{7vP%7zEQ6<2R=oN=mb{?p5*87o6`6^}+AyLjrQ#eI`5)&s#GO2i(S z1ut>Z&E<~T6gX$@pYBQh_78OwnE9O;E1Z7FtUAb17svRj{mYK(_mz<)^30ApweG9- ze@#A`<XN=8`sSbi?;Eu5T$FY!erkMaCe!?uL*Mmsr|+C2{%OVhMP@64T~ZovzF7CG zMe)^wmNoqMj|Rwb|NH87)iwFHP5_Th$Xd6cH-FE0|K6P3$RPbdLLh6=M-2teBnKz? zi~pO%511(4;BaIL%{sm)M(@Xuef&qZx*k1s`uHLDKOA2F=gF@=!BdtT^VZ2}_5Z*Z zd(UZpJsWqrW?JTf^><e3KiL|xi9b2^wi0I%WBT;zoeHO#c-ew@1e!Pt6q-35`5fAK zAMncu{tZ!WNO1ll<RoAt|1T-PN&fW1kM&c<e|QUZcmIihT68Y^?fvMRr*0?cMpmuw z@BSD2QRse1w4CM3z+SHzGYUT5o!1-~_xzjr)(r+*_wHMldnf#G;{l5wuidXnA4ys5 zWU%yw?HPtN=ZW16k8-1URNVLsxO}!u*7kY(LVKFQ-5u8w*JV#qS7c6kCf{Z#vRd{= zAJfl+;jw$Ta<3*bziQleHGW$E_KQ&~Zv4L*-|*wNqv!knhCjb{hWuh&U|lP3_QPxc zraNJ)?lh^l|6~4f;APl<!%i8ykl6IoYYzm9ANsw?Ft~5++2=o_YCmoKf21Km{I~a` zh4-&k{l4n6WBtXQmYe7O*)96}{`7O7O>GtAtFL97`kw1%ShoGuA^sKeY(n4a8yTdZ zUb?mVmTH9re~aed#V4%ww%b2@d++!KNBs$2EK=*s{wUT@k(}Qm^wg&@Q8()3kJ^Yy zjIZ|puZ^9}#45!7?SOvh%2g4E-fev!ntuH7@2@2laqL(9`?{YWc)t9A^=Hkxq^%}< zgVqF!@aO$=b^DmMb^E`n;ygdE`9U`_xB~w3GCXMg@6cj5`THyNZTDZ@S!?i9tD?qB zFU*c3VFAO%4-@R=YdnSa?h9vs<kT7;w2twE!_todQv^O#vi}cTA!2sGI{k~0tj4o< z&RM75tom7&vRZ=6R#v86AXH=dTrNpJKFcF94G%d!M<0EE>uz@0wP&Wg48yA(9_(Y) z+t-qA$*!00_)dYjZn1IOf#v%T?<}smbNJ*7i}V9UOb077moxfZf0ySLcRAF+;>%i< zYj^K`xgD#R5+`y<k^A!%-t@~(Q`<Hlif~+ds%8D(SPtg9i`<V)RdQc5{Z)d)-&Jc@ z{e8Ll_I|mKj=!o3;-7MA%5O695;@9zPu@|DQ=ww_saNZ#2mKe<>N@b@lY@<Iz;cZb zyV9O{Mz{a{KmBifh`(#(rcmphhCTBV1>Z}wDZ9)&vdn4M0-qZ?GG#8RO$&d&eJ_-G z>Dc9)T<?^#{nMj1Z;tkuSi-sZR?DFt+Y9AvA`kZNQI>sbm8HmTBGU6mi)(wU(x)l! zX3TiZW0QJqy5spJmyJB!KE~bkJWwWVy?xj0Skt)|OC~1k@QT;A+Z%icj&eD4V+xC# zSm%y(l^(AntCcm>GA0UGI7>{;{P|(=8{=Jk+(!hY&%B&bSy$RNoptBM-?uKZYSz9p zpS_zgPj<i6hAYLt6}2@z{mr+_mt6DTlXYs}ob5aITG!qYz8-FVm@!zUWpBfyC8vcS z87)%Zx>(Cve44c0tL1?<57sYi+Eoy1x!1r#@cg}5l^lQb7Y0Ox@Cb@FZ}FQVqb=U< z@c58#hhMqL`hL-er{70Q3I+cYELvlH^j+v~{$#P98No~bUT4jpr2hQmA?EJ4b1g+u zTiBIzEi4Q3gC?`i*>b@`(037Q#|@cG{uC$nlDO&IjAt{h?p+YoWOljaMMd4G)VmcM zj+*@DU%mfxgwdCKelaC)ZdJ_p>fLmXw|MpO&^x88F0SOiba}$PM9rUZ^HyZH%c}CU z^L_8#bnM_!mYXaF#VQA){eNEUQb}A8rqEPz`+@aBr_yuVA3Er4`yR0QQ=f06>&uY0 z50w;qU(OJ7PH5TuPwv^)EtAS(OAagghTf0&xbt|!zqdKp=9bv>Z$0bi8xb|vF<kkk zVM~i|;PYu`jY@qTFE5z?<-_Xztv+|y-OfKz@{JSu{_5%CiIMTrv1>BSZH_2uvWrgA zJI~ydIB(<XOKVx23b(SWxuk65c38LA&9O+-D&)!oOTl-h<ue<eoj2%N!>Z=%cqD1< zBY}ndCAXI~9iPIK&hahMN2qG$<AZgw6)%_H)HUJGzxSSX$*pKV!5=%1&8WF+c;5Wt zdX8iL9KXC;Pn+{IU0)g%@}lQ7_*AZ!jF8@U%md~ByWY*de(&%7pXv4gcklbZx9aAC z&<|z80uKxWHs8Hz{Py0-H!~%J)?eZ9zjC8wj!2v^_ui1H@&7Fr+ouL!y!K|FT;T%a z!hN$ixE@S?f5AqzGOq5V<F=!Ay^SYS>OVDhKGjOiy*qRH!T9^?^8EWBK3ep^Zp9vj zPUnjnk};v8zYjlf4E^~2YL)iPPcLHZLt^ao^?q$|{xH@3>4TQIc<;G6M}!ty@7}-r zd;F9Kueta9(A3}cxzX|BtNHx8`v1-yFyTF4Q^r-V_5JJW-4+#mM~#DT|Bbr;HEErC z@j>6J<F6jb1{|8}w7#RZc5&d3UoR_*9S&I*`5pXzu=P=F=$}<T6JCG*;3n(p^Q`#8 zi{JmZKfM^V@K1<+_$&6OlkYVj^=kO{`TK!IIW^1P?6LDO>i?+5Z?`UvU-W#W!`X0A zwX@6QLz>!O9hs=IWB1cnFDpxDtyc|F<t$J*^wg`nrGMqWRYB_y)CTS6f4?l~;qQ~% ze{VVVeq+=1O`?`I?4svat@``l^grL4t5eS`cJx?Pvj6d=|ChdIrN6&=)&9oSTW2Jr z>wn)qV(zy7|E;s-Sug*+6<@M@>)qAYcU?RCefizmOYiRA-DWI*@Bh1Xx6JPQ%iOzr z_wMoC|KEM<N}Rg!%e{Bs6Md^C&zH=NdH)_9<HgXHT5N%^_};ZS7euV@%t`IP!LFtw z-hG_u!^*u3784bA^*Npll+J&yUcKa~^uGG!Q=h(<Mg~7Btop4HUhqUo^zFyB>|%mf z4<7H7t@&*#V6i1VX~jyllgeM;)NVC=c<lSht>HIx#rJzIeRxa8jPpx|+8tRgsqe1c z6?}YbiB6w$MPJ>$>~SEMyKR=PhD6{_hpo*DLEGc1<W}U(SYpd9d}@PCSWUqkG2e~b z)|}WrjqCRH#S@D4^J`YEzk7VOzrN@F)4x9~fBUNJ?wy*A6AHHG#Plk&MT)nY_g-o= z-?+wcabYoM$K}wIr{)U3WDtp4duHvn8J}`53w?^+qwIPq^oA9yJ$IsM{Ih#yet8K! z5mORk?Je*1t)0a)b>H%csMWQ#Uj3cS`~L>~43S;EsoEvMx-wttak;I^{hP8{eesVY zXPhXi-ej7ybscxZ@`nZ6|9k7*GvBV!Vm!@vr`fZc68;5C%X&GPBFrvoKYhrc!08lO z|1|vJ2S*O&4}3FUt-2%R(%`@rzSaFfpQ_f@xYM@k`y@NP+7F!if8HVS%jAo3%?JLU z{`OQz;s2?X6>M7abyb~O?Op#=rw9F<FIREd*nL{s=~)-9)o`YlonN&=Bzk2Gt9<L% zO*eO3R`mF>OH1g0(R3{i!3akomI*vzJZtJ=R4zC%JZKO|-}}<RFoLZ{adkL1XaePG zXX@dfj~+dguZdg2w87zE+4+>szc<D91?uX3tk>UPeDfpAgXfyYos70!DfMnm{Yyl* zxBl{&kht)B%a_!xd-vqLP}{#rM>g@osZAoS`izHaH6z5%v^(r}3%j9{^<J`&i7CZm z#?;~mIa8X$6OVIzWc&LdxXSpd*NjsuR@DD|qaR|kMPQ#@>ks>XjW>%@<ti$_+U+*` z8JD%5Eo<-FwLO0XxLX$FF23~X<F{Y`|A#)+s<RVnlGO`YZ#@0+uf?DGYwOmDN7#m~ zkTBLZSUJV^$a$`cX|eAeweN@4tf?1W5wOJV(?%6$(U{PE{}1l`^lNF@iojgU*?<0R zV{H8&!Y0D_Av41!hB5W-o!($3$AZ7%i<*9|zrXb9_XBtS+~?Py`q?u5&G!edem`D+ z@@EWV*TFUNl>t*9Jx%`flYQp<6nQOu7R6VKzNS9?uuD65@mDYJhqZbiG`jaO@_yAT z{k%Vrp?AXvkt<do5*!(>*0V7mXe{eze{hid)L!##)0sFXtq#4r>3w&1!}pDw-kxKN z>smhbU)<BcTN@|-)#pfk6w2Xs`hAnof)@KQo)!BKMJ-6M;7~ZQEKFeCA4%7)gU<gi z{pa8R@zZ{Xyy?x>+kfY2ZqMr892`3Bwfp|SV*mU8@w%zZ)`t$=a8lUvQ>b~8T(sk% zZQPD0ca*MuFyDKBcH7MN#+ln%Q{DzooV#f4+7ny+uf?lv^<TZ`!R6WImfef<S2znY z^Gy++n)#oj>H5Z}ZFji*uf^piNzHyL^lsVgz1|1*MVzww{K#O%&-k*Boinevaj#n6 zZ}wz+)Zf_5tiIS?+hUFP=A=tl?E5Cj=;IMGO<RA}k@YM}pWgEy65X}NOJ8<+QS{T~ zV^e<ropvtn%<`m#7YhrEmNGy5SXk8R{9bDl-!_j`g+WW>z8jsBh;K1n{yR_ZN5`!i zRaU9D_oX7YZ4fS9x8>zAj<1Xo{}y{x-TSC^V0)8*#b*u2h?>A@%(LxTC*BM2JCg9= z{ACG^n6GxH^&|@(h)paic`5TzIJw~=@8!JNGo@{weL1nxtoPjO%Sr4PW?63dUHM@3 zlm|~WIe%Yy@US!Jz~dvnzhwGYj#qezUY%UweTCuSdcKX@yv#nl<q_DYe);9%gZW|K zERVSem2ckQ^KMh>uC&Efrpvj%|K4d`SvNCPvtiM#W7iF&dk@6~?2pQ1%$PfmwWP=S z*|C`i?!+GBw0gdB&UR1Mr_0*Ijd@+3<Zpktb-Vfe3!f(UKmB*<K4Xc>2L}&J#oHw= z6X&?jeHa|88fVJKePMZy%ty0ZS2A}rPG0CgQ@B@B-8<o&_cgW|ttZoyn>w`^r6ZcT z`PUis6v;}=-umsEl(kiA&xc(_>q<E<bzN0E84;zkahuau{aZ(Fy>Y5rWVKCRj@vSE z!yDBj4<4r~JSq}@Yrx0PrtyufvGl*;?8c1M9mftzITT)0du~(j&zSl>*8W9pbNHro zeh$w>@y!2+k{>MgPP=tBKe~3uVuN=d-hVKZ`F789Zp^2mlpB7bzjv;m)N^Uej97lX z856JW6}%9CH9@Cc`kwu3hsRA{YSft4zmn16I{YcUvb1~wyS=wCJ9F5#stH>q7Tqh| zdnsJ2=7!(oiZ8FXG_UpP+<51h_LJTxP7i0^{a?R5>hOfuY7Z|+`@Ly<p1Az)y)|`T zw=R!;Z9C_YP*uf@qfzRuO0TMfM6=Fa7Fb!$pd>4789cAMS~oh;KK$T<p#1d7(r$*@ z7eoT4H90(y@e}#cGnuh;t1>t9YPUkO1v1N>h2{(NFyD4y`>=5_>u=42M_%51pz9j_ zZAx>m;ydPz<%WNl*lrcsMch2F;cDVp3I8Q;^I6vJ{j*qae%0FGx+xR9wtEBwuDlj^ z{l=7!M&HwKeOT5rA6)mIV1u-_Vjl>L@3X$!@L;|C6^BRDI#^$;ax^T8y|d=_;fb>j z7kgOnDdc`xa4zcdQ_1Hw=FyK{Mmya+`tQ(jBW}mm<?I|vzw-?`Hgv{Wtdvmk{(b1$ zuV?<eyA9qRUflnF`Ra;8%7^A#7<l9@vtO7grQ957_T<a&_(DS~p9R{l3d<I1vTg_} zS^8zc@9G`zvR&O(Ggdnu54|mUX6=g^?q4^_P5!l2%JLk~&(0vR9iRhojZQ3Fav^;) zx9|4|SI6V0s_QMM8dNuBFX?^nKV#mJDKhtjALy)>Y}@H?x_fVBeSLIx<^$(%w~~Z{ ztiDg#!4-S@>9a5k^`yvRDb_aUZ&z(K9{)P?P(tKu;j_MvGgW3@6#pWzBw>E#)V=JM zVU-n=W9$xCt8Dsr=lk^FW75$Rx4xIpjng?R?7eBbR*m#L(455ULM8XQ>i<WDZmuqo z6`Id{poQ_({@New@|WoAZGN@xZ_vV*<p*cUuezNR&i(iOPp7S+QLCAa9zA;aXVp~K z;0Lvlh2`8=w3|PD`p-XAOD;72bN#I~BE|}x?e(^KH??DTD+&L!Pu*lH`F~Gj##g}y znm;N&PkJ0~pR-_v;5)Tv*UYj%eTuj`TW8O~gYGf*Y%E%;&HRnshh)Otk3MKD|9<#^ zGpoWMZ+ZTfMGw^)5)2eu1lrgez6y!*{}t6*b+tJs{JmWI&6|2==7r(m7VCV!ZM|*K zq4Rv(JLNr`#*PPHPD_?;c+9-(vW;?I^m0vB@zk%rZ}Sra_AC9a=by?vk=vk0v*4xi z>Yd6l2a1eeBo&6O*<mqpUq{k})pfr^ntg+>e2~_hboM>R<dBt7^=6l{ZPvdr?#ciB z`%O;a(%C=X)ojYwTe0cPd+lY3*PqQuzaO%G5&NgdMfLx-YuN-{`~4{=YQ>#B+q~X) z?@Cwya6R2^q3`iSu6nEtA9n1%Ctty@(fsH=C+n&1J!?Y)R_wl1v8$qXmCB?le@~V6 z{jY6Q`CE3eT@~+Sef9i?e)HAZ={om2g?|Pw>zC*BYHyH<WtkVKen8GnzW!SOL7ocR z@9VGdw=77!|A)it_|sE+7VLidc-7hvxjj3W>))>us<8`+i+7py{=9f<*Ux>-e~!w9 zKKxnnHU9Ixpw+MbzgY41(ccT}i%zfPZMBh5=nRqLVhV87`_K4b|7|vo__=2<elT#H zpH;5sS6Fs##qE!O!n;&M*k=bV>U6#S?QI_azxZdCFLiFlG2RmRv)1RYzPz@czW$9h z`)YR7sWM3@YAp)yZtuD}{a1~Myj;Jk&|j8~I$mGpFPsdYT7Rkf>4Sy8RX>JzPpz$5 z8M38f)xDEnQ~ytTsvmayId@L~zpJw6u05zddeXJZ#PP!%Czfy9yYJmw7oV!W_1%Qi zch_eZvTyw_wxn_4*U%SkStU!WI6F>WJJsQI?xN(S%YL2@+b$UxJDhy5<mS%c?~X;P z+TW*y+I(uA(y=M^%C${fj89fZrCvIj7WZ;zt>y+Zcki2-E1!vYRz+V9Q|?xNuPQ3d zVIWZ0ufoc-p+R7he*ODS`83Vjdv!8fUfL>s-`jEi|4or8EGKhTcd6boS~vH}(xeYD zjZUS@R{gHemYoq|6mc_CGP?bvkf7<_R~dm)FVp4;C3mGg-JNoSX}w$7#{(-8EAO&% zrKxMPJd>yh`W>|B*31-dXI0<kzN9C+8y<ys%*?PzF79=0$h~#(yZLg(+wVPdFSE4% zef4IE51-YHC9lNzSdzaqh<*9H(BsWxX>aB}{#6pkt3n$0v+}2BP5d_Fb+$`V*6r-% zfARZR#s2edF^O2fwt-LFZv*q8>5C-p81gb6Z4YYC<jDIVQ?f-Z*vZ&JU&s7p{lWtl zXYNfhUu(TKwygb)`2N*>&2p30uA3p=<XbG!BK|s{BmT;Py)60nmf4we9{N$m$#Hf{ zuG$<irp=x{Um681>+b0nR>vnd-E@1o{76bo+(C)3%Y_D2GuCunc(Cr$#swu}T}782 zFX%KLp0n&?=ClMGnK?a$3i^wlC;6VM_`e~9yQ=QOmL*g4<5ici=1ul|$9>$|spQI( zoYJ*NqjI072Q7E2zuPOkX0P(`zdY{J_w2PA9$lQUXU&h-d<SiuWJEaFZeJ>K;3|mz zw%zoCSlqsA1?|5aAAaqe$GUc}>MZN>_Vt`D;%m2U{(U_7Ld31h5%VT3@^GsCzIEE% z%wxI+S3GYd-HSS}c+11d|NFOPm(OmukZPE)Fh4e%@tB30)>4NpT-7)I#F@K}`LbHg ztoxGGDN&|y$YA}VOanC~ZT?@kqx}|3EW1}a;iurT?GvhUFFXBa*0@+bZSNOd?#wyX zkuA<^U(XZYUmlnz<>SD*?%&0t;^{LIL8JbS(E2Q{092pdnIUtiNT;6hh||Xd8O#nV z_wR4IdTN1H=dlBig1-LSy-WW3k1&pd1`lL1%0Dt#eC>I0HRj*aRF2gwB`>%3J@qU2 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 literal 0 HcmV?d00001 diff --git a/demos/DemoFrameDifferenceBGS.cpp b/demos/DemoFrameDifferenceBGS.cpp new file mode 100644 index 0000000..5f81242 --- /dev/null +++ b/demos/DemoFrameDifferenceBGS.cpp @@ -0,0 +1,49 @@ +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "package_bgs/FrameDifferenceBGS.h" + +int main(int argc, char **argv) +{ + CvCapture *capture = 0; + + capture = cvCaptureFromCAM(0); + //capture = cvCaptureFromAVI("video.avi"); + + if(!capture){ + std::cerr << "Cannot open initialize webcam!" << std::endl; + return 1; + } + + IplImage *frame = cvQueryFrame(capture); + + FrameDifferenceBGS* bgs = new FrameDifferenceBGS; + + int key = 0; + while(key != 'q') + { + frame = cvQueryFrame(capture); + + if(!frame) break; + + cv::Mat img_input(frame,true); + cv::resize(img_input,img_input,cv::Size(320,240)); + cv::imshow("input", img_input); + + cv::Mat img_mask; + bgs->process(img_input, img_mask); // automatically shows the foreground mask image + + //if(!img_mask.empty()) + // do something + + key = cvWaitKey(1); + } + + delete bgs; + + cvDestroyAllWindows(); + cvReleaseCapture(&capture); + + return 0; +} diff --git a/demos/DemoMultiLayerBGS.cpp b/demos/DemoMultiLayerBGS.cpp new file mode 100644 index 0000000..bf2bbad --- /dev/null +++ b/demos/DemoMultiLayerBGS.cpp @@ -0,0 +1,49 @@ +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "package_bgs/jmo/MultiLayerBGS.h" + +int main(int argc, char **argv) +{ + CvCapture *capture = 0; + + capture = cvCaptureFromCAM(0); + //capture = cvCaptureFromAVI("video.avi"); + + if(!capture){ + std::cerr << "Cannot open initialize webcam!" << std::endl; + return 1; + } + + IplImage *frame = cvQueryFrame(capture); + + MultiLayerBGS* bgs = new MultiLayerBGS; + + int key = 0; + while(key != 'q') + { + frame = cvQueryFrame(capture); + + if(!frame) break; + + cv::Mat img_input(frame,true); + cv::resize(img_input,img_input,cv::Size(320,240)); + cv::imshow("input", img_input); + + cv::Mat img_mask; + bgs->process(img_input, img_mask); // automatically shows the foreground mask image + + //if(!img_mask.empty()) + // do something + + key = cvWaitKey(1); + } + + delete bgs; + + cvDestroyAllWindows(); + cvReleaseCapture(&capture); + + return 0; +} diff --git a/package_analysis/ForegroundMaskAnalysis.cpp b/package_analysis/ForegroundMaskAnalysis.cpp new file mode 100644 index 0000000..45645a0 --- /dev/null +++ b/package_analysis/ForegroundMaskAnalysis.cpp @@ -0,0 +1,101 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "ForegroundMaskAnalysis.h" + +ForegroundMaskAnalysis::ForegroundMaskAnalysis() : firstTime(true), stopAt(0), showOutput(true), img_ref_path("") +{ + std::cout << "ForegroundMaskAnalysis()" << std::endl; +} + +ForegroundMaskAnalysis::~ForegroundMaskAnalysis() +{ + std::cout << "~ForegroundMaskAnalysis()" << std::endl; +} + +void ForegroundMaskAnalysis::process(const long &frameNumber, const std::string &name, const cv::Mat &img_input) +{ + if(img_input.empty()) + return; + + if(stopAt == 0) + { + loadConfig(); + + if(firstTime) + saveConfig(); + } + + if(stopAt == frameNumber && img_ref_path.empty() == false) + { + cv::Mat img_ref = cv::imread(img_ref_path, 0); + + if(showOutput) + cv::imshow("ForegroundMaskAnalysis", img_ref); + + int rn = cv::countNonZero(img_ref); + cv::Mat i; + cv::Mat u; + + if(rn > 0) + { + i = img_input & img_ref; + u = img_input | img_ref; + } + else + { + i = (~img_input) & (~img_ref); + u = (~img_input) | (~img_ref); + } + + int in = cv::countNonZero(i); + int un = cv::countNonZero(u); + + double s = (((double)in) / ((double)un)); + + if(showOutput) + { + cv::imshow("A^B", i); + cv::imshow("AvB", u); + } + + std::cout << name << " - Similarity Measure: " << s << " press ENTER to continue" << std::endl; + + cv::waitKey(0); + } + + firstTime = false; +} + +void ForegroundMaskAnalysis::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/ForegroundMaskAnalysis.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "stopAt", stopAt); + cvWriteString(fs, "img_ref_path", img_ref_path.c_str()); + + cvReleaseFileStorage(&fs); +} + +void ForegroundMaskAnalysis::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/ForegroundMaskAnalysis.xml", 0, CV_STORAGE_READ); + + stopAt = cvReadIntByName(fs, 0, "stopAt", 0); + img_ref_path = cvReadStringByName(fs, 0, "img_ref_path", ""); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_analysis/ForegroundMaskAnalysis.h b/package_analysis/ForegroundMaskAnalysis.h new file mode 100644 index 0000000..d6bfdae --- /dev/null +++ b/package_analysis/ForegroundMaskAnalysis.h @@ -0,0 +1,42 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <string> +#include <cv.h> +#include <highgui.h> + +class ForegroundMaskAnalysis +{ +private: + bool firstTime; + bool showOutput; + +public: + ForegroundMaskAnalysis(); + ~ForegroundMaskAnalysis(); + + long stopAt; + std::string img_ref_path; + + void process(const long &frameNumber, const std::string &name, const cv::Mat &img_input); + +private: + void saveConfig(); + void loadConfig(); +}; \ No newline at end of file diff --git a/package_bgs/AdaptiveBackgroundLearning.cpp b/package_bgs/AdaptiveBackgroundLearning.cpp new file mode 100644 index 0000000..b111e65 --- /dev/null +++ b/package_bgs/AdaptiveBackgroundLearning.cpp @@ -0,0 +1,111 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "AdaptiveBackgroundLearning.h" + +AdaptiveBackgroundLearning::AdaptiveBackgroundLearning() : firstTime(true), alpha(0.05), limit(-1), counter(0), minVal(0.0), maxVal(1.0), + enableThreshold(true), threshold(15), showForeground(true), showBackground(true) +{ + std::cout << "AdaptiveBackgroundLearning()" << std::endl; +} + +AdaptiveBackgroundLearning::~AdaptiveBackgroundLearning() +{ + std::cout << "~AdaptiveBackgroundLearning()" << std::endl; +} + +void AdaptiveBackgroundLearning::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + if(img_background.empty()) + img_input.copyTo(img_background); + + cv::Mat img_input_f(img_input.size(), CV_32F); + img_input.convertTo(img_input_f, CV_32F, 1./255.); + + cv::Mat img_background_f(img_background.size(), CV_32F); + img_background.convertTo(img_background_f, CV_32F, 1./255.); + + cv::Mat img_diff_f(img_input.size(), CV_32F); + cv::absdiff(img_input_f, img_background_f, img_diff_f); + + if((limit > 0 && limit < counter) || limit == -1) + { + img_background_f = alpha*img_input_f + (1-alpha)*img_background_f; + + cv::Mat img_new_background(img_input.size(), CV_8U); + img_background_f.convertTo(img_new_background, CV_8U, 255.0/(maxVal - minVal), -minVal); + img_new_background.copyTo(img_background); + + if(limit > 0 && limit < counter) + counter++; + } + + cv::Mat img_foreground(img_input.size(), CV_8U); + img_diff_f.convertTo(img_foreground, CV_8U, 255.0/(maxVal - minVal), -minVal); + + if(img_foreground.channels() == 3) + cv::cvtColor(img_foreground, img_foreground, CV_BGR2GRAY); + + if(enableThreshold) + cv::threshold(img_foreground, img_foreground, threshold, 255, cv::THRESH_BINARY); + + if(showForeground) + cv::imshow("A-Learning FG", img_foreground); + + if(showBackground) + cv::imshow("A-Learning BG", img_background); + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + firstTime = false; +} + +void AdaptiveBackgroundLearning::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/AdaptiveBackgroundLearning.xml", 0, CV_STORAGE_WRITE); + + cvWriteReal(fs, "alpha", alpha); + cvWriteInt(fs, "limit", limit); + cvWriteInt(fs, "enableThreshold", enableThreshold); + cvWriteInt(fs, "threshold", threshold); + cvWriteInt(fs, "showForeground", showForeground); + cvWriteInt(fs, "showBackground", showBackground); + + cvReleaseFileStorage(&fs); +} + +void AdaptiveBackgroundLearning::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/AdaptiveBackgroundLearning.xml", 0, CV_STORAGE_READ); + + alpha = cvReadRealByName(fs, 0, "alpha", 0.05); + limit = cvReadIntByName(fs, 0, "limit", -1); + enableThreshold = cvReadIntByName(fs, 0, "enableThreshold", true); + threshold = cvReadIntByName(fs, 0, "threshold", 15); + showForeground = cvReadIntByName(fs, 0, "showForeground", true); + showBackground = cvReadIntByName(fs, 0, "showBackground", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/AdaptiveBackgroundLearning.h b/package_bgs/AdaptiveBackgroundLearning.h new file mode 100644 index 0000000..eb07a64 --- /dev/null +++ b/package_bgs/AdaptiveBackgroundLearning.h @@ -0,0 +1,50 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "IBGS.h" + +class AdaptiveBackgroundLearning : public IBGS +{ +private: + bool firstTime; + cv::Mat img_background; + double alpha; + long limit; + long counter; + double minVal; + double maxVal; + bool enableThreshold; + int threshold; + bool showForeground; + bool showBackground; + +public: + AdaptiveBackgroundLearning(); + ~AdaptiveBackgroundLearning(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/AdaptiveSelectiveBackgroundLearning.cpp b/package_bgs/AdaptiveSelectiveBackgroundLearning.cpp new file mode 100644 index 0000000..cd3e7d3 --- /dev/null +++ b/package_bgs/AdaptiveSelectiveBackgroundLearning.cpp @@ -0,0 +1,131 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "AdaptiveSelectiveBackgroundLearning.h" + +AdaptiveSelectiveBackgroundLearning::AdaptiveSelectiveBackgroundLearning() : firstTime(true), +alphaLearn(0.05), alphaDetection(0.05), learningFrames(-1), counter(0), minVal(0.0), maxVal(1.0), +threshold(15), showOutput(true) +{ + std::cout << "AdaptiveSelectiveBackgroundLearning()" << std::endl; +} + +AdaptiveSelectiveBackgroundLearning::~AdaptiveSelectiveBackgroundLearning() +{ + std::cout << "~AdaptiveSelectiveBackgroundLearning()" << std::endl; +} + +void AdaptiveSelectiveBackgroundLearning::process(const cv::Mat &img_input_, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input_.empty()) + return; + + cv::Mat img_input; + if (img_input_.channels() == 3) + cv::cvtColor(img_input_, img_input, CV_BGR2GRAY); + else + img_input_.copyTo(img_input); + + loadConfig(); + + if(firstTime) + saveConfig(); + + if(img_background.empty()) + img_input.copyTo(img_background); + + cv::Mat img_input_f(img_input.size(), CV_32F); + img_input.convertTo(img_input_f, CV_32F, 1./255.); + + cv::Mat img_background_f(img_background.size(), CV_32F); + img_background.convertTo(img_background_f, CV_32F, 1./255.); + + cv::Mat img_diff_f(img_input.size(), CV_32F); + cv::absdiff(img_input_f, img_background_f, img_diff_f); + + cv::Mat img_foreground(img_input.size(), CV_8U); + img_diff_f.convertTo(img_foreground, CV_8U, 255.0 / (maxVal - minVal), -minVal); + + cv::threshold(img_foreground, img_foreground, threshold, 255, cv::THRESH_BINARY); + cv::medianBlur(img_foreground, img_foreground, 3); + + if (learningFrames > 0 && counter <= learningFrames) + { + //std::cout << "Adaptive update..." << std::endl; + // Only Adaptive update of the background model + img_background_f = alphaLearn * img_input_f + (1 - alphaLearn) * img_background_f; + counter++; + } + else + { + //std::cout << "Adaptive and Selective update..." << std::endl; + int rows = img_input.rows; + int cols = img_input.cols; + + for (int i = 0; i < rows; i++) + { + for (int j = 0; j < cols; j++) + { + // Adaptive and Selective update of the background model + if (img_foreground.at<uchar>(i, j) == 0) + { + img_background_f.at<float>(i, j) = alphaDetection * img_input_f.at<float>(i, j) + (1 - alphaDetection) * img_background_f.at<float>(i, j); + } + } + } + } + + cv::Mat img_new_background(img_input.size(), CV_8U); + img_background_f.convertTo(img_new_background, CV_8U, 255.0 / (maxVal - minVal), -minVal); + img_new_background.copyTo(img_background); + + if(showOutput) + { + cv::imshow("AS-Learning FG", img_foreground); + cv::imshow("AS-Learning BG", img_background); + } + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + firstTime = false; +} + +void AdaptiveSelectiveBackgroundLearning::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/AdaptiveSelectiveBackgroundLearning.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "learningFrames", learningFrames); + cvWriteReal(fs, "alphaLearn", alphaLearn); + cvWriteReal(fs, "alphaDetection", alphaDetection); + cvWriteInt(fs, "threshold", threshold); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void AdaptiveSelectiveBackgroundLearning::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/AdaptiveSelectiveBackgroundLearning.xml", 0, CV_STORAGE_READ); + + learningFrames = cvReadIntByName(fs, 0, "learningFrames", 90); + alphaLearn = cvReadRealByName(fs, 0, "alphaLearn", 0.05); + alphaDetection = cvReadRealByName(fs, 0, "alphaDetection", 0.05); + threshold = cvReadIntByName(fs, 0, "threshold", 25); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/AdaptiveSelectiveBackgroundLearning.h b/package_bgs/AdaptiveSelectiveBackgroundLearning.h new file mode 100644 index 0000000..cb9f4d5 --- /dev/null +++ b/package_bgs/AdaptiveSelectiveBackgroundLearning.h @@ -0,0 +1,49 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "IBGS.h" + +class AdaptiveSelectiveBackgroundLearning : public IBGS +{ +private: + bool firstTime; + cv::Mat img_background; + double alphaLearn; + double alphaDetection; + long learningFrames; + long counter; + double minVal; + double maxVal; + int threshold; + bool showOutput; + +public: + AdaptiveSelectiveBackgroundLearning(); + ~AdaptiveSelectiveBackgroundLearning(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/FrameDifferenceBGS.cpp b/package_bgs/FrameDifferenceBGS.cpp new file mode 100644 index 0000000..e871651 --- /dev/null +++ b/package_bgs/FrameDifferenceBGS.cpp @@ -0,0 +1,83 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "FrameDifferenceBGS.h" + +FrameDifferenceBGS::FrameDifferenceBGS() : firstTime(true), enableThreshold(true), threshold(15), showOutput(true) +{ + std::cout << "FrameDifferenceBGS()" << std::endl; +} + +FrameDifferenceBGS::~FrameDifferenceBGS() +{ + std::cout << "~FrameDifferenceBGS()" << std::endl; +} + +void FrameDifferenceBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + if(img_input_prev.empty()) + { + img_input.copyTo(img_input_prev); + return; + } + + cv::absdiff(img_input_prev, img_input, img_foreground); + + if(img_foreground.channels() == 3) + cv::cvtColor(img_foreground, img_foreground, CV_BGR2GRAY); + + if(enableThreshold) + cv::threshold(img_foreground, img_foreground, threshold, 255, cv::THRESH_BINARY); + + if(showOutput) + cv::imshow("Frame Difference", img_foreground); + + img_foreground.copyTo(img_output); + + img_input.copyTo(img_input_prev); + + firstTime = false; +} + +void FrameDifferenceBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/FrameDifferenceBGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "enableThreshold", enableThreshold); + cvWriteInt(fs, "threshold", threshold); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void FrameDifferenceBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/FrameDifferenceBGS.xml", 0, CV_STORAGE_READ); + + enableThreshold = cvReadIntByName(fs, 0, "enableThreshold", true); + threshold = cvReadIntByName(fs, 0, "threshold", 15); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/FrameDifferenceBGS.h b/package_bgs/FrameDifferenceBGS.h new file mode 100644 index 0000000..3fab44d --- /dev/null +++ b/package_bgs/FrameDifferenceBGS.h @@ -0,0 +1,44 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "IBGS.h" + +class FrameDifferenceBGS : public IBGS +{ +private: + bool firstTime; + cv::Mat img_input_prev; + cv::Mat img_foreground; + bool enableThreshold; + int threshold; + bool showOutput; + +public: + FrameDifferenceBGS(); + ~FrameDifferenceBGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; \ No newline at end of file diff --git a/package_bgs/GMG.cpp b/package_bgs/GMG.cpp new file mode 100644 index 0000000..675b23c --- /dev/null +++ b/package_bgs/GMG.cpp @@ -0,0 +1,99 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "GMG.h" + +GMG::GMG() : firstTime(true), initializationFrames(20), decisionThreshold(0.7), showOutput(true) +{ + std::cout << "GMG()" << std::endl; + + cv::initModule_video(); + cv::setUseOptimized(true); + cv::setNumThreads(8); + + fgbg = cv::Algorithm::create<cv::BackgroundSubtractorGMG>("BackgroundSubtractor.GMG"); +} + +GMG::~GMG() +{ + std::cout << "~GMG()" << std::endl; +} + +void GMG::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + { + fgbg->set("initializationFrames", initializationFrames); + fgbg->set("decisionThreshold", decisionThreshold); + + saveConfig(); + } + + if(fgbg.empty()) + { + std::cerr << "Failed to create BackgroundSubtractor.GMG Algorithm." << std::endl; + return; + } + + (*fgbg)(img_input, img_foreground); + + cv::Mat img_background; + (*fgbg).getBackgroundImage(img_background); + + img_input.copyTo(img_segmentation); + cv::add(img_input, cv::Scalar(100, 100, 0), img_segmentation, img_foreground); + + if(showOutput) + { + if (!img_foreground.empty()) + cv::imshow("GMG FG (Godbehere-Matsukawa-Goldberg)", img_foreground); + + if (!img_background.empty()) + cv::imshow("GMG BG (Godbehere-Matsukawa-Goldberg)", img_background); + } + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + firstTime = false; +} + +void GMG::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/GMG.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "initializationFrames", initializationFrames); + cvWriteReal(fs, "decisionThreshold", decisionThreshold); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void GMG::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/GMG.xml", 0, CV_STORAGE_READ); + + initializationFrames = cvReadIntByName(fs, 0, "initializationFrames", 20); + decisionThreshold = cvReadRealByName(fs, 0, "decisionThreshold", 0.7); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/GMG.h b/package_bgs/GMG.h new file mode 100644 index 0000000..9da28ad --- /dev/null +++ b/package_bgs/GMG.h @@ -0,0 +1,45 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <opencv2/opencv.hpp> + +#include "IBGS.h" + +class GMG : public IBGS +{ +private: + bool firstTime; + cv::Ptr<cv::BackgroundSubtractorGMG> fgbg; + int initializationFrames; + double decisionThreshold; + cv::Mat img_foreground; + cv::Mat img_segmentation; + bool showOutput; + +public: + GMG(); + ~GMG(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/IBGS.h b/package_bgs/IBGS.h new file mode 100644 index 0000000..0b57658 --- /dev/null +++ b/package_bgs/IBGS.h @@ -0,0 +1,33 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <cv.h> + +class IBGS +{ +public: + virtual void process(const cv::Mat &img_input, cv::Mat &img_foreground, cv::Mat &img_background) = 0; + /*virtual void process(const cv::Mat &img_input, cv::Mat &img_foreground){ + process(img_input, img_foreground, cv::Mat()); + }*/ + virtual ~IBGS(){} + +private: + virtual void saveConfig() = 0; + virtual void loadConfig() = 0; +}; diff --git a/package_bgs/MixtureOfGaussianV1BGS.cpp b/package_bgs/MixtureOfGaussianV1BGS.cpp new file mode 100644 index 0000000..51d41eb --- /dev/null +++ b/package_bgs/MixtureOfGaussianV1BGS.cpp @@ -0,0 +1,95 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "MixtureOfGaussianV1BGS.h" + +MixtureOfGaussianV1BGS::MixtureOfGaussianV1BGS() : firstTime(true), alpha(0.05), enableThreshold(true), threshold(15), showOutput(true) +{ + std::cout << "MixtureOfGaussianV1BGS()" << std::endl; +} + +MixtureOfGaussianV1BGS::~MixtureOfGaussianV1BGS() +{ + std::cout << "~MixtureOfGaussianV1BGS()" << std::endl; +} + +void MixtureOfGaussianV1BGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + //------------------------------------------------------------------ + // BackgroundSubtractorMOG + // http://opencv.itseez.com/modules/video/doc/motion_analysis_and_object_tracking.html#backgroundsubtractormog + // + // Gaussian Mixture-based Backbround/Foreground Segmentation Algorithm. + // + // The class implements the algorithm described in: + // P. KadewTraKuPong and R. Bowden, + // An improved adaptive background mixture model for real-time tracking with shadow detection, + // Proc. 2nd European Workshp on Advanced Video-Based Surveillance Systems, 2001 + //------------------------------------------------------------------ + + mog(img_input, img_foreground, alpha); + cv::Mat img_background; + mog.getBackgroundImage(img_background); + + if(enableThreshold) + cv::threshold(img_foreground, img_foreground, threshold, 255, cv::THRESH_BINARY); + + if(showOutput) + { + if (!img_foreground.empty()) + cv::imshow("GMM FG (KadewTraKuPong&Bowden)", img_foreground); + + if (!img_background.empty()) + cv::imshow("GMM BG (KadewTraKuPong&Bowden)", img_background); + } + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + firstTime = false; +} + +void MixtureOfGaussianV1BGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/MixtureOfGaussianV1BGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteReal(fs, "alpha", alpha); + cvWriteInt(fs, "enableThreshold", enableThreshold); + cvWriteInt(fs, "threshold", threshold); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void MixtureOfGaussianV1BGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/MixtureOfGaussianV1BGS.xml", 0, CV_STORAGE_READ); + + alpha = cvReadRealByName(fs, 0, "alpha", 0.05); + enableThreshold = cvReadIntByName(fs, 0, "enableThreshold", true); + threshold = cvReadIntByName(fs, 0, "threshold", 15); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/MixtureOfGaussianV1BGS.h b/package_bgs/MixtureOfGaussianV1BGS.h new file mode 100644 index 0000000..8a67acc --- /dev/null +++ b/package_bgs/MixtureOfGaussianV1BGS.h @@ -0,0 +1,47 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> +#include <opencv2/video/background_segm.hpp> + +#include "IBGS.h" + +class MixtureOfGaussianV1BGS : public IBGS +{ +private: + bool firstTime; + cv::BackgroundSubtractorMOG mog; + cv::Mat img_foreground; + double alpha; + bool enableThreshold; + int threshold; + bool showOutput; + +public: + MixtureOfGaussianV1BGS(); + ~MixtureOfGaussianV1BGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/MixtureOfGaussianV2BGS.cpp b/package_bgs/MixtureOfGaussianV2BGS.cpp new file mode 100644 index 0000000..5ce33a3 --- /dev/null +++ b/package_bgs/MixtureOfGaussianV2BGS.cpp @@ -0,0 +1,98 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "MixtureOfGaussianV2BGS.h" + +MixtureOfGaussianV2BGS::MixtureOfGaussianV2BGS() : firstTime(true), alpha(0.05), enableThreshold(true), threshold(15), showOutput(true) +{ + std::cout << "MixtureOfGaussianV2BGS()" << std::endl; +} + +MixtureOfGaussianV2BGS::~MixtureOfGaussianV2BGS() +{ + std::cout << "~MixtureOfGaussianV2BGS()" << std::endl; +} + +void MixtureOfGaussianV2BGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + //------------------------------------------------------------------ + // BackgroundSubtractorMOG2 + // http://opencv.itseez.com/modules/video/doc/motion_analysis_and_object_tracking.html#backgroundsubtractormog2 + // + // Gaussian Mixture-based Backbround/Foreground Segmentation Algorithm. + // + // The class implements the Gaussian mixture model background subtraction described in: + // (1) Z.Zivkovic, Improved adaptive Gausian mixture model for background subtraction, International Conference Pattern Recognition, UK, August, 2004, + // The code is very fast and performs also shadow detection. Number of Gausssian components is adapted per pixel. + // + // (2) Z.Zivkovic, F. van der Heijden, Efficient Adaptive Density Estimation per Image Pixel for the Task of Background Subtraction, + // Pattern Recognition Letters, vol. 27, no. 7, pages 773-780, 2006. + // The algorithm similar to the standard Stauffer&Grimson algorithm with additional selection of the number of the Gaussian components based on: + // Z.Zivkovic, F.van der Heijden, Recursive unsupervised learning of finite mixture models, IEEE Trans. on Pattern Analysis and Machine Intelligence, + // vol.26, no.5, pages 651-656, 2004. + //------------------------------------------------------------------ + + mog(img_input, img_foreground, alpha); + + cv::Mat img_background; + mog.getBackgroundImage(img_background); + + if(enableThreshold) + cv::threshold(img_foreground, img_foreground, threshold, 255, cv::THRESH_BINARY); + + if(showOutput) + { + cv::imshow("GMM (Zivkovic&Heijden)", img_foreground); + cv::imshow("GMM BKG (Zivkovic&Heijden)", img_background); + } + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + firstTime = false; +} + +void MixtureOfGaussianV2BGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/MixtureOfGaussianV2BGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteReal(fs, "alpha", alpha); + cvWriteInt(fs, "enableThreshold", enableThreshold); + cvWriteInt(fs, "threshold", threshold); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void MixtureOfGaussianV2BGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/MixtureOfGaussianV2BGS.xml", 0, CV_STORAGE_READ); + + alpha = cvReadRealByName(fs, 0, "alpha", 0.05); + enableThreshold = cvReadIntByName(fs, 0, "enableThreshold", true); + threshold = cvReadIntByName(fs, 0, "threshold", 15); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/MixtureOfGaussianV2BGS.h b/package_bgs/MixtureOfGaussianV2BGS.h new file mode 100644 index 0000000..495d701 --- /dev/null +++ b/package_bgs/MixtureOfGaussianV2BGS.h @@ -0,0 +1,47 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> +#include <opencv2/video/background_segm.hpp> + +#include "IBGS.h" + +class MixtureOfGaussianV2BGS : public IBGS +{ +private: + bool firstTime; + cv::BackgroundSubtractorMOG2 mog; + cv::Mat img_foreground; + double alpha; + bool enableThreshold; + int threshold; + bool showOutput; + +public: + MixtureOfGaussianV2BGS(); + ~MixtureOfGaussianV2BGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/StaticFrameDifferenceBGS.cpp b/package_bgs/StaticFrameDifferenceBGS.cpp new file mode 100644 index 0000000..3463c45 --- /dev/null +++ b/package_bgs/StaticFrameDifferenceBGS.cpp @@ -0,0 +1,79 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "StaticFrameDifferenceBGS.h" + +StaticFrameDifferenceBGS::StaticFrameDifferenceBGS() : firstTime(true), enableThreshold(true), threshold(15), showOutput(true) +{ + std::cout << "StaticFrameDifferenceBGS()" << std::endl; +} + +StaticFrameDifferenceBGS::~StaticFrameDifferenceBGS() +{ + std::cout << "~StaticFrameDifferenceBGS()" << std::endl; +} + +void StaticFrameDifferenceBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + if(img_background.empty()) + img_input.copyTo(img_background); + + loadConfig(); + + if(firstTime) + saveConfig(); + + cv::absdiff(img_input, img_background, img_foreground); + + if(img_foreground.channels() == 3) + cv::cvtColor(img_foreground, img_foreground, CV_BGR2GRAY); + + if(enableThreshold) + cv::threshold(img_foreground, img_foreground, threshold, 255, cv::THRESH_BINARY); + + if(showOutput) + cv::imshow("Static Frame Difference", img_foreground); + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + firstTime = false; +} + +void StaticFrameDifferenceBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/StaticFrameDifferenceBGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "enableThreshold", enableThreshold); + cvWriteInt(fs, "threshold", threshold); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void StaticFrameDifferenceBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/StaticFrameDifferenceBGS.xml", 0, CV_STORAGE_READ); + + enableThreshold = cvReadIntByName(fs, 0, "enableThreshold", true); + threshold = cvReadIntByName(fs, 0, "threshold", 15); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/StaticFrameDifferenceBGS.h b/package_bgs/StaticFrameDifferenceBGS.h new file mode 100644 index 0000000..416d13b --- /dev/null +++ b/package_bgs/StaticFrameDifferenceBGS.h @@ -0,0 +1,45 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "IBGS.h" + +class StaticFrameDifferenceBGS : public IBGS +{ +private: + bool firstTime; + cv::Mat img_background; + cv::Mat img_foreground; + bool enableThreshold; + int threshold; + bool showOutput; + +public: + StaticFrameDifferenceBGS(); + ~StaticFrameDifferenceBGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/WeightedMovingMeanBGS.cpp b/package_bgs/WeightedMovingMeanBGS.cpp new file mode 100644 index 0000000..841c467 --- /dev/null +++ b/package_bgs/WeightedMovingMeanBGS.cpp @@ -0,0 +1,122 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "WeightedMovingMeanBGS.h" + +WeightedMovingMeanBGS::WeightedMovingMeanBGS() : firstTime(true), enableWeight(true), enableThreshold(true), threshold(15), showOutput(true), showBackground(false) +{ + std::cout << "WeightedMovingMeanBGS()" << std::endl; +} + +WeightedMovingMeanBGS::~WeightedMovingMeanBGS() +{ + std::cout << "~WeightedMovingMeanBGS()" << std::endl; +} + +void WeightedMovingMeanBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + if(img_input_prev_1.empty()) + { + img_input.copyTo(img_input_prev_1); + return; + } + + if(img_input_prev_2.empty()) + { + img_input_prev_1.copyTo(img_input_prev_2); + img_input.copyTo(img_input_prev_1); + return; + } + + cv::Mat img_input_f(img_input.size(), CV_32F); + img_input.convertTo(img_input_f, CV_32F, 1./255.); + + cv::Mat img_input_prev_1_f(img_input.size(), CV_32F); + img_input_prev_1.convertTo(img_input_prev_1_f, CV_32F, 1./255.); + + cv::Mat img_input_prev_2_f(img_input.size(), CV_32F); + img_input_prev_2.convertTo(img_input_prev_2_f, CV_32F, 1./255.); + + cv::Mat img_background_f(img_input.size(), CV_32F); + + if(enableWeight) + img_background_f = ((img_input_f * 0.5) + (img_input_prev_1_f * 0.3) + (img_input_prev_2_f * 0.2)); + else + img_background_f = ((img_input_f) + (img_input_prev_1_f) + (img_input_prev_2_f)) / 3.0; + + cv::Mat img_background(img_background_f.size(), CV_8U); + + double minVal, maxVal; + minVal = 0.; maxVal = 1.; + img_background_f.convertTo(img_background, CV_8U, 255.0/(maxVal - minVal), -minVal); + + if(showBackground) + cv::imshow("W Moving Mean BG Model", img_background); + + cv::Mat img_foreground; + cv::absdiff(img_input, img_background, img_foreground); + + if(img_foreground.channels() == 3) + cv::cvtColor(img_foreground, img_foreground, CV_BGR2GRAY); + + if(enableThreshold) + cv::threshold(img_foreground, img_foreground, threshold, 255, cv::THRESH_BINARY); + + if(showOutput) + cv::imshow("W Moving Mean FG Mask", img_foreground); + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + img_input_prev_1.copyTo(img_input_prev_2); + img_input.copyTo(img_input_prev_1); + + firstTime = false; +} + +void WeightedMovingMeanBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/WeightedMovingMeanBGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "enableWeight", enableWeight); + cvWriteInt(fs, "enableThreshold", enableThreshold); + cvWriteInt(fs, "threshold", threshold); + cvWriteInt(fs, "showOutput", showOutput); + cvWriteInt(fs, "showBackground", showBackground); + + cvReleaseFileStorage(&fs); +} + +void WeightedMovingMeanBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/WeightedMovingMeanBGS.xml", 0, CV_STORAGE_READ); + + enableWeight = cvReadIntByName(fs, 0, "enableWeight", true); + enableThreshold = cvReadIntByName(fs, 0, "enableThreshold", true); + threshold = cvReadIntByName(fs, 0, "threshold", 15); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + showBackground = cvReadIntByName(fs, 0, "showBackground", false); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/WeightedMovingMeanBGS.h b/package_bgs/WeightedMovingMeanBGS.h new file mode 100644 index 0000000..a6684e7 --- /dev/null +++ b/package_bgs/WeightedMovingMeanBGS.h @@ -0,0 +1,47 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "IBGS.h" + +class WeightedMovingMeanBGS : public IBGS +{ +private: + bool firstTime; + cv::Mat img_input_prev_1; + cv::Mat img_input_prev_2; + bool enableWeight; + bool enableThreshold; + int threshold; + bool showOutput; + bool showBackground; + +public: + WeightedMovingMeanBGS(); + ~WeightedMovingMeanBGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/WeightedMovingVarianceBGS.cpp b/package_bgs/WeightedMovingVarianceBGS.cpp new file mode 100644 index 0000000..7e691e9 --- /dev/null +++ b/package_bgs/WeightedMovingVarianceBGS.cpp @@ -0,0 +1,161 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "WeightedMovingVarianceBGS.h" + +WeightedMovingVarianceBGS::WeightedMovingVarianceBGS() : firstTime(true), enableWeight(true), + enableThreshold(true), threshold(15), showOutput(true) +{ + std::cout << "WeightedMovingVarianceBGS()" << std::endl; +} + +WeightedMovingVarianceBGS::~WeightedMovingVarianceBGS() +{ + std::cout << "~WeightedMovingVarianceBGS()" << std::endl; +} + +void WeightedMovingVarianceBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + if(img_input_prev_1.empty()) + { + img_input.copyTo(img_input_prev_1); + return; + } + + if(img_input_prev_2.empty()) + { + img_input_prev_1.copyTo(img_input_prev_2); + img_input.copyTo(img_input_prev_1); + return; + } + + cv::Mat img_input_f(img_input.size(), CV_32F); + img_input.convertTo(img_input_f, CV_32F, 1./255.); + + cv::Mat img_input_prev_1_f(img_input.size(), CV_32F); + img_input_prev_1.convertTo(img_input_prev_1_f, CV_32F, 1./255.); + + cv::Mat img_input_prev_2_f(img_input.size(), CV_32F); + img_input_prev_2.convertTo(img_input_prev_2_f, CV_32F, 1./255.); + + cv::Mat img_foreground; + + // Weighted mean + cv::Mat img_mean_f(img_input.size(), CV_32F); + + if(enableWeight) + img_mean_f = ((img_input_f * 0.5) + (img_input_prev_1_f * 0.3) + (img_input_prev_2_f * 0.2)); + else + img_mean_f = ((img_input_f * 0.3) + (img_input_prev_1_f * 0.3) + (img_input_prev_2_f * 0.3)); + + // Weighted variance + cv::Mat img_1_f(img_input.size(), CV_32F); + cv::Mat img_2_f(img_input.size(), CV_32F); + cv::Mat img_3_f(img_input.size(), CV_32F); + cv::Mat img_4_f(img_input.size(), CV_32F); + + if(enableWeight) + { + img_1_f = computeWeightedVariance(img_input_f, img_mean_f, 0.5); + img_2_f = computeWeightedVariance(img_input_prev_1_f, img_mean_f, 0.3); + img_3_f = computeWeightedVariance(img_input_prev_2_f, img_mean_f, 0.2); + img_4_f = (img_1_f + img_2_f + img_3_f); + } + else + { + img_1_f = computeWeightedVariance(img_input_f, img_mean_f, 0.3); + img_2_f = computeWeightedVariance(img_input_prev_1_f, img_mean_f, 0.3); + img_3_f = computeWeightedVariance(img_input_prev_2_f, img_mean_f, 0.3); + img_4_f = (img_1_f + img_2_f + img_3_f); + } + + // Standard deviation + cv::Mat img_sqrt_f(img_input.size(), CV_32F); + cv::sqrt(img_4_f, img_sqrt_f); + cv::Mat img_sqrt(img_input.size(), CV_8U); + double minVal, maxVal; + minVal = 0.; maxVal = 1.; + img_sqrt_f.convertTo(img_sqrt, CV_8U, 255.0/(maxVal - minVal), -minVal); + img_sqrt.copyTo(img_foreground); + + if(img_foreground.channels() == 3) + cv::cvtColor(img_foreground, img_foreground, CV_BGR2GRAY); + + if(enableThreshold) + cv::threshold(img_foreground, img_foreground, threshold, 255, cv::THRESH_BINARY); + + if(showOutput) + cv::imshow("W Moving Variance", img_foreground); + + img_foreground.copyTo(img_output); + + img_input_prev_1.copyTo(img_input_prev_2); + img_input.copyTo(img_input_prev_1); + + firstTime = false; +} + +//unused +cv::Mat WeightedMovingVarianceBGS::computeWeightedMean(const std::vector<cv::Mat> &v_img_input_f, const std::vector<double> weights) +{ + cv::Mat img; + return img; +} + +cv::Mat WeightedMovingVarianceBGS::computeWeightedVariance(const cv::Mat &img_input_f, const cv::Mat &img_mean_f, const double weight) +{ + //ERROR in return (weight * ((cv::abs(img_input_f - img_mean_f))^2.)); + + cv::Mat img_f_absdiff(img_input_f.size(), CV_32F); + cv::absdiff(img_input_f, img_mean_f, img_f_absdiff); + cv::Mat img_f_pow(img_input_f.size(), CV_32F); + cv::pow(img_f_absdiff, 2.0, img_f_pow); + cv::Mat img_f = weight * img_f_pow; + + return img_f; +} + +void WeightedMovingVarianceBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/WeightedMovingVarianceBGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "enableWeight", enableWeight); + cvWriteInt(fs, "enableThreshold", enableThreshold); + cvWriteInt(fs, "threshold", threshold); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void WeightedMovingVarianceBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/WeightedMovingVarianceBGS.xml", 0, CV_STORAGE_READ); + + enableWeight = cvReadIntByName(fs, 0, "enableWeight", true); + enableThreshold = cvReadIntByName(fs, 0, "enableThreshold", true); + threshold = cvReadIntByName(fs, 0, "threshold", 15); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/WeightedMovingVarianceBGS.h b/package_bgs/WeightedMovingVarianceBGS.h new file mode 100644 index 0000000..f07cf59 --- /dev/null +++ b/package_bgs/WeightedMovingVarianceBGS.h @@ -0,0 +1,48 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "IBGS.h" + +class WeightedMovingVarianceBGS : public IBGS +{ +private: + bool firstTime; + cv::Mat img_input_prev_1; + cv::Mat img_input_prev_2; + bool enableWeight; + bool enableThreshold; + int threshold; + bool showOutput; + +public: + WeightedMovingVarianceBGS(); + ~WeightedMovingVarianceBGS(); + + cv::Mat computeWeightedMean(const std::vector<cv::Mat> &v_img_input_f, const std::vector<double> weights); + cv::Mat computeWeightedVariance(const cv::Mat &img_input_f, const cv::Mat &img_mean_f, const double weight); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; diff --git a/package_bgs/ae/KDE.cpp b/package_bgs/ae/KDE.cpp new file mode 100644 index 0000000..2cbbd8c --- /dev/null +++ b/package_bgs/ae/KDE.cpp @@ -0,0 +1,128 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "KDE.h" + +KDE::KDE() : SequenceLength(50), TimeWindowSize(100), SDEstimationFlag(1), lUseColorRatiosFlag(1), + th(10e-8), alpha(0.3), framesToLearn(10), frameNumber(0), firstTime(true), showOutput(true) +{ + p = new NPBGSubtractor; + std::cout << "KDE()" << std::endl; +} + +KDE::~KDE() +{ + delete FGImage; + delete p; + std::cout << "~KDE()" << std::endl; +} + +void KDE::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + { + rows = img_input.size().height; + cols = img_input.size().width; + color_channels = img_input.channels(); + + // SequenceLength: number of samples for each pixel. + // TimeWindowSize: Time window for sampling. for example in the call above, the bg will sample 50 points out of 100 frames. + // this rate will affect how fast the model adapt. + // SDEstimationFlag: True means to estimate suitable kernel bandwidth to each pixel, False uses a default value. + // lUseColorRatiosFlag: True means use normalized RGB for color (recommended.) + p->Intialize(rows,cols,color_channels,SequenceLength,TimeWindowSize,SDEstimationFlag,lUseColorRatiosFlag); + // th: 0-1 is the probability threshold for a pixel to be a foregroud. typically make it small as 10e-8. the smaller the value the less false positive and more false negative. + // alpha: 0-1, for color. typically set to 0.3. this affect shadow suppression. + p->SetThresholds(th,alpha); + + FGImage = new unsigned char[rows*cols]; + //FilteredFGImage = new unsigned char[rows*cols]; + FilteredFGImage = 0; + DisplayBuffers = 0; + + img_foreground = cv::Mat::zeros(rows,cols,CV_8UC1); + + frameNumber = 0; + saveConfig(); + firstTime = false; + } + + // Stores the first N frames to build the background model + if(frameNumber < framesToLearn) + { + p->AddFrame(img_input.data); + frameNumber++; + return; + } + + // Build the background model with first 10 frames + if(frameNumber == framesToLearn) + { + p->Estimation(); + frameNumber++; + } + + // Now, we can subtract the background + ((NPBGSubtractor *)p)->NBBGSubtraction(img_input.data,FGImage,FilteredFGImage,DisplayBuffers); + + // At each frame also you can call the update function to adapt the bg + // here you pass a mask where pixels with true value will be masked out of the update. + ((NPBGSubtractor *)p)->Update(FGImage); + + img_foreground.data = FGImage; + + if(showOutput) + cv::imshow("KDE", img_foreground); + + img_foreground.copyTo(img_output); +} + +void KDE::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/KDE.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "framesToLearn", framesToLearn); + cvWriteInt(fs, "SequenceLength", SequenceLength); + cvWriteInt(fs, "TimeWindowSize", TimeWindowSize); + cvWriteInt(fs, "SDEstimationFlag", SDEstimationFlag); + cvWriteInt(fs, "lUseColorRatiosFlag", lUseColorRatiosFlag); + cvWriteReal(fs, "th", th); + cvWriteReal(fs, "alpha", alpha); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void KDE::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/KDE.xml", 0, CV_STORAGE_READ); + + framesToLearn = cvReadIntByName(fs, 0, "framesToLearn", 10); + SequenceLength = cvReadIntByName(fs, 0, "SequenceLength", 50); + TimeWindowSize = cvReadIntByName(fs, 0, "TimeWindowSize", 100); + SDEstimationFlag = cvReadIntByName(fs, 0, "SDEstimationFlag", 1); + lUseColorRatiosFlag = cvReadIntByName(fs, 0, "lUseColorRatiosFlag", 1); + th = cvReadRealByName(fs, 0, "th", 10e-8); + alpha = cvReadRealByName(fs, 0, "alpha", 0.3); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/ae/KDE.h b/package_bgs/ae/KDE.h new file mode 100644 index 0000000..39f01dc --- /dev/null +++ b/package_bgs/ae/KDE.h @@ -0,0 +1,58 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "NPBGSubtractor.h" +#include "../IBGS.h" + +class KDE : public IBGS +{ +private: + NPBGSubtractor *p; + int rows; + int cols; + int color_channels; + int SequenceLength; + int TimeWindowSize; + int SDEstimationFlag; + int lUseColorRatiosFlag; + double th; + double alpha; + int framesToLearn; + int frameNumber; + bool firstTime; + bool showOutput; + + cv::Mat img_foreground; + unsigned char *FGImage; + unsigned char *FilteredFGImage; + unsigned char **DisplayBuffers; + +public: + KDE(); + ~KDE(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; diff --git a/package_bgs/ae/KernelTable.cpp b/package_bgs/ae/KernelTable.cpp new file mode 100644 index 0000000..9e20d7c --- /dev/null +++ b/package_bgs/ae/KernelTable.cpp @@ -0,0 +1,116 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* +* +* Copyright 2001 by Ahmed Elgammal All rights reserved. +* +* Permission to use, copy, or modify this software and its documentation +* for educational and research purposes only and without fee is hereby +* granted, provided that this copyright notice and the original authors's +* name appear on all copies and supporting documentation. If individual +* files are separated from this distribution directory structure, this +* copyright notice must be included. For any other uses of this software, +* in original or modified form, including but not limited to distribution +* in whole or in part, specific prior permission must be obtained from +* Author or UMIACS. These programs shall not be used, rewritten, or +* adapted as the basis of a commercial software or hardware product +* without first obtaining appropriate licenses from Author. +* Other than these cases, no part of this software may be used or +* distributed without written permission of the author. +* +* Neither the author nor UMIACS make any representations about the +* suitability of this software for any purpose. It is provided +* "as is" without express or implied warranty. +* +* Ahmed Elgammal +* +* University of Maryland at College Park +* UMIACS +* A.V. Williams Bldg. +* CollegePark, MD 20742 +* E-mail: elgammal@umiacs.umd.edu +* +**/ + +#include "KernelTable.h" +#include <math.h> + +#define PI 3.14159 + +KernelLUTable::KernelLUTable() +{ + std::cout << "KernelLUTable()" << std::endl; +} + +KernelLUTable::~KernelLUTable() +{ + delete kerneltable; + delete kernelsums; + std::cout << "~KernelLUTable()" << std::endl; +} + +KernelLUTable::KernelLUTable(int KernelHalfWidth, double Segmamin, double Segmamax, int Segmabins) +{ + std::cout << "KernelLUTable()" << std::endl; + + double C1,C2,v,segma,sum; + int bin,b; + + minsegma = Segmamin; + maxsegma = Segmamax; + segmabins = Segmabins; + tablehalfwidth = KernelHalfWidth; + + // Generate the Kernel + + // allocate memory for the Kernal Table + kerneltable = new double[segmabins*(2*KernelHalfWidth+1)]; + kernelsums = new double[segmabins]; + + double segmastep = (maxsegma - minsegma) / segmabins; + double y; + + for(segma = minsegma, bin = 0; bin < segmabins; segma += segmastep, bin++) + { + C1 = 1/(sqrt(2*PI)*segma); + C2 = -1/(2*segma*segma); + + b = (2*KernelHalfWidth+1)*bin; + sum = 0; + + for(int x = 0; x <= KernelHalfWidth; x++) + { + y = x/1.0; + v = C1*exp(C2*y*y); + kerneltable[b+KernelHalfWidth+x]=v; + kerneltable[b+KernelHalfWidth-x]=v; + sum += 2*v; + } + + sum -= C1; + + kernelsums[bin] = sum; + + // Normailization + for(int x = 0; x <= KernelHalfWidth; x++) + { + v = kerneltable[b+KernelHalfWidth+x] / sum; + kerneltable[b+KernelHalfWidth+x]=v; + kerneltable[b+KernelHalfWidth-x]=v; + } + } +} diff --git a/package_bgs/ae/KernelTable.h b/package_bgs/ae/KernelTable.h new file mode 100644 index 0000000..bc37cc4 --- /dev/null +++ b/package_bgs/ae/KernelTable.h @@ -0,0 +1,71 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* +* +* Copyright 2001 by Ahmed Elgammal All rights reserved. +* +* Permission to use, copy, or modify this software and its documentation +* for educational and research purposes only and without fee is hereby +* granted, provided that this copyright notice and the original authors's +* name appear on all copies and supporting documentation. If individual +* files are separated from this distribution directory structure, this +* copyright notice must be included. For any other uses of this software, +* in original or modified form, including but not limited to distribution +* in whole or in part, specific prior permission must be obtained from +* Author or UMIACS. These programs shall not be used, rewritten, or +* adapted as the basis of a commercial software or hardware product +* without first obtaining appropriate licenses from Author. +* Other than these cases, no part of this software may be used or +* distributed without written permission of the author. +* +* Neither the author nor UMIACS make any representations about the +* suitability of this software for any purpose. It is provided +* "as is" without express or implied warranty. +* +* Ahmed Elgammal +* +* University of Maryland at College Park +* UMIACS +* A.V. Williams Bldg. +* CollegePark, MD 20742 +* E-mail: elgammal@umiacs.umd.edu +* +**/ + +#ifndef __KERNEL_TABLE__ +#define __KERNEL_TABLE__ + +#include <iostream> + +class KernelLUTable +{ +public: + double minsegma; + double maxsegma; + int segmabins; + int tablehalfwidth; + double *kerneltable; + double *kernelsums; + +public: + KernelLUTable(); + ~KernelLUTable(); + + KernelLUTable(int KernelHalfWidth,double Segmamin,double Segmamax,int Segmabins); +}; + +#endif diff --git a/package_bgs/ae/NPBGSubtractor.cpp b/package_bgs/ae/NPBGSubtractor.cpp new file mode 100644 index 0000000..0f77a9a --- /dev/null +++ b/package_bgs/ae/NPBGSubtractor.cpp @@ -0,0 +1,1160 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* +* +* Copyright 2001 by Ahmed Elgammal All rights reserved. +* +* Permission to use, copy, or modify this software and its documentation +* for educational and research purposes only and without fee is hereby +* granted, provided that this copyright notice and the original authors's +* name appear on all copies and supporting documentation. If individual +* files are separated from this distribution directory structure, this +* copyright notice must be included. For any other uses of this software, +* in original or modified form, including but not limited to distribution +* in whole or in part, specific prior permission must be obtained from +* Author or UMIACS. These programs shall not be used, rewritten, or +* adapted as the basis of a commercial software or hardware product +* without first obtaining appropriate licenses from Author. +* Other than these cases, no part of this software may be used or +* distributed without written permission of the author. +* +* Neither the author nor UMIACS make any representations about the +* suitability of this software for any purpose. It is provided +* "as is" without express or implied warranty. +* +* Ahmed Elgammal +* +* University of Maryland at College Park +* UMIACS +* A.V. Williams Bldg. +* CollegePark, MD 20742 +* E-mail: elgammal@umiacs.umd.edu +* +**/ + +// NPBGSubtractor.cpp: implementation of the NPBGSubtractor class. +// +////////////////////////////////////////////////////////////////////// + +#include "NPBGSubtractor.h" +#include <assert.h> +#include <math.h> +#include <string.h> + +//#ifdef _DEBUG +//#undef THIS_FILE +//static char THIS_FILE[]=__FILE__; +//#define new DEBUG_NEW +//#endif + +void BGR2SnGnRn(unsigned char * in_image, + unsigned char * out_image, + unsigned int rows, + unsigned int cols) +{ + unsigned int i; + unsigned int r1,r2,r3; + unsigned int r,g,b; + double s; + + for(i = 0; i < rows*cols*3; i += 3) + { + b=in_image[i]; + g=in_image[i+1]; + r=in_image[i+2]; + + // calculate color ratios + s = (double) 255 / (double) (b+g+r+30); + + r2 =(unsigned int) ((g+10) * s ); + r3 =(unsigned int) ((r+10) * s ); + + out_image[i] = (unsigned char) (((unsigned int) b+g+r) / 3); + out_image[i+1] = (unsigned char) (r2 > 255 ? 255 : r2) ; + out_image[i+2] = (unsigned char) (r3 > 255 ? 255 : r3) ; + } +} + +void UpdateDiffHist(unsigned char * image1, unsigned char * image2, DynamicMedianHistogram * pHist) +{ + unsigned int j; + int bin,diff; + + unsigned int imagesize = pHist->imagesize; + unsigned char histbins = pHist->histbins; + unsigned char *pAbsDiffHist = pHist->Hist; + + int histbins_1 = histbins-1; + + for(j = 0; j < imagesize; j++) + { + diff = (int) image1[j] - (int) image2[j]; + diff = abs(diff); + // update histogram + bin = (diff < histbins ? diff : histbins_1); + pAbsDiffHist[j*histbins+bin]++; + } +} + +void FindHistMedians(DynamicMedianHistogram * pAbsDiffHist) +{ + unsigned char * Hist = pAbsDiffHist->Hist; + unsigned char * MedianBins = pAbsDiffHist->MedianBins; + unsigned char * AccSum = pAbsDiffHist->AccSum; + unsigned char histsum = pAbsDiffHist->histsum; + unsigned char histbins = pAbsDiffHist->histbins; + unsigned int imagesize = pAbsDiffHist->imagesize; + + int sum; + int bin; + unsigned int histindex; + unsigned char medianCount=histsum/2; + unsigned int j; + + // find medians + for(j = 0; j < imagesize; j++) + { + // find the median + bin=0; + sum=0; + + histindex=j*histbins; + + while(sum < medianCount) + { + sum+=Hist[histindex+bin]; + bin++; + } + + bin--; + + MedianBins[j]=bin; + AccSum[j]=sum; + } +} + +DynamicMedianHistogram BuildAbsDiffHist(unsigned char * pSequence, + unsigned int rows, + unsigned int cols, + unsigned int color_channels, + unsigned int SequenceLength, + unsigned int histbins) +{ + + unsigned int imagesize=rows*cols*color_channels; + unsigned int i; + + DynamicMedianHistogram Hist; + + unsigned char *pAbsDiffHist = new unsigned char[rows*cols*color_channels*histbins]; + unsigned char *pMedianBins = new unsigned char[rows*cols*color_channels]; + unsigned char *pMedianFreq = new unsigned char[rows*cols*color_channels]; + unsigned char *pAccSum = new unsigned char[rows*cols*color_channels]; + + memset(pAbsDiffHist,0,rows*cols*color_channels*histbins); + + Hist.Hist = pAbsDiffHist; + Hist.MedianBins = pMedianBins; + Hist.MedianFreq = pMedianFreq; + Hist.AccSum = pAccSum; + Hist.histbins = histbins; + Hist.imagesize = rows*cols*color_channels; + Hist.histsum = SequenceLength-1; + + unsigned char *image1, *image2; + for(i = 1; i < SequenceLength; i++) + { + // find diff between frame i,i-1; + image1 = pSequence+(i-1)*imagesize; + image2 = pSequence+(i)*imagesize; + + UpdateDiffHist(image1,image2,&Hist); + } + + FindHistMedians(&Hist); + + return Hist; +} + +void EstimateSDsFromAbsDiffHist(DynamicMedianHistogram * pAbsDiffHist, + unsigned char * pSDs, + unsigned int imagesize, + double MinSD, + double MaxSD, + unsigned int kernelbins) +{ + double v; + double kernelbinfactor=(kernelbins-1)/(MaxSD-MinSD); + int medianCount; + int sum; + int bin; + unsigned int histindex; + unsigned int j; + unsigned int x1,x2; + + unsigned char *Hist =pAbsDiffHist->Hist; + unsigned char *MedianBins =pAbsDiffHist->MedianBins; + unsigned char *AccSum =pAbsDiffHist->AccSum; + unsigned char histsum =pAbsDiffHist->histsum; + unsigned char histbins =pAbsDiffHist->histbins; + + medianCount=(histsum)/2 ; + + for(j = 0; j < imagesize; j++) + { + histindex=j*histbins; + + bin=MedianBins[j]; + sum=AccSum[j]; + + x1=sum-Hist[histindex+bin]; + x2=sum; + + // interpolate to get the median + // x1 < 50 % < x2 + + v =1.04 * ((double) bin-(double) (x2-medianCount)/ (double) (x2-x1)); + v=( v <= MinSD ? MinSD : v); + + // convert sd to kernel table bin + + bin=(int) (v>=MaxSD ? kernelbins-1 : floor((v-MinSD)*kernelbinfactor+.5)); + + assert(bin>=0 && bin < kernelbins ); + + pSDs[j]=bin; + } +} + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +NPBGSubtractor::NPBGSubtractor(){} + +NPBGSubtractor::~NPBGSubtractor() +{ + delete AbsDiffHist.Hist; + delete AbsDiffHist.MedianBins; + delete AbsDiffHist.MedianFreq; + delete AbsDiffHist.AccSum; + delete KernelTable; + delete BGModel->SDbinsImage; + delete BGModel; + delete Pimage1; + delete Pimage2; + delete tempFrame; + delete imageindex->List; + delete imageindex; +} + +int NPBGSubtractor::Intialize(unsigned int prows, + unsigned int pcols, + unsigned int pcolor_channels, + unsigned int SequenceLength, + unsigned int pTimeWindowSize, + unsigned char pSDEstimationFlag, + unsigned char pUseColorRatiosFlag) +{ + + rows=prows; + cols=pcols; + color_channels=pcolor_channels; + imagesize=rows*cols*color_channels; + SdEstimateFlag = pSDEstimationFlag; + UseColorRatiosFlag=pUseColorRatiosFlag; + //SampleSize = SequenceLength; + + AdaptBGFlag = FALSE; + // + SubsetFlag = TRUE; + + UpdateSDRate = 0; + + BGModel = new NPBGmodel(rows,cols,color_channels,SequenceLength,pTimeWindowSize,500); + + Pimage1= new double[rows*cols]; + Pimage2= new double[rows*cols]; + + tempFrame= new unsigned char[rows*cols*3]; + + imageindex = new ImageIndex; + imageindex->List= new unsigned int [rows*cols]; + + // error checking + if (BGModel==NULL) + return 0; + + return 1; +} + +void NPBGSubtractor::AddFrame(unsigned char *ImageBuffer) +{ + if(UseColorRatiosFlag && color_channels==3) + BGR2SnGnRn(ImageBuffer,ImageBuffer,rows,cols); + + BGModel->AddFrame(ImageBuffer); +} + +void NPBGSubtractor::Estimation() +{ + int SampleSize=BGModel->SampleSize; + + memset(BGModel->TemporalMask,0,rows*cols*BGModel->TemporalBufferLength); + + //BGModel->AccMask= new unsigned int [rows*cols]; + memset(BGModel->AccMask,0,rows*cols*sizeof(unsigned int)); + + unsigned char *pSDs = new unsigned char[rows*cols*color_channels]; + + //DynamicMedianHistogram AbsDiffHist; + + int Abshistbins = 20; + + TimeIndex=0; + + // estimate standard deviations + + if(SdEstimateFlag) + { + AbsDiffHist = BuildAbsDiffHist(BGModel->Sequence,rows,cols,color_channels,SampleSize,Abshistbins); + EstimateSDsFromAbsDiffHist(&AbsDiffHist,pSDs,imagesize,SEGMAMIN,SEGMAMAX,SEGMABINS); + } + else + { + unsigned int bin; + bin = (unsigned int) floor(((DEFAULTSEGMA-SEGMAMIN)*SEGMABINS)/(SEGMAMAX-SEGMAMIN)); + memset(pSDs,bin,rows*cols*color_channels*sizeof(unsigned char)); + } + + BGModel->SDbinsImage=pSDs; + + // Generate the Kernel + KernelTable = new KernelLUTable(KERNELHALFWIDTH,SEGMAMIN,SEGMAMAX,SEGMABINS); +} + +/*********************************************************************/ + +void BuildImageIndex(unsigned char * Image, + ImageIndex * imageIndex, + unsigned int rows, + unsigned int cols) +{ + unsigned int i,j; + unsigned int r,c; + unsigned int * image_list; + + j=cols+1; + i=0; + image_list=imageIndex->List; + + for(r = 1; r < rows-1; r++) + { + for(c = 1; c < cols-1; c++) + { + if(Image[j]) + image_list[i++]=j; + + j++; + } + j+=2; + } + + imageIndex->cnt = i; +} + +/*********************************************************************/ + +void HystExpandOperatorIndexed(unsigned char * inImage, + ImageIndex * inIndex, + double * Pimage, + double hyst_th, + unsigned char * outImage, + ImageIndex * outIndex, + unsigned int urows, + unsigned int ucols) +{ + unsigned int * in_list; + unsigned int in_cnt; + unsigned int * out_list; + + int rows,cols; + + int Nbr[9]; + unsigned int i,j; + unsigned int k; + unsigned int idx; + + rows=(int) urows; + cols=(int) ucols; + + in_cnt=inIndex->cnt; + in_list=inIndex->List; + + Nbr[0]=-cols-1; + Nbr[1]=-cols; + Nbr[2]=-cols+1; + Nbr[3]=-1; + Nbr[4]=0; + Nbr[5]=1; + Nbr[6]=cols-1; + Nbr[7]=cols; + Nbr[8]=cols+1; + + memset(outImage,0,rows*cols); + + out_list=outIndex->List; + k=0; + + for(i = 0; i < in_cnt; i++) + { + for(j = 0; j < 9; j++) + { + idx = in_list[i] + Nbr[j]; + + if(Pimage[idx] < hyst_th) + outImage[idx] = 255; + } + } + + // build index for out image + BuildImageIndex(outImage,outIndex,urows,ucols); +} + +/*********************************************************************/ + +void HystShrinkOperatorIndexed(unsigned char * inImage, + ImageIndex * inIndex, + double * Pimage, + double hyst_th, + unsigned char * outImage, + ImageIndex * outIndex, + unsigned int urows, + unsigned int ucols) +{ + unsigned int * in_list; + unsigned int in_cnt; + unsigned int * out_list; + + int rows,cols; + + int Nbr[9]; + unsigned int i,j; + unsigned int k,idx; + + rows=(int) urows; + cols=(int) ucols; + + in_cnt=inIndex->cnt; + in_list=inIndex->List; + + Nbr[0]=-cols-1; + Nbr[1]=-cols; + Nbr[2]=-cols+1; + Nbr[3]=-1; + Nbr[4]=0; + Nbr[5]=1; + Nbr[6]=cols-1; + Nbr[7]=cols; + Nbr[8]=cols+1; + + memset(outImage,0,rows*cols); + + out_list=outIndex->List; + k=0; + + for(i = 0; i < in_cnt; i++) + { + idx = in_list[i]; + j = 0; + + while(j < 9 && inImage[idx+Nbr[j]]) + j++; + + if(j >= 9 || Pimage[idx] <= hyst_th) + outImage[idx]=255; + } + + BuildImageIndex(outImage,outIndex,rows,cols); +} + +/*********************************************************************/ + +void ExpandOperatorIndexed(unsigned char * inImage, + ImageIndex * inIndex, + unsigned char * outImage, + ImageIndex * outIndex, + unsigned int urows, + unsigned int ucols) +{ + unsigned int * in_list; + unsigned int in_cnt; + unsigned int * out_list; + + int rows,cols; + + int Nbr[9]; + unsigned int i,j; + unsigned int k; + unsigned int idx; + + rows=(int) urows; + cols=(int) ucols; + + in_cnt=inIndex->cnt; + in_list=inIndex->List; + + Nbr[0]=-cols-1; + Nbr[1]=-cols; + Nbr[2]=-cols+1; + Nbr[3]=-1; + Nbr[4]=0; + Nbr[5]=1; + Nbr[6]=cols-1; + Nbr[7]=cols; + Nbr[8]=cols+1; + + + memset(outImage,0,rows*cols); + + + out_list=outIndex->List; + k=0; + for (i=0; i<in_cnt;i++) + for (j=0;j<9;j++) { + idx=in_list[i]+Nbr[j]; + outImage[idx]=255; + } + + + // build index for out image + + BuildImageIndex(outImage,outIndex,rows,cols); + +} + +/*********************************************************************/ + +void ShrinkOperatorIndexed(unsigned char * inImage, + ImageIndex * inIndex, + unsigned char * outImage, + ImageIndex * outIndex, + unsigned int urows, + unsigned int ucols) +{ + + unsigned int * in_list; + unsigned int in_cnt; + unsigned int * out_list; + + int rows,cols; + + int Nbr[9]; + unsigned int i,j; + unsigned int k,idx; + + rows=(int) urows; + cols=(int) ucols; + + in_cnt=inIndex->cnt; + in_list=inIndex->List; + + Nbr[0]=-cols-1; + Nbr[1]=-cols; + Nbr[2]=-cols+1; + Nbr[3]=-1; + Nbr[4]=0; + Nbr[5]=1; + Nbr[6]=cols-1; + Nbr[7]=cols; + Nbr[8]=cols+1; + + + memset(outImage,0,rows*cols); + + out_list=outIndex->List; + k=0; + for (i=0; i<in_cnt;i++) { + idx=in_list[i]; + j=0; + + while ( j<9 && inImage[idx+Nbr[j]]){ + j++; + } + + if (j>=9) { + outImage[idx]=255; + } + } + + BuildImageIndex(outImage,outIndex,rows,cols); +} + +/*********************************************************************/ + +void NoiseFilter_o(unsigned char * Image, + unsigned char * ResultIm, + int rows, + int cols, + unsigned char th) +{ + /* assuming input is 1 for on, 0 for off */ + + + int r,c; + unsigned char *p,*n,*nw,*ne,*e,*w,*s,*sw,*se; + unsigned int v; + unsigned int TH; + + unsigned char * ResultPtr; + + TH=255*th; + + memset(ResultIm,0,rows*cols); + + p=Image+cols+1; + ResultPtr=ResultIm+cols+1; + + for(r=1;r<rows-1;r++) + { + for(c=1;c<cols-1;c++) + { + if (*p) + { + n=p-cols; + ne=n+1; + nw=n-1; + e=p+1; + w=p-1; + s=p+cols; + se=s+1; + sw=s-1; + + v=(unsigned int) *nw+*n+*ne+*w+*e+*sw+*s+*se; + + if (v>=TH) + *ResultPtr=255; + else + *ResultPtr=0; + } + p++; + ResultPtr++; + } + p+=2; + ResultPtr+=2; + } +} + +/*********************************************************************/ + +void NPBGSubtractor::SequenceBGUpdate_Pairs(unsigned char * image, + unsigned char * Mask) +{ + unsigned int i,ic; + unsigned char * pSequence =BGModel->Sequence; + unsigned char * PixelQTop =BGModel->PixelQTop; + unsigned int Top =BGModel->Top; + unsigned int rate; + + int TemporalBufferTop =(int) BGModel->TemporalBufferTop; + unsigned char * pTemporalBuffer = BGModel->TemporalBuffer; + unsigned char * pTemporalMask = BGModel->TemporalMask; + int TemporalBufferLength = BGModel->TemporalBufferLength; + + unsigned int * AccMask = BGModel->AccMask; + unsigned int ResetMaskTh = BGModel->ResetMaskTh; + + unsigned char *pAbsDiffHist = AbsDiffHist.Hist; + unsigned char histbins = AbsDiffHist.histbins; + int histbins_1=histbins-1; + + int TimeWindowSize = BGModel->TimeWindowSize; + int SampleSize = BGModel->SampleSize; + + int TemporalBufferNext; + + unsigned int imagebuffersize=rows*cols*color_channels; + unsigned int imagespatialsize=rows*cols; + + unsigned char mask; + + unsigned int histindex; + unsigned char diff; + unsigned char bin; + + static int TBCount=0; + + unsigned char * pTBbase1, * pTBbase2; + unsigned char * pModelbase1, * pModelbase2; + + rate=TimeWindowSize/SampleSize; + rate=(rate > 2) ? rate : 2; + + + TemporalBufferNext=(TemporalBufferTop+1) + % TemporalBufferLength; + + // pointers to Masks : Top and Next + unsigned char * pTMaskTop=pTemporalMask+TemporalBufferTop*imagespatialsize; + unsigned char * pTMaskNext=pTemporalMask+TemporalBufferNext*imagespatialsize; + + // pointers to TB frames: Top and Next + unsigned char * pTBTop=pTemporalBuffer+TemporalBufferTop*imagebuffersize; + unsigned char * pTBNext=pTemporalBuffer+TemporalBufferNext*imagebuffersize; + + if ( ((TimeIndex) % rate == 0) && TBCount >= TemporalBufferLength ) + { + for(i=0,ic=0;i<imagespatialsize;i++,ic+=color_channels) + { + mask= * (pTMaskTop+i) || * (pTMaskNext+i); + + if(!mask) + { + // pointer to TB pixels to be added to the model + pTBbase1=pTBTop+ic; + pTBbase2=pTBNext+ic; + + // pointers to Model pixels to be replaced + pModelbase1=pSequence+PixelQTop[i]*imagebuffersize+ic; + pModelbase2=pSequence+((PixelQTop[i]+1)% SampleSize)*imagebuffersize+ic; + + // update Deviation Histogram + if(SdEstimateFlag) + { + if(color_channels==1) + { + histindex=i*histbins; + + // add new pair from temporal buffer + diff=(unsigned char) abs((int) *pTBbase1 - (int) *pTBbase2); + bin=(diff < histbins ? diff : histbins_1); + pAbsDiffHist[histindex+bin]++; + + + // remove old pair from the model + diff=(unsigned char) abs((int) *pModelbase1-(int) *pModelbase2); + bin=(diff < histbins ? diff : histbins_1); + pAbsDiffHist[histindex+bin]--; + } + else + { + // color + + // add new pair from temporal buffer + histindex=ic*histbins; + diff=abs(*pTBbase1 - + *pTBbase2); + bin=(diff < histbins ? diff : histbins_1); + pAbsDiffHist[histindex+bin]++; + + histindex+=histbins; + diff=abs(*(pTBbase1+1) - + *(pTBbase2+1)); + bin=(diff < histbins ? diff : histbins_1); + pAbsDiffHist[histindex+bin]++; + + histindex+=histbins; + diff=abs(*(pTBbase1+2) - + *(pTBbase2+2)); + bin=(diff < histbins ? diff : histbins_1); + pAbsDiffHist[histindex+bin]++; + + // remove old pair from the model + histindex=ic*histbins; + + diff=abs(*pModelbase1- + *pModelbase2); + bin=(diff < histbins ? diff : histbins_1); + pAbsDiffHist[histindex+bin]--; + + histindex+=histbins; + diff=abs(*(pModelbase1+1)- + *(pModelbase2+1)); + bin=(diff < histbins ? diff : histbins_1); + pAbsDiffHist[histindex+bin]--; + + histindex+=histbins; + diff=abs(*(pModelbase1+2)- + *(pModelbase2+2)); + bin=(diff < histbins ? diff : histbins_1); + pAbsDiffHist[histindex+bin]--; + } + } + + // add new pair into the model + memcpy(pModelbase1,pTBbase1, color_channels*sizeof(unsigned char)); + + memcpy(pModelbase2,pTBbase2, color_channels*sizeof(unsigned char)); + + PixelQTop[i]=(PixelQTop[i]+2) % SampleSize; + } + } + } // end if (sampling event) + + // update temporal buffer + // add new frame to Temporal buffer. + memcpy(pTBTop,image,imagebuffersize); + + // update AccMask + // update new Mask with information in AccMask + + for (i=0;i<rows*cols;i++) + { + if (Mask[i]) + AccMask[i]++; + else + AccMask[i]=0; + + if (AccMask[i] > ResetMaskTh) + Mask[i]=0; + } + + // add new mask + memcpy(pTMaskTop,Mask,imagespatialsize); + + // advance Temporal buffer pointer + TemporalBufferTop=(TemporalBufferTop+1) % TemporalBufferLength; + + BGModel->TemporalBufferTop=TemporalBufferTop; + + TBCount++; + + // estimate SDs + + if (SdEstimateFlag && UpdateSDRate && ((TimeIndex) % UpdateSDRate == 0)) + { + double MaxSD = KernelTable->maxsegma; + double MinSD = KernelTable->minsegma; + int KernelBins = KernelTable->segmabins; + + unsigned char * pSDs= BGModel->SDbinsImage; + + FindHistMedians(&(AbsDiffHist)); + EstimateSDsFromAbsDiffHist(&(AbsDiffHist),pSDs,imagebuffersize,MinSD,MaxSD,KernelBins); + } + + TimeIndex++; +} + +/*********************************************************************/ + +void DisplayPropabilityImageWithThresholding(double * Pimage, + unsigned char * DisplayImage, + double Threshold, + unsigned int rows, + unsigned int cols) +{ + double p; + + for(unsigned int i=0;i<rows*cols;i++) + { + p = Pimage[i]; + + DisplayImage[i]=(p > Threshold) ? 0 : 255; + } +} + +/*********************************************************************/ + +void NPBGSubtractor::NPBGSubtraction_Subset_Kernel( + unsigned char * image, + unsigned char * FGImage, + unsigned char * FilteredFGImage) +{ + unsigned int i,j; + unsigned char *pSequence =BGModel->Sequence; + + unsigned int SampleSize = BGModel->SampleSize; + + double *kerneltable = KernelTable->kerneltable; + int KernelHalfWidth = KernelTable->tablehalfwidth; + double *KernelSum = KernelTable->kernelsums; + double KernelMaxSigma = KernelTable->maxsegma; + double KernelMinSigma = KernelTable->minsegma; + int KernelBins = KernelTable->segmabins; + unsigned char * SDbins= BGModel->SDbinsImage; + + unsigned char * SaturationImage=FilteredFGImage; + + // default sigmas .. to be removed. + double sigma1; + double sigma2; + double sigma3; + + sigma1=2.25; + sigma2=2.25; + sigma3=2.25; + + double p; + double th; + + double alpha,beta,beta_over_alpha, betau,betau_over_alpha; + + alpha= AlphaValue; + + /* intialize FG image */ + + memset(FGImage,0,rows*cols); + + //Threshold=1; + th = Threshold * SampleSize; + + double sum=0,kernel1,kernel2,kernel3; + int k,g; + + + if (color_channels==1) + { + // gray scale + + int kernelbase; + + for (i=0;i<rows*cols;i++) + { + kernelbase=SDbins[i]*(2*KernelHalfWidth+1); + sum=0; + j=0; + + while (j<SampleSize && sum < th) + { + g=pSequence[j*imagesize+i]; + k= g- image[i] +KernelHalfWidth; + sum+=kerneltable[kernelbase+k]; + j++; + } + + p=sum/j; + Pimage1[i]=p; + } + } + else if (UseColorRatiosFlag && SubsetFlag) + { + // color ratios + + unsigned int ig; + int base; + + int kernelbase1; + int kernelbase2; + int kernelbase3; + + unsigned int kerneltablewidth=2*KernelHalfWidth+1; + + beta=3.0; // minimum bound on the range. + betau=100.0; + + beta_over_alpha = beta / alpha; + betau_over_alpha = betau / alpha; + + + double brightness_lowerbound = 1-alpha; + double brightness_upperbound = 1+alpha; + int x1,x2; + unsigned int SubsampleCount; + + for (i=0,ig=0;i<imagesize;i+=3,ig++) + { + kernelbase1=SDbins[i]*kerneltablewidth; + kernelbase2=SDbins[i+1]*kerneltablewidth; + kernelbase3=SDbins[i+2]*kerneltablewidth; + + sum=0; + j=0; + SubsampleCount=0; + + while (j<SampleSize && sum < th) + { + base=j*imagesize+i; + g=pSequence[base]; + + if (g < beta_over_alpha) + { + x1=(int) (g-beta); + x2=(int) (g+beta); + } + else if (g > betau_over_alpha) + { + x1=(int) (g-betau); + x2=(int) (g+betau); + } + else + { + x1=(int) (g*brightness_lowerbound+0.5); + x2=(int) (g*brightness_upperbound+0.5); + } + + if(x1<image[i] && image[i] <x2) + { + g=pSequence[base+1]; + k= (g- image[i+1]) +KernelHalfWidth; + kernel2=kerneltable[kernelbase2+k]; + + g=pSequence[base+2]; + k= (g- image[i+2]) +KernelHalfWidth; + kernel3=kerneltable[kernelbase3+k]; + + sum+=kernel2*kernel3; + + SubsampleCount++; + } + j++; + } + + p=sum / j; + Pimage1[ig]=p; + } + } + else if (UseColorRatiosFlag && ! SubsetFlag) + { + // color ratios + + unsigned int ig; + int base; + int bin; + + int kernelbase1; + int kernelbase2; + int kernelbase3; + + unsigned int kerneltablewidth=2*KernelHalfWidth+1; + + int gmin,gmax; + double gfactor; + + gmax=200; + gmin=10; + + gfactor = (KernelMaxSigma-KernelMinSigma) / (double) (gmax - gmin); + + for (i=0,ig=0;i<imagesize;i+=3,ig++) + { + + bin=(int) floor(((alpha*16-KernelMinSigma)*KernelBins)/(KernelMaxSigma-KernelMinSigma)); + + kernelbase1=bin*kerneltablewidth; + kernelbase2=SDbins[i+1]*kerneltablewidth; + kernelbase3=SDbins[i+2]*kerneltablewidth; + + sum=0; + j=0; + + while (j<SampleSize && sum < th) + { + base=j*imagesize+i; + g=pSequence[base]; + + if (g < gmin ) + bin=0; + else if (g > gmax) + bin = KernelBins -1 ; + else + bin= (int) ((g-gmin) * gfactor + 0.5); + + kernelbase1=bin*kerneltablewidth; + + k= (g- image[i]) +KernelHalfWidth; + kernel1=kerneltable[kernelbase1+k]; + + g=pSequence[base+1]; + k= (g- image[i+1]) +KernelHalfWidth; + kernel2=kerneltable[kernelbase2+k]; + + g=pSequence[base+2]; + k= (g- image[i+2]) +KernelHalfWidth; + kernel3=kerneltable[kernelbase3+k]; + + sum+=kernel1*kernel2*kernel3; + j++; + } + + p=sum / j; + Pimage1[ig]=p; + } + } + else // RGB color + { + unsigned int ig; + int base; + + int kernelbase1; + int kernelbase2; + int kernelbase3; + unsigned int kerneltablewidth=2*KernelHalfWidth+1; + + for (i=0,ig=0;i<imagesize;i+=3,ig++) + { + // used extimated kernel width to access the right kernel + kernelbase1=SDbins[i]*kerneltablewidth; + kernelbase2=SDbins[i+1]*kerneltablewidth; + kernelbase3=SDbins[i+2]*kerneltablewidth; + + sum=0; + j=0; + while (j<SampleSize && sum < th) + { + base=j*imagesize+i; + g=pSequence[base]; + k= (g- image[i]) +KernelHalfWidth; + kernel1=kerneltable[kernelbase1+k]; + + g=pSequence[base+1]; + k= (g- image[i+1]) +KernelHalfWidth; + kernel2=kerneltable[kernelbase2+k]; + + g=pSequence[base+2]; + k= (g- image[i+2]) +KernelHalfWidth; + kernel3=kerneltable[kernelbase3+k]; + + sum+=kernel1*kernel2*kernel3; + j++; + } + + p=sum/j; + Pimage1[ig]=p; + } + } + + DisplayPropabilityImageWithThresholding(Pimage1,FGImage,Threshold,rows,cols); +} + +/*********************************************************************/ + +void NPBGSubtractor::NBBGSubtraction(unsigned char * Frame, + unsigned char * FGImage, + unsigned char * FilteredFGImage, + unsigned char ** DisplayBuffers) +{ + if(UseColorRatiosFlag) + BGR2SnGnRn(Frame,tempFrame,rows,cols); + else + memcpy(tempFrame,Frame,rows*cols*color_channels); + + NPBGSubtraction_Subset_Kernel(tempFrame,FGImage,FilteredFGImage); + /*NoiseFilter_o(FGImage,DisplayBuffers[3],rows,cols,4); + BuildImageIndex(DisplayBuffers[3],imageindex,rows,cols); + + ExpandOperatorIndexed(DisplayBuffers[3],imageindex,DisplayBuffers[4],imageindex,rows,cols); + ShrinkOperatorIndexed(DisplayBuffers[4],imageindex,FilteredFGImage,imageindex,rows,cols); + + memset(DisplayBuffers[3],0,rows*cols);*/ +} + +void NPBGSubtractor::Update(unsigned char * FGMask) +{ + if(UpdateBGFlag) + SequenceBGUpdate_Pairs(tempFrame,FGMask); +} diff --git a/package_bgs/ae/NPBGSubtractor.h b/package_bgs/ae/NPBGSubtractor.h new file mode 100644 index 0000000..e7f3795 --- /dev/null +++ b/package_bgs/ae/NPBGSubtractor.h @@ -0,0 +1,154 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* +* +* Copyright 2001 by Ahmed Elgammal All rights reserved. +* +* Permission to use, copy, or modify this software and its documentation +* for educational and research purposes only and without fee is hereby +* granted, provided that this copyright notice and the original authors's +* name appear on all copies and supporting documentation. If individual +* files are separated from this distribution directory structure, this +* copyright notice must be included. For any other uses of this software, +* in original or modified form, including but not limited to distribution +* in whole or in part, specific prior permission must be obtained from +* Author or UMIACS. These programs shall not be used, rewritten, or +* adapted as the basis of a commercial software or hardware product +* without first obtaining appropriate licenses from Author. +* Other than these cases, no part of this software may be used or +* distributed without written permission of the author. +* +* Neither the author nor UMIACS make any representations about the +* suitability of this software for any purpose. It is provided +* "as is" without express or implied warranty. +* +* Ahmed Elgammal +* +* University of Maryland at College Park +* UMIACS +* A.V. Williams Bldg. +* CollegePark, MD 20742 +* E-mail: elgammal@umiacs.umd.edu +* +**/ + +// NPBGSubtractor.h: interface for the NPBGSubtractor class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_NPBGSUBTRACTOR_H__84B0F51E_6E65_41E4_AC01_723B406363C4__INCLUDED_) +#define AFX_NPBGSUBTRACTOR_H__84B0F51E_6E65_41E4_AC01_723B406363C4__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "NPBGmodel.h" +#include "KernelTable.h" + +#define FALSE 0 +#define TRUE 1 + +// kernal look up table settings +#define KERNELHALFWIDTH 255 +#define SEGMAMAX 36.5 +#define SEGMAMIN 0.5 +#define SEGMABINS 80 +#define DEFAULTSEGMA 1.0 + +typedef struct +{ + unsigned char *Hist; + unsigned char *MedianBins; + unsigned char *MedianFreq; + unsigned char *AccSum; + unsigned char histbins; + unsigned char histsum; + unsigned int imagesize; +} DynamicMedianHistogram; + +typedef struct +{ + unsigned int cnt; + unsigned int *List; +} ImageIndex; + +class NPBGSubtractor +{ +private: + unsigned int rows; + unsigned int cols; + unsigned int color_channels; + unsigned int imagesize; + // flags + unsigned char UpdateBGFlag; + unsigned char SdEstimateFlag; + unsigned char UseColorRatiosFlag; + unsigned char AdaptBGFlag; + unsigned char SubsetFlag; + // + int UpdateSDRate; + double Threshold; + double AlphaValue; + unsigned int TimeIndex; + ImageIndex *imageindex; + unsigned char *tempFrame; + KernelLUTable *KernelTable; + NPBGmodel *BGModel; + DynamicMedianHistogram AbsDiffHist; + double *Pimage1; + double *Pimage2; + // + void NPBGSubtraction_Subset_Kernel(unsigned char * image, unsigned char * FGImage, unsigned char * FilteredFGImage); + void SequenceBGUpdate_Pairs(unsigned char * image, unsigned char * Mask); + +public: + NPBGSubtractor(); + virtual ~NPBGSubtractor(); + //~NPBGSubtractor(); + + int Intialize(unsigned int rows, + unsigned int cols, + unsigned int color_channels, + unsigned int SequenceLength, + unsigned int TimeWindowSize, + unsigned char SDEstimationFlag, + unsigned char UseColorRatiosFlag); + + void AddFrame(unsigned char * ImageBuffer); + + void Estimation(); + + void NBBGSubtraction(unsigned char *Frame, + unsigned char *FGImage, + unsigned char *FilteredFGImage, + unsigned char **DisplayBuffers); + + void Update(unsigned char *); + + void SetThresholds(double th, double alpha) + { + Threshold = th; + AlphaValue = alpha; + }; + + void SetUpdateFlag(unsigned int bgflag){ + UpdateBGFlag = bgflag; + }; +}; + +#endif // !defined(AFX_NPBGSUBTRACTOR_H__84B0F51E_6E65_41E4_AC01_723B406363C4__INCLUDED_) diff --git a/package_bgs/ae/NPBGmodel.cpp b/package_bgs/ae/NPBGmodel.cpp new file mode 100644 index 0000000..2c8b074 --- /dev/null +++ b/package_bgs/ae/NPBGmodel.cpp @@ -0,0 +1,127 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* +* +* Copyright 2001 by Ahmed Elgammal All rights reserved. +* +* Permission to use, copy, or modify this software and its documentation +* for educational and research purposes only and without fee is hereby +* granted, provided that this copyright notice and the original authors's +* name appear on all copies and supporting documentation. If individual +* files are separated from this distribution directory structure, this +* copyright notice must be included. For any other uses of this software, +* in original or modified form, including but not limited to distribution +* in whole or in part, specific prior permission must be obtained from +* Author or UMIACS. These programs shall not be used, rewritten, or +* adapted as the basis of a commercial software or hardware product +* without first obtaining appropriate licenses from Author. +* Other than these cases, no part of this software may be used or +* distributed without written permission of the author. +* +* Neither the author nor UMIACS make any representations about the +* suitability of this software for any purpose. It is provided +* "as is" without express or implied warranty. +* +* Ahmed Elgammal +* +* University of Maryland at College Park +* UMIACS +* A.V. Williams Bldg. +* CollegePark, MD 20742 +* E-mail: elgammal@umiacs.umd.edu +* +**/ + +// NPBGmodel.cpp: implementation of the NPBGmodel class. +// +////////////////////////////////////////////////////////////////////// + +#include "NPBGmodel.h" +#include "memory.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +//#define new DEBUG_NEW +#endif + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +NPBGmodel::NPBGmodel() +{ + std::cout << "NPBGmodel()" << std::endl; +} + +NPBGmodel::~NPBGmodel() +{ + delete Sequence; + delete PixelQTop; + delete TemporalBuffer; + delete TemporalMask; + delete AccMask; + //delete SDbinsImage; + std::cout << "~NPBGmodel()" << std::endl; +} + +NPBGmodel::NPBGmodel(unsigned int Rows, + unsigned int Cols, + unsigned int ColorChannels, + unsigned int Length, + unsigned int pTimeWindowSize, + unsigned int bg_suppression_time) +{ + std::cout << "NPBGmodel()" << std::endl; + + imagesize = Rows*Cols*ColorChannels; + + rows = Rows; + cols = Cols; + color_channels = ColorChannels; + + SampleSize = Length; + + TimeWindowSize = pTimeWindowSize; + + Sequence = new unsigned char[imagesize*Length]; + Top = 0; + memset(Sequence,0,imagesize*Length); + + PixelQTop = new unsigned char[rows*cols]; + + // temporalBuffer + TemporalBufferLength = (TimeWindowSize/Length > 2 ? TimeWindowSize/Length:2); + TemporalBuffer = new unsigned char[imagesize*TemporalBufferLength]; + TemporalMask = new unsigned char[rows*cols*TemporalBufferLength]; + + TemporalBufferTop = 0; + + AccMask = new unsigned int[rows*cols]; + + ResetMaskTh = bg_suppression_time; +} + +void NPBGmodel::AddFrame(unsigned char *ImageBuffer) +{ + memcpy(Sequence+Top*imagesize,ImageBuffer,imagesize); + Top = (Top + 1) % SampleSize; + + memset(PixelQTop, (unsigned char) Top, rows*cols); + + memcpy(TemporalBuffer,ImageBuffer,imagesize); +} diff --git a/package_bgs/ae/NPBGmodel.h b/package_bgs/ae/NPBGmodel.h new file mode 100644 index 0000000..9e28510 --- /dev/null +++ b/package_bgs/ae/NPBGmodel.h @@ -0,0 +1,111 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* +* +* Copyright 2001 by Ahmed Elgammal All rights reserved. +* +* Permission to use, copy, or modify this software and its documentation +* for educational and research purposes only and without fee is hereby +* granted, provided that this copyright notice and the original authors's +* name appear on all copies and supporting documentation. If individual +* files are separated from this distribution directory structure, this +* copyright notice must be included. For any other uses of this software, +* in original or modified form, including but not limited to distribution +* in whole or in part, specific prior permission must be obtained from +* Author or UMIACS. These programs shall not be used, rewritten, or +* adapted as the basis of a commercial software or hardware product +* without first obtaining appropriate licenses from Author. +* Other than these cases, no part of this software may be used or +* distributed without written permission of the author. +* +* Neither the author nor UMIACS make any representations about the +* suitability of this software for any purpose. It is provided +* "as is" without express or implied warranty. +* +* Ahmed Elgammal +* +* University of Maryland at College Park +* UMIACS +* A.V. Williams Bldg. +* CollegePark, MD 20742 +* E-mail: elgammal@umiacs.umd.edu +* +**/ + +// NPBGmodel.h: interface for the NPBGmodel class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_NPBGMODEL_H__CCAF05D4_D06E_44C2_95D8_979E2249953A__INCLUDED_) +#define AFX_NPBGMODEL_H__CCAF05D4_D06E_44C2_95D8_979E2249953A__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include <iostream> + +class NPBGmodel +{ +private: + unsigned char *Sequence; + unsigned int SampleSize; + unsigned int TimeWindowSize; + + unsigned int rows,cols,color_channels; + unsigned int imagesize; + + unsigned int Top; + unsigned char *PixelQTop; + + //unsigned int *PixelUpdateCounter; + + unsigned char *SDbinsImage; + + unsigned char *TemporalBuffer; + unsigned char TemporalBufferLength; + unsigned char TemporalBufferTop; + unsigned char *TemporalBufferMask; + + unsigned char *TemporalMask; + unsigned char TemporalMaskLength; + unsigned char TemporalMaskTop; + + unsigned int *AccMask; + unsigned int ResetMaskTh; // Max continous duration a pixel can be detected before + // it is forced to be updated... + + double *weights; + +public: + NPBGmodel(); + //~NPBGmodel(); + virtual ~NPBGmodel(); + + NPBGmodel(unsigned int Rows, + unsigned int Cols, + unsigned int ColorChannels, + unsigned int Length, + unsigned int pTimeWindowSize, + unsigned int bg_suppression_time); + + void AddFrame(unsigned char *ImageBuffer); + + friend class NPBGSubtractor; +}; + +#endif // !defined(AFX_NPBGMODEL_H__CCAF05D4_D06E_44C2_95D8_979E2249953A__INCLUDED_) diff --git a/package_bgs/av/TBackground.cpp b/package_bgs/av/TBackground.cpp new file mode 100644 index 0000000..2e97d93 --- /dev/null +++ b/package_bgs/av/TBackground.cpp @@ -0,0 +1,166 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* +* TBackground.cpp +* Framework +* +* Created by Robinault Lionel on 07/12/11. +* +*/ + +#include "TBackground.h" + +TBackground::TBackground(void) +{ + std::cout << "TBackground()" << std::endl; +} + +TBackground::~TBackground(void) +{ + Clear(); + std::cout << "~TBackground()" << std::endl; +} + +void TBackground::Clear(void) +{ +} + +void TBackground::Reset(void) +{ +} + +int TBackground::GetParameterCount(void) +{ + return 0; +} + +std::string TBackground::GetParameterName(int nInd) +{ + return ""; +} + +std::string TBackground::GetParameterValue(int nInd) +{ + return ""; +} + +int TBackground::SetParameterValue(int nInd, std::string csNew) +{ + return 0; +} + +int TBackground::Init(IplImage * pSource) +{ + return 0; +} + +bool TBackground::isInitOk(IplImage * pSource, IplImage *pBackground, IplImage *pMotionMask) +{ + bool bResult = TRUE; + int nbl, nbc; + + if(pSource == NULL || pSource->nChannels != 1 || pSource->depth != IPL_DEPTH_8U) + bResult = FALSE; + + if(bResult) + { + nbl = pSource->height; + nbc = pSource->width; + + if(pBackground == NULL || pBackground->width != nbc || pBackground->height != nbl || pBackground->imageSize != pSource->imageSize) + bResult = FALSE; + + if(pMotionMask == NULL || pMotionMask->width != nbc || pMotionMask->height != nbl || pMotionMask->imageSize != pSource->imageSize) + bResult = FALSE; + } + + return bResult; +} + +int TBackground::UpdateBackground(IplImage * pSource, IplImage *pBackground, IplImage *pMotionMask) +{ + return 0; +} + +IplImage *TBackground::CreateTestImg() +{ + IplImage *pImage = cvCreateImage(cvSize(256, 256), IPL_DEPTH_8U, 3); + + if(pImage != NULL) + cvSetZero(pImage); + + return pImage; +} + +int TBackground::UpdateTest(IplImage *pSource, IplImage *pBackground, IplImage *pTest, int nX, int nY, int nInd) +{ + int nErr = 0; + CvScalar Color; + unsigned char *ptr; + int l, c; + + if(pTest == NULL || !isInitOk(pSource, pBackground, pSource)) + nErr = 1; + + if(!nErr) + { + if(pTest->width != 256 || pTest->height != 256 || pTest->nChannels != 3) + nErr = 1; + + if(nX < 0 || nX > pSource->width || nY < 0 || nY > pSource->height) + nErr = 1; + + switch(nInd) + { + case 0 : Color = cvScalar(128, 0, 0); break; + case 1 : Color = cvScalar(0, 128, 0); break; + case 2 : Color = cvScalar(0, 0, 128); break; + default : nErr = 1; + } + } + + if(!nErr) + { + // recupere l'indice de la colonne + ptr = (unsigned char *)(pTest->imageData); + c = *ptr; + + // efface la colonne + cvLine(pTest, cvPoint(c, 0), cvPoint(c, 255), cvScalar(0)); + *ptr += 1; + + //recupere la couleur du fond + ptr = (unsigned char *)(pBackground->imageData + pBackground->widthStep * nY); + ptr += nX; + l = *ptr; + + // dessine la couleur + cvLine(pTest, cvPoint(c, l - 5), cvPoint(c, l + 5), Color); + + //recupere la couleur du point + ptr = (unsigned char *)(pSource->imageData + pSource->widthStep * nY); + ptr += nX; + l = *ptr; + + // dessine la couleur + ptr = (unsigned char *)(pTest->imageData + pTest->widthStep * l); + ptr += (c * 3) + nInd; + *ptr = 255; + } + + return nErr; +} diff --git a/package_bgs/av/TBackground.h b/package_bgs/av/TBackground.h new file mode 100644 index 0000000..974cab9 --- /dev/null +++ b/package_bgs/av/TBackground.h @@ -0,0 +1,51 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* +* TBackground.h +* Framework +* +* Created by Robinault Lionel on 07/12/11. +* +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +class TBackground +{ +public: + TBackground(void); + virtual ~TBackground(void); + + virtual void Clear(void); + virtual void Reset(void); + + virtual int UpdateBackground(IplImage * pSource, IplImage *pBackground, IplImage *pMotionMask); + virtual int UpdateTest(IplImage *pSource, IplImage *pBackground, IplImage *pTest, int nX, int nY, int nInd); + virtual IplImage *CreateTestImg(); + + virtual int GetParameterCount(void); + virtual std::string GetParameterName(int nInd); + virtual std::string GetParameterValue(int nInd); + virtual int SetParameterValue(int nInd, std::string csNew); + +protected: + virtual int Init(IplImage * pSource); + virtual bool isInitOk(IplImage * pSource, IplImage *pBackground, IplImage *pMotionMask); +}; diff --git a/package_bgs/av/TBackgroundVuMeter.cpp b/package_bgs/av/TBackgroundVuMeter.cpp new file mode 100644 index 0000000..4597621 --- /dev/null +++ b/package_bgs/av/TBackgroundVuMeter.cpp @@ -0,0 +1,380 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* +* TBackgroundVuMeter.cpp +* Framework +* +* Created by Robinault Lionel on 07/12/11. +* +*/ +#include "TBackgroundVuMeter.h" + +#define PROCESS_PAR_COUNT 3 + +TBackgroundVuMeter::TBackgroundVuMeter(void) + : m_pHist(NULL) + , m_nBinSize(8) + , m_nBinCount(0) + , m_fAlpha(0.995) + , m_fThreshold(0.03) + , m_nCount(0) +{ + std::cout << "TBackgroundVuMeter()" << std::endl; +} + +TBackgroundVuMeter::~TBackgroundVuMeter(void) +{ + Clear(); + std::cout << "~TBackgroundVuMeter()" << std::endl; +} + +void TBackgroundVuMeter::Clear(void) +{ + int i; + + TBackground::Clear(); + + if(m_pHist != NULL) + { + for(i = 0; i < m_nBinCount; ++i) + { + if(m_pHist[i] != NULL) + cvReleaseImage(&m_pHist[i]); + } + + delete m_pHist; + m_pHist = NULL; + m_nBinCount = 0; + } + + m_nCount = 0; +} + +void TBackgroundVuMeter::Reset(void) +{ + int i; + float fVal = 0.0; + + TBackground::Reset(); + + if(m_pHist != NULL) + { + // fVal = (m_nBinCount != 0) ? (float)(1.0 / (double)m_nBinCount) : (float)0.0; + fVal = 0.0; + + for(i = 0; i < m_nBinCount; ++i) + { + if(m_pHist[i] != NULL) + { + cvSetZero(m_pHist[i]); + cvAddS(m_pHist[i], cvScalar(fVal), m_pHist[i]); + } + } + } + + m_nCount = 0; +} + +int TBackgroundVuMeter::GetParameterCount(void) +{ + return TBackground::GetParameterCount() + PROCESS_PAR_COUNT; +} + +std::string TBackgroundVuMeter::GetParameterName(int nInd) +{ + std::string csResult; + int nNb; + + nNb = TBackground::GetParameterCount(); + + if(nInd >= nNb) + { + nInd -= nNb; + + switch(nInd) + { + case 0 : csResult = "Bin size"; break; + case 1 : csResult = "Alpha"; break; + case 2 : csResult = "Threshold"; break; + } + } + else + csResult = TBackground::GetParameterName(nInd); + + return csResult; +} + +std::string TBackgroundVuMeter::GetParameterValue(int nInd) +{ + std::string csResult; + int nNb; + + nNb = TBackground::GetParameterCount(); + + if(nInd >= nNb) + { + nInd -= nNb; + + char buff[100]; + + switch(nInd) + { + case 0 : sprintf(buff, "%d", m_nBinSize); break; + case 1 : sprintf(buff, "%.3f", m_fAlpha); break; + case 2 : sprintf(buff, "%.2f", m_fThreshold); break; + } + + csResult = buff; + } + else + csResult = TBackground::GetParameterValue(nInd); + + return csResult; +} + +int TBackgroundVuMeter::SetParameterValue(int nInd, std::string csNew) +{ + int nErr = 0; + + int nNb; + + nNb = TBackground::GetParameterCount(); + + if(nInd >= nNb) + { + nInd -= nNb; + + switch(nInd) + { + case 0 : SetBinSize(atoi(csNew.c_str())); break; + case 1 : SetAlpha(atof(csNew.c_str())); break; + case 2 : SetThreshold(atof(csNew.c_str())); break; + default : nErr = 1; + } + } + else + nErr = TBackground::SetParameterValue(nInd, csNew); + + return nErr; +} + +int TBackgroundVuMeter::Init(IplImage * pSource) +{ + int nErr = 0; + int i; + int nbl, nbc; + + Clear(); + + nErr = TBackground::Init(pSource); + + if(pSource == NULL) + nErr = 1; + + // calcul le nb de bin + if(!nErr) + { + nbl = pSource->height; + nbc = pSource->width; + m_nBinCount = (m_nBinSize != 0) ? 256 / m_nBinSize : 0; + + if(m_nBinCount <= 0 || m_nBinCount > 256) + nErr = 1; + } + + // creation du tableau de pointeur + if(!nErr) + { + m_pHist = new IplImage *[m_nBinCount]; + + if(m_pHist == NULL) + nErr = 1; + } + + // creation des images + if(!nErr) + { + for(i = 0; i < m_nBinCount; ++i) + { + m_pHist[i] = cvCreateImage(cvSize(nbc, nbl), IPL_DEPTH_32F, 1); + + if(m_pHist[i] == NULL) + nErr = 1; + } + } + + if(!nErr) + Reset(); + else + Clear(); + + return nErr; +} + +bool TBackgroundVuMeter::isInitOk(IplImage * pSource, IplImage *pBackground, IplImage *pMotionMask) +{ + bool bResult = TRUE; + int i; + int nbl, nbc; + + bResult = TBackground::isInitOk(pSource, pBackground, pMotionMask); + + if(pSource == NULL) + bResult = FALSE; + + if(m_nBinSize == 0) + bResult = FALSE; + + if(bResult) + { + i = (m_nBinSize != 0) ? 256 / m_nBinSize : 0; + + if(i != m_nBinCount || m_pHist == NULL) + bResult = FALSE; + } + + if(bResult) + { + nbl = pSource->height; + nbc = pSource->width; + + for(i = 0; i < m_nBinCount; ++i) + { + if(m_pHist[i] == NULL || m_pHist[i]->width != nbc || m_pHist[i]->height != nbl) + bResult = FALSE; + } + } + + return bResult; +} + +int TBackgroundVuMeter::UpdateBackground(IplImage *pSource, IplImage *pBackground, IplImage *pMotionMask) +{ + int nErr = 0; + int i, l, c, nbl, nbc; + unsigned char *ptrs, *ptrb, *ptrm; + float *ptr1, *ptr2; + unsigned char v; + + if(!isInitOk(pSource, pBackground, pMotionMask)) + nErr = Init(pSource); + + if(!nErr) + { + m_nCount++; + nbc = pSource->width; + nbl = pSource->height; + v = m_nBinSize; + + // multiplie tout par alpha + for(i = 0; i < m_nBinCount; ++i) + cvConvertScale(m_pHist[i], m_pHist[i], m_fAlpha, 0.0); + + for(l = 0; l < nbl; ++l) + { + ptrs = (unsigned char *)(pSource->imageData + pSource->widthStep * l); + ptrm = (unsigned char *)(pMotionMask->imageData + pMotionMask->widthStep * l); + ptrb = (unsigned char *)(pBackground->imageData + pBackground->widthStep * l); + + for(c = 0; c < nbc; ++c, ptrs++, ptrb++, ptrm++) + { + // recherche le bin � augmenter + i = *ptrs / v; + + if(i < 0 || i >= m_nBinCount) + i = 0; + + ptr1 = (float *)(m_pHist[i]->imageData + m_pHist[i]->widthStep * l); + ptr1 += c; + + *ptr1 += (float)(1.0 - m_fAlpha); + *ptrm = (*ptr1 < m_fThreshold) ? 255 : 0; + + // recherche le bin du fond actuel + i = *ptrb / v; + + if(i < 0 || i >= m_nBinCount) + i = 0; + + ptr2 = (float *)(m_pHist[i]->imageData + m_pHist[i]->widthStep * l); + ptr2 += c; + + if(*ptr2 < *ptr1) + *ptrb = *ptrs; + } + } + + if(m_nCount < 5) + cvSetZero(pMotionMask); + } + + return nErr; +} + +IplImage *TBackgroundVuMeter::CreateTestImg() +{ + IplImage *pImage = NULL; + + if(m_nBinCount > 0) + pImage = cvCreateImage(cvSize(m_nBinCount, 100), IPL_DEPTH_8U, 3); + + if(pImage != NULL) + cvSetZero(pImage); + + return pImage; +} + +int TBackgroundVuMeter::UpdateTest(IplImage *pSource, IplImage *pBackground, IplImage *pTest, int nX, int nY, int nInd) +{ + int nErr = 0; + int i, nbl, nbc; + float *ptrf; + + if(pTest == NULL || !isInitOk(pSource, pBackground, pSource)) + nErr = 1; + + if(!nErr) + { + nbl = pTest->height; + nbc = pTest->width; + + if(nbl != 100 || nbc != m_nBinCount) + nErr = 1; + + if(nX < 0 || nX >= pSource->width || nY < 0 || nY >= pSource->height) + nErr = 1; + } + + if(!nErr) + { + cvSetZero(pTest); + + for(i = 0; i < m_nBinCount; ++i) + { + ptrf = (float *)(m_pHist[i]->imageData + m_pHist[i]->widthStep * nY); + ptrf += nX; + + if(*ptrf >= 0 || *ptrf <= 1.0) { + cvLine(pTest, cvPoint(i, 100), cvPoint(i, (int)(100.0 * (1.0 - *ptrf))), cvScalar(0, 255, 0)); + } + } + + cvLine(pTest, cvPoint(0, (int)(100.0 * (1.0 - m_fThreshold))), cvPoint(m_nBinCount, (int)(100.0 * (1.0 - m_fThreshold))), cvScalar(0, 128, 0)); + } + + return nErr; +} diff --git a/package_bgs/av/TBackgroundVuMeter.h b/package_bgs/av/TBackgroundVuMeter.h new file mode 100644 index 0000000..1a19324 --- /dev/null +++ b/package_bgs/av/TBackgroundVuMeter.h @@ -0,0 +1,67 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* +* TBackgroundVuMeter.h +* Framework +* +* Created by Robinault Lionel on 07/12/11. +* +*/ +#pragma once + +#include "TBackground.h" + +class TBackgroundVuMeter : public TBackground +{ +public: + TBackgroundVuMeter(void); + virtual ~TBackgroundVuMeter(void); + + virtual void Clear(void); + virtual void Reset(void); + + virtual int UpdateBackground(IplImage * pSource, IplImage *pBackground, IplImage *pMotionMask); + + virtual IplImage *CreateTestImg(); + virtual int UpdateTest(IplImage *pSource, IplImage *pBackground, IplImage *pTest, int nX, int nY, int nInd); + + virtual int GetParameterCount(void); + virtual std::string GetParameterName(int nInd); + virtual std::string GetParameterValue(int nInd); + virtual int SetParameterValue(int nInd, std::string csNew); + + inline void SetBinSize(int nNew) { m_nBinSize = (nNew > 0 && nNew < 255) ? nNew : 8; } + inline double GetBinSize() { return m_nBinSize; } + + inline void SetAlpha(double fNew) { m_fAlpha = (fNew > 0.0 && fNew < 1.0) ? fNew : 0.995; } + inline double GetAlpha() { return m_fAlpha; } + + inline void SetThreshold(double fNew) { m_fThreshold = (fNew > 0.0 && fNew < 1.0) ? fNew : 0.03; } + inline double GetThreshold() { return m_fThreshold; } + +protected: + IplImage **m_pHist; + + int m_nBinCount; + int m_nBinSize; + int m_nCount; + double m_fAlpha; + double m_fThreshold; + + virtual int Init(IplImage * pSource); + virtual bool isInitOk(IplImage * pSource, IplImage *pBackground, IplImage *pMotionMask); +}; diff --git a/package_bgs/av/VuMeter.cpp b/package_bgs/av/VuMeter.cpp new file mode 100644 index 0000000..29a1477 --- /dev/null +++ b/package_bgs/av/VuMeter.cpp @@ -0,0 +1,116 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "VuMeter.h" + +VuMeter::VuMeter() : firstTime(true), showOutput(true), enableFilter(true), binSize(8), alpha(0.995), threshold(0.03) +{ + std::cout << "VuMeter()" << std::endl; +} + +VuMeter::~VuMeter() +{ + cvReleaseImage(&mask); + cvReleaseImage(&background); + cvReleaseImage(&gray); + + std::cout << "~VuMeter()" << std::endl; +} + +void VuMeter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + else + frame = new IplImage(img_input); + + loadConfig(); + + if(firstTime) + { + bgs.SetAlpha(alpha); + bgs.SetBinSize(binSize); + bgs.SetThreshold(threshold); + + gray = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1); + cvCvtColor(frame,gray,CV_RGB2GRAY); + + background = cvCreateImage(cvGetSize(gray),IPL_DEPTH_8U,1); + cvCopy(gray, background); + + mask = cvCreateImage(cvGetSize(gray),IPL_DEPTH_8U,1); + cvZero(mask); + + saveConfig(); + } + else + cvCvtColor(frame,gray,CV_RGB2GRAY); + + bgs.UpdateBackground(gray,background,mask); + cv::Mat img_foreground(mask); + cv::Mat img_bkg(background); + + if(enableFilter) + { + cv::erode(img_foreground,img_foreground,cv::Mat()); + cv::medianBlur(img_foreground, img_foreground, 5); + } + + if(showOutput) + { + if(!img_foreground.empty()) + cv::imshow("VuMeter", img_foreground); + + if(!img_bkg.empty()) + cv::imshow("VuMeter Bkg Model", img_bkg); + } + + img_foreground.copyTo(img_output); + img_bkg.copyTo(img_bgmodel); + + delete frame; + firstTime = false; +} + +void VuMeter::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/VuMeter.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "enableFilter", enableFilter); + + cvWriteInt(fs, "binSize", binSize); + cvWriteReal(fs, "alpha", alpha); + cvWriteReal(fs, "threshold", threshold); + + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void VuMeter::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/VuMeter.xml", 0, CV_STORAGE_READ); + + enableFilter = cvReadIntByName(fs, 0, "enableFilter", true); + + binSize = cvReadIntByName(fs, 0, "binSize", 8); + alpha = cvReadRealByName(fs, 0, "alpha", 0.995); + threshold = cvReadRealByName(fs, 0, "threshold", 0.03); + + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/av/VuMeter.h b/package_bgs/av/VuMeter.h new file mode 100644 index 0000000..7884ff6 --- /dev/null +++ b/package_bgs/av/VuMeter.h @@ -0,0 +1,53 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "TBackgroundVuMeter.h" +#include "../IBGS.h" + +class VuMeter : public IBGS +{ +private: + TBackgroundVuMeter bgs; + + IplImage *frame; + IplImage *gray; + IplImage *background; + IplImage *mask; + + bool firstTime; + bool showOutput; + bool enableFilter; + + int binSize; + double alpha; + double threshold; + +public: + VuMeter(); + ~VuMeter(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; diff --git a/package_bgs/ck/LbpMrf.cpp b/package_bgs/ck/LbpMrf.cpp new file mode 100644 index 0000000..f3d068c --- /dev/null +++ b/package_bgs/ck/LbpMrf.cpp @@ -0,0 +1,87 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. + +Csaba, Kertész: Texture-Based Foreground Detection, International Journal of Signal Processing, +Image Processing and Pattern Recognition (IJSIP), Vol. 4, No. 4, 2011. + +*/ +#include "LbpMrf.h" + +#include "MotionDetection.hpp" + +LbpMrf::LbpMrf() : firstTime(true), Detector(NULL), showOutput(true) +{ + std::cout << "LbpMrf()" << std::endl; + Detector = new MotionDetection(); + Detector->SetMode(MotionDetection::md_LBPHistograms); +} + +LbpMrf::~LbpMrf() +{ + std::cout << "~LbpMrf()" << std::endl; + delete Detector; + Detector = NULL; +} + +void LbpMrf::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + { + saveConfig(); + } + + IplImage TempImage(img_input); + MEImage InputImage(img_input.cols, img_input.rows, img_input.channels()); + MEImage OutputImage(img_input.cols, img_input.rows, img_input.channels()); + + InputImage.SetIplImage((void*)&TempImage); + + Detector->DetectMotions(InputImage); + Detector->GetMotionsMask(OutputImage); + img_output = (IplImage*)OutputImage.GetIplImage(); + bitwise_not(img_output, img_bgmodel); + + if(showOutput) + { + cv::imshow("LBP-MRF FG", img_output); + cv::imshow("LBP-MRF BG", img_bgmodel); + } + + firstTime = false; +} + +void LbpMrf::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/LbpMrf.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void LbpMrf::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/LbpMrf.xml", 0, CV_STORAGE_READ); + + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/ck/LbpMrf.h b/package_bgs/ck/LbpMrf.h new file mode 100644 index 0000000..6fd7267 --- /dev/null +++ b/package_bgs/ck/LbpMrf.h @@ -0,0 +1,44 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <opencv2/opencv.hpp> + +#include "../IBGS.h" + +class MotionDetection; + +class LbpMrf : public IBGS +{ +private: + bool firstTime; + MotionDetection* Detector; + cv::Mat img_foreground; + cv::Mat img_segmentation; + bool showOutput; + +public: + LbpMrf(); + ~LbpMrf(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; diff --git a/package_bgs/ck/MEDefs.cpp b/package_bgs/ck/MEDefs.cpp new file mode 100644 index 0000000..9347353 --- /dev/null +++ b/package_bgs/ck/MEDefs.cpp @@ -0,0 +1,40 @@ +/* + * This file is part of the AiBO+ project + * + * Copyright (C) 2005-2013 Csaba Kertész (csaba.kertesz@gmail.com) + * + * AiBO+ is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * AiBO+ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + +#include "MEDefs.hpp" + +#include <math.h> + +float MERound(float number) +{ + double FracPart = 0.0; + double IntPart = 0.0; + float Ret = 0.0; + + FracPart = modf((double)number, &IntPart); + if (number >= 0) + { + Ret = (float)(FracPart >= 0.5 ? IntPart+1 : IntPart); + } else { + Ret = (float)(FracPart <= -0.5 ? IntPart-1 : IntPart); + } + return Ret; +} diff --git a/package_bgs/ck/MEDefs.hpp b/package_bgs/ck/MEDefs.hpp new file mode 100644 index 0000000..d5bc246 --- /dev/null +++ b/package_bgs/ck/MEDefs.hpp @@ -0,0 +1,83 @@ +/* + * This file is part of the AiBO+ project + * + * Copyright (C) 2005-2013 Csaba Kertész (csaba.kertesz@gmail.com) + * + * AiBO+ is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * AiBO+ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef MEDefs_hpp +#define MEDefs_hpp + +/** + * @addtogroup mindeye + * @{ + */ + +/// Pi value +#ifndef ME_PI_VALUE +#define ME_PI_VALUE 3.14159265 +#endif + +/*! Process state */ +typedef enum { + ps_Min = 0, /*!< Minimum value */ + ps_Uninitialized = ps_Min, /*!< Uninitialized state */ + ps_Initialized, /*!< Initialized state */ + ps_InProgress, /*!< In progress state */ + ps_Successful, /*!< Successful state */ + ps_Max = ps_Successful /*!< Maximum value */ +} MEProcessStateType; + +template <typename T> +const T& MEMin(const T& a, const T& b) +{ + if (a < b) + return a; + return b; +} + +template <typename T> +const T& MEMax(const T& a, const T& b) +{ + if (a < b) + return b; + return a; +} + +template <typename T> +const T& MEBound(const T& min, const T& val, const T& max) +{ + return MEMax(min, MEMin(max, val)); +} + +/*! + * @brief Round a float number + * + * @param number number to round + * + * @return New float number + * + * This method rounds a float number, if the fraction is .5 or lower + * then it rounds down, otherwise up. + * + */ + +float MERound(float number); + +/** @} */ + +#endif diff --git a/package_bgs/ck/MEHistogram.cpp b/package_bgs/ck/MEHistogram.cpp new file mode 100644 index 0000000..126fd25 --- /dev/null +++ b/package_bgs/ck/MEHistogram.cpp @@ -0,0 +1,508 @@ +/* + * This file is part of the AiBO+ project + * + * Copyright (C) 2005-2013 Csaba Kertész (csaba.kertesz@gmail.com) + * + * AiBO+ is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * AiBO+ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + * Some histogram stretch codes are based on how Gimp does it, the same + * GPL 2 license applies for the following authors: + * + * The GIMP -- an image manipulation program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + */ + +#include "MEHistogram.hpp" + +#if defined(__MINGW32__) || defined(__MINGW64__) +#include <cv.h> +#else +#include <opencv/cv.h> +#endif + +#include "MEDefs.hpp" +#include "MEImage.hpp" + +MEHistogram::MEHistogram() +{ + Clear(); +} + + +MEHistogram::~MEHistogram() +{ +} + + +void MEHistogram::Clear() +{ + memset(&HistogramData, 0, 256*sizeof(int)); +} + + +bool MEHistogram::operator==(MEHistogram& histogram) const +{ + bool ret = true; + + for (int i = 255; i >= 0; --i) + { + if (HistogramData[i] != histogram.HistogramData[i]) + { + ret = false; + break; + } + } + return ret; +} + + +void MEHistogram::Calculate(MEImage& image, int channel, HistogramType mode) +{ + int Channel = (channel < 1) ? 1 : ((channel > image.GetLayers()) ? image.GetLayers() : channel); + + if (mode == h_Overwrite) + { + Clear(); + } + + unsigned char *ImageData = image.GetImageData(); + int rowStart = 0; + + for (int i = image.GetHeight()-1; i >= 0; i--) + { + for (int i1 = (image.GetWidth()-1)*image.GetLayers()+Channel-1; i1 >= Channel-1; i1 -= image.GetLayers()) + { + HistogramData[ImageData[rowStart+i1]]++; + } + rowStart += image.GetRowWidth(); + } +} + + +void MEHistogram::Calculate(MEImage& image, HistogramType mode) +{ + if (mode == h_Overwrite) + { + Clear(); + } + + unsigned char *ImageData = image.GetImageData(); + int RowStart = 0; + int RowWidth = image.GetRowWidth(); + + for (int i = image.GetHeight()-1; i >= 0; i--) + { + for (int i1 = image.GetWidth()*image.GetLayers()-1; i1 >= 0; i1--) + { + HistogramData[ImageData[RowStart+i1]]++; + } + RowStart += RowWidth; + } +} + + +void MEHistogram::Calculate(MEImage& image, int channel, int x0, int y0, int x1, int y1) +{ + int Channel = (channel < 1) ? 1 : ((channel > image.GetLayers()) ? image.GetLayers() : channel); + unsigned char *ImageData = image.GetImageData(); + int RowStart = 0; + int RowWidth = image.GetRowWidth(); + int X0 = x0 > x1 ? x1 : x0; + int Y0 = y0 > y1 ? y1 : y0; + int X1 = x0 < x1 ? x1 : x0; + int Y1 = y0 < y1 ? y1 : y0; + + Clear(); + + // Compute the correct region coordinates and check them + X0 = X0 < 0 ? 0 : X0; + Y0 = Y0 < 0 ? 0 : Y0; + X1 = X1 > image.GetWidth()-1 ? image.GetWidth()-1 : X1; + Y1 = Y1 > image.GetHeight()-1 ? image.GetHeight()-1 : Y1; + RowStart = Y0*image.GetRowWidth(); + + for (int i = Y1; i >= Y0; --i) + { + for (int i1 = X1*image.GetLayers()+Channel-1; i1 >= X0*image.GetLayers()+Channel-1; + i1 -= image.GetLayers()) + { + HistogramData[ImageData[RowStart+i1]]++; + } + RowStart += RowWidth; + } +} + + +int MEHistogram::GetPeakIndex() const +{ + int PeakIndex = 0; + int PeakValue = 0; + + for (int i = 0; i < 256; i++) + { + if (PeakValue < HistogramData[i]) + { + PeakValue = HistogramData[i]; + PeakIndex = i; + } + } + return PeakIndex; +} + + +int MEHistogram::GetLowestLimitIndex(int threshold) const +{ + int MinIndex = 0; + + for (int i = 0; i < 256; i++) + { + if (threshold <= HistogramData[i]) + { + MinIndex = i; + break; + } + } + return MinIndex; +} + + +int MEHistogram::GetHighestLimitIndex(int threshold) const +{ + int MaxIndex = 255; + + for (int i = 255; i >= 0; i--) + { + if (threshold <= HistogramData[i]) + { + MaxIndex = i; + break; + } + } + return MaxIndex; +} + + +int MEHistogram::GetPowerAmount(int minindex, int maxindex) const +{ + int ValueAmount = 0; + int MinIndex = (minindex > 255) ? 255 : ((minindex < 0) ? 0 : minindex); + int MaxIndex = (maxindex > 255) ? 255 : ((maxindex < 0) ? 0 : maxindex); + + if (MinIndex > MaxIndex) + { + int TempInt = MinIndex; + MinIndex = MaxIndex; + MaxIndex = TempInt; + } + + for (int i = MinIndex; i <= MaxIndex; i++) + { + ValueAmount += HistogramData[i]; + } + return ValueAmount; +} + + +int MEHistogram::GetCentroidIndex() const +{ + int ValueAmount = GetPowerAmount(0, 255); + int WeightedValueAmount = 1; + int CentroidIndex = 0; + + // Calculate the normal and weighted amount of histogram values + for (int i = 0; i < 256; i++) + { + WeightedValueAmount += i*HistogramData[i]; + } + // Calculate the centroid point of the histogram + CentroidIndex = WeightedValueAmount / ValueAmount; + return CentroidIndex; +} + + +bool MEHistogram::Stretch(StretchType mode) +{ + int MinIndex = -1; + int MaxIndex = -1; + int Percent = -1; + double Percentage = 0.0; + double NextPercentage = 0.0; + double Count = 0.0; + double NewCount = 0.0; + bool Ret = true; + + switch (mode) + { + case s_OwnMode: + Percent = 20; + MinIndex = GetLowestLimitIndex(Percent); + MaxIndex = GetHighestLimitIndex(Percent); + + while ((abs(MaxIndex-MinIndex) < 52) && (Percent > 1)) + { + Percent = Percent / 2; + MinIndex = GetLowestLimitIndex(Percent); + MaxIndex = GetHighestLimitIndex(Percent); + + // The calculation gives wrong answer back + if (MinIndex == 0 && MaxIndex == 255) + { + MinIndex = 128; + MaxIndex = 128; + Ret = false; + } + } + break; + + case s_GimpMode: + Count = GetPowerAmount(0, 255); + NewCount = 0; + + for (int i = 0; i < 255; i++) + { + double Value = 0.0; + double NextValue = 0.0; + + Value = HistogramData[i]; + NextValue = HistogramData[i+1]; + NewCount += Value; + Percentage = NewCount / Count; + NextPercentage = (NewCount+NextValue) / Count; + + if (fabs(Percentage-0.006) < fabs(NextPercentage-0.006)) + { + MinIndex = i+1; + break; + } + } + NewCount = 0.0; + for (int i = 255; i > 0; i--) + { + double Value = 0.0; + double NextValue = 0.0; + + Value = HistogramData[i]; + NextValue = HistogramData[i-1]; + NewCount += Value; + Percentage = NewCount / Count; + NextPercentage = (NewCount+NextValue) / Count; + + if (fabs(Percentage-0.006) < fabs(NextPercentage-0.006)) + { + MaxIndex = i-1; + break; + } + } + break; + + default: + break; + } + + if (MaxIndex <= MinIndex) + { + MinIndex = 0; + MaxIndex = 255; + Ret = false; + } + if (MaxIndex-MinIndex <= 10 || + (MaxIndex-MinIndex <= 20 && (float)GetPowerAmount(MinIndex, MaxIndex) / GetPowerAmount(0, 255) < 0.20)) + { + MinIndex = 0; + MaxIndex = 255; + Ret = false; + } + if (Ret) + { + unsigned char TransformedHistogram[256]; + + for (int i = 0; i < 256; ++i) + { + TransformedHistogram[i] = (unsigned char)MEBound(0, 255*(i-MinIndex) / (MaxIndex-MinIndex), 255); + } + for (int i = 0; i < 256; ++i) + { + HistogramData[i] = TransformedHistogram[i]; + } + } + return Ret; +} + + +MEHistogramTransform::MEHistogramTransform() : ChannelMode(p_SeparateChannels), +StretchMode(MEHistogram::s_GimpMode), DiscreteStretchingDone(false) +{ +} + + +MEHistogramTransform::~MEHistogramTransform() +{ +} + + +void MEHistogramTransform::HistogramStretch(MEImage& image) +{ + SetStretchProcessingMode(p_SeparateChannels, MEHistogram::s_GimpMode); + HistogramStretch(image, t_Continuous); +} + + +void MEHistogramTransform::HistogramStretch(MEImage& image, TransformType time_mode) +{ + if (time_mode == t_Continuous) + { + DiscreteStretchingDone = false; + } + + if (ChannelMode == p_Average || image.GetLayers() == 1) + { + if (time_mode == t_Continuous || (time_mode == t_Discrete && !DiscreteStretchingDone)) + { + RedChannel.Calculate(image, 1, MEHistogram::h_Overwrite); + + for (int l = 1; l < image.GetLayers(); l++) + { + RedChannel.Calculate(image, l+1, MEHistogram::h_Add); + } + RedChannel.Stretch(StretchMode); + if (time_mode == t_Discrete && !DiscreteStretchingDone) + { + DiscreteStretchingDone = true; + } + } + unsigned char *ImageData = image.GetImageData(); + int RowStart = 0; + int RowWidth = image.GetRowWidth(); + + for (int i = image.GetHeight()-1; i >= 0; i--) + { + for (int i1 = image.GetWidth()*image.GetLayers()-1; i1 >= 0; i1--) + { + ImageData[RowStart+i1] = RedChannel.HistogramData[ImageData[RowStart+i1]]; + } + RowStart += RowWidth; + } + } else + if (ChannelMode == p_SeparateChannels) + { + if (time_mode == t_Continuous || (time_mode == t_Discrete && !DiscreteStretchingDone)) + { + RedChannel.Calculate(image, 1, MEHistogram::h_Overwrite); + GreenChannel.Calculate(image, 2, MEHistogram::h_Overwrite); + BlueChannel.Calculate(image, 3, MEHistogram::h_Overwrite); + RedChannel.Stretch(StretchMode); + GreenChannel.Stretch(StretchMode); + BlueChannel.Stretch(StretchMode); + if (time_mode == t_Discrete && !DiscreteStretchingDone) + { + DiscreteStretchingDone = true; + } + } + unsigned char *ImageData = image.GetImageData(); + int RowStart = 0; + int RowWidth = image.GetRowWidth(); + + for (int i = image.GetHeight()-1; i >= 0; i--) + { + for (int i1 = image.GetWidth()*image.GetLayers()-3; i1 >= 0; i1 -= 3) + { + ImageData[RowStart+i1] = RedChannel.HistogramData[ImageData[RowStart+i1]]; + ImageData[RowStart+i1+1] = GreenChannel.HistogramData[ImageData[RowStart+i1+1]]; + ImageData[RowStart+i1+2] = BlueChannel.HistogramData[ImageData[RowStart+i1+2]]; + } + RowStart += RowWidth; + } + } +} + + +void MEHistogramTransform::HistogramEqualize(MEImage& image) +{ + DiscreteStretchingDone = false; + IplImage* cvDest8bitImg = NULL; + IplImage* cvDestImg = NULL; + + switch (image.GetLayers()) + { + case 1: + // Grayscale image + cvDest8bitImg = cvCreateImage(cvSize(image.GetWidth(), image.GetHeight()), 8, 1); + cvEqualizeHist((IplImage*)image.GetIplImage(), cvDest8bitImg); + image.SetIplImage((void*)cvDest8bitImg); + cvReleaseImage(&cvDest8bitImg); + break; + + case 3: + // RGB image + cvDestImg = cvCreateImage(cvSize(image.GetWidth(), image.GetHeight()), 8, 3); + IplImage *cvR, *cvG, *cvB; + + cvR = cvCreateImage(cvSize(image.GetWidth(), image.GetHeight()), 8, 1); + cvG = cvCreateImage(cvSize(image.GetWidth(), image.GetHeight()), 8, 1); + cvB = cvCreateImage(cvSize(image.GetWidth(), image.GetHeight()), 8, 1); + + cvSplit((IplImage*)image.GetIplImage(), cvR, cvG, cvB, NULL); + cvEqualizeHist(cvR, cvR); + cvEqualizeHist(cvG, cvG); + cvEqualizeHist(cvB, cvB); + cvMerge(cvR, cvG, cvB, NULL, cvDestImg); + + image.SetIplImage((void*)cvDestImg); + cvReleaseImage(&cvR); + cvReleaseImage(&cvG); + cvReleaseImage(&cvB); + cvReleaseImage(&cvDestImg); + break; + + default: + break; + } +} + + +void MEHistogramTransform::SetStretchProcessingMode(ProcessingType new_channel_mode, + MEHistogram::StretchType new_stretch_mode) +{ + DiscreteStretchingDone = false; + + switch(new_channel_mode) + { + case p_SeparateChannels: + ChannelMode = new_channel_mode; + break; + + case p_Average: + ChannelMode = new_channel_mode; + break; + + default: + break; + } + + switch(new_stretch_mode) + { + case MEHistogram::s_OwnMode: + StretchMode = new_stretch_mode; + break; + + case MEHistogram::s_GimpMode: + StretchMode = new_stretch_mode; + break; + + default: + break; + } +} diff --git a/package_bgs/ck/MEHistogram.hpp b/package_bgs/ck/MEHistogram.hpp new file mode 100644 index 0000000..5b2b47f --- /dev/null +++ b/package_bgs/ck/MEHistogram.hpp @@ -0,0 +1,348 @@ +/* + * This file is part of the AiBO+ project + * + * Copyright (C) 2005-2013 Csaba Kertész (csaba.kertesz@gmail.com) + * + * AiBO+ is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * AiBO+ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef MEHistogram_hpp +#define MEHistogram_hpp + +/** + * @addtogroup mindeye + * @{ + */ + +class MEImage; + +/** + * MEHistogram + * @brief The class provides basic histogram operations + */ +class MEHistogram +{ +public: + + /// Types of histogram calculation + typedef enum { + h_Min = 0, /*!< Minimum value */ + h_Overwrite = h_Min, /*!< Overwrite */ + h_Add, /*!< Add */ + h_Max = h_Add /*!< Maximum value */ + } HistogramType; + + /// Types of histogram stretching + typedef enum { + s_Min = 0, /*!< Minimum value */ + s_OwnMode = s_Min, /*!< Own mode */ + s_GimpMode, /*!< Gimp mode */ + s_Max = s_GimpMode /*!< Maximum value */ + } StretchType; + + /// Constructor of class + MEHistogram(); + /// Destructor of class + ~MEHistogram(); + + /*! + * @brief Clear histogram data + * + * Clear histogram data. + * + */ + + void Clear(); + + /*! + * @brief Equality (==) operator + * + * @param histogram Histogram to be compared + * + * @return True if the two histograms are equal. + * + * Compare two histograms. + * + */ + + bool operator==(MEHistogram& histogram) const; + + /*! + * @brief Calculate the histogram of one color channel + * + * @param image Given image for the calculations + * @param channel Selected color channel for calculation (Range: 1..x) + * @param mode The mode of calculation. + * + * The method calculates the histograms of a color channel. + * There is two different type of the function: + * + * - h_Add: Add the data to the existing histogram. + * - h_Overwrite: Clear the histogram data before the + * calculation. + * + */ + + void Calculate(MEImage& image, int channel, HistogramType mode); + + /*! + * @brief Calculate the average histogram of an image + * + * @param image Given image for the calculations + * @param mode Histogram calculation mode + * + * The method calculates the average histogram of an image. + * + */ + + void Calculate(MEImage& image, HistogramType mode = h_Overwrite); + + /*! + * @brief Calculate the histogram of an image region + * + * @param image Given image for the calculations + * @param channel Selected color channel for calculation (Range: 1..x) + * @param x0 x0 coordinate of the region + * @param y0 y0 coordinate of the region + * @param x1 x1 coordinate of the region + * @param y1 y1 coordinate of the region + * + * The method calculates the average histogram of an image region + * (x0,y0)-(x1,y1). + * + */ + + void Calculate(MEImage& image, int channel, int x0, int y0, int x1, int y1); + + /*! + * @brief Get the index of maximum value of the histogram + * + * @return Index number + * + * Function gives an index value back where is the highest + * peak of the histogram. + * + */ + + int GetPeakIndex() const; + + /*! + * @brief Get the lowest histogram index with an threshold value + * + * @param threshold Specified threshold (in percent: 0..100 %) + * + * @return Index number + * + * Function gives the lowest index back whose value reaches + * an threshold value calculated by (counted pixel number / + * 10*threshold / 100). + * + */ + + int GetLowestLimitIndex(int threshold) const; + + /*! + * @brief Get the highest histogram index with an threshold value + * + * @param threshold Specified threshold (in percent: 0..100 %) + * + * @return Index number + * + * Function gives the highest index back whose value reaches + * an threshold value calculated by (counted pixel number / + * 10*threshold / 100). + * + */ + + int GetHighestLimitIndex(int threshold) const; + + /*! + * @brief Get the amount of the histogram values in an interval + * + * @param minindex Minimal index of the interval + * @param maxindex Maximal index of the interval + * + * @return Amount of the values + * + * Function calculates the amount of the histogram values + * in a given interval. + * + */ + + int GetPowerAmount(int min_index, int max_index) const; + + /*! + * @brief Get index value of the centroid point of the histogram + * + * @return Index number + * + * Function calculates the centre of area of the histogram and + * gives the index number back. + * + */ + + int GetCentroidIndex() const; + + /*! + * @brief Stretch the histogram + * + * @param mode Mode of the histogram stretching + * + * @return True if successful, otherwise false. + * + * The function selects and stretches the main power + * interval of the histogram. The following calculation + * modes are available: + * + * - s_OwnMode: The calculation of the power + * interval is selected by functions Histogram::GetHistogramLowestLimitIndex() + * and Histogram::GetHistogramHighestLimitIndex() where the + * threshold is 20, 10, 5, 2, 1 in order. The power range will + * be selected if the length is at least 52 long or the used + * threshold reaches the 1 value. + * - s_GimpMode: The minimum index of power interval is + * specified by the first fulfilled abs(percentage[i]-0.006) < + * fabs(percentage[i+1]-0.006) where the percentage[i] means + * the amount of the histogram values in the interval [0, i]. + * The maximum index is specified by the first fulfilled + * (from the end of the histogram) abs(percentage[i]-0.006) < + * fabs(percentage[i-1]-0.006) where the percentage[i] means + * the amount of the histogram values in the interval [i, 255]. + * + * The stretch operation is rejected if the power interval is + * less than 10 or less than 20 and the percentage[min_index, max_index] + * / percentage[0, 255] < 0.2. + * + */ + + bool Stretch(StretchType mode); + + /// Histogram spectrum + int HistogramData[256]; +}; + + +/** + * MEHistogramTransform + * @brief The class provides histogram operations + */ +class MEHistogramTransform +{ +public: + /// Types of histogram processing + typedef enum { + p_Min = 0, /*!< Minimum value */ + p_SeparateChannels = p_Min, /*!< Separate channels */ + p_Average, /*!< Average */ + p_Max = p_Average /*!< Maximum value */ + } ProcessingType; + + /// Types of histogram transformations + typedef enum { + t_Min = 0, /*!< Minimum value */ + t_Continuous = t_Min, /*!< Continuous */ + t_Discrete, /*!< Discrete */ + t_Max = t_Discrete /*!< Maximum value */ + } TransformType; + + /// Constructor of class + MEHistogramTransform(); + /// Destructor of class + ~MEHistogramTransform(); + + /*! + * @brief Histogram stretching an image + * + * @param image Source image to stretch + * + * The function stretches the histogram of the given image with + * default parameters: process the color channels separately + * and continuously. + * + */ + + void HistogramStretch(MEImage& image); + + /*! + * @brief Histogram stretching with specified parameters + * + * @param image Source image to stretch + * @param time_mode Mode of the histogram stretching + * + * The function transformations the histogram of the image. + * There is some different possibilities to make the operation: + * + * - t_Continuous: The function always stretches the + * image at each call of the method. + * - t_Discrete: A histogram is calculated at the first + * call of the function and all further images will be + * stretched by this initial histogram. + * + */ + + void HistogramStretch(MEImage& image, TransformType time_mode); + + /*! + * @brief Histogram equalization on an image + * + * @param image Source image to equalize + * + * The source image is transformed by histogram + * equalization. + * + */ + + void HistogramEqualize(MEImage& image); + + /*! + * @brief Set the process mode of the histogram transformation + * + * @param new_channel_mode New mode of processing channels + * @param new_stretch_mode New mode of histogram stretching + * + * The process mode of histogram transformation can be + * set by this method. Two process modes are available for + * processing channels: + * + * - p_SeparateChannels: The class processes the color channels + * separately. + * - p_Average: The color channels are averaged + * in the histogram operations. + * + * Two process modes are usable for histogram stretching: + * s_OwnMode and s_GimpMode. See Histogram::Stretch() + * for more details. + * + */ + + void SetStretchProcessingMode(ProcessingType new_channel_mode, MEHistogram::StretchType new_stretch_mode); + +private: + /// Type of the process of histograms + ProcessingType ChannelMode; + /// Stretch mode + MEHistogram::StretchType StretchMode; + /// Histograms for red, green and blue color channels + MEHistogram RedChannel, GreenChannel, BlueChannel; + /// Histogram for average calculation + MEHistogram AverageChannel; + /// Continuous histogram stretch is done already + bool DiscreteStretchingDone; +}; + +/** @} */ + +#endif diff --git a/package_bgs/ck/MEImage.cpp b/package_bgs/ck/MEImage.cpp new file mode 100644 index 0000000..5a625a9 --- /dev/null +++ b/package_bgs/ck/MEImage.cpp @@ -0,0 +1,1472 @@ +/* + * This file is part of the AiBO+ project + * + * Copyright (C) 2005-2013 Csaba Kertész (csaba.kertesz@gmail.com) + * + * AiBO+ is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * AiBO+ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + +#include "MEImage.hpp" + +#if defined(__MINGW32__) || defined(__MINGW64__) +#include <cv.h> +#include <highgui.h> +#else +#include <opencv/cv.h> +#include <opencv/highgui.h> +#endif + +#include "MEDefs.hpp" + +#define ME_CAST_TO_IPLIMAGE(image_ptr) ((IplImage*)image_ptr) +#define ME_RELEASE_IPLIMAGE(image_ptr) \ + cvReleaseImage((IplImage**)&image_ptr); \ + image_ptr = NULL; + +// RGB to YUV transform +const float RGBtoYUVMatrix[3][3] = + {{ 0.299, 0.587, 0.114 }, + { -0.147, -0.289, 0.436 }, + { 0.615, -0.515, -0.100 }}; + +// RGB to YIQ transform +const float RGBtoYIQMatrix[3][3] = + {{ 0.299, 0.587, 0.114 }, + { 0.596, -0.274, -0.322 }, + { 0.212, -0.523, 0.311 }}; + +MEImage::MEImage(int width, int height, int layers) : cvImg(NULL) +{ + _Init(width, height, layers); +} + + +MEImage::MEImage(const MEImage& other) : cvImg(NULL) +{ + _Copy(other); +} + + +MEImage::~MEImage() +{ + if (ME_CAST_TO_IPLIMAGE(cvImg)) + { + ME_RELEASE_IPLIMAGE(cvImg); + } +} + + +void MEImage::Clear() +{ + cvSetZero(ME_CAST_TO_IPLIMAGE(cvImg)); +} + + +void MEImage::GetLayer(MEImage& new_layer, int layer_number) const +{ + int LayerNumber = layer_number; + + if ((new_layer.GetWidth() != ME_CAST_TO_IPLIMAGE(cvImg)->width) || + (new_layer.GetHeight() != ME_CAST_TO_IPLIMAGE(cvImg)->height) || + (new_layer.GetLayers() != 1)) + { + new_layer.Realloc(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height, 1); + } + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels < LayerNumber) + { + printf("The given layer number is too large (%d > %d)\n", + LayerNumber, ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + + LayerNumber = ME_CAST_TO_IPLIMAGE(cvImg)->nChannels; + } + if (LayerNumber <= 0) + { + printf("The given layer number is too small (%d <= 0)\n", LayerNumber); + LayerNumber = 1; + } + + cvSetImageCOI(ME_CAST_TO_IPLIMAGE(cvImg), LayerNumber); + cvCopy(ME_CAST_TO_IPLIMAGE(cvImg), (IplImage*)new_layer.GetIplImage(), NULL); + cvSetImageCOI(ME_CAST_TO_IPLIMAGE(cvImg), 0); +} + + +void MEImage::SetLayer(MEImage& layer, int layer_number) +{ + int LayerNumber = layer_number; + + if (layer.GetWidth() != ME_CAST_TO_IPLIMAGE(cvImg)->width || + layer.GetHeight() != ME_CAST_TO_IPLIMAGE(cvImg)->height) + { + printf("The dimensions of the layer and " + "destination image is different (%dx%d <> %dx%d)\n", + layer.GetWidth(), layer.GetHeight(), ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height); + return; + } + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels < LayerNumber) + { + printf("The given layer number is too large (%d > %d)\n", + LayerNumber, ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + LayerNumber = ME_CAST_TO_IPLIMAGE(cvImg)->nChannels; + } + if (LayerNumber <= 0) + { + printf("The given layer number is too small (%d <= 0)\n", LayerNumber); + LayerNumber = 1; + } + if (layer.GetLayers() != 1) + { + printf("The layer image has not one color channel (1 != %d)\n", + layer.GetLayers()); + return; + } + cvSetImageCOI(ME_CAST_TO_IPLIMAGE(cvImg), LayerNumber); + cvCopy((IplImage*)layer.GetIplImage(), ME_CAST_TO_IPLIMAGE(cvImg), NULL); + cvSetImageCOI(ME_CAST_TO_IPLIMAGE(cvImg), 0); +} + + +void MEImage::CopyImageData(unsigned char* data) +{ + memcpy(ME_CAST_TO_IPLIMAGE(cvImg)->imageData, data, ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->height*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); +} + + +void* MEImage::GetIplImage() const +{ + return (void*)ME_CAST_TO_IPLIMAGE(cvImg); +} + + +void MEImage::SetIplImage(void* image) +{ + if (ME_CAST_TO_IPLIMAGE(cvImg)) + { + ME_RELEASE_IPLIMAGE(cvImg); + } + cvImg = cvCloneImage((IplImage*)image); + // Correct the origin of the image + if (ME_CAST_TO_IPLIMAGE(cvImg)->origin == 1) + { + MirrorVertical(); + ME_CAST_TO_IPLIMAGE(cvImg)->origin = 0; + } +} + + +bool MEImage::operator==(const MEImage& image) +{ + return Equal(image); +} + + +bool MEImage::operator!=(const MEImage& image) +{ + return !operator==(image); +} + + +MEImage& MEImage::operator=(const MEImage& other_image) +{ + if (&other_image == this) + return *this; + + _Copy(other_image); + return *this; +} + + +int MEImage::GetWidth() const +{ + return ME_CAST_TO_IPLIMAGE(cvImg) ? ME_CAST_TO_IPLIMAGE(cvImg)->width : 0; +} + + +int MEImage::GetRowWidth() const +{ + return ME_CAST_TO_IPLIMAGE(cvImg) ? ME_CAST_TO_IPLIMAGE(cvImg)->widthStep : 0; +} + + +int MEImage::GetHeight() const +{ + return ME_CAST_TO_IPLIMAGE(cvImg) ? ME_CAST_TO_IPLIMAGE(cvImg)->height : 0; +} + + +int MEImage::GetLayers() const +{ + return ME_CAST_TO_IPLIMAGE(cvImg) ? ME_CAST_TO_IPLIMAGE(cvImg)->nChannels : 0; +} + + +int MEImage::GetPixelDataNumber() const +{ + return ME_CAST_TO_IPLIMAGE(cvImg) ? GetWidth()*GetHeight()*GetLayers() : 0; +} + + +unsigned char* MEImage::GetImageData() const +{ + return ME_CAST_TO_IPLIMAGE(cvImg) ? (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData : NULL; +} + + +void MEImage::SetData(unsigned char* image_data, int width, int height, int channels) +{ + _Init(width, height, channels); + + for (int y = height-1; y >= 0; --y) + { + int Start = GetRowWidth()*y; + int Start2 = width*channels*y; + + memcpy(&ME_CAST_TO_IPLIMAGE(cvImg)->imageData[Start], &image_data[Start2], width*channels); + } +} + + +float MEImage::GetRatio() const +{ + return ME_CAST_TO_IPLIMAGE(cvImg) ? (float)ME_CAST_TO_IPLIMAGE(cvImg)->height/(float)ME_CAST_TO_IPLIMAGE(cvImg)->width : 0.0; +} + + +void MEImage::Realloc(int width, int height) +{ + Realloc(width, height, ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); +} + + +void MEImage::Realloc(int width, int height, int layers) +{ + _Init(width, height, layers); +} + + +void MEImage::Resize(int new_width, int new_height) +{ + if (new_height < 1) + { + printf("Invalid new height: %d < 1\n", new_height); + return; + } + if (new_width < 1) + { + printf("Invalid new width: %d < 1\n", new_width); + return; + } + IplImage* TempImg = cvCreateImage(cvSize(new_width, new_height), 8, ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + + cvResize(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_INTER_NN); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; +} + + +void MEImage::ResizeScaleX(int new_width) +{ + if (new_width < 1) + { + printf("Invalid new width: %d < 1\n", new_width); + return; + } + Resize(new_width, (int)((float)new_width*GetRatio())); +} + + +void MEImage::ResizeScaleY(int new_height) +{ + if (new_height < 1) + { + printf("Invalid new height: %d < 1\n", new_height); + return; + } + Resize((int)((float)new_height*1/GetRatio()), new_height); +} + + +void MEImage::MirrorHorizontal() +{ + cvFlip(ME_CAST_TO_IPLIMAGE(cvImg), NULL, 1); +} + + +void MEImage::MirrorVertical() +{ + cvFlip(ME_CAST_TO_IPLIMAGE(cvImg), NULL, 0); +} + + +void MEImage::Crop(int x1, int y1, int x2, int y2) +{ + int NewX1 = x1; + int NewY1 = y1; + int NewX2 = x2; + int NewY2 = y2; + + NewX1 = (NewX1 < 0) ? 0 : NewX1; + NewX1 = (NewX1 > ME_CAST_TO_IPLIMAGE(cvImg)->width) ? ME_CAST_TO_IPLIMAGE(cvImg)->width : NewX1; + NewY1 = (NewY1 < 0) ? 0 : NewY1; + NewY1 = (NewY1 > ME_CAST_TO_IPLIMAGE(cvImg)->height) ? ME_CAST_TO_IPLIMAGE(cvImg)->height : NewY1; + + NewX2 = (NewX2 < 0) ? 0 : NewX2; + NewX2 = (NewX2 > ME_CAST_TO_IPLIMAGE(cvImg)->width) ? ME_CAST_TO_IPLIMAGE(cvImg)->width : NewX2; + NewY2 = (NewY2 < 0) ? 0 : NewY2; + NewY2 = (NewY2 > ME_CAST_TO_IPLIMAGE(cvImg)->height) ? ME_CAST_TO_IPLIMAGE(cvImg)->height : NewY2; + + if ((NewX2-NewX1) <= 0) + { + printf("Invalid new width: %d <= 0\n", NewX2-NewX1); + return; + } + if ((NewY2-NewY1) <= 0) + { + printf("Invalid new height: %d <= 0\n", NewY2-NewY1); + return; + } + IplImage* TempImg = cvCreateImage(cvSize(NewX2-NewX1, NewY2-NewY1), 8, ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + + cvSetImageROI(ME_CAST_TO_IPLIMAGE(cvImg), cvRect(NewX1, NewY1, NewX2-NewX1, NewY2-NewY1)); + cvCopy(ME_CAST_TO_IPLIMAGE(cvImg), TempImg); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; +} + + +void MEImage::CopyImageInside(int x, int y, MEImage& source_image) +{ + int NewX = x; + int NewY = y; + int PasteLengthX = source_image.GetWidth(); + int PasteLengthY = source_image.GetHeight(); + + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels != source_image.GetLayers()) + { + if (source_image.GetLayers() == 1 && ME_CAST_TO_IPLIMAGE(cvImg)->nChannels == 3) + { + source_image.ConvertGrayscaleToRGB(); + } + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels == 1 && source_image.GetLayers() == 3) + { + source_image.ConvertToGrayscale(g_OpenCV); + } + } + if (NewX < 0) + NewX = 0; + if (NewX > ME_CAST_TO_IPLIMAGE(cvImg)->width) + NewX = ME_CAST_TO_IPLIMAGE(cvImg)->width; + if (NewY < 0) + NewY = 0; + if (NewY > ME_CAST_TO_IPLIMAGE(cvImg)->height) + NewY = ME_CAST_TO_IPLIMAGE(cvImg)->height; + if (NewX+PasteLengthX > ME_CAST_TO_IPLIMAGE(cvImg)->width) + PasteLengthX = ME_CAST_TO_IPLIMAGE(cvImg)->width-NewX; + if (NewY+PasteLengthY > ME_CAST_TO_IPLIMAGE(cvImg)->height) + PasteLengthY = ME_CAST_TO_IPLIMAGE(cvImg)->height-NewY; + + if (PasteLengthX != source_image.GetWidth() || + PasteLengthY != source_image.GetHeight()) + { + source_image.Resize(PasteLengthX, PasteLengthY); + } + cvSetImageROI(ME_CAST_TO_IPLIMAGE(cvImg), cvRect(NewX, NewY, PasteLengthX, PasteLengthY)); + cvCopy((IplImage*)source_image.GetIplImage(), ME_CAST_TO_IPLIMAGE(cvImg)); + cvResetImageROI(ME_CAST_TO_IPLIMAGE(cvImg)); +} + + +void MEImage::Erode(int iterations) +{ + IplImage* TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, + ME_CAST_TO_IPLIMAGE(cvImg)->height), + 8, ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + + cvErode(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, NULL, iterations); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; +} + + +void MEImage::Dilate(int iterations) +{ + IplImage* TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, + ME_CAST_TO_IPLIMAGE(cvImg)->height), + 8, ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + + cvDilate(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, NULL, iterations); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; +} + + +void MEImage::Smooth() +{ + SmoothAdvanced(s_Median, 3); +} + + +void MEImage::SmoothAdvanced(SmoothType filtermode, int filtersize) +{ + IplImage* TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + + switch (filtermode) + { + case s_Blur: + cvSmooth(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_BLUR, filtersize, filtersize, 0); + break; + case s_Median: + cvSmooth(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_MEDIAN, filtersize, 0, 0); + break; + case s_Gaussian: + cvSmooth(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_GAUSSIAN, filtersize, filtersize, 0); + break; + default: + cvSmooth(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_MEDIAN, filtersize, 0, 0); + break; + } + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; +} + + +void MEImage::Canny() +{ + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels > 1) + { + ConvertToGrayscale(g_OpenCV); + } + + IplImage* TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + cvCanny(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, 800, 1100, 5); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; +} + + +void MEImage::Laplace() +{ + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels != 1) + { + ConvertToGrayscale(g_OpenCV); + } + IplImage* TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, + ME_CAST_TO_IPLIMAGE(cvImg)->height), + IPL_DEPTH_16S, 1); + cvLaplace(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, 3); + cvConvertScale(TempImg, ME_CAST_TO_IPLIMAGE(cvImg), 1, 0); + ME_RELEASE_IPLIMAGE(cvImg); +} + + +void MEImage::Quantize(int levels) +{ + if (levels <= 0) + { + printf("Level number is too small (%d <= 0)\n", levels); + return; + } + if (levels > 256) + { + printf("Level number is too large (%d > 256)\n", levels); + return; + } + unsigned char* ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + + for (int i = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep*ME_CAST_TO_IPLIMAGE(cvImg)->height-1; i >= 0; --i) + { + ImageData[i] = ImageData[i] / (256 / levels)*(256 / levels); + } +} + + +void MEImage::Threshold(int threshold_limit) +{ + if (threshold_limit < 0) + { + printf("Threshold number is too small (%d <= 0)\n", threshold_limit); + return; + } + if (threshold_limit > 255) + { + printf("Threshold number is too large (%d > 255)\n", threshold_limit); + return; + } + unsigned char* ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + + for (int i = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep*ME_CAST_TO_IPLIMAGE(cvImg)->height-1; i >= 0; --i) + { + if (ImageData[i] < threshold_limit) + { + ImageData[i] = 0; + } + } +} + + +void MEImage::AdaptiveThreshold() +{ + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels != 1) + { + ConvertToGrayscale(g_OpenCV); + } + IplImage* TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + cvAdaptiveThreshold(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, 25, + CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 7, -7); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; +} + + +void MEImage::ThresholdByMask(MEImage& mask_image) +{ + if (mask_image.GetWidth() != ME_CAST_TO_IPLIMAGE(cvImg)->width || + mask_image.GetHeight() != ME_CAST_TO_IPLIMAGE(cvImg)->height) + { + printf("Image properties are different\n"); + return; + } + if (mask_image.GetLayers() != 3 && ME_CAST_TO_IPLIMAGE(cvImg)->nChannels == 3) + { + mask_image.ConvertGrayscaleToRGB(); + } + unsigned char* ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + unsigned char* MaskImageData = mask_image.GetImageData(); + + for (int i = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep*ME_CAST_TO_IPLIMAGE(cvImg)->height-1; i >= 0; --i) + { + if (MaskImageData[i] == 0) + { + ImageData[i] = 0; + } + } +} + + +void MEImage::ColorSpace(ColorSpaceConvertType mode) +{ + IplImage* TempImg = NULL; + unsigned char* ImageData = NULL; + int WidthStep = 0; + int RowStart = 0; + + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels == 1) + { + printf("No sense to convert: source image is greyscale\n"); + ConvertGrayscaleToRGB(); + } + switch (mode) + { + case csc_RGBtoXYZCIED65: + TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, + ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + cvCvtColor(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_RGB2XYZ); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; + break; + + case csc_XYZCIED65toRGB: + TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, + ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + cvCvtColor(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_XYZ2RGB); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; + break; + + case csc_RGBtoHSV: + TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, + ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + cvCvtColor(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_RGB2HSV); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; + break; + + case csc_HSVtoRGB: + TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, + ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + cvCvtColor(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_HSV2RGB); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; + break; + + case csc_RGBtoHLS: + TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + cvCvtColor(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_RGB2HLS); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; + break; + + case csc_HLStoRGB: + TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + cvCvtColor(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_HLS2RGB); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; + break; + + case csc_RGBtoCIELab: + TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + cvCvtColor(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_RGB2Lab); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; + break; + + case csc_CIELabtoRGB: + TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + cvCvtColor(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_Lab2RGB); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; + break; + + case csc_RGBtoCIELuv: + TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + cvCvtColor(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_RGB2Luv); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; + break; + + case csc_CIELuvtoRGB: + TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + cvCvtColor(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_Luv2RGB); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; + break; + + case csc_RGBtoYUV: + ComputeColorSpace(csc_RGBtoYUV); + break; + + case csc_RGBtoYIQ: + ComputeColorSpace(csc_RGBtoYIQ); + break; + + case csc_RGBtorgI: + ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + WidthStep = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep; + RowStart = 0; + for (int y = ME_CAST_TO_IPLIMAGE(cvImg)->height-1; y >= 0; --y) + { + for (int x = (ME_CAST_TO_IPLIMAGE(cvImg)->width-1)*3; x >= 0; x -= 3) + { + int r = 0; + int g = 0; + int I = 0; + + I = (int)ImageData[RowStart+x]+(int)ImageData[RowStart+x+1]+(int)ImageData[RowStart+x+2]; + r = (int)((float)ImageData[RowStart+x] / I*255); + g = (int)((float)ImageData[RowStart+x+1] / I*255); + ImageData[RowStart+x] = (unsigned char)r; + ImageData[RowStart+x+1] = (unsigned char)g; + ImageData[RowStart+x+2] = (unsigned char)(I / 3); + } + RowStart += WidthStep; + } + break; + + default: + break; + } +} + + +void MEImage::ConvertToGrayscale(GrayscaleType grayscale_mode) +{ + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels == 1) + { + printf("Image is already grayscale\n"); + return; + } + IplImage* TempImg = NULL; + unsigned char* ImgData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + unsigned char* ImageData = NULL; + + switch (grayscale_mode) + { + case g_Average: + TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, 1); + ImageData = (unsigned char*)TempImg->imageData; + + for (int i = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep*ME_CAST_TO_IPLIMAGE(cvImg)->height-3; i >= 0; i -= 3) + { + ImageData[i / 3] = (ImgData[i]+ImgData[i+1]+ImgData[i+2]) / 3; + } + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; + break; + + case g_OpenCV: + TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, 1); + cvCvtColor(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_RGB2GRAY); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; + break; + + default: + break; + } +} + + +void MEImage::ConvertGrayscaleToRGB() +{ + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels != 1) + { + return; + } + IplImage* TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, 3); + + cvCvtColor(ME_CAST_TO_IPLIMAGE(cvImg), TempImg, CV_GRAY2RGB); + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; +} + + +void MEImage::ConvertBGRToRGB() +{ + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels != 3) + { + return; + } + cvCvtColor(ME_CAST_TO_IPLIMAGE(cvImg), ME_CAST_TO_IPLIMAGE(cvImg), CV_RGB2BGR); +} + + +void MEImage::LBP(LBPType mode) +{ + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels > 1) + { + ConvertToGrayscale(g_OpenCV); + } + unsigned char* ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + IplImage* TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, 1); + unsigned char* TempImgData = (unsigned char*)TempImg->imageData; + int WidthStep = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep; + int WidthStep_2 = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep*2; + + cvSetZero(TempImg); + switch (mode) + { + case lbp_Normal: + for (int i = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep*(ME_CAST_TO_IPLIMAGE(cvImg)->height-2)-1; i >= ME_CAST_TO_IPLIMAGE(cvImg)->widthStep+1; --i) + { + TempImgData[i] = + (ImageData[i] <= ImageData[i-ME_CAST_TO_IPLIMAGE(cvImg)->widthStep-1])+ + ((ImageData[i] <= ImageData[i-ME_CAST_TO_IPLIMAGE(cvImg)->widthStep])*2)+ + ((ImageData[i] <= ImageData[i-ME_CAST_TO_IPLIMAGE(cvImg)->widthStep+1])*4)+ + ((ImageData[i] <= ImageData[i-1])*8)+ + ((ImageData[i] <= ImageData[i+1])*16)+ + ((ImageData[i] <= ImageData[i+ME_CAST_TO_IPLIMAGE(cvImg)->widthStep-1])*32)+ + ((ImageData[i] <= ImageData[i+ME_CAST_TO_IPLIMAGE(cvImg)->widthStep])*64)+ + ((ImageData[i] <= ImageData[i+ME_CAST_TO_IPLIMAGE(cvImg)->widthStep+1])*128); + } + break; + + case lbp_Special: + for (int i = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep*(ME_CAST_TO_IPLIMAGE(cvImg)->height-3)-2; i >= ME_CAST_TO_IPLIMAGE(cvImg)->widthStep*2+2; --i) + { + int CenterPixel = (ImageData[i+1]+ImageData[i-1]+ + ImageData[i-WidthStep]+ImageData[i+WidthStep]) / 4; + TempImgData[i] = ((CenterPixel <= (ImageData[i-(WidthStep_2)-2]+ + ImageData[i-(WidthStep_2)-1]+ + ImageData[i-WidthStep-2]+ + ImageData[i-WidthStep-1]) / 4))+ + ((CenterPixel <= (ImageData[i-WidthStep]+ + ImageData[i-(WidthStep_2)]) / 2)*2)+ + ((CenterPixel <= ((ImageData[i-(WidthStep_2)+2]+ + ImageData[i-(WidthStep_2)+1]+ + ImageData[i-WidthStep+2]+ + ImageData[i-WidthStep+1]) / 4))*4)+ + ((CenterPixel <= (ImageData[i-1]+ + ImageData[i-2]) / 2)*8)+ + ((CenterPixel <= (ImageData[i+1]+ + ImageData[i+2]) / 2)*16)+ + ((CenterPixel <= ((ImageData[i+(WidthStep_2)-2]+ + ImageData[i+(WidthStep_2)-1]+ + ImageData[i+WidthStep-2]+ + ImageData[i+WidthStep-1]) / 4))*32)+ + ((CenterPixel <= (ImageData[i+WidthStep]+ + ImageData[i-WidthStep_2]) / 2)*64)+ + ((CenterPixel <= ((ImageData[i+(WidthStep_2)+2]+ + ImageData[i+(WidthStep_2)+1]+ + ImageData[i+WidthStep+2]+ + ImageData[i+WidthStep+1]) / 4))*128); + } + break; + + default: + break; + } + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; +} + + +void MEImage::Binarize(int threshold) +{ + unsigned char* ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + + for (int i = ME_CAST_TO_IPLIMAGE(cvImg)->height*ME_CAST_TO_IPLIMAGE(cvImg)->widthStep-1; i >= 0; --i) + { + if (ImageData[i] >= threshold) + { + ImageData[i] = 255; + } else { + ImageData[i] = 0; + } + } +} + + +void MEImage::Subtract(MEImage& source, SubtractModeType mode) +{ + if (source.GetWidth() != ME_CAST_TO_IPLIMAGE(cvImg)->width || + source.GetHeight() != ME_CAST_TO_IPLIMAGE(cvImg)->height || + source.GetLayers() != ME_CAST_TO_IPLIMAGE(cvImg)->nChannels) + { + printf("Image properties are different.\n"); + return; + } + unsigned char* ImageData = NULL; + unsigned char* DstData = NULL; + int WidthStep = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep; + int RowStart = 0; + + switch (mode) + { + case sub_Normal: + ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + DstData = source.GetImageData(); + RowStart = 0; + + for (int y = ME_CAST_TO_IPLIMAGE(cvImg)->height-1; y >= 0; --y) + { + for (int x = ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels-1; x >= 0; --x) + { + ImageData[RowStart+x] = + ImageData[RowStart+x]-DstData[RowStart+x] < 0 ? 0 : + ImageData[RowStart+x]-DstData[RowStart+x]; + } + RowStart += WidthStep; + } + break; + + case sub_Absolut: + ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + DstData = source.GetImageData(); + RowStart = 0; + + for (int y = ME_CAST_TO_IPLIMAGE(cvImg)->height-1; y >= 0; --y) + { + for (int x = ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels-1; x >= 0; --x) + { + ImageData[RowStart+x] = ImageData[RowStart+x]- + DstData[RowStart+x] < 0 ? -ImageData[RowStart+x]+ + DstData[RowStart+x] : ImageData[RowStart+x]-DstData[RowStart+x]; + } + RowStart += WidthStep; + } + break; + + default: + break; + } +} + + +void MEImage::Multiple(MEImage& source, MultiplicationType mode) +{ + if (source.GetWidth() != ME_CAST_TO_IPLIMAGE(cvImg)->width || + source.GetHeight() != ME_CAST_TO_IPLIMAGE(cvImg)->height || + source.GetLayers() != ME_CAST_TO_IPLIMAGE(cvImg)->nChannels) + { + printf("Image properties are different.\n"); + return; + } + float Result = 0.0; + IplImage* TempImg = NULL; + unsigned char* ImageData = NULL; + unsigned char* ImageData2 = NULL; + unsigned char* ImageData3 = NULL; + unsigned char* DstData = NULL; + + switch (mode) + { + case m_Normal: + Result = 0; + ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + DstData = source.GetImageData(); + + for (int i = ME_CAST_TO_IPLIMAGE(cvImg)->height*ME_CAST_TO_IPLIMAGE(cvImg)->widthStep-1; i >= 0; --i) + { + if ((ImageData[i] >= 128) && (DstData[i] >= 128)) + { + Result = (float)ImageData[i]/128*(float)DstData[i]/128; + + if (Result >= 1) + { + ImageData[i] = 255; + } else { + ImageData[i] = 0; + } + } else { + ImageData[i] = 0; + } + } + break; + + case m_Neighbourhood: + TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + ImageData2 = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + DstData = source.GetImageData(); + ImageData3 = (unsigned char*)TempImg->imageData; + + for (int y = ME_CAST_TO_IPLIMAGE(cvImg)->height-1; y >= 0; --y) + for (int x = ME_CAST_TO_IPLIMAGE(cvImg)->width-1; x >= 0; --x) + for (int l = ME_CAST_TO_IPLIMAGE(cvImg)->nChannels-1; l >= 0; --l) + { + if (((DstData[y*ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+ + x*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+l] == 255) || + (ImageData2[y*ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+ + x*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+l] == 255)) && + (NeighbourhoodCounter(x-2, y-2, n_5x5) > 3) && + (source.NeighbourhoodCounter(x-2, y-2, n_5x5) > 3)) + { + ImageData3[y*ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+ + x*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+l] = 255; + } + } + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; + break; + + default: + break; + } +} + + +void MEImage::Addition(MEImage& source, AdditionType mode) +{ + if (source.GetWidth() != ME_CAST_TO_IPLIMAGE(cvImg)->width || + source.GetHeight() != ME_CAST_TO_IPLIMAGE(cvImg)->height || + source.GetLayers() != ME_CAST_TO_IPLIMAGE(cvImg)->nChannels) + { + printf("Image properties are different.\n"); + return; + } + unsigned char* ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + unsigned char* DstData = source.GetImageData(); + + switch (mode) + { + case a_Average: + for (int i = ME_CAST_TO_IPLIMAGE(cvImg)->height*ME_CAST_TO_IPLIMAGE(cvImg)->widthStep-1; i >= 0; --i) + { + ImageData[i] = (ImageData[i]+DstData[i]) / 2; + } + break; + + case a_Union: + for (int i = ME_CAST_TO_IPLIMAGE(cvImg)->height*ME_CAST_TO_IPLIMAGE(cvImg)->widthStep-1; i >= 0; --i) + { + if (DstData[i] > ImageData[i]) + { + ImageData[i] = DstData[i]; + } + } + break; + + default: + break; + } +} + + +void MEImage::EliminateSinglePixels() +{ + IplImage* TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + unsigned char* ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + unsigned char* DstData = (unsigned char*)TempImg->imageData; + int sum = 0; + int xy = 0; + int ywidth = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep; + + for (int y = ME_CAST_TO_IPLIMAGE(cvImg)->height-1; y >= 0; --y) + for (int x = ME_CAST_TO_IPLIMAGE(cvImg)->width-1; x >= 0; --x) + { + xy = y*ywidth+x*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels; + + for (int l = ME_CAST_TO_IPLIMAGE(cvImg)->nChannels-1; l >= 0; --l) + { + if ((ImageData[xy+l] > 0) && (x > 0) && (y > 0) && (x < ME_CAST_TO_IPLIMAGE(cvImg)->width-1) && (y < ME_CAST_TO_IPLIMAGE(cvImg)->height-1)) + { + sum = (ImageData[xy-ywidth-ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+l] > 0)+ + (ImageData[xy-ywidth+l] > 0)+ + (ImageData[xy-ywidth+ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+l] > 0)+ + (ImageData[xy-ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+l] > 0)+ + (ImageData[xy+ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+l] > 0)+ + (ImageData[xy+ywidth-ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+l] > 0)+ + (ImageData[xy+ywidth+l] > 0)+ + (ImageData[xy+ywidth+ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+l] > 0); + + if (sum > 3) + { + DstData[xy+l] = 255; + } else { + DstData[xy+l] = 0; + } + } else { + DstData[xy+l] = 0; + } + } + } + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; +} + + +float MEImage::DifferenceAreas(MEImage& reference, int difference) const +{ + if (reference.GetWidth() != GetWidth() || + reference.GetHeight() != GetHeight() || + reference.GetLayers() != GetLayers()) + { + printf("Image dimensions or channels are different\n"); + return -1.0; + } + float PixelDiff = 0.0; + int Pixels = 0; + unsigned char* OrigImgData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + unsigned char* RefImgData = reference.GetImageData(); + int WidthStep = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep; + int RowStart = 0; + + for (int y = ME_CAST_TO_IPLIMAGE(cvImg)->height-1; y >= 0; --y) + { + for (int x = ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels-1; x >= 0; --x) + { + if (abs(OrigImgData[RowStart+x]-RefImgData[RowStart+x]) > difference) + Pixels++; + } + RowStart += WidthStep; + } + PixelDiff = (float)Pixels / (ME_CAST_TO_IPLIMAGE(cvImg)->height*ME_CAST_TO_IPLIMAGE(cvImg)->widthStep)*100; + return PixelDiff; +} + + +int MEImage::AverageDifference(MEImage& reference) const +{ + if (reference.GetWidth() != GetWidth() || + reference.GetHeight() != GetHeight() || + reference.GetLayers() != GetLayers()) + { + printf("Image dimensions or channels are different\n"); + return -1; + } + int Difference = 0; + unsigned char* OrigImgData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + unsigned char* RefImgData = reference.GetImageData(); + int WidthStep = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep; + int RowStart = 0; + + for (int y = ME_CAST_TO_IPLIMAGE(cvImg)->height-1; y >= 0; --y) + { + for (int x = ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels-1; x >= 0; --x) + { + Difference += abs(OrigImgData[RowStart+x]-RefImgData[RowStart+x]); + } + RowStart += WidthStep; + } + Difference = Difference / (ME_CAST_TO_IPLIMAGE(cvImg)->height*ME_CAST_TO_IPLIMAGE(cvImg)->widthStep); + return Difference; +} + + +void MEImage::Minimum(MEImage& image) +{ + if (image.GetWidth() != ME_CAST_TO_IPLIMAGE(cvImg)->width || + image.GetHeight() != ME_CAST_TO_IPLIMAGE(cvImg)->height || + image.GetLayers() != ME_CAST_TO_IPLIMAGE(cvImg)->nChannels) + { + printf("Image properties are different\n"); + return; + } + unsigned char* ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + unsigned char* SecData = image.GetImageData(); + int WidthStep = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep; + int RowStart = 0; + + for (int y = ME_CAST_TO_IPLIMAGE(cvImg)->height-1; y >= 0; --y) + { + for (int x = ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels-1; x >= 0; --x) + { + ImageData[RowStart+x] = ImageData[RowStart+x] > SecData[RowStart+x] ? + SecData[RowStart+x] : ImageData[RowStart+x]; + } + RowStart += WidthStep; + } +} + + +float MEImage::AverageBrightnessLevel() const +{ + unsigned char* ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + int WidthStep = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep; + int RowStart = 0; + int BrightnessLevel = 0; + + for (int y = ME_CAST_TO_IPLIMAGE(cvImg)->height-1; y >= 0; --y) + { + for (int x = ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels-1; x >= 0; --x) + { + BrightnessLevel += (int)ImageData[RowStart+x]; + } + RowStart += WidthStep; + } + return BrightnessLevel / (GetWidth()*GetHeight()*GetLayers()); +} + + +bool MEImage::Equal(const MEImage& reference) const +{ + return Equal(reference, 1); +} + + +bool MEImage::Equal(const MEImage& reference, int maxabsdiff) const +{ + bool Ret = true; + + if (reference.GetWidth() != ME_CAST_TO_IPLIMAGE(cvImg)->width || + reference.GetHeight() != ME_CAST_TO_IPLIMAGE(cvImg)->height || + reference.GetLayers() != ME_CAST_TO_IPLIMAGE(cvImg)->nChannels) + { + printf("Image properties are different\n"); + return false; + } + unsigned char* ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + unsigned char* RefData = reference.GetImageData(); + int WidthStep = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep; + int RowStart = 0; + + for (int y = ME_CAST_TO_IPLIMAGE(cvImg)->height-1; y >= 0; --y) + { + for (int x = ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels-1; x >= 0; --x) + { + if (abs(ImageData[RowStart+x]-RefData[RowStart+x]) >= maxabsdiff) + { + Ret = false; + return Ret; + } + } + RowStart += WidthStep; + } + return Ret; +} + + +unsigned char MEImage::GrayscalePixel(int x, int y) const +{ + int NewX = x; + int NewY = y; + + NewX = NewX < 0 ? 0 : NewX; + NewX = NewX > ME_CAST_TO_IPLIMAGE(cvImg)->width-1 ? ME_CAST_TO_IPLIMAGE(cvImg)->width-1 : NewX; + NewY = NewY < 0 ? 0 : NewY; + NewY = NewY > ME_CAST_TO_IPLIMAGE(cvImg)->height-1 ? ME_CAST_TO_IPLIMAGE(cvImg)->height-1 : NewY; + + float Sum = 0; + unsigned char* ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + + for (int l = 0; l < ME_CAST_TO_IPLIMAGE(cvImg)->nChannels; l++) + { + Sum = Sum + (int)ImageData[NewY*ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+NewX*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+l]; + } + Sum = Sum / ME_CAST_TO_IPLIMAGE(cvImg)->nChannels; + return (unsigned char)(Sum); +} + + +int MEImage::NeighbourhoodCounter(int startx, int starty, + NeighbourhoodType neighbourhood) const +{ + int IterX = 0; + int IterY = 0; + int Counter = 0; + + // Determine the iteration numbers + switch (neighbourhood) + { + case n_2x2: + IterX = 2; + IterY = 2; + break; + + case n_3x3: + IterX = 3; + IterY = 3; + break; + + case n_3x2: + IterX = 2; + IterY = 3; + break; + + case n_5x5: + IterX = 5; + IterY = 5; + break; + + case n_7x7: + IterX = 7; + IterY = 7; + break; + + default: + IterX = 3; + IterY = 3; + break; + } + + int NewStartX = startx ; + int NewStartY = starty; + + NewStartX = startx < 0 ? 0 : startx; + NewStartX = startx >= ME_CAST_TO_IPLIMAGE(cvImg)->width-IterX ? ME_CAST_TO_IPLIMAGE(cvImg)->width-IterX-1 : startx; + NewStartY = starty < 0 ? 0 : starty; + NewStartY = starty >= ME_CAST_TO_IPLIMAGE(cvImg)->height-IterY ? ME_CAST_TO_IPLIMAGE(cvImg)->height-IterY-1 : starty; + + int Value = 0; + unsigned char* ImageData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + + for (int x = NewStartX; x < NewStartX+IterX; x++) + for (int y = NewStartY; y < NewStartY+IterY; y++) + { + Value = ((int)ImageData[y*ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+x*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels]+ + (int)ImageData[y*ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+x*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+1]+ + (int)ImageData[y*ME_CAST_TO_IPLIMAGE(cvImg)->width*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+x*ME_CAST_TO_IPLIMAGE(cvImg)->nChannels+2]) / 3; + + if (Value == 255) + { + Counter++; + } + } + return Counter; +} + + +void MEImage::GradientVector(bool smooth, int x, int y, int mask_size, int& result_x, int& result_y) +{ + int Results[8]; + int DiagonalMaskSize = (int)((float)mask_size / sqrt(2)); + + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels > 1) + { + ConvertToGrayscale(g_OpenCV); + } + if (smooth) + { + SmoothAdvanced(s_Gaussian, mask_size*3-(mask_size*3-1) % 2); + } + + Results[0] = (int)GrayscalePixel(x,y)-(int)GrayscalePixel(x,y-mask_size); + Results[1] = (int)GrayscalePixel(x,y)-(int)GrayscalePixel(x+DiagonalMaskSize,y-DiagonalMaskSize); + Results[2] = (int)GrayscalePixel(x,y)-(int)GrayscalePixel(x+mask_size,y); + Results[3] = (int)GrayscalePixel(x,y)-(int)GrayscalePixel(x+DiagonalMaskSize,y+DiagonalMaskSize); + Results[4] = (int)GrayscalePixel(x,y)-(int)GrayscalePixel(x,y+mask_size); + Results[5] = (int)GrayscalePixel(x,y)-(int)GrayscalePixel(x-DiagonalMaskSize,y+DiagonalMaskSize); + Results[6] = (int)GrayscalePixel(x,y)-(int)GrayscalePixel(x-mask_size,y); + Results[7] = (int)GrayscalePixel(x,y)-(int)GrayscalePixel(x+DiagonalMaskSize,y-DiagonalMaskSize); + + result_x = (DiagonalMaskSize*Results[1]+mask_size*Results[2]+ + DiagonalMaskSize*Results[3]-DiagonalMaskSize*Results[5]- + mask_size*Results[6]+DiagonalMaskSize*Results[7]) / 256; + result_y = (-mask_size*Results[0]-DiagonalMaskSize*Results[1]+ + DiagonalMaskSize*Results[3]+mask_size*Results[4]+ + DiagonalMaskSize*Results[5]-DiagonalMaskSize*Results[7]) / 256; +} + + +void MEImage::GradientVisualize(int vector_x, int vector_y) +{ + if (vector_x <= 0) + { + printf("vectorx: wrong parameter (%d <= 0)\n", vector_x); + return; + } + if (vector_y <= 0) + { + printf("vectory: wrong parameter (%d <= 0)\n", vector_y); + return; + } + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels > 1) + { + ConvertToGrayscale(g_OpenCV); + } + + int masksize = (ME_CAST_TO_IPLIMAGE(cvImg)->width < ME_CAST_TO_IPLIMAGE(cvImg)->height) ? + ME_CAST_TO_IPLIMAGE(cvImg)->width / (vector_x+1) : + ME_CAST_TO_IPLIMAGE(cvImg)->height / (vector_y+1); + + SmoothAdvanced(s_Gaussian, masksize*2-1); + for (int i = 1; i < vector_x; i++) + for (int i1 = 1; i1 < vector_y; i1++) + { + int Resultx = 0, Resulty = 0; + int x = (int)(((float)ME_CAST_TO_IPLIMAGE(cvImg)->width*i / (vector_x))); + int y = (int)(((float)ME_CAST_TO_IPLIMAGE(cvImg)->height*i1 / (vector_y))); + + GradientVector(false, x, y, (int)(0.707*masksize), Resultx, Resulty); + + CvPoint Point1; + CvPoint Point2; + + Point1.x = x-Resultx / 2; + Point1.y = y-Resulty / 2; + Point2.x = x+Resultx / 2; + Point2.y = y+Resulty / 2; + cvLine(ME_CAST_TO_IPLIMAGE(cvImg), Point1, Point2, CV_RGB(255, 255, 255), 1, 8); + } +} + + +bool MEImage::_Copy(const MEImage& other_image) +{ + if (&other_image == this) + return true; + + if (ME_CAST_TO_IPLIMAGE(cvImg)) + { + ME_RELEASE_IPLIMAGE(cvImg); + } + cvImg = cvCloneImage((IplImage*)other_image.GetIplImage()); + return true; +} + + +void MEImage::_Init(int width, int height, int layers) +{ + if (width < 1) + { + printf("Given width for the new image is too small (%d <= 0)\n", width); + return; + } + if (height < 1) + { + printf("Given height for the new image is (%d <= 0)\n", height); + return; + } + if ((layers != 1) && (layers != 3)) + { + printf("Only one or three (%d != 1 or 3) layer allowed\n", layers); + return; + } + + if (ME_CAST_TO_IPLIMAGE(cvImg)) + { + ME_RELEASE_IPLIMAGE(cvImg); + } + cvImg = cvCreateImage(cvSize(width, height), 8, layers); +} + + +void MEImage::ComputeColorSpace(ColorSpaceConvertType mode) +{ + if (ME_CAST_TO_IPLIMAGE(cvImg)->nChannels != 3) + { + printf("Image has to have three color channels (%d != 3)\n", ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + return; + } + IplImage* TempImg = cvCreateImage(cvSize(ME_CAST_TO_IPLIMAGE(cvImg)->width, ME_CAST_TO_IPLIMAGE(cvImg)->height), 8, + ME_CAST_TO_IPLIMAGE(cvImg)->nChannels); + + for (int i = 0; i < 3; i++) + for (int i1 = 0; i1 < 3; i1++) + { + if (mode == csc_RGBtoYUV) + TransformMatrix[i][i1] = RGBtoYUVMatrix[i][i1]; + if (mode == csc_RGBtoYIQ) + TransformMatrix[i][i1] = RGBtoYIQMatrix[i][i1]; + } + float x = 0.0; + float y = 0.0; + float z = 0.0; + float xmin = 0.0; + float xmax = 0.0; + float ymin = 0.0; + float ymax = 0.0; + float zmin = 0.0; + float zmax = 0.0; + + if (mode == csc_RGBtoYUV) + { + xmin = 0.0; + xmax = 255.0; + ymin = -111.18; + ymax = 111.18; + zmin = -156.825; + zmax = 156.825; + } + if (mode == csc_RGBtoYIQ) + { + xmin = 0.0; + xmax = 255.0; + ymin = -151.98; + ymax = 151.98; + zmin = -133.365; + zmax = 133.365; + } + unsigned char* SrcData = (unsigned char*)ME_CAST_TO_IPLIMAGE(cvImg)->imageData; + unsigned char* DstData = (unsigned char*)TempImg->imageData; + + for (int i = ME_CAST_TO_IPLIMAGE(cvImg)->widthStep*ME_CAST_TO_IPLIMAGE(cvImg)->height-1; i >= 0; i-=3) + { + x = (float)SrcData[i]*TransformMatrix[0][0]+ + (float)SrcData[i+1]*TransformMatrix[0][1]+ + (float)SrcData[i+2]*TransformMatrix[0][2]; + y = (float)SrcData[i]*TransformMatrix[1][0]+ + (float)SrcData[i+1]*TransformMatrix[1][1]+ + (float)SrcData[i+2]*TransformMatrix[1][2]; + z = (float)SrcData[i]*TransformMatrix[2][0]+ + (float)SrcData[i+1]*TransformMatrix[2][1]+ + (float)SrcData[i+2]*TransformMatrix[2][2]; + + x = xmax-xmin != 0.0 ? 255.0 : (x-xmin) / (xmax-xmin)*255.0; + y = ymax-ymin != 0.0 ? 255.0 : (y-xmin) / (ymax-ymin)*255.0; + z = zmax-zmin != 0.0 ? 255.0 : (z-xmin) / (zmax-zmin)*255.0; + + DstData[i] = (unsigned char)MEBound(0, (int)x, 255); + DstData[i+1] = (unsigned char)MEBound(0, (int)y, 255); + DstData[i+2] = (unsigned char)MEBound(0, (int)z, 255); + } + ME_RELEASE_IPLIMAGE(cvImg); + cvImg = TempImg; +} diff --git a/package_bgs/ck/MEImage.hpp b/package_bgs/ck/MEImage.hpp new file mode 100644 index 0000000..41ada3b --- /dev/null +++ b/package_bgs/ck/MEImage.hpp @@ -0,0 +1,999 @@ +/* + * This file is part of the AiBO+ project + * + * Copyright (C) 2005-2013 Csaba Kertész (csaba.kertesz@gmail.com) + * + * AiBO+ is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * AiBO+ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef MEImage_H +#define MEImage_H + +/** + * @addtogroup mindeye + * @{ + */ + +/** + * MEImage + * @brief Basic image functions + */ +class MEImage +{ +public: + /// Types of LBP operator + typedef enum { + lbp_Min = 0, /*!< Minimum value */ + lbp_Normal = lbp_Min, /*!< Normal LBP pattern */ + lbp_Special, /*!< Special LBP pattern */ + lbp_Max = lbp_Special /*!< Maximum value */ + } LBPType; + + /// Types of image subtraction + typedef enum { + sub_Min = 0, /*!< Minimum value */ + sub_Normal = sub_Min, /*!< Normal */ + sub_Absolut, /*!< Absolut */ + sub_Max = sub_Absolut /*!< Maximum value */ + } SubtractModeType; + + /// Types of image addition + typedef enum { + a_Min = 0, /*!< Minimum value */ + a_Average = a_Min, /*!< Average */ + a_Union, /*!< Union */ + a_Max = a_Union /*!< Maximum value */ + } AdditionType; + + /// Types of image multiplication + typedef enum { + m_Min = 0, /*!< Minimum value */ + m_Normal = m_Min, /*!< Normal */ + m_Neighbourhood, /*!< Neighbourhood */ + m_Max = m_Neighbourhood /*!< Maximum value */ + } MultiplicationType; + + /// Types of grayscale conversation + typedef enum { + g_Min = 0, /*!< Minimum value */ + g_Average = g_Min, /*!< Average */ + g_OpenCV, /*!< OpenCV */ + g_Max = g_OpenCV /*!< Maximum value */ + } GrayscaleType; + + /// Types of pixel neighbourhoods + typedef enum { + n_Min = 0, /*!< Minimum value */ + n_2x2 = n_Min, /*!< 2x2 */ + n_3x2, /*!< 3x2 */ + n_3x3, /*!< 3x3 */ + n_5x5, /*!< 5x5 */ + n_7x7, /*!< 7x7 */ + n_Max = n_7x7 /*!< Maximum value */ + } NeighbourhoodType; + + /// Types of special pixels + typedef enum { + p_Min = 0, /*!< Minimum value */ + p_Minimum = p_Min, /*!< Minimum */ + p_Maximum, /*!< Maximum */ + p_Counter, /*!< Counter */ + p_Max = p_Counter /*!< Maximum value */ + } PixelType; + + /// Types of smooth operation + typedef enum { + s_Min = 0, /*!< Minimum value */ + s_Blur = s_Min, /*!< Blur */ + s_Gaussian, /*!< Gaussian */ + s_Median, /*!< Medium */ + s_Max = s_Median /*!< Maximum value */ + } SmoothType; + + /// Types of color space conversions + typedef enum { + csc_Min = 0, /*!< Minimum value */ + csc_RGBtoXYZCIED65 = csc_Min, /*!< RGB to XYZCIED65 */ + csc_XYZCIED65toRGB, /*!< XYZCIED65 to RGB */ + csc_RGBtoHSV, /*!< RGB to HSV */ + csc_HSVtoRGB, /*!< HSV to RGB */ + csc_RGBtoHLS, /*!< RGB to HLS */ + csc_HLStoRGB, /*!< HLS to RGB */ + csc_RGBtoCIELab, /*!< RGB to CIELab */ + csc_CIELabtoRGB, /*!< CIELab to RGB */ + csc_RGBtoCIELuv, /*!< RGB to CIELuv */ + csc_CIELuvtoRGB, /*!< CIELuv to RGB */ + csc_RGBtoYUV, /*!< RGB to YUV */ + csc_RGBtoYIQ, /*!< RGB to YIQ */ + csc_RGBtorgI, /*!< RGB to rgI */ + csc_Max = csc_RGBtorgI /*!< Maximum value */ + } ColorSpaceConvertType; + + /*! + * @brief Class constructor + * + * @param width Image width + * @param height Image height + * @param layers Layers + * + * Class constructor with the possibility to specify the image width, + * height and the layers. The default options are 16x16x1. + * + */ + + MEImage(int width = 16, int height = 16, int layers = 1); + + /*! + * @brief Class constructor + * + * @param other Other image + * + * Class constructor with the possibility to specify the image width, + * height and the layers. The default options are 16x16x1. + * + */ + + MEImage(const MEImage& other); + /// Destructor of class + ~MEImage(); + + /* + ------------------------------------------------------------------- + Basic functions + ------------------------------------------------------------------- + */ + + /*! + * @brief Clear image + * + * This function clears image by filling all image data with zero + * value. + * + */ + + void Clear(); + + /*! + * @brief Get an color layer of image + * + * @param new_layer new image of layer + * @param layernumber number of layer which will be copied + * + * Copy an image layer (R, G or B) to @a new_layer image. @a new_layer has to + * have only one color layer (greyscale). If @a new_layer is not + * greyscale or it has got different width or height like source image + * than function reallocates it with appropriate features before + * copying image data. + * + */ + + void GetLayer(MEImage& new_layer, int layernumber) const; + + /*! + * @brief Copy a new color layer to image + * + * @param new_layer image data of new color layer + * @param layernumber number of layer where image data will copy + * + * Copy a new image layer from @a new_layer image. @a new_layer has to + * have only one color layer (greyscale). If @a new_layer is not + * greyscale or it has got different width or height like source image + * than function halts with an error message. + * + */ + + void SetLayer(MEImage& new_layer, int layernumber); + + /*! + * @brief Copy image data to a pointer + * + * @param data pointer where image data will be copied + * + * Function in order to acquire image data to an external + * (unsigned char*) pointer. + * + */ + + void CopyImageData(unsigned char* data); + + /*! + * @brief Get a pointer to the internal IplImage + * + * @return Pointer to the IplImage + * + * This function returns the internal IplImage of the class. The + * image data can not be modified. + * + */ + + void* GetIplImage() const; + + /*! + * @brief Set the internal IplImage + * + * @param image Pointer to the IplImage + * + * This function sets the internal IplImage of the class. + * + */ + + void SetIplImage(void* image); + + /*! + * @brief Handle operator == for MEImage + * + * @param image image to check + * + * @return true if the images are equal otherwise false. + * + * The operator checks the equality of two images. + * + */ + + bool operator==(const MEImage& image); + + /*! + * @brief Handle operator != for MEImage + * + * @param image image to check + * + * @return true if the images are not equal otherwise false. + * + * The operator checks the non-equality of two images. + * + */ + + bool operator!=(const MEImage& image); + + /*! + * @brief Handle operator = for MEImage + * + * @param other_image image to copy operation + * + * @return Reference to the actual instance. + * + * Copy image data to @a other_image image. Function calls only + * _Copy() directly. + * + */ + + MEImage& operator=(const MEImage& other_image); + + /*! + * @brief Get the width of the image + * + * @return Width of the image + * + * Get the width of the image. + * + */ + + int GetWidth() const; + + /*! + * @brief Get the height of the image + * + * @return Height of the image + * + * Get the height of the image. + */ + + int GetHeight() const; + + /*! + * @brief Get the length of a pixel row of the image + * + * @return Length of a pixel row + * + * Get the row width of the image. + * + */ + + int GetRowWidth() const; + + /*! + * @brief Get the number of color layers of the image + * + * @return Number of color layer of the image + * + * Get the number of color layer of the image. + * + */ + + int GetLayers() const; + + /*! + * @brief Get the number of the image pixel data + * + * @return Number of the image pixel data + * + * Get the number of the image pixel data. + * + */ + + int GetPixelDataNumber() const; + + /*! + * @brief Get the image data + * + * @return Pointer to the image data + * + * Get a pointer to the image. + * + */ + + unsigned char* GetImageData() const; + + /*! + * @brief Set the image data + * + * @param image_data New image data + * @param width New image width + * @param height New image height + * @param channels New image color channels + * + * Get a pointer to the image. + * + */ + + void SetData(unsigned char* image_data, int width, int height, int channels); + + /*! + * @brief Get ratio of image width and height + * + * @return float ratio of image dimensions + * + * Function calculates ratio of image width and height with + * following equation: ratio = height / width. + */ + + float GetRatio() const; + + /* + ------------------------------------------------------------------- + Basic image manipulation + ------------------------------------------------------------------- + */ + + /*! + * @brief Reallocate image data + * + * @param width New width of the image + * @param height New height of the image + * + * Image data will be reallocated with new dimensions @a width + * and @a height. Number of color channels is not changed. + * + */ + + void Realloc(int width, int height); + + /*! + * @brief Reallocate image data + * + * @param width New width of the image + * @param height New height of the image + * @param layers Number of color channels of the image + * + * Image data will be reallocated with new dimensions @a width, + * @a height and new number of color channels @a layers. + * + */ + + void Realloc(int width, int height, int layers); + + /*! + * @brief Resize image + * + * @param newwidth new width of image + * @param newheight new height of image + * + * Resize image to @a newwidth width and @a newheight + * height dimensions. + * + */ + + void Resize(int newwidth, int newheight); + + /*! + * @brief Resize image with new width + * + * @param newwidth new width of image + * + * Image is resized with only new width information therefore + * fit to original ratio. + * + */ + + void ResizeScaleX(int newwidth); + + /*! + * @brief Resize image with new height + * + * @param newheight new height of image + * + * Image is resized with only new height information therefore + * fit to original ratio. + * + */ + + void ResizeScaleY(int newheight); + + /*! + * @brief Reverse image in horizontal direction + * + * Function makes a mirror transformation on image in horizontal + * direction. + * + */ + + void MirrorHorizontal(); + + /*! + * @brief Reverse image in vertical direction + * + * Function makes a mirror transformation on image in vertical + * direction. + * + */ + + void MirrorVertical(); + + /*! + * @brief Crop image + * + * @param x1, y1 coordinates of top-left point of rectangle + * @param x2, y2 coordinates of bottom-right point of rectangle + * + * Crop the image in a smaller piece whose dimensions are + * specified as a rectangle. Top-left and bottom-right + * coordinates of rectangle are (x1, y1) and (x2, y2) wherefrom + * comes that the width of the new image is x2-x1 and height is + * y2-y1. + * + */ + + void Crop(int x1, int y1, int x2, int y2); + + /*! + * @brief Copy all image data from an other picture + * + * @param x0 x coordinate to paste the new image data + * @param y0 y coordinate to paste the new image data + * @param source_image source image + * + * Function copies all image data from @a source_image + * to the given coordinate (x0,y0). + * + */ + + void CopyImageInside(int x0, int y0, MEImage& source_image); + + /* + ------------------------------------------------------------------- + Image processing functions + ------------------------------------------------------------------- + */ + + /*! + * @brief Erode function + * + * @param iterations iterations of erode method + * + * Method makes an erode filter on an image @a iterations + * times with standard 3x3 matrix size. + * + */ + + void Erode(int iterations); + + /*! + * @brief Dilate function + * + * @param iterations iterations of dilate method + * + * Method makes an dilate filter on an image + * @a iterations times with standard 3x3 matrix size. + * + */ + + void Dilate(int iterations); + + /*! + * @brief Smooth function + * + * Method smooths with median filter and standard 3x3 matrix size. + * (Median filter works fine and fast.) + * + */ + + void Smooth(); + + /*! + * @brief Smooth function with defined parameters + * + * @param filtermode type of smooth method + * @param filtersize the size of the convolution matrix + * + * Method smooths with median filter and the given matrix + * size (@a filtersize x @a filtersize). There are more + * types of smooth function (@a filtermode): + * + * - s_Blur: Blur filter. + * - s_Gaussian: Gaussian filter. + * - s_Median: Median filter. + * + */ + + void SmoothAdvanced(SmoothType filtermode, int filtersize); + + /*! + * @brief Canny function + * + * Canny operator is usable for edge detection. Function makes + * this operation with standard 3x3 matrix + * size. Canny has two threshold value which are set to zero + * in this function by default. + * + */ + + void Canny(); + + /*! + * @brief Laplace function + * + * Laplace operator is usable for edge detection like Canny. + * This function makes a laplace filter with + * standard 3x3 matrix size. After calculating destination image will + * be converted from 16 bit back to 8 bit. + * + */ + + void Laplace(); + + /*! + * @brief Image quantisation + * + * @param levels level of quantisation + * + * Quantize an image with @a levels level. It means by 16 + * level color range 0-255 quantizes to 0-15, by 4 level to 0-63 etc. + * + */ + + void Quantize(int levels); + + /*! + * @brief Threshold a picture + * + * @param threshold_limit limit for threshold + * + * Threshold an image with @a threshold_limit limit. Value range + * of @a threshold_limit is between 0-255. E.g. by value 160 functions + * will eliminate all color values under 160 with black color + * (color value zero). + * + */ + + void Threshold(int threshold_limit); + + /*! + * @brief Adaptive threshold function + * + * This function does adaptive threshold function. + * + */ + + void AdaptiveThreshold(); + + /*! + * @brief Threshold a picture by a mask image + * + * @param mask_image mask image for thresholding + * + * Threshold an image with a mask image @a mask_image. + * + */ + + void ThresholdByMask(MEImage& mask_image); + + /*! + * @brief Convert an image into a new color space + * + * @param transformation Definition of color transformation + * + * This function converts an image from a specified color space + * to an other. + * Current supported conversions (@a transformation): + * - csc_RGBtoXYZCIED65: RGB to XYZ (D65 reference light), + * - csc_XYZCIED65toRGB: XYZ to RGB (D65 reference light), + * - csc_RGBtoHSV: RGB to HSV, + * - csc_HSVtoRGB: HSV to RGB, + * - csc_RGBtoHLS: RGB to HSV, + * - csc_HLStoRGB: HSV to RGB, + * - csc_RGBtoCIELab: RGB to CIELab, + * - csc_CIELabtoRGB: CIELuv to RGB, + * - csc_RGBtoCIELuv: RGB to CIELuv, + * - csc_CIELuvtoRGB: CIELuv to RGB, + * - csc_RGBtoYUV: RGB to YUV color space, + * - csc_RGBtoYIQ: RGB to YIQ color space. + * + */ + + void ColorSpace(ColorSpaceConvertType transformation); + + /*! + * @brief Convert an image to grayscale + * + * @param grayscale_mode mode of grayscale conversation + * + * The function converts the image to grayscale version + * (one color channel after the conversion). There is four + * different ways to convert the image to grayscale what we + * can define with @a grayscale_mode: + * + * - g_Average: It computes the average grayscale + * values of the pixels with arithmetical average. + * - g_OpenCV: It computes the average grayscale + * values by help of the values of the Y channel. + * + */ + + void ConvertToGrayscale(GrayscaleType grayscale_mode = g_OpenCV); + + /*! + * @brief Convert a grayscale image to RGB + * + * The function converts the grayscale image to RGB version. + * (It copies the info from a single color channel to + * three color channel.) + * + */ + + void ConvertGrayscaleToRGB(); + + /*! + * @brief Change the red and blue components of every pixels + * + * Function changes the red component with the blue of + * every pixels. (Simple conversion from RGB->BGR.) + * + */ + + void ConvertBGRToRGB(); + + /*! + * @brief Compute an LBP filter on the image + * + * @param mode The LBP operator type + * + * The function converts the image to binary version over the + * threshold value. + * + */ + + void LBP(LBPType mode = lbp_Special); + + /*! + * @brief Binarize an image + * + * @param threshold Threshold value + * + * The function converts the image to binary version over the + * threshold value. + * + */ + + void Binarize(int threshold); + + /*! + * @brief Subtract an image from the internal picture + * + * @param source Source image for subtraction + * @param mode Calculation mode of difference feature + * + * Function generates a difference image between two image: + * the internal picture of this class and @a source_image. + * The calculation mode is determined by @a mode parameter. + * Function supports the following modes: + * + * - sub_Normal: Simple subtraction between each + * correspondent pixel (per color channels). The result values + * are converted to absolute value and normalized to + * range 0-255. + * + */ + + void Subtract(MEImage& source, SubtractModeType mode); + + /*! + * @brief Multiple an image with the internal picture + * + * @param source Second source image for multiplication + * @param mode Multiplication mode + * + * Function multiples an image with the internal image of this class and + * the result is stored in the internal image. The implemented calculation + * modes: + * + * - m_Normal: It multiples the corresponding pixel values + * of the two images. The original pixel values are divided by 128 and + * multiplied together. If the result is at least 1 then the new pixel value + * is 255 otherwise 0. + * - m_Neighbourhood: It multiples all pixel values of its + * 3x3 neighbourhood separately (see the method at MULTIPLICATION_NORMAL) + * and the new pixel value is 255 if at least two pixel is active in the + * 3x3 neighbourhood otherwise 0. + * + */ + + void Multiple(MEImage& source, MultiplicationType mode); + + /*! + * @brief Addition of an image and the internal picture + * + * @param source second source image for addition method + * @param mode the declaration of the used addition mode + * + * Function makes an addition operation between an image and the internal + * image of this class and the result is stored in the internal image. + * Supported modes: + * + * - a_Average: It sums the average of the corresponding pixels + * of each pictures. + * - a_Union: It sums the union of the corresponding pixels + * of each pictures. + * + */ + + void Addition(MEImage& source, AdditionType mode); + + /*! + * @brief Eliminate the single pixels from a binary image + * + * Function eliminates such a pixels which do not have neighbour pixels with + * 255 value in a 3x3 neighbourhood. The image should be converted to binary + * version. + * + */ + + void EliminateSinglePixels(); + + /*! + * @brief Calculate an area difference feature between two images + * + * @param reference Reference image + * @param difference Difference + * + * @return The percentage of image areas representing the conditions + * + * Function calculates a similarity feature between two pictures. + * Counts the number of the pixels whose intensity difference is + * higher than @a difference. (Range: 0..100) + * + */ + + float DifferenceAreas(MEImage& reference, int difference) const; + + /*! + * @brief Calculate an average difference between two images + * + * @param reference Reference image + * + * @return Average difference of the pixels + * + * Function calculates a similarity feature between + * two images. It returns a simple sum of the absolute difference + * of each pixel in the two images and averaged by the pixel number. + * (Range: 0..255) + * + */ + + int AverageDifference(MEImage& reference) const; + + /*! + * @brief Calculate minimum of image data + * + * @param image Second image + * + * Function calculates the minimum of current and given image. + * + */ + + void Minimum(MEImage& image); + + /*! + * @brief Calculate average brightness level + * + * @return Brightness level in range 0-255. + * + * Function calculates the average brightness level of the image. + * + */ + + float AverageBrightnessLevel() const; + + /*! + * @brief Check the equalization with a reference image + * + * @param reference Reference image + * + * @return true in case of binary equalization, otherwise false. + * + * Function calculates the binary difference between + * the image and the reference image. + * + */ + + bool Equal(const MEImage& reference) const; + + /*! + * @brief Check the equalization with a reference image + * + * @param reference Reference image + * @param maxabsdiff Maximal absolute difference + * + * @return true in case of equalization, otherwise false. + * + * Function checks the difference between the image and + * the reference image. Two pixels are equal in a range of + * a maximal absolute difference. + * + */ + + bool Equal(const MEImage& reference, int maxabsdiff) const; + + /*! + * @brief Get the grayscale value of a pixel + * + * @param x X coordinate of the pixel + * @param y Y coordinate of the pixel + * + * @return grayscale value of the pixel + * + * The method gives the grayscale value of a pixel back. If + * the image has 3 color channels (e.g. RGB) then Y value of + * YIQ/YUV color space will be calculated otherwise normal + * averaged grayscale value. + * + */ + + unsigned char GrayscalePixel(int x, int y) const; + + /*! + * @brief Count the number of neighbourhood pixels with maximum intensity + * + * @param startx X coordinate of the top-left pixel + * @param starty Y coordinate of the top-left pixel + * @param neighbourhood Specific subset of pixels + * + * @return number of the pixels with maximum intensity. + * + * The method counts the number of the pixels with maximum + * intensity (255) in a specified subset of pixels. + * The grayscale values of the pixels are used in the counter + * process. The following neighbourhood forms are allowed with + * the @a neighbourhood parameter: + * + * - n_2X2: Simple 2x2 matrix. + * - n_3X3: Simple 3x3 matrix. + * - n_3x2: Simple 3x2 matrix. + * + */ + + int NeighbourhoodCounter(int startx, int starty, NeighbourhoodType neighbourhood) const; + + /*! + * @brief Calculate the gradient vector in a point + * + * @param smooth compute smooth filter + * @param x X coordinate of the point + * @param y Y coordinate of the point + * @param mask_size The mask size to calculate the gradient + * + * @param result_x X component of the calculated vector + * @param result_y Y component of the calculated vector + * + * The method calculates the gradient vector in a given point. + * The image is preprocessed with a Gauss filter to smooth the + * image content. The filter size of the Gauss filter depends on + * mask size of the gradient vector: filter size = mask size*3. + * Eight points are assigned to the initial point to compute + * a vector sum: (x, y-mask_size), (x+mask_size/√2, y-mask_size/√2), + * (x+mask_size, y), (x+mask_size/√2, y+mask_size/√2), (x, y+mask_size), + * (x-mask_size/√2, y+mask_size/√2), (x-mask_size, y), (x-mask_size/√2, y-mask_size/√2). + * The lengths of all vectors equalize with the mask size. + * After that each vector is multiplied with the gradient difference between + * its two end points. The results are summarized and normalized by + * the mask size. + * + */ + + void GradientVector(bool smooth, int x, int y, int mask_size, int& result_x, int& result_y); + + /*! + * @brief Visualize gradient vectors + * + * @param vector_x Number of points horizontally + * @param vector_y Number of points vertically + * + * This function draws a wire (@a vector_x * @a vector_y) with + * gradient vectors. + * + */ + + void GradientVisualize(int vector_x, int vector_y); + +private: + + /* + ------------------------------------------------------------------- + Internal methods + ------------------------------------------------------------------- + */ + + /*! + * @brief Copy image data + * + * @param other_image Input image with new image data + * + * @return true if it is successful, otherwise false. + * + * Copy image data from @a other_image to MEImage image data. + * + */ + + bool _Copy(const MEImage& other_image); + + /*! + * @brief Inherent initialization function + * + * @param width Width of the image + * @param height Height of the image + * @param layer Number of color channels of the image + * + * Initialization function of MEImage class which allocates + * memory to internal MEImage image and sets its properties. + * + */ + + void _Init(int width, int height, int layer); + + /*! + * @brief Compute an image to a different color space + * + * @param mode Mode of the conversion + * + * Currently, the internal function allows to use a few + * mode to convert an image between color spaces. + * Current supported conversions (@a mode): + * - RGBtoYUV: RGB to YUV color space, + * - RGBtoYIQ: RGB to YIQ color space. + * + */ + + void ComputeColorSpace(ColorSpaceConvertType mode); + +private: + /// This matrix stores the matrix of the actual color space transform + float TransformMatrix[3][3]; + /// The OpenCV image which contains the image data + void* cvImg; +}; + +/** @} */ + +#endif diff --git a/package_bgs/ck/MotionDetection.cpp b/package_bgs/ck/MotionDetection.cpp new file mode 100644 index 0000000..9cb8e79 --- /dev/null +++ b/package_bgs/ck/MotionDetection.cpp @@ -0,0 +1,1425 @@ +/* + * This file is part of the AiBO+ project + * + * Copyright (C) 2005-2013 Csaba Kertész (csaba.kertesz@gmail.com) + * + * AiBO+ is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * AiBO+ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + * Paper: Csaba, Kertész: Texture-Based Foreground Detection, International Journal of Signal Processing, + * Image Processing and Pattern Recognition (IJSIP), Vol. 4, No. 4, 2011. + */ + +#include "MotionDetection.hpp" + +#include "graph.h" + +#if defined(__MINGW32__) || defined(__MINGW64__) +#include <cvaux.h> +#else +#include <opencv/cvaux.h> +#endif + +#include "MEHistogram.hpp" +#include "MEImage.hpp" + +// Pyramid picture for the tracking +IplImage *HUOFPyramid; +// Pyramid picture for the tracking +IplImage *HUOFPrevPyramid; + +// Struct for histogram update data of a pixel +struct MEPixelDataType +{ + float BackgroundRate; + int LifeCycle; + float *Weights; + bool *BackgroundHistogram; + float **Histograms; + float *PreviousHistogram; +}; + +MotionDetection::MotionDetection(DetectorType mode) : + MDMode(md_NotDefined), MDDataState(ps_Uninitialized), Frames(0), ReadyMask(false), + HUColorSpace(MEImage::csc_RGBtoCIELuv), HULBPMode(MEImage::lbp_Special), + HUHistogramsPerPixel(3), HUHistogramArea(5), HUHistogramBins(8), + HUImageWidth(-1), HUImageHeight(-1), HULBPPixelData(NULL), + HUPrThres(0.75), HUBackgrThres(0.95), HUHistLRate(0.01), HUWeightsLRate(0.01), + HUSamplePixels(-1), HUDesiredSamplePixels(-1), HUMinCutWeight(8.0), + HUOFDataState(ps_Uninitialized), HUOFPointsNumber(-1), + HUOFCamMovementX(0), MaxTrackedPoints(0), HUOFFrames(-1), + HUOFCamMovement(false) +{ + HUOFPyramid = NULL; + HUOFPrevPyramid = NULL; + HUOFPoints[0] = NULL; + HUOFPoints[1] = NULL; + SetMode(mode); +} + + +MotionDetection::~MotionDetection() +{ + if (MDMode != md_NotDefined) + { + ReleaseData(); + } +} + + +void MotionDetection::SetMode(DetectorType newmode) +{ + if (MDMode != md_NotDefined && MDMode != newmode) + { + ReleaseData(); + Frames = 0; + HUOFFrames = -1; + HUOFCamMovement = false; + HUOFCamMovementX = 0; + ReadyMask = false; + } + + switch (newmode) + { + case md_LBPHistograms: + MDMode = md_LBPHistograms; + break; + + case md_DLBPHistograms: + MDMode = md_DLBPHistograms; + break; + + default: + MDMode = md_LBPHistograms; + break; + } +} + + +float MotionDetection::GetParameter(ParametersType param) const +{ + float ret = 0.0; + + switch (param) + { + case mdp_HUProximityThreshold: + ret = (float)HUPrThres; + break; + + case mdp_HUBackgroundThreshold: + ret = (float)HUBackgrThres; + break; + + case mdp_HUHistogramLearningRate: + ret = (float)HUHistLRate; + break; + + case mdp_HUWeightsLearningRate: + ret = (float)HUWeightsLRate; + break; + + case mdp_HUMinCutWeight: + ret = (float)HUMinCutWeight; + break; + + case mdp_HUDesiredSamplePixels: + ret = (float)HUDesiredSamplePixels; + break; + + case mdp_HUHistogramsPerPixel: + ret = (float)HUHistogramsPerPixel; + break; + + case mdp_HUHistogramArea: + ret = (float)HUHistogramArea; + break; + + case mdp_HUHistogramBins: + ret = (float)HUHistogramBins; + break; + + case mdp_HUColorSpace: + ret = (float)HUColorSpace; + break; + + case mdp_HULBPMode: + ret = (float)HULBPMode; + break; + + default: + break; + } + return ret; +} + + +void MotionDetection::SetParameter(ParametersType param, float value) +{ + switch (param) + { + case mdp_HUProximityThreshold: + HUPrThres = (float)value; + break; + + case mdp_HUBackgroundThreshold: + HUBackgrThres = (float)value; + break; + + case mdp_HUHistogramLearningRate: + HUHistLRate = (float)value; + break; + + case mdp_HUWeightsLearningRate: + HUWeightsLRate = (float)value; + break; + + case mdp_HUMinCutWeight: + HUMinCutWeight = (float)value; + break; + + case mdp_HUDesiredSamplePixels: + HUDesiredSamplePixels = (int)value; + break; + + case mdp_HUHistogramsPerPixel: + HUHistogramsPerPixel = (MDDataState == ps_Uninitialized) ? (int)value : HUHistogramsPerPixel; + break; + + case mdp_HUHistogramArea: + HUHistogramArea = (MDDataState == ps_Uninitialized) ? (int)value : HUHistogramArea; + break; + + case mdp_HUHistogramBins: + HUHistogramBins = (MDDataState == ps_Uninitialized) ? (int)value : HUHistogramBins; + break; + + case mdp_HUColorSpace: + HUColorSpace = (MDDataState == ps_Uninitialized) ? (int)value : HUColorSpace; + break; + + case mdp_HULBPMode: + HULBPMode = (MDDataState == ps_Uninitialized) ? (int)value : HULBPMode; + break; + + default: + break; + } +} + + +void MotionDetection::DetectMotions(MEImage& image) +{ + switch (MDMode) + { + case md_LBPHistograms: + case md_DLBPHistograms: + DetectMotionsHU(image); + break; + + default: + break; + } +} + + +void MotionDetection::GetMotionsMask(MEImage& mask_image) +{ + if (ReadyMask) + { + mask_image = MaskImage; + } + + switch (MDMode) + { + case md_LBPHistograms: + case md_DLBPHistograms: + GetMotionsMaskHU(MaskImage); + break; + + default: + break; + } + + ReadyMask = true; + mask_image = MaskImage; +} + + +void MotionDetection::CalculateResults(MEImage& referenceimage, int& tnegatives, int& tpositives, + int& ttnegatives, int& ttpositives) +{ + if (MDDataState != ps_Successful) + { + printf("No data for calculation.\n"); + return; + } + + if (referenceimage.GetLayers() != 1) + referenceimage.ConvertToGrayscale(MEImage::g_OpenCV); + + referenceimage.Binarize(1); + + MEImage mask_image; + + GetMotionsMask(mask_image); + + if ((mask_image.GetWidth() != referenceimage.GetWidth()) || + (mask_image.GetHeight() != referenceimage.GetHeight())) + { + printf("Different resolutions of mask<->reference image.\n"); + return; + } + + unsigned char* RefMaskImgData = referenceimage.GetImageData(); + unsigned char* MaskImgData = mask_image.GetImageData(); + int RowStart = 0; + int RowWidth = referenceimage.GetRowWidth(); + + int TrueNegatives = 0; + int TruePositives = 0; + int TotalTrueNegatives = 0; + int TotalTruePositives = 0; + + int ImageFrame = 0; + + if (MDMode == md_LBPHistograms || md_DLBPHistograms) + { + ImageFrame = HUHistogramArea / 2; + } + + for (int y = referenceimage.GetHeight()-ImageFrame-1; y >= ImageFrame; --y) + { + for (int x = referenceimage.GetWidth()-ImageFrame-1; x >= ImageFrame; --x) + { + TrueNegatives += + (RefMaskImgData[RowStart+x] == 0) && + (MaskImgData[RowStart+x] == 0); + TotalTrueNegatives += (RefMaskImgData[RowStart+x] == 0); + TruePositives += + (RefMaskImgData[RowStart+x] == 255) && + (MaskImgData[RowStart+x] == 255); + TotalTruePositives += (RefMaskImgData[RowStart+x] == 255); + } + RowStart += RowWidth; + } + + tnegatives = TrueNegatives; + ttnegatives = TotalTrueNegatives; + tpositives = TruePositives; + ttpositives = TotalTruePositives; +} + + +void MotionDetection::ReleaseData() +{ + if (MDMode == md_LBPHistograms || MDMode == md_DLBPHistograms) + { + ReleaseHUData(); + } +} + + +void MotionDetection::InitHUData(int imagewidth, int imageheight) +{ + if ((HUImageWidth != imagewidth-HUHistogramArea+1) || + (HUImageHeight != imageheight-HUHistogramArea+1) || + (MDDataState == ps_Uninitialized)) + { + if (MDDataState != ps_Uninitialized) + { + ReleaseHUData(); + } + + MDDataState = ps_Initialized; + + HUImageWidth = imagewidth-HUHistogramArea+1; + HUImageHeight = imageheight-HUHistogramArea+1; + + HULBPPixelData = new MEPixelDataType**[HUImageWidth / 2]; + + for (int i = 0; i < HUImageWidth / 2; ++i) + { + HULBPPixelData[i] = new MEPixelDataType*[HUImageHeight]; + } + + for (int i = 0; i < HUImageWidth / 2; ++i) + for (int i1 = 0; i1 < HUImageHeight; ++i1) + { + HULBPPixelData[i][i1] = new MEPixelDataType; + HULBPPixelData[i][i1]->Weights = new float[HUHistogramsPerPixel]; + HULBPPixelData[i][i1]->BackgroundHistogram = new bool[HUHistogramsPerPixel]; + HULBPPixelData[i][i1]->Histograms = new float*[HUHistogramsPerPixel]; + for (int i2 = 0; i2 < HUHistogramsPerPixel; ++i2) + HULBPPixelData[i][i1]->Histograms[i2] = new float[HUHistogramBins]; + HULBPPixelData[i][i1]->PreviousHistogram = new float[HUHistogramBins]; + } + + // Allocate auxiliary variables + HUMaskColumnAddDel = new int*[HUHistogramArea]; + for (int i = 0; i < HUHistogramArea; ++i) + HUMaskColumnAddDel[i] = new int[2]; + + HUMaskRowAddDel = new int*[HUHistogramArea]; + for (int i = 0; i < HUHistogramArea; ++i) + HUMaskRowAddDel[i] = new int[2]; + + // Generate sample mask + SetSampleMaskHU(sm_Circle, HUDesiredSamplePixels); + + // Init HU optical flow data + if (MDMode == md_DLBPHistograms) + InitHUOFData(imagewidth, imageheight); + + ClearHUData(); + } +} + + +void MotionDetection::InitHUOFData(int imagewidth, int imageheight) +{ + if (HUOFDataState != ps_Uninitialized) + { + ReleaseHUOFData(); + } + + if (HUOFDataState == ps_Uninitialized) + { + HUOFPointsNumber = imagewidth*imageheight / 1000; + HUOFPyramid = cvCreateImage(cvSize(imagewidth, imageheight), 8, 1); + HUOFPrevPyramid = cvCreateImage(cvSize(imagewidth, imageheight), 8, 1); + HUOFPoints[0] = (CvPoint2D32f*)cvAlloc(HUOFPointsNumber*sizeof(HUOFPoints[0][0])); + HUOFPoints[1] = (CvPoint2D32f*)cvAlloc(HUOFPointsNumber*sizeof(HUOFPoints[1][0])); + } +} + + +void MotionDetection::ReleaseHUData() +{ + if (MDDataState != ps_Uninitialized) + { + for (int i = 0; i < HUImageWidth / 2; i++) + for (int i1 = 0; i1 < HUImageHeight; i1++) + { + delete[] HULBPPixelData[i][i1]->PreviousHistogram; + for (int i2 = 0; i2 < HUHistogramsPerPixel; ++i2) + delete[] HULBPPixelData[i][i1]->Histograms[i2]; + delete[] HULBPPixelData[i][i1]->Histograms; + delete[] HULBPPixelData[i][i1]->BackgroundHistogram; + delete[] HULBPPixelData[i][i1]->Weights; + delete HULBPPixelData[i][i1]; + } + + for (int i = 0; i < HUImageWidth / 2; i++) + { + delete[] HULBPPixelData[i]; + } + delete[] HULBPPixelData; + + if (MDMode == md_DLBPHistograms) + ReleaseHUOFData(); + + HUImageWidth = -1; + HUImageHeight = -1; + HULBPPixelData = NULL; + MDDataState = ps_Uninitialized; + + // Release auxiliary variables + for (int i = 0; i < HUHistogramArea; ++i) + delete[] HUMaskColumnAddDel[i]; + delete[] HUMaskColumnAddDel; + + for (int i = 0; i < HUHistogramArea; ++i) + delete[] HUMaskRowAddDel[i]; + delete[] HUMaskRowAddDel; + + HUMaskColumnAddDel = NULL; + HUMaskRowAddDel = NULL; + } +} + + +void MotionDetection::ReleaseHUOFData() +{ + if (MDDataState != ps_Uninitialized) + { + if (HUOFPyramid) + { + cvReleaseImage(&HUOFPyramid); + HUOFPyramid = NULL; + } + if (HUOFPrevPyramid) + { + cvReleaseImage(&HUOFPrevPyramid); + HUOFPrevPyramid = NULL; + } + if (HUOFPoints[0]) + { + cvFree(&HUOFPoints[0]); + HUOFPoints[0] = NULL; + } + if (HUOFPoints[1]) + { + cvFree(&HUOFPoints[1]); + HUOFPoints[1] = NULL; + } + HUOFDataState = ps_Uninitialized; + } +} + + +void MotionDetection::ClearHUData() +{ + if (MDDataState != ps_Uninitialized) + { + for (int i = (HUImageWidth / 2)-1; i >= 0; --i) + for (int i1 = HUImageHeight-1; i1 >= 0; --i1) + { + for (int i2 = HUHistogramsPerPixel-1; i2 >= 0; --i2) + { + memset(HULBPPixelData[i][i1]->Histograms[i2], 0, + HUHistogramBins*sizeof(float)); + HULBPPixelData[i][i1]->Weights[i2] = 1.0 / HUHistogramsPerPixel; + HULBPPixelData[i][i1]->BackgroundHistogram[i2] = true; + } + HULBPPixelData[i][i1]->BackgroundRate = 1.0; + HULBPPixelData[i][i1]->LifeCycle = 0; + } + MDDataState = ps_Initialized; + } +} + + +void MotionDetection::DetectMotionsHU(MEImage& image) +{ + unsigned char *ImgData = NULL; + MEImage newimage = image; + float DiffAreas = 0; + + // Init the histogram update data structures if needs be + if ((MDDataState == ps_Uninitialized) || + (HUImageWidth != newimage.GetWidth()-HUHistogramArea+1) || + (HUImageHeight != newimage.GetHeight()-HUHistogramArea+1)) + { + InitHUData(newimage.GetWidth(), newimage.GetHeight()); + } + + if (newimage.GetLayers() == 1) + { + newimage.ConvertGrayscaleToRGB(); + } + + MEImage blueimage = newimage; + blueimage.ColorSpace(MEImage::csc_RGBtoCIELuv); + + if (HUColorSpace != -1) + { + newimage.ColorSpace((MEImage::ColorSpaceConvertType)HUColorSpace); + } + + if (Frames == 0) + { + MEImage BlueLayer; + blueimage.GetLayer(BlueLayer, 1); + BlueLayer.Resize(32, 24); + PreviousBlueLayer = BlueLayer; + } + + Frames++; + + // Detect the fast, big changes in the scene + MEImage BlueLayer; + blueimage.GetLayer(BlueLayer, 1); + BlueLayer.Resize(32, 24); + DiffAreas = BlueLayer.DifferenceAreas(PreviousBlueLayer, 12); + + if (DiffAreas > 80) + { + MDDataState = ps_Initialized; + if (MDMode == md_DLBPHistograms) + HUOFDataState = ps_Initialized; + printf("Frame: %d - big changes in the scene (%f)", Frames, DiffAreas); + Frames = 1; + HUOFFrames = -1; + } + PreviousBlueLayer = BlueLayer; + + if (Frames == 1) + { + CurrentImage = image; + PreviousImage = CurrentImage; + } else + if (Frames > 1) + { + PreviousImage = CurrentImage; + CurrentImage = image; + // Optical flow correction of the camera movements + if (MDMode == md_DLBPHistograms) + { + OpticalFlowCorrection(); + } + } + + newimage.ConvertToGrayscale(MEImage::g_OpenCV); + + if (HULBPMode != -1) + { + newimage.LBP((MEImage::LBPType)HULBPMode); + } + + // Set some auxiliary variables + ImgData = newimage.GetImageData(); + int DivisionOperator = (int)(log(256 / HUHistogramBins) / log(2))+1; + + // Downscale the image + for (int i = newimage.GetRowWidth()*newimage.GetHeight()-1; i >= 0; --i) + { + ImgData[i] >>= DivisionOperator; + } + + UpdateModelHU(newimage, HULBPPixelData); + + // Change the state of the HU data structures + if (MDDataState == ps_Initialized) + { + MDDataState = ps_Successful; + } + HUOFCamMovement = false; + ReadyMask = false; +} + + +void MotionDetection::UpdateModelHU(MEImage& image, MEPixelDataType*** model) +{ + float CurrentHistogram[HUHistogramBins], CurrentHistogram2[HUHistogramBins]; + unsigned char *ImgData = image.GetImageData(); + int RowWidth = image.GetRowWidth(); + int RowStart = (HUImageHeight-1)*RowWidth; + + memset(CurrentHistogram, 0, sizeof(CurrentHistogram)); + // Calculate the first histogram + for (int y = HUHistogramArea-1; y >= 0; --y) + { + for (int x = HUHistogramArea-1; x >= 0; --x) + { + if ((HUMaskRowAddDel[y][1] > x) && (HUMaskRowAddDel[y][0] <= x) && + (HUMaskColumnAddDel[x][1] > y) && (HUMaskColumnAddDel[x][0] <= y)) + { + CurrentHistogram[ImgData[RowStart+HUImageWidth-1+x]]++; + } + } + RowStart += RowWidth; + } + + // This cycle generates the last row of histograms + for (int y = HUImageHeight-1; y >= 0; --y) + { + if (HUImageHeight-1 > y) + { + // Delete and add a pixel column from the histogram data + for (int i = HUHistogramArea-1; i >= 0; --i) + { + if (HUMaskColumnAddDel[i][0] != -1) + CurrentHistogram[ImgData[RowWidth*(y+HUMaskColumnAddDel[i][0])+HUImageWidth-1+i]]++; + if (HUMaskColumnAddDel[i][1] != -1) + CurrentHistogram[ImgData[RowWidth*(y+HUMaskColumnAddDel[i][1])+HUImageWidth-1+i]]--; + } + } + + if (y % 2 == HUImageWidth % 2) + { + MEPixelDataType* PixelData = model[(HUImageWidth-1) / 2][y]; + + // Allocate and initialize the pixel data if needs be + if (!PixelData) + { + // Memory allocation + PixelData = new MEPixelDataType; + PixelData->Weights = new float[HUHistogramsPerPixel]; + PixelData->BackgroundHistogram = new bool[HUHistogramsPerPixel]; + PixelData->Histograms = new float*[HUHistogramsPerPixel]; + for (int i2 = 0; i2 < HUHistogramsPerPixel; ++i2) + PixelData->Histograms[i2] = new float[HUHistogramBins]; + PixelData->PreviousHistogram = new float[HUHistogramBins]; + + for (int i = HUHistogramsPerPixel-1; i >= 0; --i) + { + memcpy(PixelData->Histograms[i], CurrentHistogram, sizeof(CurrentHistogram)); + PixelData->Weights[i] = 1.0 / HUHistogramsPerPixel; + PixelData->BackgroundHistogram[i] = true; + } + PixelData->BackgroundRate = 1.0; + PixelData->LifeCycle = 0; + memcpy(PixelData->PreviousHistogram, CurrentHistogram, sizeof(CurrentHistogram)); + + model[(HUImageWidth-1) / 2][y] = PixelData; + } else { + bool InitHistograms = (MDDataState == ps_Initialized); + + if (MDDataState != ps_Initialized && HUOFCamMovement) + { + // Histogram intersection between the previous and the current histogram + float Difference = 0.0; + for (int i1 = HUHistogramBins-1; i1 >= 0; --i1) + { + Difference += (float)(CurrentHistogram[i1] < PixelData->PreviousHistogram[i1] ? + CurrentHistogram[i1] : PixelData->PreviousHistogram[i1]); + } + Difference /= HUSamplePixels; + + if (Difference < HUBackgrThres) + InitHistograms = true; + } + if (InitHistograms) + { + // Copy the histogram data to the HU data structures + for (int i = HUHistogramsPerPixel-1; i >= 0; --i) + { + memcpy(PixelData->Histograms[i], CurrentHistogram, sizeof(CurrentHistogram)); + PixelData->Weights[i] = 1.0 / HUHistogramsPerPixel; + PixelData->BackgroundHistogram[i] = true; + } + memcpy(PixelData->PreviousHistogram, CurrentHistogram, sizeof(CurrentHistogram)); + PixelData->BackgroundRate = 1.0; + PixelData->LifeCycle = 0; + } else { + // Update the HU data structures + UpdateHUPixelData(PixelData, CurrentHistogram); + + if (MDMode == md_DLBPHistograms) + { + memcpy(PixelData->PreviousHistogram, CurrentHistogram, sizeof(CurrentHistogram)); + } + } + } + } + + // Copy the histogram + memcpy(CurrentHistogram2, CurrentHistogram, sizeof(CurrentHistogram)); + + // This cycle generates a column of histograms + for (int x = HUImageWidth-2; x >= 0; --x) + { + RowStart = RowWidth*y; + + // Delete and add a pixel column from the histogram data + for (int i = HUHistogramArea-1; i >= 0; --i) + { + if (HUMaskRowAddDel[i][0] != -1) + CurrentHistogram2[ImgData[RowStart+x+HUMaskRowAddDel[i][0]]]++; + if (HUMaskRowAddDel[i][1] != -1) + CurrentHistogram2[ImgData[RowStart+x+HUMaskRowAddDel[i][1]]]--; + + RowStart += RowWidth; + } + if (x % 2 == 0) + { + MEPixelDataType* PixelData = model[x / 2][y]; + + // Allocate and initialize the pixel data if needs be + if (!PixelData) + { + // Memory allocation + PixelData = new MEPixelDataType; + PixelData->Weights = new float[HUHistogramsPerPixel]; + PixelData->BackgroundHistogram = new bool[HUHistogramsPerPixel]; + PixelData->Histograms = new float*[HUHistogramsPerPixel]; + for (int i2 = 0; i2 < HUHistogramsPerPixel; ++i2) + PixelData->Histograms[i2] = new float[HUHistogramBins]; + PixelData->PreviousHistogram = new float[HUHistogramBins]; + + for (int i = HUHistogramsPerPixel-1; i >= 0; --i) + { + memcpy(PixelData->Histograms[i], CurrentHistogram2, sizeof(CurrentHistogram2)); + PixelData->Weights[i] = 1.0 / HUHistogramsPerPixel; + PixelData->BackgroundHistogram[i] = true; + } + PixelData->BackgroundRate = 1.0; + PixelData->LifeCycle = 0; + model[x / 2][y] = PixelData; + memcpy(PixelData->PreviousHistogram, CurrentHistogram2, sizeof(CurrentHistogram2)); + } else { + bool InitHistograms = (MDDataState == ps_Initialized); + + if (MDDataState != ps_Initialized && HUOFCamMovement) + { + // Histogram intersection between the previous and the current histogram + float Difference = 0.0; + for (int i1 = HUHistogramBins-1; i1 >= 0; --i1) + { + Difference += (float)(CurrentHistogram2[i1] < PixelData->PreviousHistogram[i1] ? + CurrentHistogram2[i1] : PixelData->PreviousHistogram[i1]); + } + Difference /= HUSamplePixels; + + if (Difference < HUBackgrThres) + InitHistograms = true; + } + if (InitHistograms) + { + // Copy the histogram data to the HU data structures + for (int i = HUHistogramsPerPixel-1; i >= 0; --i) + { + memcpy(PixelData->Histograms[i], CurrentHistogram2, sizeof(CurrentHistogram2)); + PixelData->Weights[i] = 1.0 / HUHistogramsPerPixel; + PixelData->BackgroundHistogram[i] = true; + } + memcpy(PixelData->PreviousHistogram, CurrentHistogram2, sizeof(CurrentHistogram2)); + PixelData->BackgroundRate = 1.0; + PixelData->LifeCycle = 0; + } else { + // Update the HU data structures + UpdateHUPixelData(PixelData, CurrentHistogram2); + + if (MDMode == md_DLBPHistograms) + { + memcpy(PixelData->PreviousHistogram, CurrentHistogram2, sizeof(CurrentHistogram2)); + } + } + } + } + + } + } +} + + +void MotionDetection::UpdateHUPixelData(MEPixelDataType* PixelData, const float *histogram) +{ + int MaxIndex = 0; + float MaxValue = -1; + bool Replace = true; + float IntersectionResults[HUHistogramsPerPixel]; + + PixelData->LifeCycle++; + PixelData->BackgroundRate = 0.0; + + // Compute intersection between the currect and older histograms + for (int i = HUHistogramsPerPixel-1; i >= 0; --i) + { + // Histogram intersection + float Difference = 0.0; + for (int i1 = HUHistogramBins-1; i1 >= 0; --i1) + { + Difference += (float)histogram[i1] < PixelData->Histograms[i][i1] ? + (float)histogram[i1] : PixelData->Histograms[i][i1]; + } + + IntersectionResults[i] = (float)Difference / (float)(HUSamplePixels); + + if (PixelData->BackgroundHistogram[i] && + IntersectionResults[i] > PixelData->BackgroundRate) + { + PixelData->BackgroundRate = IntersectionResults[i]; + } + + if (MaxValue < IntersectionResults[i]) + { + MaxValue = IntersectionResults[i]; + MaxIndex = i; + } + + Replace = Replace && (IntersectionResults[i] < HUPrThres); + } + + // Replace the histogram with the lowest weight + if (Replace) + { + // Find the histogram with minimal weight + int MinIndex = 0; + float MinValue = PixelData->Weights[0]; + for (int i1 = HUHistogramsPerPixel-1; i1 > 0; --i1) + { + if (MinValue > PixelData->Weights[i1]) + { + MinValue = PixelData->Weights[i1]; + MinIndex = i1; + } + } + + PixelData->Weights[MinIndex] = 0.01; + for (int i1 = HUHistogramBins-1; i1 >= 0; --i1) + PixelData->Histograms[MinIndex][i1] = (float)histogram[i1]; + PixelData->BackgroundHistogram[MinIndex] = 0; + + // Normalize the weights + float sum = 0; + for (int i1 = HUHistogramsPerPixel-1; i1 >= 0; --i1) + sum += PixelData->Weights[i1]; + + for (int i1 = HUHistogramsPerPixel-1; i1 >= 0; --i1) + PixelData->Weights[i1] = PixelData->Weights[i1] / sum; + + return; + } + + float LearningRate = HUHistLRate; + + if (PixelData->LifeCycle < 100) + LearningRate += (float)(100-PixelData->LifeCycle) / 100; + else + if (MDMode == md_DLBPHistograms && HUOFFrames != -1 && HUOFFrames < 40) + LearningRate += (HUOFFrames < 80 ? 0.05 : 0); + + // Match was found -> Update the histogram of the best match + for (int i = HUHistogramBins-1; i >= 0; --i) + { + PixelData->Histograms[MaxIndex][i] *= (1.0-LearningRate); + PixelData->Histograms[MaxIndex][i] += LearningRate*(float)histogram[i]; + } + + LearningRate = HUWeightsLRate; + if (PixelData->LifeCycle < 100) + LearningRate += (float)(100-PixelData->LifeCycle) / 100; + else + if (MDMode == md_DLBPHistograms && HUOFFrames != -1 && HUOFFrames < 40) + LearningRate += (HUOFFrames < 80 ? 0.05 : 0); + + // Update the weights of the histograms + for (int i = HUHistogramsPerPixel-1; i >= 0; --i) + { + PixelData->Weights[i] = + (LearningRate*(i == MaxIndex)+(1.0-LearningRate)*PixelData->Weights[i]); + } + + // Order and select the background histograms + float Weights[HUHistogramsPerPixel][2]; + + for (int i = HUHistogramsPerPixel-1; i >= 0; --i) + { + Weights[i][0] = (float)i; + Weights[i][1] = PixelData->Weights[i]; + } + + for (int i1 = HUHistogramsPerPixel-1; i1 >= 2; --i1) + for (int i = i1; i >= 1; --i) + { + if (Weights[i][1] <= Weights[i-1][1]) + { + float tmp = Weights[i][0]; + float tmp2 = Weights[i][1]; + + Weights[i][0] = Weights[i-1][0]; + Weights[i][1] = Weights[i-1][1]; + + Weights[i-1][0] = tmp; + Weights[i-1][1] = tmp2; + } + } + + float Sum = 0; + int i = 0; + + for (i = HUHistogramsPerPixel-1; i >= 0; --i) + { + Sum += Weights[i][1]; + PixelData->BackgroundHistogram[(int)Weights[i][0]] = true; + + if (Sum > HUBackgrThres) + break; + } + for (int i1 = i-1; i1 >= 0; --i1) + { + PixelData->BackgroundHistogram[(int)Weights[i1][0]] = false; + } +} + + +void MotionDetection::OpticalFlowCorrection() +{ + IplImage *PreviousGray = NULL, *CurrentGray = NULL; + char* PointsStatus = (char*)cvAlloc(HUOFPointsNumber); + int i = 0, i1 = 0; + + if (HUOFFrames != -1) + HUOFFrames++; + + // Convert the images into grayscale + if (CurrentImage.GetLayers() > 1) + { + CurrentGray = cvCreateImage(cvGetSize(CurrentImage.GetIplImage()), IPL_DEPTH_8U, 1); + cvCvtColor(CurrentImage.GetIplImage(), CurrentGray, CV_BGR2GRAY); + } else + CurrentGray = (IplImage*)CurrentImage.GetIplImage(); + if (PreviousImage.GetLayers() > 1) + { + PreviousGray = cvCreateImage(cvGetSize(CurrentImage.GetIplImage()), IPL_DEPTH_8U, 1); + cvCvtColor(PreviousImage.GetIplImage(), PreviousGray, CV_BGR2GRAY); + } else + PreviousGray = (IplImage*)PreviousImage.GetIplImage(); + + if (HUOFDataState != ps_Successful) + { + printf("Search new corners\n"); + IplImage* TempEig = cvCreateImage(cvGetSize(CurrentGray), 32, 1 ); + IplImage* Temp = cvCreateImage(cvGetSize(CurrentGray), 32, 1 ); + double MinDistance = (CurrentImage.GetWidth()+CurrentImage.GetHeight()) / 20; + HUOFPointsNumber = MaxTrackedPoints = CurrentImage.GetWidth()*CurrentImage.GetHeight() / 1000; + + // Search good trackable points + cvGoodFeaturesToTrack(PreviousGray, TempEig, Temp, + HUOFPoints[0], &HUOFPointsNumber, + 0.01, MinDistance, NULL, 3); + MaxTrackedPoints = HUOFPointsNumber; + // Release temporary images + cvReleaseImage(&TempEig); + cvReleaseImage(&Temp); + // Realloc the point status array + if (PointsStatus) + { + cvFree(&PointsStatus); + PointsStatus = NULL; + } + + if (MaxTrackedPoints < 2) + { + HUOFDataState = ps_Initialized; + HUOFPointsNumber = CurrentImage.GetWidth()*CurrentImage.GetHeight() / 1000; + return; + } else + HUOFDataState = ps_Successful; + PointsStatus = (char*)cvAlloc(HUOFPointsNumber); + } + + cvCalcOpticalFlowPyrLK(PreviousGray, CurrentGray, HUOFPrevPyramid, HUOFPyramid, + HUOFPoints[0], HUOFPoints[1], HUOFPointsNumber, + cvSize(10, 10), 3, PointsStatus, NULL, + cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 5, 1), 0); + + // Count the distances of the tracked points + int Distances[HUOFPointsNumber][3]; + int DistanceMax = 0; + for (i = 0; i < HUOFPointsNumber; ++i) + { + int DiffX = (int)MERound(HUOFPoints[1][i].x-HUOFPoints[0][i].x); + int DiffY = (int)MERound(HUOFPoints[1][i].y-HUOFPoints[0][i].y); + if ((PointsStatus[i] == 1) && !((DiffX == 0) && (DiffY == 0))) + { + bool found = false; + // Create a list from the differences to count them + for (i1 = 0; i1 < DistanceMax; ++i1) + { + if ((Distances[i1][0] == DiffX) && + (Distances[i1][1] == DiffY)) + { + Distances[i1][2]++; + found = true; + break; + } + } + if ((!found) && !((DiffX == 0) && (DiffY == 0))) + { + Distances[DistanceMax][0] = (int)MERound(HUOFPoints[1][i].x-HUOFPoints[0][i].x); + Distances[DistanceMax][1] = (int)MERound(HUOFPoints[1][i].y-HUOFPoints[0][i].y); + Distances[DistanceMax][2] = 1; + DistanceMax++; + } + } + } + + // Sort the results + for (int i1 = DistanceMax-1; i1 >= 2; --i1) + for (int i = i1; i >= 1; --i) + { + if ((Distances[i][2] > Distances[i-1][2]) || + ((Distances[i][2] == Distances[i-1][2]) && + (abs(Distances[i][0])+abs(Distances[i][1]) < + abs(Distances[i-1][0])+abs(Distances[i-1][1])))) + { + int tmp = Distances[i][0]; + int tmp2 = Distances[i][1]; + int tmp3 = Distances[i][2]; + + Distances[i][0] = Distances[i-1][0]; + Distances[i][1] = Distances[i-1][1]; + Distances[i][2] = Distances[i-1][2]; + + Distances[i-1][0] = tmp; + Distances[i-1][1] = tmp2; + Distances[i-1][2] = tmp3; + } + } + + float MoveX = 0.0; + float MoveY = 0.0; + int SampleNums = 0; + float DistanceMeasure = 0.0; + + // Calculate the final camera movement + for (i = 0; i < DistanceMax; ++i) + { + if ((Distances[i][2] <= MaxTrackedPoints / 10)) + break; + + if (i > 0) + { + DistanceMeasure += (Distances[i][0]-Distances[i-1][0])*(Distances[i][0]-Distances[i-1][0]); + DistanceMeasure += (Distances[i][1]-Distances[i-1][1])*(Distances[i][1]-Distances[i-1][1]); + } + + MoveX += Distances[i][0]*Distances[i][2]; + MoveY += Distances[i][1]*Distances[i][2]; + SampleNums += Distances[i][2]; + } + + if (SampleNums > 0) + { + MoveX = MERound(MoveX / SampleNums); + MoveY = MERound(MoveY / SampleNums); + } + + if (!((MoveX == 0) && (MoveY == 0)) && + (SampleNums > MaxTrackedPoints / 2)) + { + HUOFCamMovementX += (int)MoveX; + int HUOFCamMovementY = (int)MoveY; + int MaxX = (HUImageWidth / 2)-1; + int MaxY = HUImageHeight-1; +/* + printf("-----------\n"); + + for (i = 0; i < DistanceMax; ++i) + printf("%d: %d,%d\n", Distances[i][2], Distances[i][0], Distances[i][1]); + + printf("FINAL: %d,%d,%1.2f\n", (int)MoveX, (int)MoveY, DistanceMeasure); + printf("-----------\n"); + printf("Camera movement: %d,%d,%d (max: %d, current: %d)\n", + SampleNums, HUOFCamMovementX, HUOFCamMovementY, MaxTrackedPoints, HUOFPointsNumber); +*/ + HUOFFrames = 0; + HUOFCamMovement = true; + + if (!(HUOFCamMovementY == 0 && HUOFCamMovementX >= -1 && HUOFCamMovementX <= 1)) + { + MEPixelDataType* PreviousData[MaxX+1][MaxY+1]; + + // Camera movement being happened + for (int y = MaxY; y >= 0; --y) + for (int x = MaxX; x >= 0; --x) + { + PreviousData[x][y] = NULL; + } + + // Move the LBP data to new locations + for (int y = MaxY; y >= 0; --y) + for (int x = MaxX; x >= 0; --x) + { + int NewX = x+(HUOFCamMovementX / 2); + int NewY = y+HUOFCamMovementY; + + if (NewX >= 0 && NewX <= MaxX && + NewY >= 0 && NewY <= MaxY) + { + if (HULBPPixelData[NewX][NewY]) + { + PreviousData[NewX][NewY] = HULBPPixelData[NewX][NewY]; + HULBPPixelData[NewX][NewY] = NULL; + if (PreviousData[x][y]) + { + HULBPPixelData[NewX][NewY] = PreviousData[x][y]; + PreviousData[x][y] = NULL; + } else { + HULBPPixelData[NewX][NewY] = HULBPPixelData[x][y]; + HULBPPixelData[x][y] = NULL; + } + } else { + if (PreviousData[x][y]) + { + HULBPPixelData[NewX][NewY] = PreviousData[x][y]; + PreviousData[x][y] = NULL; + } else { + HULBPPixelData[NewX][NewY] = HULBPPixelData[x][y]; + HULBPPixelData[x][y] = NULL; + } + } + } else { + if (HULBPPixelData[x][y]) + { + delete[] HULBPPixelData[x][y]->PreviousHistogram; + for (int i2 = 0; i2 < HUHistogramsPerPixel; ++i2) + delete[] HULBPPixelData[x][y]->Histograms[i2]; + delete[] HULBPPixelData[x][y]->Histograms; + delete[] HULBPPixelData[x][y]->BackgroundHistogram; + delete[] HULBPPixelData[x][y]->Weights; + delete HULBPPixelData[x][y]; + HULBPPixelData[x][y] = NULL; + } + } + } + // Release unused data + for (int y = MaxY; y >= 0; --y) + for (int x = MaxX; x >= 0; --x) + { + if (PreviousData[x][y]) + { + delete[] PreviousData[x][y]->PreviousHistogram; + for (int i2 = 0; i2 < HUHistogramsPerPixel; ++i2) + delete[] PreviousData[x][y]->Histograms[i2]; + delete[] PreviousData[x][y]->Histograms; + delete[] PreviousData[x][y]->BackgroundHistogram; + delete[] PreviousData[x][y]->Weights; + delete PreviousData[x][y]; + PreviousData[x][y] = NULL; + } + } + HUOFCamMovementX = HUOFCamMovementX % 1; + } + } + + i1 = 0; + // Throw the missed points away + for (i = 0; i < HUOFPointsNumber; ++i) + { + if (PointsStatus[i] == 1) + { + HUOFPoints[0][i1] = HUOFPoints[1][i]; + i1++; + } + } + HUOFPointsNumber -= i+1-i1; + + if (HUOFPointsNumber < MaxTrackedPoints / 2) + { + printf("Re-init the optical flow\n"); + HUOFDataState = ps_Initialized; + HUOFPointsNumber = CurrentImage.GetWidth()*CurrentImage.GetHeight() / 1000; + } + // Free memory + if (PreviousGray != PreviousImage.GetIplImage()) + cvReleaseImage(&PreviousGray); + if (CurrentGray != CurrentImage.GetIplImage()) + cvReleaseImage(&CurrentGray); + cvFree(&PointsStatus); +} + + +void MotionDetection::GetMotionsMaskHU(MEImage& mask_image) +{ + if (MDDataState != ps_Successful) + { + mask_image.Clear(); + return; + } + + // Reallocate the mask image if needs be + if ((HUImageWidth+HUHistogramArea-1 != mask_image.GetWidth()) || + (HUImageHeight+HUHistogramArea-1 != mask_image.GetHeight()) || + (mask_image.GetLayers() != 1)) + { + mask_image.Realloc(HUImageWidth+HUHistogramArea-1, + HUImageHeight+HUHistogramArea-1, 1); + } + mask_image.Clear(); + // Generate the mask image + unsigned char* MaskImgData = mask_image.GetImageData(); + int RowStart = (mask_image.GetHeight()-HUHistogramArea / 2)*mask_image.GetRowWidth(); + int RowWidth = mask_image.GetRowWidth(); + + // Generate a graph about the histogram data + Graph::node_id Nodes[HUImageWidth / 2][HUImageHeight]; + Graph *LBPGraph = new Graph(); + + for (int x = (HUImageWidth / 2)-1; x >= 0; --x) + for (int y = HUImageHeight-1; y >= 0; --y) + { + Nodes[x][y] = LBPGraph->add_node(); + } + + for (int x = (HUImageWidth / 2)-1; x >= 0; --x) + for (int y = HUImageHeight-1; y >= 0; --y) + { + LBPGraph->set_tweights(Nodes[x][y], 1, + (short int)(HUMinCutWeight*(1-HULBPPixelData[x][y]->BackgroundRate))); + + if (x > 0 && y > 0) + { + LBPGraph->add_edge(Nodes[x][y], Nodes[x-1][y], 1, 1); + LBPGraph->add_edge(Nodes[x][y], Nodes[x][y-1], 1, 1); + } + } + + LBPGraph->maxflow(); + + for (int x = (HUImageWidth / 2)-1; x >= 0; --x) + for (int y = HUImageHeight-1; y >= 0; --y) + { + if (LBPGraph->what_segment(Nodes[x][y]) == Graph::SINK) + HULBPPixelData[x][y]->BackgroundRate = 0.0; + else + HULBPPixelData[x][y]->BackgroundRate = 1.0; + } + + delete LBPGraph; + LBPGraph = NULL; + for (int y = HUImageHeight-1; y >= 0; --y) + { + for (int x = HUImageWidth-1; x >= 0; --x) + { + if (y % 2 == (x+1) % 2) + MaskImgData[RowStart+x+(HUHistogramArea / 2)] = + (HULBPPixelData[x / 2][y]->BackgroundRate == 0.0) ? 255 : 0; + else { + MaskImgData[RowStart+x+(HUHistogramArea / 2)] = + ((int)(x > 1 && HULBPPixelData[(x / 2)-1][y]->BackgroundRate == 0.0)+ + (int)(x < mask_image.GetWidth()-HUHistogramArea-1 && + HULBPPixelData[(x / 2)+1][y]->BackgroundRate == 0.0)+ + (int)(y > 0 && HULBPPixelData[x / 2][y-1]->BackgroundRate == 0.0)+ + (int)(y < mask_image.GetHeight()-HUHistogramArea && + HULBPPixelData[x / 2][y+1]->BackgroundRate == 0.0) > 1) + ? 255 : 0; + } + } + RowStart -= RowWidth; + } + + cvFloodFill(mask_image.GetIplImage(), cvPoint(0, 0), cvScalar(128, 128, 128, 128), + cvScalar(0, 0, 0, 0), cvScalar(0, 0, 0, 0)); + for (int i = ((IplImage*)mask_image.GetIplImage())->widthStep*((IplImage*)mask_image.GetIplImage())->height-1; i >= 0; --i) + { + if (MaskImgData[i] == 128) + { + MaskImgData[i] = 0; + } else + if (MaskImgData[i] == 0) + { + MaskImgData[i] = 255; + } + } + // Apply an erode operator + mask_image.Erode(1); +} + + +void MotionDetection::SetSampleMaskHU(SampleMaskType mask_type, int desiredarea) +{ + if (HUMaskColumnAddDel == NULL || HUMaskRowAddDel == NULL) + { + printf("Auxiliary variables are NULL\n"); + return; + } + + // Generate a mask for computing the histograms + IplImage *MaskImage = cvCreateImage(cvSize(HUHistogramArea, HUHistogramArea), 8, 1); + int DesiredArea = desiredarea <= 0 ? HUHistogramBins*2 : desiredarea; + int CalculationMask[HUHistogramArea][HUHistogramArea]; + int SquareSide = (int)MERound(sqrt(DesiredArea)); + int CircleRadius = (int)MERound(sqrt((float)DesiredArea / ME_PI_VALUE)); + int EllipseA = (int)MERound(HUHistogramArea / 2+1); + int EllipseB = (int)MERound(DesiredArea / (EllipseA*1.2*ME_PI_VALUE)); + + cvSetZero(MaskImage); + + switch (mask_type) + { + case sm_Circle: + cvCircle(MaskImage, cvPoint(HUHistogramArea / 2, HUHistogramArea / 2), + CircleRadius, CV_RGB(1, 1, 1), -1); + break; + + case sm_Square: + cvRectangle(MaskImage, + cvPoint(HUHistogramArea / 2-SquareSide / 2, HUHistogramArea / 2-SquareSide / 2), + cvPoint(HUHistogramArea / 2+SquareSide / 2, HUHistogramArea / 2+SquareSide / 2), + CV_RGB(1, 1, 1), -1); + break; + + case sm_Ellipse: + cvEllipse(MaskImage, cvPoint(HUHistogramArea / 2, HUHistogramArea / 2), + cvSize(EllipseA, EllipseB), 45, 0, 360, + CV_RGB(1, 1, 1), -1); + break; + + case sm_RandomPixels: + HUSamplePixels = 0; + while (HUSamplePixels != DesiredArea) + { + int i = rand() % HUHistogramArea; + int j = rand() % HUHistogramArea; + + if (MaskImage->imageData[i*MaskImage->widthStep+j] == 0) + { + MaskImage->imageData[i*MaskImage->widthStep+j] = 1; + HUSamplePixels++; + } + } + break; + + default: + cvCircle(MaskImage, cvPoint(HUHistogramArea / 2, HUHistogramArea / 2), + (int)MERound(sqrt((float)DesiredArea / ME_PI_VALUE)), CV_RGB(1, 1, 1), -1); + break; + } + + HUSamplePixels = 0; + memset(CalculationMask, 0, sizeof(CalculationMask)); + + for (int i = 0; i < HUHistogramArea; ++i) + for (int i1 = 0; i1 < HUHistogramArea; ++i1) + { + if (MaskImage->imageData[i*MaskImage->widthStep+i1] != 0) + { + HUSamplePixels++; + CalculationMask[i][i1] = 1; + } else { + CalculationMask[i][i1] = 0; + } + } + + // Fill an auxiliary variable for fast computing with data + for (int i = 0; i < HUHistogramArea; ++i) + { + HUMaskColumnAddDel[i][0] = -1; + for (int i1 = 0; i1 < HUHistogramArea; ++i1) + { + if (CalculationMask[i][i1] != 0) + { + HUMaskColumnAddDel[i][0] = i1; + break; + } + } + HUMaskColumnAddDel[i][1] = -1; + for (int i1 = HUHistogramArea-1; i1 >= 0; --i1) + { + if (CalculationMask[i][i1] != 0) + { + HUMaskColumnAddDel[i][1] = i1+1; + break; + } + } + } + // Fill an auxiliary variable for fast computing with data + for (int i = 0; i < HUHistogramArea; ++i) + { + HUMaskRowAddDel[i][0] = -1; + for (int i1 = 0; i1 < HUHistogramArea; ++i1) + { + if (CalculationMask[i1][i] != 0) + { + HUMaskRowAddDel[i][0] = i1; + break; + } + } + HUMaskRowAddDel[i][1] = -1; + for (int i1 = HUHistogramArea-1; i1 >= 0; --i1) + { + if (CalculationMask[i1][i] != 0) + { + HUMaskRowAddDel[i][1] = i1+1; + break; + } + } + } + // Freeing memory + cvReleaseImage(&MaskImage); +} + diff --git a/package_bgs/ck/MotionDetection.hpp b/package_bgs/ck/MotionDetection.hpp new file mode 100644 index 0000000..6e11521 --- /dev/null +++ b/package_bgs/ck/MotionDetection.hpp @@ -0,0 +1,401 @@ +/* + * This file is part of the AiBO+ project + * + * Copyright (C) 2005-2013 Csaba Kertész (csaba.kertesz@gmail.com) + * + * AiBO+ is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * AiBO+ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef MotionDetection_hpp +#define MotionDetection_hpp + +/** + * @addtogroup mindeye + * @{ + */ + +#include "MEDefs.hpp" +#include "MEImage.hpp" + +class CvBGStatModel; +class CvPoint2D32f; + +// Struct for histogram update data of a pixel +struct MEPixelDataType; + +/** + * MotionDetection + * @brief Extract moving objects from image sequence + */ +class MotionDetection +{ +public: + + /// Types of motion detection + typedef enum + { + md_Min = 0, /*!< Minimum value */ + md_NotDefined = md_Min, /*!< Not defined */ + md_DLBPHistograms, /*!< Dynamic LBP */ + md_LBPHistograms, /*!< Normal LBP */ + md_Max = md_LBPHistograms /*!< Maximum value */ + } DetectorType; + + /// Types of sample mask + typedef enum + { + sm_Min = 0, /*!< Minimum value */ + sm_Circle = sm_Min, /*!< Circle */ + sm_Square, /*!< Square */ + sm_Ellipse, /*!< Ellipse */ + sm_RandomPixels, /*!< Random pixels */ + sm_Max = sm_RandomPixels /*!< Maximum value */ + } SampleMaskType; + + /// Types of motion detection parameters + typedef enum + { + mdp_Min = 0, /*!< Minimum value */ + mdp_HUProximityThreshold = mdp_Min, /*!< Proximity threshold */ + mdp_HUBackgroundThreshold, /*!< Background threshold */ + mdp_HUHistogramLearningRate, /*!< Histogram learning rate */ + mdp_HUWeightsLearningRate, /*!< Weights learning rate */ + mdp_HUMinCutWeight, /*!< Minimum cut weight */ + mdp_HUDesiredSamplePixels, /*!< Desired sample pixels */ + mdp_HUHistogramsPerPixel, /*!< Histogram per pixel */ + mdp_HUHistogramArea, /*!< Histogram area */ + mdp_HUHistogramBins, /*!< Histogram bins */ + mdp_HUColorSpace, /*!< Color space */ + mdp_HULBPMode, /*!< LBP mode */ + mdp_Max = mdp_HULBPMode /*!< Maximum value */ + } ParametersType; + + /*! + * @brief Class constructor + * + * @param mode Detection mode + * + * Class constructor with the possibility to specify the detection mode. + * The default is dynamic LBP. + * + */ + + MotionDetection(DetectorType mode = md_DLBPHistograms); + /// Destructor of class + ~MotionDetection(); + + /* + ------------------------------------------------------------------- + Motion methods + ------------------------------------------------------------------- + */ + + /*! + * @brief Set the mode of the motion detection + * + * @param newmode New mode of detection + * + * Set the mode of the motion detection. + * + */ + + void SetMode(DetectorType newmode); + + /*! + * @brief Get a parameter value of the motion detection + * + * @param param Parameter of the detection + * + * @return Queried value + * + * Get the value of a parameter of the motion detection. + * + */ + + float GetParameter(ParametersType param) const; + + /*! + * @brief Set a parameter of the motion detection + * + * @param param Parameter of the detection + * @param value New value + * + * Set a new value to a parameter of the motion detection. + * + */ + + void SetParameter(ParametersType param, float value); + + /*! + * @brief Detect the motions on an image + * + * @param image Image to process + * + * The function designed to search motions in image streams + * thus it needs to process the image sequence frame by frame. + * It processes an image from this sequence and searches moving blobs + * on that. + * + */ + + void DetectMotions(MEImage& image); + + /*! + * @brief Get mask image with detected motions + * + * @param mask_image Result mask image + * + * The function creates a mask image on which the objects are + * indicated by white blobs. + * + */ + + void GetMotionsMask(MEImage& mask_image); + + /*! + * @brief Calculate results of the motion detection + * + * @param referenceimage Reference mask image + * @param tnegatives True negative pixels + * @param tpositives True positive pixels + * @param ttnegatives Total true negative pixels + * @param ttpositives Total true positive pixels + * + * The function calculates the results of the motion detection + * between the current motion mask and a given reference mask + * image. + * + */ + + void CalculateResults(MEImage& referenceimage, int& tnegatives, int& tpositives, + int& ttnegatives, int& ttpositives); + +private: + + /*! + * @brief Release data structures + * + * Function releases the data structures. + * + */ + + void ReleaseData(); + + /* + ------------------------------------------------------------------- + Histogram update methods + ------------------------------------------------------------------- + */ + + /*! + * @brief Init HU data structures + * + * @param imagewidth Image width for HU to process + * @param imageheight Image height for HU to process + * + * Function allocates/re-allocates the HU data structures and they + * are cleared if needs be. + * + */ + + void InitHUData(int imagewidth, int imageheight); + + /*! + * @brief Init HU optical flow data structures + * + * @param imagewidth Image width for HU to process + * @param imageheight Image height for HU to process + * + * Function allocates/re-allocates the HU optical flow + * data structures. + * + */ + + void InitHUOFData(int imagewidth, int imageheight); + + /*! + * @brief Release HU data structures + * + * Function releases the HU data structures. + * + */ + + void ReleaseHUData(); + + /*! + * @brief Release HU optical flow data structures + * + * Function releases the HU optical flow data structures. + * + */ + + void ReleaseHUOFData(); + + /*! + * @brief Clear HU data structures + * + * Function clears the HU data structures. + * + */ + + void ClearHUData(); + + /*! + * @brief Get mask image with detected motions by histogram update + * + * @param mask_image Result mask image + * + * The function creates a mask image on which the objects are + * indicated by white blobs. + * + */ + + void GetMotionsMaskHU(MEImage& mask_image); + + /*! + * @brief Set the sample mask + * + * @param mask_type Type of the mask + * @param desiredarea The desired area size of the mask + * + * The function creates a sample mask with a desired form + * (square, circle, ellipse, random pixels) and size. + * + */ + + void SetSampleMaskHU(SampleMaskType mask_type, int desiredarea); + + /*! + * @brief Detect the motions on an image with histogram update + * + * @param image Image to process + * + * The function designed to search motions in image streams + * thus it needs to process the image sequence frame by frame. + * It processes an image from this sequence and searches moving blobs + * on that. It uses histogram update method. + * + */ + + void DetectMotionsHU(MEImage& image); + + /*! + * @brief Update a model + * + * @param image Image to process + * @param model Model to update + * + * The function updates a histogram model of the image. + * + */ + + void UpdateModelHU(MEImage& image, MEPixelDataType*** model); + + /*! + * @brief Update the HU data structure for one pixel + * + * @param pixeldata Pixel data + * @param histogram Current histogram + * + * This method updates the HU data for one pixel. + * + */ + + void UpdateHUPixelData(MEPixelDataType* pixeldata, const float *histogram); + + /*! + * @brief Optical flow correction of the camera movements + * + * The function trackes some points on the scene if a camera movement is + * detected, then the LBP pixel data is corrected. + * + */ + + void OpticalFlowCorrection(); + +private: + // GENERAL VARIABLES + /// Motion detection type + DetectorType MDMode; + /// State of the data structures + MEProcessStateType MDDataState; + /// Processed number in the image sequence + int Frames; + /// Store the current image + MEImage CurrentImage; + /// Store the previous image + MEImage PreviousImage; + /// Store the current mask image + MEImage MaskImage; + /// Store the current mask image + bool ReadyMask; + // HISTOGRAM UPDATE VARIABLES + /// Color space (-1 = no conversion) + int HUColorSpace; + /// LBP calculation mode (-1 = no conversion) + int HULBPMode; + /// Histograms per pixel + int HUHistogramsPerPixel; + /// Histogram area + int HUHistogramArea; + /// Histogram bins + int HUHistogramBins; + /// Image width for histogram update + int HUImageWidth; + /// Image height for histogram update + int HUImageHeight; + /// Data of the LBP histograms + MEPixelDataType ***HULBPPixelData; + /// Store the previous blue layer + MEImage PreviousBlueLayer; + /// Histogram proximity threshold + float HUPrThres; + /// Background selection threshold + float HUBackgrThres; + /// Histogram learning rate + float HUHistLRate; + /// Weights learning rate + float HUWeightsLRate; + /// Pixel number used to calculate the histograms + int HUSamplePixels; + /// The desired pixel number used to calculate the histograms (-1 = Auto) + int HUDesiredSamplePixels; + /// Min cut weight + float HUMinCutWeight; + /// Auxiliary variable for computing the histograms in a column + int **HUMaskColumnAddDel; + /// Auxiliary variable for computing the histograms in a row + int **HUMaskRowAddDel; + // OPTICAL FLOW VARIABLES + /// State of the optical flow + MEProcessStateType HUOFDataState; + /// Number of the tracked points with optical flow + int HUOFPointsNumber; + /// Tracked points + CvPoint2D32f* HUOFPoints[2]; + /// The rest x component of previous camera movement + int HUOFCamMovementX; + /// Maximum tracked points detected in one cycle + int MaxTrackedPoints; + /// Processed frame number with optical flow in the image sequence + int HUOFFrames; + /// Indicator of a new camera movement + bool HUOFCamMovement; +}; + +/** @} */ + +#endif diff --git a/package_bgs/ck/README.TXT b/package_bgs/ck/README.TXT new file mode 100644 index 0000000..d76c6a3 --- /dev/null +++ b/package_bgs/ck/README.TXT @@ -0,0 +1,135 @@ +################################################################### +# # +# MAXFLOW - software for computing mincut/maxflow in a graph # +# Version 2.2 # +# http://www.cs.cornell.edu/People/vnk/software.html # +# # +# Yuri Boykov (yuri@csd.uwo.ca) # +# Vladimir Kolmogorov (vnk@cs.cornell.edu) # +# 2001 # +# # +################################################################### + +1. Introduction. + +This software library implements the maxflow algorithm +described in + + An Experimental Comparison of Min-Cut/Max-Flow Algorithms + for Energy Minimization in Vision. + Yuri Boykov and Vladimir Kolmogorov. + In IEEE Transactions on Pattern Analysis and Machine Intelligence (PAMI), + September 2004 + +This algorithm was developed by Yuri Boykov and Vladimir Kolmogorov +at Siemens Corporate Research. To make it available for public use, +it was later reimplemented by Vladimir Kolmogorov based on open publications. + +If you use this software for research purposes, you should cite +the aforementioned paper in any resulting publication. + +Tested under windows, Visual C++ 6.0 compiler and unix (SunOS 5.8 +and RedHat Linux 7.0, GNU c++ compiler). + +################################################################## + +2. License. + + Copyright 2001 Vladimir Kolmogorov (vnk@cs.cornell.edu), Yuri Boykov (yuri@csd.uwo.ca). + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +################################################################## + +3. Graph representation. + +There are two versions of the algorithm using different +graph representations (adjacency list and forward star). +The former one uses more than twice as much memory as the +latter one but is 10-20% faster. + +Memory allocation (assuming that all capacities are 'short' - 2 bytes): + + | Nodes | Arcs +------------------------------------------ +Adjacency list | *24 bytes | *14 bytes +Forward star | *28 bytes | 6 bytes + +(* means that often it should be rounded up to be a multiple of 4 +- some compilers (e.g. Visual C++) seem to round up elements +of arrays unless the are structures containing only char[].) + +Note that arcs are always added in pairs - in forward and reverse directions. +Arcs between nodes and terminals (the source and the sink) are +not stored as arcs, but rather as a part of nodes. + +The assumption for the forward star representation is that +the maximum number of arcs per node (except the source +and the sink) is much less than ARC_BLOCK_SIZE (1024 by default). + +Both versions have the same interface. + +################################################################## + +4. Example usage. + +This section shows how to use the library to compute +a minimum cut on the following graph: + + SOURCE + / \ + 1/ \2 + / 3 \ + node0 -----> node1 + | <----- | + | 4 | + \ / + 5\ /6 + \ / + SINK + +/////////////////////////////////////////////////// + +#include <stdio.h> +#include "graph.h" + +void main() +{ + Graph::node_id nodes[2]; + Graph *g = new Graph(); + + nodes[0] = g -> add_node(); + nodes[1] = g -> add_node(); + g -> set_tweights(nodes[0], 1, 5); + g -> set_tweights(nodes[1], 2, 6); + g -> add_edge(nodes[0], nodes[1], 3, 4); + + Graph::flowtype flow = g -> maxflow(); + + printf("Flow = %d\n", flow); + printf("Minimum cut:\n"); + if (g->what_segment(nodes[0]) == Graph::SOURCE) + printf("node0 is in the SOURCE set\n"); + else + printf("node0 is in the SINK set\n"); + if (g->what_segment(nodes[1]) == Graph::SOURCE) + printf("node1 is in the SOURCE set\n"); + else + printf("node1 is in the SINK set\n"); + + delete g; +} + +/////////////////////////////////////////////////// diff --git a/package_bgs/ck/block.h b/package_bgs/ck/block.h new file mode 100644 index 0000000..a243ed1 --- /dev/null +++ b/package_bgs/ck/block.h @@ -0,0 +1,286 @@ +/* block.h */ +/* + Copyright 2001 Vladimir Kolmogorov (vnk@cs.cornell.edu), Yuri Boykov (yuri@csd.uwo.ca). + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +/* + Template classes Block and DBlock + Implement adding and deleting items of the same type in blocks. + + If there there are many items then using Block or DBlock + is more efficient than using 'new' and 'delete' both in terms + of memory and time since + (1) On some systems there is some minimum amount of memory + that 'new' can allocate (e.g., 64), so if items are + small that a lot of memory is wasted. + (2) 'new' and 'delete' are designed for items of varying size. + If all items has the same size, then an algorithm for + adding and deleting can be made more efficient. + (3) All Block and DBlock functions are inline, so there are + no extra function calls. + + Differences between Block and DBlock: + (1) DBlock allows both adding and deleting items, + whereas Block allows only adding items. + (2) Block has an additional operation of scanning + items added so far (in the order in which they were added). + (3) Block allows to allocate several consecutive + items at a time, whereas DBlock can add only a single item. + + Note that no constructors or destructors are called for items. + + Example usage for items of type 'MyType': + + /////////////////////////////////////////////////// + #include "block.h" + #define BLOCK_SIZE 1024 + typedef struct { int a, b; } MyType; + MyType *ptr, *array[10000]; + + ... + + Block<MyType> *block = new Block<MyType>(BLOCK_SIZE); + + // adding items + for (int i=0; i<sizeof(array); i++) + { + ptr = block -> New(); + ptr -> a = ptr -> b = rand(); + } + + // reading items + for (ptr=block->ScanFirst(); ptr; ptr=block->ScanNext()) + { + printf("%d %d\n", ptr->a, ptr->b); + } + + delete block; + + ... + + DBlock<MyType> *dblock = new DBlock<MyType>(BLOCK_SIZE); + + // adding items + for (int i=0; i<sizeof(array); i++) + { + array[i] = dblock -> New(); + } + + // deleting items + for (int i=0; i<sizeof(array); i+=2) + { + dblock -> Delete(array[i]); + } + + // adding items + for (int i=0; i<sizeof(array); i++) + { + array[i] = dblock -> New(); + } + + delete dblock; + + /////////////////////////////////////////////////// + + Note that DBlock deletes items by marking them as + empty (i.e., by adding them to the list of free items), + so that this memory could be used for subsequently + added items. Thus, at each moment the memory allocated + is determined by the maximum number of items allocated + simultaneously at earlier moments. All memory is + deallocated only when the destructor is called. +*/ + +#ifndef __BLOCK_H__ +#define __BLOCK_H__ + +#include <stdlib.h> +#include <stdio.h> + +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ + +template <class Type> class Block +{ +public: + /* Constructor. Arguments are the block size and + (optionally) the pointer to the function which + will be called if allocation failed; the message + passed to this function is "Not enough memory!" */ + Block(int size, void (*err_function)(char *) = NULL) { first = last = NULL; block_size = size; error_function = err_function; } + + /* Destructor. Deallocates all items added so far */ + ~Block() { while (first) { block *next = first -> next; delete first; first = next; } } + + /* Allocates 'num' consecutive items; returns pointer + to the first item. 'num' cannot be greater than the + block size since items must fit in one block */ + Type *New(int num = 1) + { + Type *t; + + if (!last || last->current + num > last->last) + { + if (last && last->next) last = last -> next; + else + { + block *next = (block *) new char [sizeof(block) + (block_size-1)*sizeof(Type)]; + if (!next) { fprintf(stderr, "Not enough memory!"); exit(1); } + if (last) last -> next = next; + else first = next; + last = next; + last -> current = & ( last -> data[0] ); + last -> last = last -> current + block_size; + last -> next = NULL; + } + } + + t = last -> current; + last -> current += num; + return t; + } + + /* Returns the first item (or NULL, if no items were added) */ + Type *ScanFirst() + { + scan_current_block = first; + if (!scan_current_block) return NULL; + scan_current_data = & ( scan_current_block -> data[0] ); + return scan_current_data ++; + } + + /* Returns the next item (or NULL, if all items have been read) + Can be called only if previous ScanFirst() or ScanNext() + call returned not NULL. */ + Type *ScanNext() + { + if (scan_current_data >= scan_current_block -> current) + { + scan_current_block = scan_current_block -> next; + if (!scan_current_block) return NULL; + scan_current_data = & ( scan_current_block -> data[0] ); + } + return scan_current_data ++; + } + + /* Marks all elements as empty */ + void Reset() + { + block *b; + if (!first) return; + for (b=first; ; b=b->next) + { + b -> current = & ( b -> data[0] ); + if (b == last) break; + } + last = first; + } + +/***********************************************************************/ + +private: + + typedef struct block_st + { + Type *current, *last; + struct block_st *next; + Type data[1]; + } block; + + int block_size; + block *first; + block *last; + + block *scan_current_block; + Type *scan_current_data; + + void (*error_function)(char *); +}; + +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ + +template <class Type> class DBlock +{ +public: + /* Constructor. Arguments are the block size and + (optionally) the pointer to the function which + will be called if allocation failed; the message + passed to this function is "Not enough memory!" */ + DBlock(int size, void (*err_function)(char *) = NULL) { first = NULL; first_free = NULL; block_size = size; error_function = err_function; } + + /* Destructor. Deallocates all items added so far */ + ~DBlock() { while (first) { block *next = first -> next; delete first; first = next; } } + + /* Allocates one item */ + Type *New() + { + block_item *item; + + if (!first_free) + { + block *next = first; + first = (block *) new char [sizeof(block) + (block_size-1)*sizeof(block_item)]; + if (!first) { fprintf(stderr, "Not enough memory!"); exit(1); } + first_free = & (first -> data[0] ); + for (item=first_free; item<first_free+block_size-1; item++) + item -> next_free = item + 1; + item -> next_free = NULL; + first -> next = next; + } + + item = first_free; + first_free = item -> next_free; + return (Type *) item; + } + + /* Deletes an item allocated previously */ + void Delete(Type *t) + { + ((block_item *) t) -> next_free = first_free; + first_free = (block_item *) t; + } + +/***********************************************************************/ + +private: + + typedef union block_item_st + { + Type t; + block_item_st *next_free; + } block_item; + + typedef struct block_st + { + struct block_st *next; + block_item data[1]; + } block; + + int block_size; + block *first; + block_item *first_free; + + void (*error_function)(char *); +}; + + +#endif + diff --git a/package_bgs/ck/graph.cpp b/package_bgs/ck/graph.cpp new file mode 100644 index 0000000..fb4cf9f --- /dev/null +++ b/package_bgs/ck/graph.cpp @@ -0,0 +1,80 @@ +/* graph.cpp */ +/* + Copyright 2001 Vladimir Kolmogorov (vnk@cs.cornell.edu), Yuri Boykov (yuri@csd.uwo.ca). + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include <stdio.h> +#include "graph.h" + +Graph::Graph(void (*err_function)(char *)) +{ + error_function = err_function; + node_block = new Block<node>(NODE_BLOCK_SIZE, error_function); + arc_block = new Block<arc>(NODE_BLOCK_SIZE, error_function); + flow = 0; +} + +Graph::~Graph() +{ + delete node_block; + delete arc_block; +} + +Graph::node_id Graph::add_node() +{ + node *i = node_block -> New(); + + i -> first = NULL; + i -> tr_cap = 0; + + return (node_id) i; +} + +void Graph::add_edge(node_id from, node_id to, captype cap, captype rev_cap) +{ + arc *a, *a_rev; + + a = arc_block -> New(2); + a_rev = a + 1; + + a -> sister = a_rev; + a_rev -> sister = a; + a -> next = ((node*)from) -> first; + ((node*)from) -> first = a; + a_rev -> next = ((node*)to) -> first; + ((node*)to) -> first = a_rev; + a -> head = (node*)to; + a_rev -> head = (node*)from; + a -> r_cap = cap; + a_rev -> r_cap = rev_cap; +} + +void Graph::set_tweights(node_id i, captype cap_source, captype cap_sink) +{ + flow += (cap_source < cap_sink) ? cap_source : cap_sink; + ((node*)i) -> tr_cap = cap_source - cap_sink; +} + +void Graph::add_tweights(node_id i, captype cap_source, captype cap_sink) +{ + register captype delta = ((node*)i) -> tr_cap; + if (delta > 0) cap_source += delta; + else cap_sink -= delta; + flow += (cap_source < cap_sink) ? cap_source : cap_sink; + ((node*)i) -> tr_cap = cap_source - cap_sink; +} diff --git a/package_bgs/ck/graph.h b/package_bgs/ck/graph.h new file mode 100644 index 0000000..fdae566 --- /dev/null +++ b/package_bgs/ck/graph.h @@ -0,0 +1,180 @@ +/* graph.h */ +/* + This software library implements the maxflow algorithm + described in + + An Experimental Comparison of Min-Cut/Max-Flow Algorithms + for Energy Minimization in Vision. + Yuri Boykov and Vladimir Kolmogorov. + In IEEE Transactions on Pattern Analysis and Machine Intelligence (PAMI), + September 2004 + + This algorithm was developed by Yuri Boykov and Vladimir Kolmogorov + at Siemens Corporate Research. To make it available for public use, + it was later reimplemented by Vladimir Kolmogorov based on open publications. + + If you use this software for research purposes, you should cite + the aforementioned paper in any resulting publication. +*/ + +/* + Copyright 2001 Vladimir Kolmogorov (vnk@cs.cornell.edu), Yuri Boykov (yuri@csd.uwo.ca). + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +/* + For description, example usage, discussion of graph representation + and memory usage see README.TXT. +*/ + +#ifndef __GRAPH_H__ +#define __GRAPH_H__ + +#include "block.h" + +/* + Nodes, arcs and pointers to nodes are + added in blocks for memory and time efficiency. + Below are numbers of items in blocks +*/ +#define NODE_BLOCK_SIZE 512 +#define ARC_BLOCK_SIZE 1024 +#define NODEPTR_BLOCK_SIZE 128 + +class Graph +{ +public: + typedef enum + { + SOURCE = 0, + SINK = 1 + } termtype; /* terminals */ + + /* Type of edge weights. + Can be changed to char, int, float, double, ... */ + typedef short captype; + /* Type of total flow */ + typedef int flowtype; + + typedef void * node_id; + + /* interface functions */ + + /* Constructor. Optional argument is the pointer to the + function which will be called if an error occurs; + an error message is passed to this function. If this + argument is omitted, exit(1) will be called. */ + Graph(void (*err_function)(char *) = NULL); + + /* Destructor */ + ~Graph(); + + /* Adds a node to the graph */ + node_id add_node(); + + /* Adds a bidirectional edge between 'from' and 'to' + with the weights 'cap' and 'rev_cap' */ + void add_edge(node_id from, node_id to, captype cap, captype rev_cap); + + /* Sets the weights of the edges 'SOURCE->i' and 'i->SINK' + Can be called at most once for each node before any call to 'add_tweights'. + Weights can be negative */ + void set_tweights(node_id i, captype cap_source, captype cap_sink); + + /* Adds new edges 'SOURCE->i' and 'i->SINK' with corresponding weights + Can be called multiple times for each node. + Weights can be negative */ + void add_tweights(node_id i, captype cap_source, captype cap_sink); + + /* After the maxflow is computed, this function returns to which + segment the node 'i' belongs (Graph::SOURCE or Graph::SINK) */ + termtype what_segment(node_id i); + + /* Computes the maxflow. Can be called only once. */ + flowtype maxflow(); + +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ + +private: + /* internal variables and functions */ + + struct arc_st; + + /* node structure */ + typedef struct node_st + { + arc_st *first; /* first outcoming arc */ + + arc_st *parent; /* node's parent */ + node_st *next; /* pointer to the next active node + (or to itself if it is the last node in the list) */ + int TS; /* timestamp showing when DIST was computed */ + int DIST; /* distance to the terminal */ + short is_sink; /* flag showing whether the node is in the source or in the sink tree */ + + captype tr_cap; /* if tr_cap > 0 then tr_cap is residual capacity of the arc SOURCE->node + otherwise -tr_cap is residual capacity of the arc node->SINK */ + } node; + + /* arc structure */ + typedef struct arc_st + { + node_st *head; /* node the arc points to */ + arc_st *next; /* next arc with the same originating node */ + arc_st *sister; /* reverse arc */ + + captype r_cap; /* residual capacity */ + } arc; + + /* 'pointer to node' structure */ + typedef struct nodeptr_st + { + node_st *ptr; + nodeptr_st *next; + } nodeptr; + + Block<node> *node_block; + Block<arc> *arc_block; + DBlock<nodeptr> *nodeptr_block; + + void (*error_function)(char *); /* this function is called if a error occurs, + with a corresponding error message + (or exit(1) is called if it's NULL) */ + + flowtype flow; /* total flow */ + +/***********************************************************************/ + + node *queue_first[2], *queue_last[2]; /* list of active nodes */ + nodeptr *orphan_first, *orphan_last; /* list of pointers to orphans */ + int TIME; /* monotonically increasing global counter */ + +/***********************************************************************/ + + /* functions for processing active list */ + void set_active(node *i); + node *next_active(); + + void maxflow_init(); + void augment(arc *middle_arc); + void process_source_orphan(node *i); + void process_sink_orphan(node *i); +}; + +#endif diff --git a/package_bgs/ck/maxflow.cpp b/package_bgs/ck/maxflow.cpp new file mode 100644 index 0000000..8812a4a --- /dev/null +++ b/package_bgs/ck/maxflow.cpp @@ -0,0 +1,514 @@ +/* maxflow.cpp */ +/* + Copyright 2001 Vladimir Kolmogorov (vnk@cs.cornell.edu), Yuri Boykov (yuri@csd.uwo.ca). + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include <stdio.h> +#include "graph.h" + +/* + special constants for node->parent +*/ +#define TERMINAL ( (arc *) 1 ) /* to terminal */ +#define ORPHAN ( (arc *) 2 ) /* orphan */ + +#define INFINITE_D 1000000000 /* infinite distance to the terminal */ + +/***********************************************************************/ + +/* + Functions for processing active list. + i->next points to the next node in the list + (or to i, if i is the last node in the list). + If i->next is NULL iff i is not in the list. + + There are two queues. Active nodes are added + to the end of the second queue and read from + the front of the first queue. If the first queue + is empty, it is replaced by the second queue + (and the second queue becomes empty). +*/ + +inline void Graph::set_active(node *i) +{ + if (!i->next) + { + /* it's not in the list yet */ + if (queue_last[1]) queue_last[1] -> next = i; + else queue_first[1] = i; + queue_last[1] = i; + i -> next = i; + } +} + +/* + Returns the next active node. + If it is connected to the sink, it stays in the list, + otherwise it is removed from the list +*/ +inline Graph::node * Graph::next_active() +{ + node *i; + + while ( 1 ) + { + if (!(i=queue_first[0])) + { + queue_first[0] = i = queue_first[1]; + queue_last[0] = queue_last[1]; + queue_first[1] = NULL; + queue_last[1] = NULL; + if (!i) return NULL; + } + + /* remove it from the active list */ + if (i->next == i) queue_first[0] = queue_last[0] = NULL; + else queue_first[0] = i -> next; + i -> next = NULL; + + /* a node in the list is active iff it has a parent */ + if (i->parent) return i; + } +} + +/***********************************************************************/ + +void Graph::maxflow_init() +{ + node *i; + + queue_first[0] = queue_last[0] = NULL; + queue_first[1] = queue_last[1] = NULL; + orphan_first = NULL; + + for (i=node_block->ScanFirst(); i; i=node_block->ScanNext()) + { + i -> next = NULL; + i -> TS = 0; + if (i->tr_cap > 0) + { + /* i is connected to the source */ + i -> is_sink = 0; + i -> parent = TERMINAL; + set_active(i); + i -> TS = 0; + i -> DIST = 1; + } + else if (i->tr_cap < 0) + { + /* i is connected to the sink */ + i -> is_sink = 1; + i -> parent = TERMINAL; + set_active(i); + i -> TS = 0; + i -> DIST = 1; + } + else + { + i -> parent = NULL; + } + } + TIME = 0; +} + +/***********************************************************************/ + +void Graph::augment(arc *middle_arc) +{ + node *i; + arc *a; + captype bottleneck; + nodeptr *np; + + + /* 1. Finding bottleneck capacity */ + /* 1a - the source tree */ + bottleneck = middle_arc -> r_cap; + for (i=middle_arc->sister->head; ; i=a->head) + { + a = i -> parent; + if (a == TERMINAL) break; + if (bottleneck > a->sister->r_cap) bottleneck = a -> sister -> r_cap; + } + if (bottleneck > i->tr_cap) bottleneck = i -> tr_cap; + /* 1b - the sink tree */ + for (i=middle_arc->head; ; i=a->head) + { + a = i -> parent; + if (a == TERMINAL) break; + if (bottleneck > a->r_cap) bottleneck = a -> r_cap; + } + if (bottleneck > - i->tr_cap) bottleneck = - i -> tr_cap; + + + /* 2. Augmenting */ + /* 2a - the source tree */ + middle_arc -> sister -> r_cap += bottleneck; + middle_arc -> r_cap -= bottleneck; + for (i=middle_arc->sister->head; ; i=a->head) + { + a = i -> parent; + if (a == TERMINAL) break; + a -> r_cap += bottleneck; + a -> sister -> r_cap -= bottleneck; + if (!a->sister->r_cap) + { + /* add i to the adoption list */ + i -> parent = ORPHAN; + np = nodeptr_block -> New(); + np -> ptr = i; + np -> next = orphan_first; + orphan_first = np; + } + } + i -> tr_cap -= bottleneck; + if (!i->tr_cap) + { + /* add i to the adoption list */ + i -> parent = ORPHAN; + np = nodeptr_block -> New(); + np -> ptr = i; + np -> next = orphan_first; + orphan_first = np; + } + /* 2b - the sink tree */ + for (i=middle_arc->head; ; i=a->head) + { + a = i -> parent; + if (a == TERMINAL) break; + a -> sister -> r_cap += bottleneck; + a -> r_cap -= bottleneck; + if (!a->r_cap) + { + /* add i to the adoption list */ + i -> parent = ORPHAN; + np = nodeptr_block -> New(); + np -> ptr = i; + np -> next = orphan_first; + orphan_first = np; + } + } + i -> tr_cap += bottleneck; + if (!i->tr_cap) + { + /* add i to the adoption list */ + i -> parent = ORPHAN; + np = nodeptr_block -> New(); + np -> ptr = i; + np -> next = orphan_first; + orphan_first = np; + } + + + flow += bottleneck; +} + +/***********************************************************************/ + +void Graph::process_source_orphan(node *i) +{ + node *j; + arc *a0, *a0_min = NULL, *a; + nodeptr *np; + int d, d_min = INFINITE_D; + + /* trying to find a new parent */ + for (a0=i->first; a0; a0=a0->next) + if (a0->sister->r_cap) + { + j = a0 -> head; + if (!j->is_sink && (a=j->parent)) + { + /* checking the origin of j */ + d = 0; + while ( 1 ) + { + if (j->TS == TIME) + { + d += j -> DIST; + break; + } + a = j -> parent; + d ++; + if (a==TERMINAL) + { + j -> TS = TIME; + j -> DIST = 1; + break; + } + if (a==ORPHAN) { d = INFINITE_D; break; } + j = a -> head; + } + if (d<INFINITE_D) /* j originates from the source - done */ + { + if (d<d_min) + { + a0_min = a0; + d_min = d; + } + /* set marks along the path */ + for (j=a0->head; j->TS!=TIME; j=j->parent->head) + { + j -> TS = TIME; + j -> DIST = d --; + } + } + } + } + + if ((i->parent = a0_min)) + { + i -> TS = TIME; + i -> DIST = d_min + 1; + } + else + { + /* no parent is found */ + i -> TS = 0; + + /* process neighbors */ + for (a0=i->first; a0; a0=a0->next) + { + j = a0 -> head; + if (!j->is_sink && (a=j->parent)) + { + if (a0->sister->r_cap) set_active(j); + if (a!=TERMINAL && a!=ORPHAN && a->head==i) + { + /* add j to the adoption list */ + j -> parent = ORPHAN; + np = nodeptr_block -> New(); + np -> ptr = j; + if (orphan_last) orphan_last -> next = np; + else orphan_first = np; + orphan_last = np; + np -> next = NULL; + } + } + } + } +} + +void Graph::process_sink_orphan(node *i) +{ + node *j; + arc *a0, *a0_min = NULL, *a; + nodeptr *np; + int d, d_min = INFINITE_D; + + /* trying to find a new parent */ + for (a0=i->first; a0; a0=a0->next) + if (a0->r_cap) + { + j = a0 -> head; + if (j->is_sink && (a=j->parent)) + { + /* checking the origin of j */ + d = 0; + while ( 1 ) + { + if (j->TS == TIME) + { + d += j -> DIST; + break; + } + a = j -> parent; + d ++; + if (a==TERMINAL) + { + j -> TS = TIME; + j -> DIST = 1; + break; + } + if (a==ORPHAN) { d = INFINITE_D; break; } + j = a -> head; + } + if (d<INFINITE_D) /* j originates from the sink - done */ + { + if (d<d_min) + { + a0_min = a0; + d_min = d; + } + /* set marks along the path */ + for (j=a0->head; j->TS!=TIME; j=j->parent->head) + { + j -> TS = TIME; + j -> DIST = d --; + } + } + } + } + + if ((i->parent = a0_min)) + { + i -> TS = TIME; + i -> DIST = d_min + 1; + } + else + { + /* no parent is found */ + i -> TS = 0; + + /* process neighbors */ + for (a0=i->first; a0; a0=a0->next) + { + j = a0 -> head; + if (j->is_sink && (a=j->parent)) + { + if (a0->r_cap) set_active(j); + if (a!=TERMINAL && a!=ORPHAN && a->head==i) + { + /* add j to the adoption list */ + j -> parent = ORPHAN; + np = nodeptr_block -> New(); + np -> ptr = j; + if (orphan_last) orphan_last -> next = np; + else orphan_first = np; + orphan_last = np; + np -> next = NULL; + } + } + } + } +} + +/***********************************************************************/ + +Graph::flowtype Graph::maxflow() +{ + node *i, *j, *current_node = NULL; + arc *a; + nodeptr *np, *np_next; + + maxflow_init(); + nodeptr_block = new DBlock<nodeptr>(NODEPTR_BLOCK_SIZE, error_function); + + while ( 1 ) + { + if ((i=current_node)) + { + i -> next = NULL; /* remove active flag */ + if (!i->parent) i = NULL; + } + if (!i) + { + if (!(i = next_active())) break; + } + + /* growth */ + if (!i->is_sink) + { + /* grow source tree */ + for (a=i->first; a; a=a->next) + if (a->r_cap) + { + j = a -> head; + if (!j->parent) + { + j -> is_sink = 0; + j -> parent = a -> sister; + j -> TS = i -> TS; + j -> DIST = i -> DIST + 1; + set_active(j); + } + else if (j->is_sink) break; + else if (j->TS <= i->TS && + j->DIST > i->DIST) + { + /* heuristic - trying to make the distance from j to the source shorter */ + j -> parent = a -> sister; + j -> TS = i -> TS; + j -> DIST = i -> DIST + 1; + } + } + } + else + { + /* grow sink tree */ + for (a=i->first; a; a=a->next) + if (a->sister->r_cap) + { + j = a -> head; + if (!j->parent) + { + j -> is_sink = 1; + j -> parent = a -> sister; + j -> TS = i -> TS; + j -> DIST = i -> DIST + 1; + set_active(j); + } + else if (!j->is_sink) { a = a -> sister; break; } + else if (j->TS <= i->TS && + j->DIST > i->DIST) + { + /* heuristic - trying to make the distance from j to the sink shorter */ + j -> parent = a -> sister; + j -> TS = i -> TS; + j -> DIST = i -> DIST + 1; + } + } + } + + TIME ++; + + if (a) + { + i -> next = i; /* set active flag */ + current_node = i; + + /* augmentation */ + augment(a); + /* augmentation end */ + + /* adoption */ + while ((np=orphan_first)) + { + np_next = np -> next; + np -> next = NULL; + + while ((np=orphan_first)) + { + orphan_first = np -> next; + i = np -> ptr; + nodeptr_block -> Delete(np); + if (!orphan_first) orphan_last = NULL; + if (i->is_sink) process_sink_orphan(i); + else process_source_orphan(i); + } + + orphan_first = np_next; + } + /* adoption end */ + } + else current_node = NULL; + } + + delete nodeptr_block; + + return flow; +} + +/***********************************************************************/ + +Graph::termtype Graph::what_segment(node_id i) +{ + if (((node*)i)->parent && !((node*)i)->is_sink) return SOURCE; + return SINK; +} + diff --git a/package_bgs/db/IndependentMultimodalBGS.cpp b/package_bgs/db/IndependentMultimodalBGS.cpp new file mode 100644 index 0000000..c05ee5c --- /dev/null +++ b/package_bgs/db/IndependentMultimodalBGS.cpp @@ -0,0 +1,54 @@ +#include "IndependentMultimodalBGS.h" + +IndependentMultimodalBGS::IndependentMultimodalBGS() : firstTime(true), fps(10), showOutput(true){ + pIMBS = new BackgroundSubtractorIMBS(fps); +} +IndependentMultimodalBGS::~IndependentMultimodalBGS(){ + delete pIMBS; +} + +void IndependentMultimodalBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if (firstTime) + saveConfig(); + + //get the fgmask and update the background model + pIMBS->apply(img_input, img_foreground); + + //get background image + pIMBS->getBackgroundImage(img_background); + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + if (showOutput) + { + cv::imshow("IMBS FG", img_foreground); + cv::imshow("IMBS BG", img_background); + } + + firstTime = false; +} + +void IndependentMultimodalBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/IndependentMultimodalBGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void IndependentMultimodalBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/IndependentMultimodalBGS.xml", 0, CV_STORAGE_READ); + + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/db/IndependentMultimodalBGS.h b/package_bgs/db/IndependentMultimodalBGS.h new file mode 100644 index 0000000..b6f9a5d --- /dev/null +++ b/package_bgs/db/IndependentMultimodalBGS.h @@ -0,0 +1,29 @@ +#pragma once + +#include <cv.h> +#include <highgui.h> + +#include "imbs.hpp" + +#include "../IBGS.h" + +class IndependentMultimodalBGS : public IBGS +{ +private: + BackgroundSubtractorIMBS* pIMBS; + int fps; + bool firstTime; + cv::Mat img_foreground; + cv::Mat img_background; + bool showOutput; + +public: + IndependentMultimodalBGS(); + ~IndependentMultimodalBGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; \ No newline at end of file diff --git a/package_bgs/db/imbs.cpp b/package_bgs/db/imbs.cpp new file mode 100644 index 0000000..715d699 --- /dev/null +++ b/package_bgs/db/imbs.cpp @@ -0,0 +1,748 @@ +/* +* IMBS Background Subtraction Library +* +* This file imbs.hpp contains the C++ OpenCV based implementation for +* IMBS algorithm described in +* D. D. Bloisi and L. Iocchi +* "Independent Multimodal Background Subtraction" +* In Proc. of the Third Int. Conf. on Computational Modeling of Objects +* Presented in Images: Fundamentals, Methods and Applications, pp. 39-44, 2012. +* Please, cite the above paper if you use IMBS. +* +* This software is provided without any warranty about its usability. +* It is for educational purposes and should be regarded as such. +* +* Written by Domenico D. Bloisi +* +* Please, report suggestions/comments/bugs to +* domenico.bloisi@gmail.com +* +*/ + +#include "imbs.hpp" + +using namespace std; +using namespace cv; + +BackgroundSubtractorIMBS::BackgroundSubtractorIMBS() +{ + fps = 0.; + fgThreshold = 15; + associationThreshold = 5; + samplingPeriod = 250.;//500.ms + minBinHeight = 2; + numSamples = 10; //30 + alpha = 0.65; + beta = 1.15; + tau_s = 60.; + tau_h = 40.; + minArea = 30.; + persistencePeriod = samplingPeriod*numSamples/3.;//ms + + initial_tick_count = (double)getTickCount(); + + //morphological Opening and closing + morphologicalFiltering = false; +} + +BackgroundSubtractorIMBS::BackgroundSubtractorIMBS( + double fps, + unsigned int fgThreshold, + unsigned int associationThreshold, + double samplingPeriod, + unsigned int minBinHeight, + unsigned int numSamples, + double alpha, + double beta, + double tau_s, + double tau_h, + double minArea, + double persistencePeriod, + bool morphologicalFiltering) +{ + this->fps = fps; + this->fgThreshold = fgThreshold; + this->persistencePeriod = persistencePeriod; + if(minBinHeight <= 1){ + this->minBinHeight = 1; + } + else { + this->minBinHeight = minBinHeight; + } + this->associationThreshold = associationThreshold; + this->samplingPeriod = samplingPeriod;//ms + this->minBinHeight = minBinHeight; + this->numSamples = numSamples; + this->alpha = alpha; + this->beta = beta; + this->tau_s = tau_s; + this->tau_h = tau_h; + this->minArea = minArea; + + if(fps == 0.) + initial_tick_count = (double)getTickCount(); + else + initial_tick_count = 0; + + //morphological Opening and closing + this->morphologicalFiltering = morphologicalFiltering; +} + +BackgroundSubtractorIMBS::~BackgroundSubtractorIMBS() +{ + delete[] bgBins; + delete[] bgModel; + delete[] persistenceMap; +} + +void BackgroundSubtractorIMBS::initialize(Size frameSize, int frameType) +{ + /*cout << "INPUT: WIDTH " << frameSize.width << " HEIGHT " << frameSize.height << + " FPS " << fps << endl; + cout << endl;*/ + + this->frameSize = frameSize; + this->frameType = frameType; + this->numPixels = frameSize.width*frameSize.height; + + persistenceMap = new unsigned int[numPixels]; + for(int i = 0; i < numPixels; i++) { + persistenceMap[i] = 0; + } + + bgBins = new Bins[numPixels]; + bgModel = new BgModel[numPixels]; + maxBgBins = numSamples / minBinHeight; + + timestamp = 0.;//ms + prev_timestamp = 0.;//ms + prev_bg_frame_time = 0; + bg_frame_counter = 0; + bg_reset = false; + prev_area = 0; + sudden_change = false; + + SHADOW_LABEL = 80; + PERSISTENCE_LABEL = 180; + FOREGROUND_LABEL = 255; + + fgmask.create(frameSize, CV_8UC1); + fgfiltered.create(frameSize, CV_8UC1); + persistenceImage = Mat::zeros(frameSize, CV_8UC1); + bgSample.create(frameSize, CV_8UC3); + bgImage = Mat::zeros(frameSize, CV_8UC3); + + //initial message to be shown until the first fg mask is computed + initialMsgGray = Mat::zeros(frameSize, CV_8UC1); + putText(initialMsgGray, "Creating", Point(10,20), FONT_HERSHEY_SIMPLEX, 0.4, CV_RGB(255, 255, 255)); + putText(initialMsgGray, "initial", Point(10,40), FONT_HERSHEY_SIMPLEX, 0.4, CV_RGB(255, 255, 255)); + putText(initialMsgGray, "background...", Point(10,60), FONT_HERSHEY_SIMPLEX, 0.4, CV_RGB(255, 255, 255)); + + initialMsgRGB = Mat::zeros(frameSize, CV_8UC3); + putText(initialMsgRGB, "Creating", Point(10,20), FONT_HERSHEY_SIMPLEX, 0.4, CV_RGB(255, 255, 255)); + putText(initialMsgRGB, "initial", Point(10,40), FONT_HERSHEY_SIMPLEX, 0.4, CV_RGB(255, 255, 255)); + putText(initialMsgRGB, "background...", Point(10,60), FONT_HERSHEY_SIMPLEX, 0.4, CV_RGB(255, 255, 255)); + + if(minBinHeight <= 1){ + minBinHeight = 1; + } + + for(unsigned int p = 0; p < numPixels; ++p) + { + bgBins[p].binValues = new Vec3b[numSamples]; + bgBins[p].binHeights = new uchar[numSamples]; + bgBins[p].isFg = new bool[numSamples]; + + bgModel[p].values = new Vec3b[maxBgBins]; + bgModel[p].isValid = new bool[maxBgBins]; + bgModel[p].isValid[0] = false; + bgModel[p].isFg = new bool[maxBgBins]; + bgModel[p].counter = new uchar[maxBgBins]; + } +} + +void BackgroundSubtractorIMBS::apply(InputArray _frame, OutputArray _fgmask, double learningRate) +{ + frame = _frame.getMat(); + + CV_Assert(frame.depth() == CV_8U); + CV_Assert(frame.channels() == 3); + + bool needToInitialize = nframes == 0 || frame.type() != frameType; + if( needToInitialize ) { + initialize(frame.size(), frame.type()); + } + + _fgmask.create(frameSize, CV_8UC1); + fgmask = _fgmask.getMat(); + fgmask = Scalar(0); + + //get current time + prev_timestamp = timestamp; + if(fps == 0.) { + timestamp = getTimestamp();//ms + } + else { + timestamp += 1000./fps;//ms + } + + //check for global changes + if(sudden_change) { + changeBg(); + } + + //wait for the first model to be generated + if(bgModel[0].isValid[0]) { + getFg(); + hsvSuppression(); + filterFg(); + } + //update the bg model + updateBg(); + + //show an initial message if the first bg is not yet ready + if(!bgModel[0].isValid[0]) { + initialMsgGray.copyTo(fgmask); + initialMsgRGB.copyTo(bgImage); + } + ++nframes; +} + +void BackgroundSubtractorIMBS::updateBg() { + if(bg_reset) { + if(bg_frame_counter > numSamples - 1) { + bg_frame_counter = numSamples - 1; + } + } + + if(prev_bg_frame_time > timestamp) { + prev_bg_frame_time = timestamp; + } + + if(bg_frame_counter == numSamples - 1) { + createBg(bg_frame_counter); + bg_frame_counter = 0; + } + else { //bg_frame_counter < (numSamples - 1) + + if((timestamp - prev_bg_frame_time) >= samplingPeriod) + { + //get a new sample for creating the bg model + prev_bg_frame_time = timestamp; + frame.copyTo(bgSample); + createBg(bg_frame_counter); + bg_frame_counter++; + } + } +} + +double BackgroundSubtractorIMBS::getTimestamp() { + return ((double)getTickCount() - initial_tick_count)*1000./getTickFrequency(); +} + +void BackgroundSubtractorIMBS::hsvSuppression() { + + uchar h_i, s_i, v_i; + uchar h_b, s_b, v_b; + float h_diff, s_diff, v_ratio; + + Mat bgrPixel(cv::Size(1, 1), CV_8UC3); + + vector<Mat> imHSV; + cv::split(convertImageRGBtoHSV(frame), imHSV); + + for(unsigned int p = 0; p < numPixels; ++p) { + if(fgmask.data[p]) { + + h_i = imHSV[0].data[p]; + s_i = imHSV[1].data[p]; + v_i = imHSV[2].data[p]; + + for(unsigned int n = 0; n < maxBgBins; ++n) { + if(!bgModel[p].isValid[n]) { + break; + } + + if(bgModel[p].isFg[n]) { + continue; + } + + bgrPixel.at<cv::Vec3b>(0,0) = bgModel[p].values[n]; + + cv::Mat hsvPixel = convertImageRGBtoHSV(bgrPixel); + + h_b = hsvPixel.at<cv::Vec3b>(0,0)[0]; + s_b = hsvPixel.at<cv::Vec3b>(0,0)[1]; + v_b = hsvPixel.at<cv::Vec3b>(0,0)[2]; + + v_ratio = (float)v_i / (float)v_b; + s_diff = std::abs(s_i - s_b); + h_diff = std::min( std::abs(h_i - h_b), 255 - std::abs(h_i - h_b)); + + if( h_diff <= tau_h && + s_diff <= tau_s && + v_ratio >= alpha && + v_ratio < beta) + { + fgmask.data[p] = SHADOW_LABEL; + break; + } + }//for + }//if + }//numPixels +} + +void BackgroundSubtractorIMBS::createBg(unsigned int bg_sample_number) { + if(!bgSample.data) { + //cerr << "createBg -- an error occurred: " << + // " unable to retrieve frame no. " << bg_sample_number << endl; + + //TODO vedere gestione errori + abort(); + } + //aux variable + Vec3b currentPixel; + //split bgSample in channels + cv::split(bgSample, bgSampleBGR); + //create a statistical model for each pixel (a set of bins of variable size) + for(unsigned int p = 0; p < numPixels; ++p) { + //create an initial bin for each pixel from the first sample (bg_sample_number = 0) + if(bg_sample_number == 0) { + for(int k = 0; k < 3; ++k) { + bgBins[p].binValues[0][k] = bgSampleBGR[k].data[p]; + } + bgBins[p].binHeights[0] = 1; + for(unsigned int s = 1; s < numSamples; ++s) { + bgBins[p].binHeights[s] = 0; + } + //if the sample pixel is from foreground keep track of that situation + if(fgmask.data[p] == FOREGROUND_LABEL) { + bgBins[p].isFg[0] = true; + } + else { + bgBins[p].isFg[0] = false; + } + }//if(bg_sample_number == 0) + else { //bg_sample_number > 0 + for(int k = 0; k < 3; ++k) { + currentPixel[k] = bgSampleBGR[k].data[p]; + } + int den = 0; + for(unsigned int s = 0; s < bg_sample_number; ++s) { + //try to associate the current pixel values to an existing bin + if( std::abs(currentPixel[2] - bgBins[p].binValues[s][2]) <= associationThreshold && + std::abs(currentPixel[1] - bgBins[p].binValues[s][1]) <= associationThreshold && + std::abs(currentPixel[0] - bgBins[p].binValues[s][0]) <= associationThreshold ) + { + den = (bgBins[p].binHeights[s] + 1); + for(int k = 0; k < 3; ++k) { + bgBins[p].binValues[s][k] = + (bgBins[p].binValues[s][k] * bgBins[p].binHeights[s] + currentPixel[k]) / den; + } + bgBins[p].binHeights[s]++; //increment the height of the bin + if(fgmask.data[p] == FOREGROUND_LABEL) { + bgBins[p].isFg[s] = true; + } + break; + } + //if the association is not possible, create a new bin + else if(bgBins[p].binHeights[s] == 0) { + bgBins[p].binValues[s] = currentPixel; + bgBins[p].binHeights[s]++; + if(fgmask.data[p] == FOREGROUND_LABEL) { + bgBins[p].isFg[s] = true; + } + else { + bgBins[p].isFg[s] = false; + } + break; + } + else continue; + }//for(unsigned int s = 0; s <= bg_sample_number; ++s) + + //if all samples have been processed + //it is time to compute the fg mask + if(bg_sample_number == (numSamples - 1)) { + unsigned int index = 0; + int max_height = -1; + for(unsigned int s = 0; s < numSamples; ++s){ + if(bgBins[p].binHeights[s] == 0) { + bgModel[p].isValid[index] = false; + break; + } + if(index == maxBgBins) { + break; + } + else if(bgBins[p].binHeights[s] >= minBinHeight) { + if(fgmask.data[p] == PERSISTENCE_LABEL) { + for(unsigned int n = 0; n < maxBgBins; n++) { + if(!bgModel[p].isValid[n]) { + break; + } + unsigned int d = std::max((int)std::abs(bgModel[p].values[n][0] - bgBins[p].binValues[s][0]), + std::abs(bgModel[p].values[n][1] - bgBins[p].binValues[s][1]) ); + d = std::max((int)d, std::abs(bgModel[p].values[n][2] - bgBins[p].binValues[s][2]) ); + if(d < fgThreshold){ + bgModel[p].isFg[n] = false; + bgBins[p].isFg[s] = false; + } + } + } + + if(bgBins[p].binHeights[s] > max_height) { + max_height = bgBins[p].binHeights[s]; + + for(int k = 0; k < 3; ++k) { + bgModel[p].values[index][k] = bgModel[p].values[0][k]; + } + bgModel[p].isValid[index] = true; + bgModel[p].isFg[index] = bgModel[p].isFg[0]; + bgModel[p].counter[index] = bgModel[p].counter[0]; + + for(int k = 0; k < 3; ++k) { + bgModel[p].values[0][k] = bgBins[p].binValues[s][k]; + } + bgModel[p].isValid[0] = true; + bgModel[p].isFg[0] = bgBins[p].isFg[s]; + bgModel[p].counter[0] = bgBins[p].binHeights[s]; + } + else { + for(int k = 0; k < 3; ++k) { + bgModel[p].values[index][k] = bgBins[p].binValues[s][k]; + } + bgModel[p].isValid[index] = true; + bgModel[p].isFg[index] = bgBins[p].isFg[s]; + bgModel[p].counter[index] = bgBins[p].binHeights[s]; + } + ++index; + } + } //for all numSamples + }//bg_sample_number == (numSamples - 1) + }//else --> if(frame_number == 0) + }//numPixels + + if(bg_sample_number == (numSamples - 1)) { + //std::cout << "new bg created" << std::endl; + persistenceImage = Scalar(0); + + bg_reset = false; + if(sudden_change) { + numSamples *= 3.; + samplingPeriod *= 2.; + sudden_change = false; + } + + for(int i = 0; i < numPixels; i++) { + persistenceMap[i] = 0; + } + + unsigned int p = 0; + for(int i = 0; i < bgImage.rows; ++i) { + for(int j = 0; j < bgImage.cols; ++j, ++p) { + bgImage.at<cv::Vec3b>(i,j) = bgModel[p].values[0]; + } + } + } +} + +void BackgroundSubtractorIMBS::getFg() { + fgmask = Scalar(0); + cv::split(frame, frameBGR); + + bool isFg = true; + bool conditionalUpdated = false; + unsigned int d = 0; + for(unsigned int p = 0; p < numPixels; ++p) { + isFg = true; + conditionalUpdated = false; + d = 0; + for(unsigned int n = 0; n < maxBgBins; ++n) { + if(!bgModel[p].isValid[n]) { + if(n == 0) { + isFg = false; + } + break; + } + else { //the model is valid + d = std::max( + (int)std::abs(bgModel[p].values[n][0] - frameBGR[0].data[p]), + std::abs(bgModel[p].values[n][1] - frameBGR[1].data[p]) ); + d = std::max( + (int)d, std::abs(bgModel[p].values[n][2] - frameBGR[2].data[p]) ); + if(d < fgThreshold){ + //check if it is a potential background pixel + //from stationary object + if(bgModel[p].isFg[n]) { + conditionalUpdated = true; + break; + } + else { + isFg = false; + persistenceMap[p] = 0; + } + } + } + } + if(isFg) { + if(conditionalUpdated) { + fgmask.data[p] = PERSISTENCE_LABEL; + persistenceMap[p] += (timestamp - prev_timestamp); + if(persistenceMap[p] > persistencePeriod) { + for(unsigned int n = 0; n < maxBgBins; ++n) { + if(!bgModel[p].isValid[n]) { + break; + } + bgModel[p].isFg[n] = false; + } + } + } + else { + fgmask.data[p] = FOREGROUND_LABEL; + persistenceMap[p] = 0; + } + } + } +} + +void BackgroundSubtractorIMBS::areaThresholding() +{ + double maxArea = 0.6 * numPixels; + + std::vector < std::vector<Point> > contours; + Mat tmpBinaryImage = fgfiltered.clone(); + findContours(tmpBinaryImage, contours, RETR_LIST, CHAIN_APPROX_NONE); + + tmpBinaryImage = Scalar(0); + + for (size_t contourIdx = 0; contourIdx < contours.size(); ++contourIdx) + { + Moments moms = moments(Mat(contours[contourIdx])); + double area = moms.m00; + if (area < minArea || area >= maxArea) + continue; + else { + drawContours( tmpBinaryImage, contours, contourIdx, Scalar(255), CV_FILLED ); + } + } + for(int i = 0; i < fgfiltered.rows; ++i) { + for(int j = 0; j < fgfiltered.cols; ++j) { + if(!tmpBinaryImage.at<uchar>(i,j)) { + fgfiltered.at<uchar>(i,j) = 0; + } + } + } +} + +// Create a HSV image from the RGB image using the full 8-bits, since OpenCV only allows Hues up to 180 instead of 255. +// ref: "http://cs.haifa.ac.il/hagit/courses/ist/Lectures/Demos/ColorApplet2/t_convert.html" +// Remember to free the generated HSV image. +Mat BackgroundSubtractorIMBS::convertImageRGBtoHSV(const Mat& imageRGB) +{ + float fR, fG, fB; + float fH, fS, fV; + const float FLOAT_TO_BYTE = 255.0f; + const float BYTE_TO_FLOAT = 1.0f / FLOAT_TO_BYTE; + + // Create a blank HSV image + Mat imageHSV(imageRGB.size(), CV_8UC3); + //if (!imageHSV || imageRGB->depth != 8 || imageRGB->nChannels != 3) { + //printf("ERROR in convertImageRGBtoHSV()! Bad input image.\n"); + //exit(1); + //} + + int h = imageRGB.rows; // Pixel height. + int w = imageRGB.cols; // Pixel width. + //int rowSizeRGB = imageRGB->widthStep; // Size of row in bytes, including extra padding. + //char *imRGB = imageRGB->imageData; // Pointer to the start of the image pixels. + //int rowSizeHSV = imageHSV->widthStep; // Size of row in bytes, including extra padding. + //char *imHSV = imageHSV->imageData; // Pointer to the start of the image pixels. + for (int y = 0; y < h; ++y) { + for (int x = 0; x < w; ++x) { + // Get the RGB pixel components. NOTE that OpenCV stores RGB pixels in B,G,R order. + //uchar *pRGB = (uchar*)(imRGB + y*rowSizeRGB + x*3); + int bB = imageRGB.at<Vec3b>(y,x)[0]; //*(uchar*)(pRGB+0); // Blue component + int bG = imageRGB.at<Vec3b>(y,x)[1]; //*(uchar*)(pRGB+1); // Green component + int bR = imageRGB.at<Vec3b>(y,x)[2]; //*(uchar*)(pRGB+2); // Red component + + // Convert from 8-bit integers to floats. + fR = bR * BYTE_TO_FLOAT; + fG = bG * BYTE_TO_FLOAT; + fB = bB * BYTE_TO_FLOAT; + + // Convert from RGB to HSV, using float ranges 0.0 to 1.0. + float fDelta; + float fMin, fMax; + int iMax; + // Get the min and max, but use integer comparisons for slight speedup. + if (bB < bG) { + if (bB < bR) { + fMin = fB; + if (bR > bG) { + iMax = bR; + fMax = fR; + } + else { + iMax = bG; + fMax = fG; + } + } + else { + fMin = fR; + fMax = fG; + iMax = bG; + } + } + else { + if (bG < bR) { + fMin = fG; + if (bB > bR) { + fMax = fB; + iMax = bB; + } + else { + fMax = fR; + iMax = bR; + } + } + else { + fMin = fR; + fMax = fB; + iMax = bB; + } + } + fDelta = fMax - fMin; + fV = fMax; // Value (Brightness). + if (iMax != 0) { // Make sure its not pure black. + fS = fDelta / fMax; // Saturation. + float ANGLE_TO_UNIT = 1.0f / (6.0f * fDelta); // Make the Hues between 0.0 to 1.0 instead of 6.0 + if (iMax == bR) { // between yellow and magenta. + fH = (fG - fB) * ANGLE_TO_UNIT; + } + else if (iMax == bG) { // between cyan and yellow. + fH = (2.0f/6.0f) + ( fB - fR ) * ANGLE_TO_UNIT; + } + else { // between magenta and cyan. + fH = (4.0f/6.0f) + ( fR - fG ) * ANGLE_TO_UNIT; + } + // Wrap outlier Hues around the circle. + if (fH < 0.0f) + fH += 1.0f; + if (fH >= 1.0f) + fH -= 1.0f; + } + else { + // color is pure Black. + fS = 0; + fH = 0; // undefined hue + } + + // Convert from floats to 8-bit integers. + int bH = (int)(0.5f + fH * 255.0f); + int bS = (int)(0.5f + fS * 255.0f); + int bV = (int)(0.5f + fV * 255.0f); + + // Clip the values to make sure it fits within the 8bits. + if (bH > 255) + bH = 255; + if (bH < 0) + bH = 0; + if (bS > 255) + bS = 255; + if (bS < 0) + bS = 0; + if (bV > 255) + bV = 255; + if (bV < 0) + bV = 0; + + // Set the HSV pixel components. + imageHSV.at<Vec3b>(y, x)[0] = bH; // H component + imageHSV.at<Vec3b>(y, x)[1] = bS; // S component + imageHSV.at<Vec3b>(y, x)[2] = bV; // V component + } + } + return imageHSV; +} + +void BackgroundSubtractorIMBS::getBackgroundImage(OutputArray backgroundImage) const +{ + bgImage.copyTo(backgroundImage); +} + +void BackgroundSubtractorIMBS::filterFg() { + + unsigned int cnt = 0; + for(unsigned int p = 0; p < numPixels; ++p) { + if(fgmask.data[p] == (uchar)255) { + fgfiltered.data[p] = 255; + cnt++; + } + else { + fgfiltered.data[p] = 0; + } + } + + if(cnt > numPixels*0.5) { + sudden_change = true; + } + + if(morphologicalFiltering) { + cv::Mat element3(3,3,CV_8U,cv::Scalar(1)); + cv::morphologyEx(fgfiltered, fgfiltered, cv::MORPH_OPEN, element3); + cv::morphologyEx(fgfiltered, fgfiltered, cv::MORPH_CLOSE, element3); + } + + areaThresholding(); + + for(unsigned int p = 0; p < numPixels; ++p) { + if(fgmask.data[p] == PERSISTENCE_LABEL) { + fgfiltered.data[p] = PERSISTENCE_LABEL; + } + else if(fgmask.data[p] == SHADOW_LABEL) { + fgfiltered.data[p] = SHADOW_LABEL; + } + } + + fgfiltered.copyTo(fgmask); +} + +void BackgroundSubtractorIMBS::changeBg() { + + std::cout << "\n\n\n\nWARNING: changeBg\n\n\n\n\n" << std::endl; + + //samplingPeriod /= 2.; + //numSamples /= 2.; + //bg_reset = true; + //cout << "qua" << endl; + + if(!bg_reset) { + numSamples /= 3.; + samplingPeriod /= 2.; + bg_frame_counter = 0; + bg_reset = true; + } +} + +void BackgroundSubtractorIMBS::getBgModel(BgModel bgModel_copy[], int size) { + if(size != numPixels) { + return; + } + for(int i = 0; i < numPixels; ++i){ + bgModel_copy[i].values = new Vec3b[maxBgBins]; + bgModel_copy[i].isValid = new bool[maxBgBins]; + bgModel_copy[i].isValid[0] = false; + bgModel_copy[i].isFg = new bool[maxBgBins]; + bgModel_copy[i].counter = new uchar[maxBgBins]; + } + for(unsigned int p = 0; p < numPixels; ++p) { + for(unsigned int n = 0; n < maxBgBins; ++n) { + if(!bgModel[p].isValid[n]) { + break; + } + bgModel_copy[p].values[n] = bgModel[p].values[n]; + bgModel_copy[p].isValid[n] = bgModel[p].isValid[n]; + bgModel_copy[p].isFg[n] = bgModel[p].isFg[n]; + bgModel_copy[p].counter[n] = bgModel[p].counter[n]; + } + } +} diff --git a/package_bgs/db/imbs.hpp b/package_bgs/db/imbs.hpp new file mode 100644 index 0000000..fd7faf1 --- /dev/null +++ b/package_bgs/db/imbs.hpp @@ -0,0 +1,178 @@ +/* +* IMBS Background Subtraction Library +* +* This file imbs.hpp contains the C++ OpenCV based implementation for +* IMBS algorithm described in +* D. D. Bloisi and L. Iocchi +* "Independent Multimodal Background Subtraction" +* In Proc. of the Third Int. Conf. on Computational Modeling of Objects +* Presented in Images: Fundamentals, Methods and Applications, pp. 39-44, 2012. +* Please, cite the above paper if you use IMBS. +* +* This software is provided without any warranty about its usability. +* It is for educational purposes and should be regarded as such. +* +* Written by Domenico D. Bloisi +* +* Please, report suggestions/comments/bugs to +* domenico.bloisi@gmail.com +* +*/ + +#ifndef __IMBS_HPP__ +#define __IMBS_HPP__ + +//OPENCV +#include <opencv2/core/core.hpp> +#include <opencv2/highgui/highgui.hpp> +#include <opencv2/imgproc/imgproc.hpp> +#include <opencv2/features2d/features2d.hpp> +//C++ +#include <iostream> +#include <vector> + +using namespace cv; +using namespace std; + +class BackgroundSubtractorIMBS +{ +public: + //! the default constructor + BackgroundSubtractorIMBS(); + //! the full constructor + BackgroundSubtractorIMBS(double fps, + unsigned int fgThreshold=15, + unsigned int associationThreshold=5, + double samplingPeriod=500., + unsigned int minBinHeight=2, + unsigned int numSamples=30, + double alpha=0.65, + double beta=1.15, + double tau_s=60., + double tau_h=40., + double minArea=30., + double persistencePeriod=10000., + bool morphologicalFiltering=false + ); + //! the destructor + ~BackgroundSubtractorIMBS(); + //! the update operator + void apply(InputArray image, OutputArray fgmask, double learningRate=-1.); + + //! computes a background image which shows only the highest bin for each pixel + void getBackgroundImage(OutputArray backgroundImage) const; + + //! re-initiaization method + void initialize(Size frameSize, int frameType); + +private: + //method for creating the background model + void createBg(unsigned int bg_sample_number); + //method for updating the background model + void updateBg(); + //method for computing the foreground mask + void getFg(); + //method for suppressing shadows and highlights + void hsvSuppression(); + //method for refining foreground mask + void filterFg(); + //method for filtering out blobs smaller than a given area + void areaThresholding(); + //method for getting the current time + double getTimestamp(); + //method for converting from RGB to HSV + Mat convertImageRGBtoHSV(const Mat& imageRGB); + //method for changing the bg in case of sudden changes + void changeBg(); + + //current input RGB frame + Mat frame; + vector<Mat> frameBGR; + //frame size + Size frameSize; + //frame type + int frameType; + //total number of pixels in frame + unsigned int numPixels; + //current background sample + Mat bgSample; + vector<Mat> bgSampleBGR; + //current background image which shows only the highest bin for each pixel + //(just for displaying purposes) + Mat bgImage; + //current foreground mask + Mat fgmask; + + Mat fgfiltered; + + //number of fps + double fps; + //time stamp in milliseconds (ms) + double timestamp; + //previous time stamp in milliseconds (ms) + double prev_timestamp; + double initial_tick_count; + //initial message to be shown until the first bg model is ready + Mat initialMsgGray; + Mat initialMsgRGB; + + //struct for modeling the background values for a single pixel + typedef struct { + Vec3b* binValues; + uchar* binHeights; + bool* isFg; + } Bins; + + Bins* bgBins; +public: + //struct for modeling the background values for the entire frame + typedef struct { + Vec3b* values; + bool* isValid; + bool* isFg; + uchar* counter; + } BgModel; +private: + BgModel* bgModel; + + //SHADOW SUPPRESSION PARAMETERS + float alpha; + float beta; + uchar tau_s; + uchar tau_h; + + unsigned int minBinHeight; + unsigned int numSamples; + unsigned int samplingPeriod; + unsigned long prev_bg_frame_time; + unsigned int bg_frame_counter; + unsigned int associationThreshold; + unsigned int maxBgBins; + unsigned int nframes; + + double minArea; + bool bg_reset; + unsigned int persistencePeriod; + bool prev_area; + bool sudden_change; + unsigned int fgThreshold; + uchar SHADOW_LABEL; + uchar PERSISTENCE_LABEL; + uchar FOREGROUND_LABEL; + //persistence map + unsigned int* persistenceMap; + Mat persistenceImage; + + bool morphologicalFiltering; + +public: + unsigned int getMaxBgBins() { + return maxBgBins; + } + unsigned int getFgThreshold() { + return fgThreshold; + } + void getBgModel(BgModel bgModel_copy[], int size); +}; + +#endif //__IMBS_HPP__ diff --git a/package_bgs/dp/AdaptiveMedianBGS.cpp b/package_bgs/dp/AdaptiveMedianBGS.cpp new file mode 100644 index 0000000..16b3988 --- /dev/null +++ b/package_bgs/dp/AdaptiveMedianBGS.cpp @@ -0,0 +1,140 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* AdaptiveMedianBGS.cpp +* +* Purpose: Implementation of the simple adaptive median background +* subtraction algorithm described in: +* "Segmentation and tracking of piglets in images" +* by McFarlane and Schofield +* +* Author: Donovan Parks, September 2007 +* +******************************************************************************/ + +#include <iostream> +#include <stdlib.h> +#include <cmath> + +#include "AdaptiveMedianBGS.h" + +using namespace Algorithms::BackgroundSubtraction; + +void AdaptiveMedianBGS::Initalize(const BgsParams& param) +{ + m_params = (AdaptiveMedianParams&)param; + + m_median = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 3); + cvSet(m_median.Ptr(), CV_RGB(BACKGROUND,BACKGROUND,BACKGROUND)); +} + +RgbImage* AdaptiveMedianBGS::Background() +{ + return &m_median; +} + +void AdaptiveMedianBGS::InitModel(const RgbImage& data) +{ + // initialize the background model + for (unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + m_median(r,c) = data(r,c); + } + } +} + +void AdaptiveMedianBGS::Update(int frame_num, const RgbImage& data, const BwImage& update_mask) +{ + if(frame_num % m_params.SamplingRate() == 1) + { + // update background model + for (unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + // perform conditional updating only if we are passed the learning phase + if(update_mask(r,c) == BACKGROUND || frame_num < m_params.LearningFrames()) + { + for(int ch = 0; ch < NUM_CHANNELS; ++ch) + { + if(data(r,c,ch) > m_median(r,c,ch)) + { + m_median(r,c,ch)++; + } + else if(data(r,c,ch) < m_median(r,c,ch)) + { + m_median(r,c,ch)--; + } + } + } + } + } + } +} + +void AdaptiveMedianBGS::SubtractPixel(int r, int c, const RgbPixel& pixel, + unsigned char& low_threshold, unsigned char& high_threshold) +{ + // perform background subtraction + low_threshold = high_threshold = FOREGROUND; + + int diffR = abs(pixel(0) - m_median(r,c,0)); + int diffG = abs(pixel(1) - m_median(r,c,1)); + int diffB = abs(pixel(2) - m_median(r,c,2)); + + if(diffR <= m_params.LowThreshold() && diffG <= m_params.LowThreshold() && diffB <= m_params.LowThreshold()) + { + low_threshold = BACKGROUND; + } + + if(diffR <= m_params.HighThreshold() && diffG <= m_params.HighThreshold() && diffB <= m_params.HighThreshold()) + { + high_threshold = BACKGROUND; + } +} + +/////////////////////////////////////////////////////////////////////////////// +//Input: +// data - a pointer to the image data +//Output: +// output - a pointer to the data of a gray value image +// (the memory should already be reserved) +// values: 255-foreground, 0-background +/////////////////////////////////////////////////////////////////////////////// +void AdaptiveMedianBGS::Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask) +{ + unsigned char low_threshold, high_threshold; + + // update each pixel of the image + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + // perform background subtraction + SubtractPixel(r, c, data(r,c), low_threshold, high_threshold); + + // setup silhouette mask + low_threshold_mask(r,c) = low_threshold; + high_threshold_mask(r,c) = high_threshold; + } + } +} + diff --git a/package_bgs/dp/AdaptiveMedianBGS.h b/package_bgs/dp/AdaptiveMedianBGS.h new file mode 100644 index 0000000..3ea25af --- /dev/null +++ b/package_bgs/dp/AdaptiveMedianBGS.h @@ -0,0 +1,89 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* AdaptiveMedianBGS.hpp +* +* Purpose: Implementation of the simple adaptive median background +* subtraction algorithm described in: +* "Segmentation and tracking of piglets in images" +* by McFarlane and Schofield +* +* Author: Donovan Parks, September 2007 + +Example: + Algorithms::BackgroundSubtraction::AdaptiveMedianParams params; + params.SetFrameSize(width, height); + params.LowThreshold() = 40; + params.HighThreshold() = 2*params.LowThreshold(); + params.SamplingRate() = 7; + params.LearningFrames() = 30; + + Algorithms::BackgroundSubtraction::AdaptiveMedianBGS bgs; + bgs.Initalize(params); +******************************************************************************/ + +#include "Bgs.h" + +namespace Algorithms +{ + namespace BackgroundSubtraction + { + // --- Parameters used by the Adaptive Median BGS algorithm --- + class AdaptiveMedianParams : public BgsParams + { + public: + unsigned char &LowThreshold() { return m_low_threshold; } + unsigned char &HighThreshold() { return m_high_threshold; } + + int &SamplingRate() { return m_samplingRate; } + int &LearningFrames() { return m_learning_frames; } + + private: + unsigned char m_low_threshold; + unsigned char m_high_threshold; + + int m_samplingRate; + int m_learning_frames; + }; + + + // --- Adaptive Median BGS algorithm --- + class AdaptiveMedianBGS : public Bgs + { + public: + virtual ~AdaptiveMedianBGS() {} + + void Initalize(const BgsParams& param); + + void InitModel(const RgbImage& data); + void Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask); + void Update(int frame_num, const RgbImage& data, const BwImage& update_mask); + + RgbImage* Background(); + + private: + void SubtractPixel(int r, int c, const RgbPixel& pixel, + unsigned char& low_threshold, unsigned char& high_threshold); + + AdaptiveMedianParams m_params; + + RgbImage m_median; + }; + }; +}; diff --git a/package_bgs/dp/Bgs.h b/package_bgs/dp/Bgs.h new file mode 100644 index 0000000..c1ae23c --- /dev/null +++ b/package_bgs/dp/Bgs.h @@ -0,0 +1,67 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* Bgs.hpp +* +* Purpose: Base class for BGS algorithms. +* +* Author: Donovan Parks, October 2007 +* +******************************************************************************/ + +#ifndef BGS_H_ +#define BGS_H_ + +#include "Image.h" +#include "BgsParams.h" + +namespace Algorithms +{ + namespace BackgroundSubtraction + { + class Bgs + { + public: + static const int BACKGROUND = 0; + static const int FOREGROUND = 255; + + virtual ~Bgs() {} + + // Initialize any data required by the BGS algorithm. Should be called once before calling + // any of the following functions. + virtual void Initalize(const BgsParams& param) = 0; + + // Initialize the background model. Typically, the background model is initialized using the first + // frame of the incoming video stream, but alternatives are possible. + virtual void InitModel(const RgbImage& data) = 0; + + // Subtract the current frame from the background model and produce a binary foreground mask using + // both a low and high threshold value. + virtual void Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask) = 0; + + // Update the background model. Only pixels set to background in update_mask are updated. + virtual void Update(int frame_num, const RgbImage& data, const BwImage& update_mask) = 0; + + // Return the current background model. + virtual RgbImage *Background() = 0; + }; + }; +}; + +#endif \ No newline at end of file diff --git a/package_bgs/dp/BgsParams.h b/package_bgs/dp/BgsParams.h new file mode 100644 index 0000000..c3bad83 --- /dev/null +++ b/package_bgs/dp/BgsParams.h @@ -0,0 +1,59 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* BgsParams.hpp +* +* Purpose: Base class for BGS parameters. Any parameters common to all BGS +* algorithms should be specified directly in this class. +* +* Author: Donovan Parks, May 2008 +* +******************************************************************************/ + +#ifndef BGS_PARAMS_H_ +#define BGS_PARAMS_H_ + +namespace Algorithms +{ + namespace BackgroundSubtraction + { + class BgsParams + { + public: + virtual ~BgsParams() {} + + virtual void SetFrameSize(unsigned int width, unsigned int height) + { + m_width = width; + m_height = height; + m_size = width*height; + } + + unsigned int &Width() { return m_width; } + unsigned int &Height() { return m_height; } + unsigned int &Size() { return m_size; } + + protected: + unsigned int m_width; + unsigned int m_height; + unsigned int m_size; + }; + }; +}; + +#endif \ No newline at end of file diff --git a/package_bgs/dp/DPAdaptiveMedianBGS.cpp b/package_bgs/dp/DPAdaptiveMedianBGS.cpp new file mode 100644 index 0000000..d7ebcd1 --- /dev/null +++ b/package_bgs/dp/DPAdaptiveMedianBGS.cpp @@ -0,0 +1,104 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "DPAdaptiveMedianBGS.h" + +DPAdaptiveMedianBGS::DPAdaptiveMedianBGS() : firstTime(true), frameNumber(0), showOutput(true), threshold(40), samplingRate(7), learningFrames(30) +{ + std::cout << "DPAdaptiveMedianBGS()" << std::endl; +} + +DPAdaptiveMedianBGS::~DPAdaptiveMedianBGS() +{ + std::cout << "~DPAdaptiveMedianBGS()" << std::endl; +} + +void DPAdaptiveMedianBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + frame = new IplImage(img_input); + + if(firstTime) + frame_data.ReleaseMemory(false); + frame_data = frame; + + if(firstTime) + { + int width = img_input.size().width; + int height = img_input.size().height; + + lowThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + lowThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + highThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + highThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + params.SetFrameSize(width, height); + params.LowThreshold() = threshold; + params.HighThreshold() = 2*params.LowThreshold(); // Note: high threshold is used by post-processing + params.SamplingRate() = samplingRate; + params.LearningFrames() = learningFrames; + + bgs.Initalize(params); + bgs.InitModel(frame_data); + } + + bgs.Subtract(frameNumber, frame_data, lowThresholdMask, highThresholdMask); + lowThresholdMask.Clear(); + bgs.Update(frameNumber, frame_data, lowThresholdMask); + + cv::Mat foreground(highThresholdMask.Ptr()); + + if(showOutput) + cv::imshow("Adaptive Median (McFarlane&Schofield)", foreground); + + foreground.copyTo(img_output); + + delete frame; + firstTime = false; + frameNumber++; +} + +void DPAdaptiveMedianBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPAdaptiveMedianBGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "threshold", threshold); + cvWriteInt(fs, "samplingRate", samplingRate); + cvWriteInt(fs, "learningFrames", learningFrames); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void DPAdaptiveMedianBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPAdaptiveMedianBGS.xml", 0, CV_STORAGE_READ); + + threshold = cvReadIntByName(fs, 0, "threshold", 40); + samplingRate = cvReadIntByName(fs, 0, "samplingRate", 7); + learningFrames = cvReadIntByName(fs, 0, "learningFrames", 30); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/dp/DPAdaptiveMedianBGS.h b/package_bgs/dp/DPAdaptiveMedianBGS.h new file mode 100644 index 0000000..05ac9c3 --- /dev/null +++ b/package_bgs/dp/DPAdaptiveMedianBGS.h @@ -0,0 +1,56 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" +#include "AdaptiveMedianBGS.h" + +using namespace Algorithms::BackgroundSubtraction; + +class DPAdaptiveMedianBGS : public IBGS +{ +private: + bool firstTime; + long frameNumber; + IplImage* frame; + RgbImage frame_data; + + AdaptiveMedianParams params; + AdaptiveMedianBGS bgs; + BwImage lowThresholdMask; + BwImage highThresholdMask; + + int threshold; + int samplingRate; + int learningFrames; + bool showOutput; + +public: + DPAdaptiveMedianBGS(); + ~DPAdaptiveMedianBGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/dp/DPEigenbackgroundBGS.cpp b/package_bgs/dp/DPEigenbackgroundBGS.cpp new file mode 100644 index 0000000..6d2c6ba --- /dev/null +++ b/package_bgs/dp/DPEigenbackgroundBGS.cpp @@ -0,0 +1,106 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "DPEigenbackgroundBGS.h" + +DPEigenbackgroundBGS::DPEigenbackgroundBGS() : firstTime(true), frameNumber(0), showOutput(true), threshold(225), historySize(20), embeddedDim(10) +{ + std::cout << "DPEigenbackgroundBGS()" << std::endl; +} + +DPEigenbackgroundBGS::~DPEigenbackgroundBGS() +{ + std::cout << "~DPEigenbackgroundBGS()" << std::endl; +} + +void DPEigenbackgroundBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + frame = new IplImage(img_input); + + if(firstTime) + frame_data.ReleaseMemory(false); + frame_data = frame; + + if(firstTime) + { + int width = img_input.size().width; + int height = img_input.size().height; + + lowThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + lowThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + highThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + highThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + params.SetFrameSize(width, height); + params.LowThreshold() = threshold; //15*15; + params.HighThreshold() = 2*params.LowThreshold(); // Note: high threshold is used by post-processing + //params.HistorySize() = 100; + params.HistorySize() = historySize; + //params.EmbeddedDim() = 20; + params.EmbeddedDim() = embeddedDim; + + bgs.Initalize(params); + bgs.InitModel(frame_data); + } + + bgs.Subtract(frameNumber, frame_data, lowThresholdMask, highThresholdMask); + lowThresholdMask.Clear(); + bgs.Update(frameNumber, frame_data, lowThresholdMask); + + cv::Mat foreground(highThresholdMask.Ptr()); + + if(showOutput) + cv::imshow("Eigenbackground (Oliver)", foreground); + + foreground.copyTo(img_output); + + delete frame; + firstTime = false; + frameNumber++; +} + +void DPEigenbackgroundBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPEigenbackgroundBGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "threshold", threshold); + cvWriteInt(fs, "historySize", historySize); + cvWriteInt(fs, "embeddedDim", embeddedDim); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void DPEigenbackgroundBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPEigenbackgroundBGS.xml", 0, CV_STORAGE_READ); + + threshold = cvReadIntByName(fs, 0, "threshold", 225); + historySize = cvReadIntByName(fs, 0, "historySize", 20); + embeddedDim = cvReadIntByName(fs, 0, "embeddedDim", 10); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/dp/DPEigenbackgroundBGS.h b/package_bgs/dp/DPEigenbackgroundBGS.h new file mode 100644 index 0000000..df558fe --- /dev/null +++ b/package_bgs/dp/DPEigenbackgroundBGS.h @@ -0,0 +1,56 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" +#include "Eigenbackground.h" + +using namespace Algorithms::BackgroundSubtraction; + +class DPEigenbackgroundBGS : public IBGS +{ +private: + bool firstTime; + long frameNumber; + IplImage* frame; + RgbImage frame_data; + + EigenbackgroundParams params; + Eigenbackground bgs; + BwImage lowThresholdMask; + BwImage highThresholdMask; + + int threshold; + int historySize; + int embeddedDim; + bool showOutput; + +public: + DPEigenbackgroundBGS(); + ~DPEigenbackgroundBGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/dp/DPGrimsonGMMBGS.cpp b/package_bgs/dp/DPGrimsonGMMBGS.cpp new file mode 100644 index 0000000..0d6ad42 --- /dev/null +++ b/package_bgs/dp/DPGrimsonGMMBGS.cpp @@ -0,0 +1,105 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "DPGrimsonGMMBGS.h" + +DPGrimsonGMMBGS::DPGrimsonGMMBGS() : firstTime(true), frameNumber(0), showOutput(true), threshold(9.0), alpha(0.01), gaussians(3) +{ + std::cout << "DPGrimsonGMMBGS()" << std::endl; +} + +DPGrimsonGMMBGS::~DPGrimsonGMMBGS() +{ + std::cout << "~DPGrimsonGMMBGS()" << std::endl; +} + +void DPGrimsonGMMBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + frame = new IplImage(img_input); + + if(firstTime) + frame_data.ReleaseMemory(false); + frame_data = frame; + + if(firstTime) + { + int width = img_input.size().width; + int height = img_input.size().height; + + lowThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + lowThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + highThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + highThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + params.SetFrameSize(width, height); + params.LowThreshold() = threshold; //3.0f*3.0f; + params.HighThreshold() = 2*params.LowThreshold(); // Note: high threshold is used by post-processing + //params.Alpha() = 0.001f; + params.Alpha() = alpha; //0.01f; + params.MaxModes() = gaussians; //3; + + bgs.Initalize(params); + bgs.InitModel(frame_data); + } + + bgs.Subtract(frameNumber, frame_data, lowThresholdMask, highThresholdMask); + lowThresholdMask.Clear(); + bgs.Update(frameNumber, frame_data, lowThresholdMask); + + cv::Mat foreground(highThresholdMask.Ptr()); + + if(showOutput) + cv::imshow("GMM (Grimson)", foreground); + + foreground.copyTo(img_output); + + delete frame; + firstTime = false; + frameNumber++; +} + +void DPGrimsonGMMBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPGrimsonGMMBGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteReal(fs, "threshold", threshold); + cvWriteReal(fs, "alpha", alpha); + cvWriteInt(fs, "gaussians", gaussians); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void DPGrimsonGMMBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPGrimsonGMMBGS.xml", 0, CV_STORAGE_READ); + + threshold = cvReadRealByName(fs, 0, "threshold", 9.0); + alpha = cvReadRealByName(fs, 0, "alpha", 0.01); + gaussians = cvReadIntByName(fs, 0, "gaussians", 3); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/dp/DPGrimsonGMMBGS.h b/package_bgs/dp/DPGrimsonGMMBGS.h new file mode 100644 index 0000000..37e2a33 --- /dev/null +++ b/package_bgs/dp/DPGrimsonGMMBGS.h @@ -0,0 +1,56 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" +#include "GrimsonGMM.h" + +using namespace Algorithms::BackgroundSubtraction; + +class DPGrimsonGMMBGS : public IBGS +{ +private: + bool firstTime; + long frameNumber; + IplImage* frame; + RgbImage frame_data; + + GrimsonParams params; + GrimsonGMM bgs; + BwImage lowThresholdMask; + BwImage highThresholdMask; + + double threshold; + double alpha; + int gaussians; + bool showOutput; + +public: + DPGrimsonGMMBGS(); + ~DPGrimsonGMMBGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/dp/DPMeanBGS.cpp b/package_bgs/dp/DPMeanBGS.cpp new file mode 100644 index 0000000..13260b4 --- /dev/null +++ b/package_bgs/dp/DPMeanBGS.cpp @@ -0,0 +1,105 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "DPMeanBGS.h" + +DPMeanBGS::DPMeanBGS() : firstTime(true), frameNumber(0), threshold(2700), alpha(1e-6f), learningFrames(30), showOutput(true) +{ + std::cout << "DPMeanBGS()" << std::endl; +} + +DPMeanBGS::~DPMeanBGS() +{ + std::cout << "~DPMeanBGS()" << std::endl; +} + +void DPMeanBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + frame = new IplImage(img_input); + + if(firstTime) + frame_data.ReleaseMemory(false); + frame_data = frame; + + if(firstTime) + { + int width = img_input.size().width; + int height = img_input.size().height; + + lowThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + lowThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + highThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + highThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + params.SetFrameSize(width, height); + params.LowThreshold() = threshold; //3*30*30; // 2700 + params.HighThreshold() = 2*params.LowThreshold(); // Note: high threshold is used by post-processing + //params.Alpha() = 1e-6f; + params.Alpha() = alpha; + params.LearningFrames() = learningFrames;//30; + + bgs.Initalize(params); + bgs.InitModel(frame_data); + } + + bgs.Subtract(frameNumber, frame_data, lowThresholdMask, highThresholdMask); + lowThresholdMask.Clear(); + bgs.Update(frameNumber, frame_data, lowThresholdMask); + + cv::Mat foreground(highThresholdMask.Ptr()); + + if(showOutput) + cv::imshow("Temporal Mean (Donovan Parks)", foreground); + + foreground.copyTo(img_output); + + delete frame; + firstTime = false; + frameNumber++; +} + +void DPMeanBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPMeanBGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "threshold", threshold); + cvWriteReal(fs, "alpha", alpha); + cvWriteInt(fs, "learningFrames", learningFrames); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void DPMeanBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPMeanBGS.xml", 0, CV_STORAGE_READ); + + threshold = cvReadIntByName(fs, 0, "threshold", 2700); + alpha = cvReadRealByName(fs, 0, "alpha", 1e-6f); + learningFrames = cvReadIntByName(fs, 0, "learningFrames", 30); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/dp/DPMeanBGS.h b/package_bgs/dp/DPMeanBGS.h new file mode 100644 index 0000000..b119ac4 --- /dev/null +++ b/package_bgs/dp/DPMeanBGS.h @@ -0,0 +1,56 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" +#include "MeanBGS.h" + +using namespace Algorithms::BackgroundSubtraction; + +class DPMeanBGS : public IBGS +{ +private: + bool firstTime; + long frameNumber; + IplImage* frame; + RgbImage frame_data; + + MeanParams params; + MeanBGS bgs; + BwImage lowThresholdMask; + BwImage highThresholdMask; + + int threshold; + double alpha; + int learningFrames; + bool showOutput; + +public: + DPMeanBGS(); + ~DPMeanBGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/dp/DPPratiMediodBGS.cpp b/package_bgs/dp/DPPratiMediodBGS.cpp new file mode 100644 index 0000000..65c3ef3 --- /dev/null +++ b/package_bgs/dp/DPPratiMediodBGS.cpp @@ -0,0 +1,107 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "DPPratiMediodBGS.h" + +DPPratiMediodBGS::DPPratiMediodBGS() : firstTime(true), frameNumber(0), threshold(30), samplingRate(5), historySize(16), weight(5), showOutput(true) +{ + std::cout << "DPPratiMediodBGS()" << std::endl; +} + +DPPratiMediodBGS::~DPPratiMediodBGS() +{ + std::cout << "~DPPratiMediodBGS()" << std::endl; +} + +void DPPratiMediodBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + frame = new IplImage(img_input); + + if(firstTime) + frame_data.ReleaseMemory(false); + frame_data = frame; + + if(firstTime) + { + int width = img_input.size().width; + int height = img_input.size().height; + + lowThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + lowThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + highThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + highThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + params.SetFrameSize(width, height); + params.LowThreshold() = threshold; + params.HighThreshold() = 2*params.LowThreshold(); // Note: high threshold is used by post-processing + params.SamplingRate() = samplingRate; + params.HistorySize() = historySize; + params.Weight() = weight; + + bgs.Initalize(params); + bgs.InitModel(frame_data); + } + + bgs.Subtract(frameNumber, frame_data, lowThresholdMask, highThresholdMask); + lowThresholdMask.Clear(); + bgs.Update(frameNumber, frame_data, lowThresholdMask); + + cv::Mat foreground(highThresholdMask.Ptr()); + + if(showOutput) + cv::imshow("Temporal Median (Cucchiara&Calderara)", foreground); + + foreground.copyTo(img_output); + + delete frame; + firstTime = false; + frameNumber++; +} + +void DPPratiMediodBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPPratiMediodBGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "threshold", threshold); + cvWriteInt(fs, "samplingRate", samplingRate); + cvWriteInt(fs, "historySize", historySize); + cvWriteInt(fs, "weight", weight); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void DPPratiMediodBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPPratiMediodBGS.xml", 0, CV_STORAGE_READ); + + threshold = cvReadIntByName(fs, 0, "threshold", 30); + samplingRate = cvReadIntByName(fs, 0, "samplingRate", 5); + historySize = cvReadIntByName(fs, 0, "historySize", 16); + weight = cvReadIntByName(fs, 0, "weight", 5); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/dp/DPPratiMediodBGS.h b/package_bgs/dp/DPPratiMediodBGS.h new file mode 100644 index 0000000..657dc1b --- /dev/null +++ b/package_bgs/dp/DPPratiMediodBGS.h @@ -0,0 +1,57 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" +#include "PratiMediodBGS.h" + +using namespace Algorithms::BackgroundSubtraction; + +class DPPratiMediodBGS : public IBGS +{ +private: + bool firstTime; + long frameNumber; + IplImage* frame; + RgbImage frame_data; + + PratiParams params; + PratiMediodBGS bgs; + BwImage lowThresholdMask; + BwImage highThresholdMask; + + int threshold; + int samplingRate; + int historySize; + int weight; + bool showOutput; + +public: + DPPratiMediodBGS(); + ~DPPratiMediodBGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/dp/DPTextureBGS.cpp b/package_bgs/dp/DPTextureBGS.cpp new file mode 100644 index 0000000..2d34342 --- /dev/null +++ b/package_bgs/dp/DPTextureBGS.cpp @@ -0,0 +1,156 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "DPTextureBGS.h" + +DPTextureBGS::DPTextureBGS() : firstTime(true), showOutput(true) + //, enableFiltering(true) +{ + std::cout << "DPTextureBGS()" << std::endl; +} + +DPTextureBGS::~DPTextureBGS() +{ + delete[] bgModel; // ~10Kb (25.708-15.968) + delete[] modeArray; + delete[] curTextureHist; // ~10Kb (16-6.396) + //cvReleaseStructuringElement(&dilateElement); + //cvReleaseStructuringElement(&erodeElement); + image.ReleaseImage(); + fgMask.ReleaseImage(); + tempMask.ReleaseImage(); + texture.ReleaseImage(); + std::cout << "~DPTextureBGS()" << std::endl; +} + +void DPTextureBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + frame = new IplImage(img_input); + + if(firstTime) + { + width = img_input.size().width; + height = img_input.size().height; + size = width * height; + + // input image + image = cvCreateImage(cvSize(width, height), 8, 3); + cvCopy(frame, image.Ptr()); + + // foreground masks + fgMask = cvCreateImage(cvSize(width, height), 8, 1); + tempMask = cvCreateImage(cvSize(width, height), 8, 1); + cvZero(fgMask.Ptr()); + cvZero(tempMask.Ptr()); + + // create background model + bgModel = new TextureArray[size]; + texture = cvCreateImage(cvSize(width, height), 8, 3); + cvZero(texture.Ptr()); + modeArray = new unsigned char[size]; + curTextureHist = new TextureHistogram[size]; + + // initialize background model + bgs.LBP(image, texture); + bgs.Histogram(texture, curTextureHist); + for(int y = REGION_R+TEXTURE_R; y < height-REGION_R-TEXTURE_R; ++y) + { + for(int x = REGION_R+TEXTURE_R; x < width-REGION_R-TEXTURE_R; ++x) + { + int index = x+y*width; + + for(int m = 0; m < NUM_MODES; ++m) + { + for(int i = 0; i < NUM_BINS; ++i) + { + bgModel[index].mode[m].r[i] = curTextureHist[index].r[i]; + bgModel[index].mode[m].g[i] = curTextureHist[index].g[i]; + bgModel[index].mode[m].b[i] = curTextureHist[index].b[i]; + } + } + } + } + + //dilateElement = cvCreateStructuringElementEx(7, 7, 3, 3, CV_SHAPE_RECT); + //erodeElement = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_RECT); + + saveConfig(); + firstTime = false; + } + + cvCopy(frame, image.Ptr()); + + // perform background subtraction + bgs.LBP(image, texture); + bgs.Histogram(texture, curTextureHist); + bgs.BgsCompare(bgModel, curTextureHist, modeArray, THRESHOLD, fgMask); + + //if(enableFiltering) + //{ + // // size filtering + // ConnectedComponents cc; + // CBlobResult largeBlobs; + // cc.SetImage(&fgMask); + // cc.Find(127); + // cc.FilterMinArea(size/30, largeBlobs); + // fgMask.Clear(); + // cc.ColorBlobs(fgMask.Ptr(), largeBlobs, CV_RGB(255,255,255)); + // largeBlobs.ClearBlobs(); + + // // morphological operators + // cvDilate(fgMask.Ptr(), fgMask.Ptr(), dilateElement, 1); + // cvErode(fgMask.Ptr(), fgMask.Ptr(), erodeElement, 1); + //} + + cv::Mat foreground(fgMask.Ptr()); + if(!foreground.empty()) + foreground.copyTo(img_output); + + if(showOutput) + cv::imshow("Texture BGS (Donovan Parks)", foreground); + + // update background subtraction + bgs.UpdateModel(fgMask, bgModel, curTextureHist, modeArray); + + delete frame; +} + +void DPTextureBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPTextureBGS.xml", 0, CV_STORAGE_WRITE); + + //cvWriteReal(fs, "alpha", alpha); + //cvWriteInt(fs, "enableFiltering", enableFiltering); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void DPTextureBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPTextureBGS.xml", 0, CV_STORAGE_READ); + + //alpha = cvReadRealByName(fs, 0, "alpha", 1e-6f); + //enableFiltering = cvReadIntByName(fs, 0, "enableFiltering", true); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/dp/DPTextureBGS.h b/package_bgs/dp/DPTextureBGS.h new file mode 100644 index 0000000..daa6a55 --- /dev/null +++ b/package_bgs/dp/DPTextureBGS.h @@ -0,0 +1,60 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" +#include "TextureBGS.h" +//#include "ConnectedComponents.h" + +class DPTextureBGS : public IBGS +{ +private: + bool firstTime; + bool showOutput; + + int width; + int height; + int size; + TextureBGS bgs; + IplImage* frame; + RgbImage image; + BwImage fgMask; + BwImage tempMask; + TextureArray* bgModel; + RgbImage texture; + unsigned char* modeArray; + TextureHistogram* curTextureHist; + //ConnectedComponents cc; + //CBlobResult largeBlobs; + //IplConvKernel* dilateElement; + //IplConvKernel* erodeElement; + //bool enableFiltering; + +public: + DPTextureBGS(); + ~DPTextureBGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; diff --git a/package_bgs/dp/DPWrenGABGS.cpp b/package_bgs/dp/DPWrenGABGS.cpp new file mode 100644 index 0000000..d7241b1 --- /dev/null +++ b/package_bgs/dp/DPWrenGABGS.cpp @@ -0,0 +1,105 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "DPWrenGABGS.h" + +DPWrenGABGS::DPWrenGABGS() : firstTime(true), frameNumber(0), threshold(12.25f), alpha(0.005f), learningFrames(30), showOutput(true) +{ + std::cout << "DPWrenGABGS()" << std::endl; +} + +DPWrenGABGS::~DPWrenGABGS() +{ + std::cout << "~DPWrenGABGS()" << std::endl; +} + +void DPWrenGABGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + frame = new IplImage(img_input); + + if(firstTime) + frame_data.ReleaseMemory(false); + frame_data = frame; + + if(firstTime) + { + int width = img_input.size().width; + int height = img_input.size().height; + + lowThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + lowThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + highThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + highThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + params.SetFrameSize(width, height); + params.LowThreshold() = threshold; //3.5f*3.5f; + params.HighThreshold() = 2*params.LowThreshold(); // Note: high threshold is used by post-processing + params.Alpha() = alpha; //0.005f; + params.LearningFrames() = learningFrames; //30; + + bgs.Initalize(params); + bgs.InitModel(frame_data); + } + + bgs.Subtract(frameNumber, frame_data, lowThresholdMask, highThresholdMask); + lowThresholdMask.Clear(); + bgs.Update(frameNumber, frame_data, lowThresholdMask); + + cv::Mat foreground(highThresholdMask.Ptr()); + + if(showOutput) + cv::imshow("Gaussian Average (Wren)", foreground); + + foreground.copyTo(img_output); + + delete frame; + firstTime = false; + frameNumber++; +} + +void DPWrenGABGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPWrenGABGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteReal(fs, "threshold", threshold); + cvWriteReal(fs, "alpha", alpha); + cvWriteInt(fs, "learningFrames", learningFrames); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void DPWrenGABGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPWrenGABGS.xml", 0, CV_STORAGE_READ); + + threshold = cvReadRealByName(fs, 0, "threshold", 12.25f); + alpha = cvReadRealByName(fs, 0, "alpha", 0.005f); + learningFrames = cvReadIntByName(fs, 0, "learningFrames", 30); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} + diff --git a/package_bgs/dp/DPWrenGABGS.h b/package_bgs/dp/DPWrenGABGS.h new file mode 100644 index 0000000..7e545c5 --- /dev/null +++ b/package_bgs/dp/DPWrenGABGS.h @@ -0,0 +1,56 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" +#include "WrenGA.h" + +using namespace Algorithms::BackgroundSubtraction; + +class DPWrenGABGS : public IBGS +{ +private: + bool firstTime; + long frameNumber; + IplImage* frame; + RgbImage frame_data; + + WrenParams params; + WrenGA bgs; + BwImage lowThresholdMask; + BwImage highThresholdMask; + + double threshold; + double alpha; + int learningFrames; + bool showOutput; + +public: + DPWrenGABGS(); + ~DPWrenGABGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/dp/DPZivkovicAGMMBGS.cpp b/package_bgs/dp/DPZivkovicAGMMBGS.cpp new file mode 100644 index 0000000..16f991c --- /dev/null +++ b/package_bgs/dp/DPZivkovicAGMMBGS.cpp @@ -0,0 +1,104 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "DPZivkovicAGMMBGS.h" + +DPZivkovicAGMMBGS::DPZivkovicAGMMBGS() : firstTime(true), frameNumber(0), showOutput(true), threshold(25.0f), alpha(0.001f), gaussians(3) +{ + std::cout << "DPZivkovicAGMMBGS()" << std::endl; +} + +DPZivkovicAGMMBGS::~DPZivkovicAGMMBGS() +{ + std::cout << "~DPZivkovicAGMMBGS()" << std::endl; +} + +void DPZivkovicAGMMBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + frame = new IplImage(img_input); + + if(firstTime) + frame_data.ReleaseMemory(false); + frame_data = frame; + + if(firstTime) + { + int width = img_input.size().width; + int height = img_input.size().height; + + lowThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + lowThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + highThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + highThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + params.SetFrameSize(width, height); + params.LowThreshold() = threshold; //5.0f*5.0f; + params.HighThreshold() = 2*params.LowThreshold(); // Note: high threshold is used by post-processing + params.Alpha() = alpha; //0.001f; + params.MaxModes() = gaussians; //3; + + bgs.Initalize(params); + bgs.InitModel(frame_data); + } + + bgs.Subtract(frameNumber, frame_data, lowThresholdMask, highThresholdMask); + lowThresholdMask.Clear(); + bgs.Update(frameNumber, frame_data, lowThresholdMask); + + cv::Mat foreground(highThresholdMask.Ptr()); + + if(showOutput) + cv::imshow("Gaussian Mixture Model (Zivkovic)", foreground); + + foreground.copyTo(img_output); + + delete frame; + firstTime = false; + frameNumber++; +} + +void DPZivkovicAGMMBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPZivkovicAGMMBGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteReal(fs, "threshold", threshold); + cvWriteReal(fs, "alpha", alpha); + cvWriteInt(fs, "gaussians", gaussians); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void DPZivkovicAGMMBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/DPZivkovicAGMMBGS.xml", 0, CV_STORAGE_READ); + + threshold = cvReadRealByName(fs, 0, "threshold", 25.0f); + alpha = cvReadRealByName(fs, 0, "alpha", 0.001f); + gaussians = cvReadIntByName(fs, 0, "gaussians", 3); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/dp/DPZivkovicAGMMBGS.h b/package_bgs/dp/DPZivkovicAGMMBGS.h new file mode 100644 index 0000000..d213341 --- /dev/null +++ b/package_bgs/dp/DPZivkovicAGMMBGS.h @@ -0,0 +1,56 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" +#include "ZivkovicAGMM.h" + +using namespace Algorithms::BackgroundSubtraction; + +class DPZivkovicAGMMBGS : public IBGS +{ +private: + bool firstTime; + long frameNumber; + IplImage* frame; + RgbImage frame_data; + + ZivkovicParams params; + ZivkovicAGMM bgs; + BwImage lowThresholdMask; + BwImage highThresholdMask; + + double threshold; + double alpha; + int gaussians; + bool showOutput; + +public: + DPZivkovicAGMMBGS(); + ~DPZivkovicAGMMBGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/dp/Eigenbackground.cpp b/package_bgs/dp/Eigenbackground.cpp new file mode 100644 index 0000000..2d2c3ef --- /dev/null +++ b/package_bgs/dp/Eigenbackground.cpp @@ -0,0 +1,190 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* Eigenbackground.cpp +* +* Purpose: Implementation of the Eigenbackground background subtraction +* algorithm developed by Oliver et al. +* +* Author: Donovan Parks, September 2007 +* +* "A Bayesian Computer Vision System for Modeling Human Interactions" +* Nuria Oliver, Barbara Rosario, Alex P. Pentland 2000 +* +******************************************************************************/ + +#include "Eigenbackground.h" + +using namespace Algorithms::BackgroundSubtraction; + +Eigenbackground::Eigenbackground() +{ + m_pcaData = NULL; + m_pcaAvg = NULL; + m_eigenValues = NULL; + m_eigenVectors = NULL; +} + +Eigenbackground::~Eigenbackground() +{ + if(m_pcaData != NULL) cvReleaseMat(&m_pcaData); + if(m_pcaAvg != NULL) cvReleaseMat(&m_pcaAvg); + if(m_eigenValues != NULL) cvReleaseMat(&m_eigenValues); + if(m_eigenVectors != NULL) cvReleaseMat(&m_eigenVectors); +} + +void Eigenbackground::Initalize(const BgsParams& param) +{ + m_params = (EigenbackgroundParams&)param; + + m_background = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 3); + m_background.Clear(); +} + +void Eigenbackground::InitModel(const RgbImage& data) +{ + if(m_pcaData != NULL) cvReleaseMat(&m_pcaData); + if(m_pcaAvg != NULL) cvReleaseMat(&m_pcaAvg); + if(m_eigenValues != NULL) cvReleaseMat(&m_eigenValues); + if(m_eigenVectors != NULL) cvReleaseMat(&m_eigenVectors); + + m_pcaData = cvCreateMat(m_params.HistorySize(), m_params.Size()*3, CV_8UC1); + + m_background.Clear(); +} + +void Eigenbackground::Update(int frame_num, const RgbImage& data, const BwImage& update_mask) +{ + // the eigenbackground model is not updated (serious limitation!) +} + +void Eigenbackground::Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask) +{ + // create eigenbackground + if(frame_num == m_params.HistorySize()) + { + // create the eigenspace + m_pcaAvg = cvCreateMat( 1, m_pcaData->cols, CV_32F ); + m_eigenValues = cvCreateMat( m_pcaData->rows, 1, CV_32F ); + m_eigenVectors = cvCreateMat( m_pcaData->rows, m_pcaData->cols, CV_32F ); + cvCalcPCA(m_pcaData, m_pcaAvg, m_eigenValues, m_eigenVectors, CV_PCA_DATA_AS_ROW); + + int index = 0; + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + for(int ch = 0; ch < m_background.Ptr()->nChannels; ++ch) + { + m_background(r,c,0) = static_cast<unsigned char>(cvmGet(m_pcaAvg,0,index)+0.5); + index++; + } + } + } + } + + if(frame_num >= m_params.HistorySize()) + { + // project new image into the eigenspace + int w = data.Ptr()->width; + int h = data.Ptr()->height; + int ch = data.Ptr()->nChannels; + CvMat* dataPt = cvCreateMat(1, w*h*ch, CV_8UC1); + CvMat data_row; + cvGetRow(dataPt, &data_row, 0); + cvReshape(&data_row, &data_row, 3, data.Ptr()->height); + cvCopy(data.Ptr(), &data_row); + + CvMat* proj = cvCreateMat(1, m_params.EmbeddedDim(), CV_32F); + cvProjectPCA(dataPt, m_pcaAvg, m_eigenVectors, proj); + + // reconstruct point + CvMat* result = cvCreateMat(1, m_pcaData->cols, CV_32F); + cvBackProjectPCA(proj, m_pcaAvg, m_eigenVectors, result); + + // calculate Euclidean distance between new image and its eigenspace projection + int index = 0; + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + double dist = 0; + bool bgLow = true; + bool bgHigh = true; + for(int ch = 0; ch < 3; ++ch) + { + dist = (data(r,c,ch) - cvmGet(result,0,index))*(data(r,c,ch) - cvmGet(result,0,index)); + if(dist > m_params.LowThreshold()) + bgLow = false; + if(dist > m_params.HighThreshold()) + bgHigh = false; + index++; + } + + if(!bgLow) + { + low_threshold_mask(r,c) = FOREGROUND; + } + else + { + low_threshold_mask(r,c) = BACKGROUND; + } + + if(!bgHigh) + { + high_threshold_mask(r,c) = FOREGROUND; + } + else + { + high_threshold_mask(r,c) = BACKGROUND; + } + } + } + + cvReleaseMat(&result); + cvReleaseMat(&proj); + cvReleaseMat(&dataPt); + } + else + { + // set entire image to background since there is not enough information yet + // to start performing background subtraction + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + low_threshold_mask(r,c) = BACKGROUND; + high_threshold_mask(r,c) = BACKGROUND; + } + } + } + + UpdateHistory(frame_num, data); +} + +void Eigenbackground::UpdateHistory(int frame_num, const RgbImage& new_frame) +{ + if(frame_num < m_params.HistorySize()) + { + CvMat src_row; + cvGetRow(m_pcaData, &src_row, frame_num); + cvReshape(&src_row, &src_row, 3, new_frame.Ptr()->height); + cvCopy(new_frame.Ptr(), &src_row); + } +} diff --git a/package_bgs/dp/Eigenbackground.h b/package_bgs/dp/Eigenbackground.h new file mode 100644 index 0000000..b86ac92 --- /dev/null +++ b/package_bgs/dp/Eigenbackground.h @@ -0,0 +1,101 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* Eigenbackground.hpp +* +* Purpose: Implementation of the Eigenbackground background subtraction +* algorithm developed by Oliver et al. +* +* Author: Donovan Parks, September 2007 +* +* "A Bayesian Computer Vision System for Modeling Human Interactions" +* Nuria Oliver, Barbara Rosario, Alex P. Pentland 2000 + +Example: +Algorithms::BackgroundSubtraction::EigenbackgroundParams params; +params.SetFrameSize(width, height); +params.LowThreshold() = 15*15; +params.HighThreshold() = 2*params.LowThreshold(); // Note: high threshold is used by post-processing +params.HistorySize() = 100; +params.EmbeddedDim() = 20; + +Algorithms::BackgroundSubtraction::Eigenbackground bgs; +bgs.Initalize(params); +******************************************************************************/ + +#ifndef _ELGAMMAL_H_ +#define _ELGAMMAL_H_ + +#include "Bgs.h" + +namespace Algorithms +{ + namespace BackgroundSubtraction + { + // --- Parameters used by the Mean BGS algorithm --- + class EigenbackgroundParams : public BgsParams + { + public: + float &LowThreshold() { return m_low_threshold; } + float &HighThreshold() { return m_high_threshold; } + + int &HistorySize() { return m_history_size; } + int &EmbeddedDim() { return m_dim; } + + private: + // A pixel will be classified as foreground if the squared distance of any + // color channel is greater than the specified threshold + float m_low_threshold; + float m_high_threshold; + + int m_history_size; // number frames used to create eigenspace + int m_dim; // eigenspace dimensionality + }; + + // --- Eigenbackground BGS algorithm --- + class Eigenbackground : public Bgs + { + public: + Eigenbackground(); + ~Eigenbackground(); + + void Initalize(const BgsParams& param); + + void InitModel(const RgbImage& data); + void Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask); + void Update(int frame_num, const RgbImage& data, const BwImage& update_mask); + + RgbImage* Background() { return &m_background; } + + private: + void UpdateHistory(int frameNum, const RgbImage& newFrame); + + EigenbackgroundParams m_params; + + CvMat* m_pcaData; + CvMat* m_pcaAvg; + CvMat* m_eigenValues; + CvMat* m_eigenVectors; + + RgbImage m_background; + }; + }; +}; + +#endif \ No newline at end of file diff --git a/package_bgs/dp/Error.cpp b/package_bgs/dp/Error.cpp new file mode 100644 index 0000000..1bd87db --- /dev/null +++ b/package_bgs/dp/Error.cpp @@ -0,0 +1,57 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* Error.cpp +* +* Purpose: Error checking routines. +* +* Author: Donovan Parks, July 2007 +* +******************************************************************************/ + +#include <iostream> +#include <fstream> + +#include "Error.h" + +using namespace std; + +ofstream traceFile; + +bool Error(const char* msg, const char* code, int data) +{ + cerr << code << ": " << msg << endl; + + return false; +} + +bool TraceInit(const char* filename) +{ + traceFile.open(filename); + return traceFile.is_open(); +} + +void Trace(const char* msg) +{ + traceFile << msg << endl; +} + +void TraceClose() +{ + traceFile.close(); +} diff --git a/package_bgs/dp/Error.h b/package_bgs/dp/Error.h new file mode 100644 index 0000000..cdbb222 --- /dev/null +++ b/package_bgs/dp/Error.h @@ -0,0 +1,36 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* Error.h +* +* Purpose: Error checking routines. +* +* Author: Donovan Parks, July 2007 +* +******************************************************************************/ + +#ifndef ERROR_H +#define ERROR_H + +bool Error(const char* msg, const char* code, int data); + +bool TraceInit(const char* filename); +void Trace(const char* msg); +void TraceClose(); + +#endif diff --git a/package_bgs/dp/GrimsonGMM.cpp b/package_bgs/dp/GrimsonGMM.cpp new file mode 100644 index 0000000..5788dc9 --- /dev/null +++ b/package_bgs/dp/GrimsonGMM.cpp @@ -0,0 +1,332 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* GrimsonGMM.cpp +* +* Purpose: Implementation of the Gaussian mixture model (GMM) background +* subtraction described in: +* "Adaptive background mixture models for real-time tracking" +* by Chris Stauffer and W.E.L Grimson +* +* Author: Donovan Parks, September 2007 +* +* This code is based on code by Z. Zivkovic's written for his enhanced GMM +* background subtraction algorithm: +* +* "Improved adaptive Gausian mixture model for background subtraction" +* Z.Zivkovic +* International Conference Pattern Recognition, UK, August, 2004 +* +* +* "Efficient Adaptive Density Estimapion per Image Pixel for the +* Task of Background Subtraction" +* Z.Zivkovic, F. van der Heijden +* Pattern Recognition Letters, vol. 27, no. 7, pages 773-780, 2006. +* +* Zivkovic's code can be obtained at: www.zoranz.net +******************************************************************************/ + +#include "GrimsonGMM.h" + +using namespace Algorithms::BackgroundSubtraction; + +int compareGMM(const void* _gmm1, const void* _gmm2) +{ + GMM gmm1 = *(GMM*)_gmm1; + GMM gmm2 = *(GMM*)_gmm2; + + if(gmm1.significants < gmm2.significants) + return 1; + else if(gmm1.significants == gmm2.significants) + return 0; + else + return -1; +} + +GrimsonGMM::GrimsonGMM() +{ + m_modes = NULL; +} + +GrimsonGMM::~GrimsonGMM() +{ + if(m_modes != NULL) + delete[] m_modes; +} + +void GrimsonGMM::Initalize(const BgsParams& param) +{ + m_params = (GrimsonParams&)param; + + // Tbf - the threshold + m_bg_threshold = 0.75f; // 1-cf from the paper + + // Tgenerate - the threshold + m_variance = 36.0f; // sigma for the new mode + + // GMM for each pixel + m_modes = new GMM[m_params.Size()*m_params.MaxModes()]; + + // used modes per pixel + m_modes_per_pixel = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 1); + + m_background = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 3); +} + +RgbImage* GrimsonGMM::Background() +{ + return &m_background; +} + +void GrimsonGMM::InitModel(const RgbImage& data) +{ + m_modes_per_pixel.Clear(); + + for(unsigned int i = 0; i < m_params.Size()*m_params.MaxModes(); ++i) + { + m_modes[i].weight = 0; + m_modes[i].variance = 0; + m_modes[i].muR = 0; + m_modes[i].muG = 0; + m_modes[i].muB = 0; + m_modes[i].significants = 0; + } +} + +void GrimsonGMM::Update(int frame_num, const RgbImage& data, const BwImage& update_mask) +{ + // it doesn't make sense to have conditional updates in the GMM framework +} + +void GrimsonGMM::SubtractPixel(long posPixel, const RgbPixel& pixel, unsigned char& numModes, + unsigned char& low_threshold, unsigned char& high_threshold) +{ + // calculate distances to the modes (+ sort???) + // here we need to go in descending order!!! + long pos; + bool bFitsPDF=false; + bool bBackgroundLow=false; + bool bBackgroundHigh=false; + + float fOneMinAlpha = 1-m_params.Alpha(); + + float totalWeight = 0.0f; + + // calculate number of Gaussians to include in the background model + int backgroundGaussians = 0; + double sum = 0.0; + for(int i = 0; i < numModes; ++i) + { + if(sum < m_bg_threshold) + { + backgroundGaussians++; + sum += m_modes[posPixel+i].weight; + } + else + { + break; + } + } + + // update all distributions and check for match with current pixel + for (int iModes=0; iModes < numModes; iModes++) + { + pos=posPixel+iModes; + float weight = m_modes[pos].weight; + + // fit not found yet + if (!bFitsPDF) + { + //check if it belongs to some of the modes + //calculate distance + float var = m_modes[pos].variance; + float muR = m_modes[pos].muR; + float muG = m_modes[pos].muG; + float muB = m_modes[pos].muB; + + float dR=muR - pixel(0); + float dG=muG - pixel(1); + float dB=muB - pixel(2); + + // calculate the squared distance + float dist = (dR*dR + dG*dG + dB*dB); + + if(dist < m_params.HighThreshold()*var && iModes < backgroundGaussians) + bBackgroundHigh = true; + + // a match occurs when the pixel is within sqrt(fTg) standard deviations of the distribution + if(dist < m_params.LowThreshold()*var) + { + bFitsPDF=true; + + // check if this Gaussian is part of the background model + if(iModes < backgroundGaussians) + bBackgroundLow = true; + + //update distribution + float k = m_params.Alpha()/weight; + weight = fOneMinAlpha*weight + m_params.Alpha(); + m_modes[pos].weight = weight; + m_modes[pos].muR = muR - k*(dR); + m_modes[pos].muG = muG - k*(dG); + m_modes[pos].muB = muB - k*(dB); + + //limit the variance + float sigmanew = var + k*(dist-var); + m_modes[pos].variance = sigmanew < 4 ? 4 : sigmanew > 5*m_variance ? 5*m_variance : sigmanew; + m_modes[pos].significants = m_modes[pos].weight / sqrt(m_modes[pos].variance); + } + else + { + weight = fOneMinAlpha*weight; + if (weight < 0.0) + { + weight=0.0; + numModes--; + } + + m_modes[pos].weight = weight; + m_modes[pos].significants = m_modes[pos].weight / sqrt(m_modes[pos].variance); + } + } + else + { + weight = fOneMinAlpha*weight; + if (weight < 0.0) + { + weight=0.0; + numModes--; + } + m_modes[pos].weight = weight; + m_modes[pos].significants = m_modes[pos].weight / sqrt(m_modes[pos].variance); + } + + totalWeight += weight; + } + + // renormalize weights so they add to one + double invTotalWeight = 1.0 / totalWeight; + for (int iLocal = 0; iLocal < numModes; iLocal++) + { + m_modes[posPixel + iLocal].weight *= (float)invTotalWeight; + m_modes[posPixel + iLocal].significants = m_modes[posPixel + iLocal].weight + / sqrt(m_modes[posPixel + iLocal].variance); + } + + // Sort significance values so they are in desending order. + qsort(&m_modes[posPixel], numModes, sizeof(GMM), compareGMM); + + // make new mode if needed and exit + if (!bFitsPDF) + { + if (numModes < m_params.MaxModes()) + { + numModes++; + } + else + { + // the weakest mode will be replaced + } + + pos = posPixel + numModes-1; + + m_modes[pos].muR = pixel.ch[0]; + m_modes[pos].muG = pixel.ch[1]; + m_modes[pos].muB = pixel.ch[2]; + m_modes[pos].variance = m_variance; + m_modes[pos].significants = 0; // will be set below + + if (numModes==1) + m_modes[pos].weight = 1; + else + m_modes[pos].weight = m_params.Alpha(); + + //renormalize weights + int iLocal; + float sum = 0.0; + for (iLocal = 0; iLocal < numModes; iLocal++) + { + sum += m_modes[posPixel+ iLocal].weight; + } + + double invSum = 1.0/sum; + for (iLocal = 0; iLocal < numModes; iLocal++) + { + m_modes[posPixel + iLocal].weight *= (float)invSum; + m_modes[posPixel + iLocal].significants = m_modes[posPixel + iLocal].weight + / sqrt(m_modes[posPixel + iLocal].variance); + + } + } + + // Sort significance values so they are in desending order. + qsort(&(m_modes[posPixel]), numModes, sizeof(GMM), compareGMM); + + if(bBackgroundLow) + { + low_threshold = BACKGROUND; + } + else + { + low_threshold = FOREGROUND; + } + + if(bBackgroundHigh) + { + high_threshold = BACKGROUND; + } + else + { + high_threshold = FOREGROUND; + } +} + +/////////////////////////////////////////////////////////////////////////////// +//Input: +// data - a pointer to the data of a RGB image of the same size +//Output: +// output - a pointer to the data of a gray value image of the same size +// (the memory should already be reserved) +// values: 255-foreground, 125-shadow, 0-background +/////////////////////////////////////////////////////////////////////////////// +void GrimsonGMM::Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask) +{ + unsigned char low_threshold, high_threshold; + long posPixel; + + // update each pixel of the image + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + // update model + background subtract + posPixel=(r*m_params.Width()+c)*m_params.MaxModes(); + + SubtractPixel(posPixel, data(r,c), m_modes_per_pixel(r,c), low_threshold, high_threshold); + + low_threshold_mask(r,c) = low_threshold; + high_threshold_mask(r,c) = high_threshold; + + m_background(r,c,0) = (unsigned char)m_modes[posPixel].muR; + m_background(r,c,1) = (unsigned char)m_modes[posPixel].muG; + m_background(r,c,2) = (unsigned char)m_modes[posPixel].muB; + } + } +} + diff --git a/package_bgs/dp/GrimsonGMM.h b/package_bgs/dp/GrimsonGMM.h new file mode 100644 index 0000000..2d11a28 --- /dev/null +++ b/package_bgs/dp/GrimsonGMM.h @@ -0,0 +1,150 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* GrimsonGMM.cpp +* +* Purpose: Implementation of the Gaussian mixture model (GMM) background +* subtraction described in: +* "Adaptive background mixture models for real-time tracking" +* by Chris Stauffer and W.E.L Grimson +* +* Author: Donovan Parks, September 2007 +* +* This code is based on code by Z. Zivkovic's written for his enhanced GMM +* background subtraction algorithm: +* +* "Improved adaptive Gausian mixture model for background subtraction" +* Z.Zivkovic +* International Conference Pattern Recognition, UK, August, 2004 +* +* +* "Efficient Adaptive Density Estimapion per Image Pixel for the +* Task of Background Subtraction" +* Z.Zivkovic, F. van der Heijden +* Pattern Recognition Letters, vol. 27, no. 7, pages 773-780, 2006. +* +* Zivkovic's code can be obtained at: www.zoranz.net + +Example: + Algorithms::BackgroundSubtraction::GrimsonParams params; + params.SetFrameSize(width, height); + params.LowThreshold() = 3.0f*3.0f; + params.HighThreshold() = 2*params.LowThreshold(); // Note: high threshold is used by post-processing + params.Alpha() = 0.001f; + params.MaxModes() = 3; + + Algorithms::BackgroundSubtraction::GrimsonGMM bgs; + bgs.Initalize(params); +******************************************************************************/ + +#ifndef GRIMSON_GMM_ +#define GRIMSON_GMM_ + +#include "Bgs.h" + +namespace Algorithms +{ + namespace BackgroundSubtraction + { + typedef struct GMMGaussian + { + float variance; + float muR; + float muG; + float muB; + float weight; + float significants; // this is equal to weight / standard deviation and is used to + // determine which Gaussians should be part of the background model + } GMM; + + // --- User adjustable parameters used by the Grimson GMM BGS algorithm --- + class GrimsonParams : public BgsParams + { + public: + float &LowThreshold() { return m_low_threshold; } + float &HighThreshold() { return m_high_threshold; } + + float &Alpha() { return m_alpha; } + int &MaxModes() { return m_max_modes; } + + private: + // Threshold on the squared dist. to decide when a sample is close to an existing + // components. If it is not close to any a new component will be generated. + // Smaller threshold values lead to more generated components and higher threshold values + // lead to a small number of components but they can grow too large. + // + // It is usual easiest to think of these thresholds as being the number of variances away + // from the mean of a pixel before it is considered to be from the foreground. + float m_low_threshold; + float m_high_threshold; + + // alpha - speed of update - if the time interval you want to average over is T + // set alpha=1/T. + float m_alpha; + + // Maximum number of modes (Gaussian components) that will be used per pixel + int m_max_modes; + }; + + // --- Grimson GMM BGS algorithm --- + class GrimsonGMM : public Bgs + { + public: + GrimsonGMM(); + ~GrimsonGMM(); + + void Initalize(const BgsParams& param); + + void InitModel(const RgbImage& data); + void Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask); + void Update(int frame_num, const RgbImage& data, const BwImage& update_mask); + + RgbImage* Background(); + + private: + void SubtractPixel(long posPixel, const RgbPixel& pixel, unsigned char& numModes, + unsigned char& lowThreshold, unsigned char& highThreshold); + + // User adjustable parameters + GrimsonParams m_params; + + // Threshold when the component becomes significant enough to be included into + // the background model. It is the TB = 1-cf from the paper. So I use cf=0.1 => TB=0.9 + // For alpha=0.001 it means that the mode should exist for approximately 105 frames before + // it is considered foreground + float m_bg_threshold; //1-cf from the paper + + // Initial variance for the newly generated components. + // It will will influence the speed of adaptation. A good guess should be made. + // A simple way is to estimate the typical standard deviation from the images. + float m_variance; + + // Dynamic array for the mixture of Gaussians + GMM* m_modes; + + // Number of Gaussian components per pixel + BwImage m_modes_per_pixel; + + // Current background model + RgbImage m_background; + }; + }; +}; + +#endif diff --git a/package_bgs/dp/Image.cpp b/package_bgs/dp/Image.cpp new file mode 100644 index 0000000..f00febd --- /dev/null +++ b/package_bgs/dp/Image.cpp @@ -0,0 +1,76 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* Image.hpp +* +* Purpose: C++ wrapper for OpenCV IplImage which supports simple and +* efficient access to the image data +* +* Author: Donovan Parks, September 2007 +* +* Based on code from: +* http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.hpptml +******************************************************************************/ + +#include "Image.h" + +ImageBase::~ImageBase() +{ + if(imgp != NULL && m_bReleaseMemory) + cvReleaseImage(&imgp); + imgp = NULL; +} + +void DensityFilter(BwImage& image, BwImage& filtered, int minDensity, unsigned char fgValue) +{ + for(int r = 1; r < image.Ptr()->height-1; ++r) + { + for(int c = 1; c < image.Ptr()->width-1; ++c) + { + int count = 0; + if(image(r,c) == fgValue) + { + if(image(r-1,c-1) == fgValue) + count++; + if(image(r-1,c) == fgValue) + count++; + if(image(r-1,c+1) == fgValue) + count++; + if(image(r,c-1) == fgValue) + count++; + if(image(r,c+1) == fgValue) + count++; + if(image(r+1,c-1) == fgValue) + count++; + if(image(r+1,c) == fgValue) + count++; + if(image(r+1,c+1) == fgValue) + count++; + + if(count < minDensity) + filtered(r,c) = 0; + else + filtered(r,c) = fgValue; + } + else + { + filtered(r,c) = 0; + } + } + } +} \ No newline at end of file diff --git a/package_bgs/dp/Image.h b/package_bgs/dp/Image.h new file mode 100644 index 0000000..40d327b --- /dev/null +++ b/package_bgs/dp/Image.h @@ -0,0 +1,364 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* Image.h +* +* Purpose: C++ wrapper for OpenCV IplImage which supports simple and +* efficient access to the image data +* +* Author: Donovan Parks, September 2007 +* +* Based on code from: +* http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html +******************************************************************************/ + +#ifndef _IMAGE_H_ +#define _IMAGE_H_ + +#include <cv.h> +#include <cxcore.h> + +// --- Image Iterator --------------------------------------------------------- + +template <class T> +class ImageIterator +{ +public: + ImageIterator(IplImage* image, int x=0, int y=0, int dx= 0, int dy=0) : + i(x), j(y), i0(0) + { + data = reinterpret_cast<T*>(image->imageData); + step = image->widthStep / sizeof(T); + + nl= image->height; + if ((y+dy)>0 && (y+dy) < nl) + nl= y+dy; + + if (y<0) + j=0; + + data += step*j; + + nc = image->width; + if ((x+dx) > 0 && (x+dx) < nc) + nc = x+dx; + + nc *= image->nChannels; + if (x>0) + i0 = x*image->nChannels; + i = i0; + + nch = image->nChannels; + } + + + /* has next ? */ + bool operator!() const { return j < nl; } + + /* next pixel */ + ImageIterator& operator++() + { + i++; + if (i >= nc) + { + i=i0; + j++; + data += step; + } + return *this; + } + + ImageIterator& operator+=(int s) + { + i+=s; + if (i >= nc) + { + i=i0; + j++; + data += step; + } + return *this; + } + + /* pixel access */ + T& operator*() { return data[i]; } + + const T operator*() const { return data[i]; } + + const T neighbor(int dx, int dy) const + { + return *(data+dy*step+i+dx); + } + + T* operator&() const { return data+i; } + + /* current pixel coordinates */ + int column() const { return i/nch; } + int line() const { return j; } + +private: + int i, i0,j; + T* data; + int step; + int nl, nc; + int nch; +}; + +// --- Constants -------------------------------------------------------------- + +const unsigned char NUM_CHANNELS = 3; + +// --- Pixel Types ------------------------------------------------------------ + +class RgbPixel +{ +public: + RgbPixel() {;} + RgbPixel(unsigned char _r, unsigned char _g, unsigned char _b) + { + ch[0] = _r; ch[1] = _g; ch[2] = _b; + } + + RgbPixel& operator=(const RgbPixel& rhs) + { + ch[0] = rhs.ch[0]; ch[1] = rhs.ch[1]; ch[2] = rhs.ch[2]; + return *this; + } + + inline unsigned char& operator()(const int _ch) + { + return ch[_ch]; + } + + inline unsigned char operator()(const int _ch) const + { + return ch[_ch]; + } + + unsigned char ch[3]; +}; + +class RgbPixelFloat +{ +public: + RgbPixelFloat() {;} + RgbPixelFloat(float _r, float _g, float _b) + { + ch[0] = _r; ch[1] = _g; ch[2] = _b; + } + + RgbPixelFloat& operator=(const RgbPixelFloat& rhs) + { + ch[0] = rhs.ch[0]; ch[1] = rhs.ch[1]; ch[2] = rhs.ch[2]; + return *this; + } + + inline float& operator()(const int _ch) + { + return ch[_ch]; + } + + inline float operator()(const int _ch) const + { + return ch[_ch]; + } + + float ch[3]; +}; + +// --- Image Types ------------------------------------------------------------ + +class ImageBase +{ +public: + ImageBase(IplImage* img = NULL) { imgp = img; m_bReleaseMemory = true; } + ~ImageBase(); + + void ReleaseMemory(bool b) { m_bReleaseMemory = b; } + + IplImage* Ptr() { return imgp; } + const IplImage* Ptr() const { return imgp; } + + void ReleaseImage() + { + cvReleaseImage(&imgp); + } + + void operator=(IplImage* img) + { + imgp = img; + } + + // copy-constructor + ImageBase(const ImageBase& rhs) + { + // it is very inefficent if this copy-constructor is called + assert(false); + } + + // assignment operator + ImageBase& operator=(const ImageBase& rhs) + { + // it is very inefficent if operator= is called + assert(false); + + return *this; + } + + virtual void Clear() = 0; + +protected: + IplImage* imgp; + bool m_bReleaseMemory; +}; + +class RgbImage : public ImageBase +{ +public: + RgbImage(IplImage* img = NULL) : ImageBase(img) { ; } + + virtual void Clear() + { + cvZero(imgp); + } + + void operator=(IplImage* img) + { + imgp = img; + } + + // channel-level access using image(row, col, channel) + inline unsigned char& operator()(const int r, const int c, const int ch) + { + return (unsigned char &)imgp->imageData[r*imgp->widthStep+c*imgp->nChannels+ch]; + } + + inline const unsigned char& operator()(const int r, const int c, const int ch) const + { + return (unsigned char &)imgp->imageData[r*imgp->widthStep+c*imgp->nChannels+ch]; + } + + // RGB pixel-level access using image(row, col) + inline RgbPixel& operator()(const int r, const int c) + { + return (RgbPixel &)imgp->imageData[r*imgp->widthStep+c*imgp->nChannels]; + } + + inline const RgbPixel& operator()(const int r, const int c) const + { + return (RgbPixel &)imgp->imageData[r*imgp->widthStep+c*imgp->nChannels]; + } +}; + +class RgbImageFloat : public ImageBase +{ +public: + RgbImageFloat(IplImage* img = NULL) : ImageBase(img) { ; } + + virtual void Clear() + { + cvZero(imgp); + } + + void operator=(IplImage* img) + { + imgp = img; + } + + // channel-level access using image(row, col, channel) + inline float& operator()(const int r, const int c, const int ch) + { + return (float &)imgp->imageData[r*imgp->widthStep+(c*imgp->nChannels+ch)*sizeof(float)]; + } + + inline float operator()(const int r, const int c, const int ch) const + { + return (float)imgp->imageData[r*imgp->widthStep+(c*imgp->nChannels+ch)*sizeof(float)]; + } + + // RGB pixel-level access using image(row, col) + inline RgbPixelFloat& operator()(const int r, const int c) + { + return (RgbPixelFloat &)imgp->imageData[r*imgp->widthStep+c*imgp->nChannels*sizeof(float)]; + } + + inline const RgbPixelFloat& operator()(const int r, const int c) const + { + return (RgbPixelFloat &)imgp->imageData[r*imgp->widthStep+c*imgp->nChannels*sizeof(float)]; + } +}; + +class BwImage : public ImageBase +{ +public: + BwImage(IplImage* img = NULL) : ImageBase(img) { ; } + + virtual void Clear() + { + cvZero(imgp); + } + + void operator=(IplImage* img) + { + imgp = img; + } + + // pixel-level access using image(row, col) + inline unsigned char& operator()(const int r, const int c) + { + return (unsigned char &)imgp->imageData[r*imgp->widthStep+c]; + } + + inline unsigned char operator()(const int r, const int c) const + { + return (unsigned char)imgp->imageData[r*imgp->widthStep+c]; + } +}; + +class BwImageFloat : public ImageBase +{ +public: + BwImageFloat(IplImage* img = NULL) : ImageBase(img) { ; } + + virtual void Clear() + { + cvZero(imgp); + } + + void operator=(IplImage* img) + { + imgp = img; + } + + // pixel-level access using image(row, col) + inline float& operator()(const int r, const int c) + { + return (float &)imgp->imageData[r*imgp->widthStep+c*sizeof(float)]; + } + + inline float operator()(const int r, const int c) const + { + return (float)imgp->imageData[r*imgp->widthStep+c*sizeof(float)]; + } +}; + +// --- Image Functions -------------------------------------------------------- + +void DensityFilter(BwImage& image, BwImage& filtered, int minDensity, unsigned char fgValue); + +#endif \ No newline at end of file diff --git a/package_bgs/dp/MeanBGS.cpp b/package_bgs/dp/MeanBGS.cpp new file mode 100644 index 0000000..b8df895 --- /dev/null +++ b/package_bgs/dp/MeanBGS.cpp @@ -0,0 +1,131 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* MeanBGS.h +* +* Purpose: Implementation of a simple temporal mean background +* subtraction algorithm. +* +* Author: Donovan Parks, September 2007 +* +******************************************************************************/ + +#include "MeanBGS.h" + +using namespace Algorithms::BackgroundSubtraction; + +void MeanBGS::Initalize(const BgsParams& param) +{ + m_params = (MeanParams&)param; + + m_mean = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_32F, 3); + m_background = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 3); +} + +void MeanBGS::InitModel(const RgbImage& data) +{ + for (unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + for(int ch = 0; ch < NUM_CHANNELS; ++ch) + { + m_mean(r,c,ch) = (float)data(r,c,ch); + } + } + } +} + +void MeanBGS::Update(int frame_num, const RgbImage& data, const BwImage& update_mask) +{ + // update background model + for (unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + // perform conditional updating only if we are passed the learning phase + if(update_mask(r,c) == BACKGROUND || frame_num < m_params.LearningFrames()) + { + // update B/G model + float mean; + for(int ch = 0; ch < NUM_CHANNELS; ++ch) + { + mean = m_params.Alpha() * m_mean(r,c,ch) + (1.0f-m_params.Alpha()) * data(r,c,ch); + m_mean(r,c,ch) = mean; + m_background(r,c,ch) = (unsigned char)(mean + 0.5); + } + } + } + } +} + +void MeanBGS::SubtractPixel(int r, int c, const RgbPixel& pixel, + unsigned char& low_threshold, + unsigned char& high_threshold) +{ + // calculate distance to sample point + float dist = 0; + for(int ch = 0; ch < NUM_CHANNELS; ++ch) + { + dist += (pixel(ch)-m_mean(r,c,ch))*(pixel(ch)-m_mean(r,c,ch)); + } + + // determine if sample point is F/G or B/G pixel + low_threshold = BACKGROUND; + if(dist > m_params.LowThreshold()) + { + low_threshold = FOREGROUND; + } + + high_threshold = BACKGROUND; + if(dist > m_params.HighThreshold()) + { + high_threshold = FOREGROUND; + } +} + +/////////////////////////////////////////////////////////////////////////////// +//Input: +// data - a pointer to the data of a RGB image of the same size +//Output: +// output - a pointer to the data of a gray value image of the same size +// values: 255-foreground, 0-background +/////////////////////////////////////////////////////////////////////////////// +void MeanBGS::Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask) +{ + unsigned char low_threshold, high_threshold; + + // update each pixel of the image + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + // perform background subtraction + update background model + SubtractPixel(r, c, data(r,c), low_threshold, high_threshold); + + // setup silhouette mask + low_threshold_mask(r,c) = low_threshold; + high_threshold_mask(r,c) = high_threshold; + } + } +} + + + + diff --git a/package_bgs/dp/MeanBGS.h b/package_bgs/dp/MeanBGS.h new file mode 100644 index 0000000..881beb7 --- /dev/null +++ b/package_bgs/dp/MeanBGS.h @@ -0,0 +1,98 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* MeanBGS.hpp +* +* Purpose: Implementation of a simple temporal mean background +* subtraction algorithm. +* +* Author: Donovan Parks, September 2007 +* + +Example: +Algorithms::BackgroundSubtraction::MeanParams params; +params.SetFrameSize(width, height); +params.LowThreshold() = 3*30*30; +params.HighThreshold() = 2*params.LowThreshold(); // Note: high threshold is used by post-processing +params.Alpha() = 1e-6f; +params.LearningFrames() = 30; + +Algorithms::BackgroundSubtraction::MeanBGS bgs; +bgs.Initalize(params); +******************************************************************************/ + +#include "Bgs.h" + +namespace Algorithms +{ + namespace BackgroundSubtraction + { + + // --- Parameters used by the Mean BGS algorithm --- + class MeanParams : public BgsParams + { + public: + unsigned int &LowThreshold() { return m_low_threshold; } + unsigned int &HighThreshold() { return m_high_threshold; } + + float &Alpha() { return m_alpha; } + int &LearningFrames() { return m_learning_frames; } + + private: + // A pixel is considered to be from the background if the squared distance between + // it and the background model is less than the threshold. + unsigned int m_low_threshold; + unsigned int m_high_threshold; + + float m_alpha; + int m_learning_frames; + }; + + + // --- Mean BGS algorithm --- + class MeanBGS : public Bgs + { + public: + virtual ~MeanBGS() {} + + void Initalize(const BgsParams& param); + + void InitModel(const RgbImage& data); + void Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask); + void Update(int frame_num, const RgbImage& data, const BwImage& update_mask); + + RgbImage* Background() { return &m_background; } + + private: + void SubtractPixel(int r, int c, const RgbPixel& pixel, + unsigned char& lowThreshold, unsigned char& highThreshold); + + MeanParams m_params; + + RgbImageFloat m_mean; + RgbImage m_background; + }; + + }; +}; + + + + + diff --git a/package_bgs/dp/PratiMediodBGS.cpp b/package_bgs/dp/PratiMediodBGS.cpp new file mode 100644 index 0000000..2ef44c0 --- /dev/null +++ b/package_bgs/dp/PratiMediodBGS.cpp @@ -0,0 +1,276 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* PratiMediodBGS.h +* +* Purpose: Implementation of the temporal median background +* subtraction algorithm described in: +* +* [1] "Detecting Moving Objects, Shosts, and Shadows in Video Stream" +* by R. Cucchiara et al (2003) +* +* [2] "Reliable Background Suppression for Complex Scenes" +* by S. Calderara et al (2006) +* +* Author: Donovan Parks, September 2007 +* +* Please note that this is not an implementation of the complete system +* given in the above papers. It simply implements the temporal media background +* subtraction algorithm. +******************************************************************************/ + +#include "PratiMediodBGS.h" + +using namespace Algorithms::BackgroundSubtraction; + +PratiMediodBGS::PratiMediodBGS() +{ + m_median_buffer = NULL; +} + +PratiMediodBGS::~PratiMediodBGS() +{ + if(m_median_buffer != NULL) + delete[] m_median_buffer; +} + +void PratiMediodBGS::Initalize(const BgsParams& param) +{ + m_params = (PratiParams&)param; + + m_mask_low_threshold = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 1); + m_mask_high_threshold = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 1); + + m_background = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 3); + + m_median_buffer = new MEDIAN_BUFFER[m_params.Size()]; +} + +void PratiMediodBGS::InitModel(const RgbImage& data) +{ + // there is no need to initialize the mode since it needs a buffer of frames + // before it can performing background subtraction +} + +void PratiMediodBGS::Update(int frame_num, const RgbImage& data, const BwImage& update_mask) +{ + // update the image buffer with the new frame and calculate new median values + if(frame_num % m_params.SamplingRate() == 0) + { + if(m_median_buffer[0].dist.size() == m_params.HistorySize()) + { + // subtract distance to sample being removed from all distances + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + int i = r*m_params.Width()+c; + + if(update_mask(r,c) == BACKGROUND) + { + int oldPos = m_median_buffer[i].pos; + for(unsigned int s = 0; s < m_median_buffer[i].pixels.size(); ++s) + { + int maxDist = 0; + for(int ch = 0; ch < NUM_CHANNELS; ++ch) + { + int tempDist = abs(m_median_buffer[i].pixels.at(oldPos)(ch) + - m_median_buffer[i].pixels.at(s)(ch)); + if(tempDist > maxDist) + maxDist = tempDist; + } + + m_median_buffer[i].dist.at(s) -= maxDist; + } + + int dist; + UpdateMediod(r, c, data, dist); + m_median_buffer[i].dist.at(oldPos) = dist; + m_median_buffer[i].pixels.at(oldPos) = data(r,c); + m_median_buffer[i].pos++; + if(m_median_buffer[i].pos >= m_params.HistorySize()) + m_median_buffer[i].pos = 0; + } + } + } + } + else + { + // calculate sum of L-inf distances for new point and + // add distance from each sample point to this point to their L-inf sum + int dist; + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + int index = r*m_params.Width()+c; + UpdateMediod(r, c, data, dist); + m_median_buffer[index].dist.push_back(dist); + m_median_buffer[index].pos = 0; + m_median_buffer[index].pixels.push_back(data(r,c)); + } + } + } + } +} + +void PratiMediodBGS::UpdateMediod(int r, int c, const RgbImage& new_frame, int& dist) +{ + // calculate sum of L-inf distances for new point and + // add distance from each sample point to this point to their L-inf sum + unsigned int i = (r*m_params.Width()+c); + + m_median_buffer[i].medianDist = INT_MAX; + + int L_inf_dist = 0; + for(unsigned int s = 0; s < m_median_buffer[i].dist.size(); ++s) + { + int maxDist = 0; + for(int ch = 0; ch < NUM_CHANNELS; ++ch) + { + int tempDist = abs(m_median_buffer[i].pixels.at(s)(ch) - new_frame(r,c,ch)); + if(tempDist > maxDist) + maxDist = tempDist; + } + + // check if point from this frame in the image buffer is the median + m_median_buffer[i].dist.at(s) += maxDist; + if(m_median_buffer[i].dist.at(s) < m_median_buffer[i].medianDist) + { + m_median_buffer[i].medianDist = m_median_buffer[i].dist.at(s); + m_median_buffer[i].median = m_median_buffer[i].pixels.at(s); + } + + L_inf_dist += maxDist; + } + + dist = L_inf_dist; + + // check if the new point is the median + if(L_inf_dist < m_median_buffer[i].medianDist) + { + m_median_buffer[i].medianDist = L_inf_dist; + m_median_buffer[i].median = new_frame(r,c); + } +} + +void PratiMediodBGS::Combine(const BwImage& low_mask, const BwImage& high_mask, BwImage& output) +{ + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + output(r,c) = BACKGROUND; + + if(r == 0 || c == 0 || r == m_params.Height()-1 || c == m_params.Width()-1) + continue; + + if(high_mask(r,c) == FOREGROUND) + { + output(r,c) = FOREGROUND; + } + else if(low_mask(r,c) == FOREGROUND) + { + // consider the pixel to be a F/G pixel if it is 8-connected to + // a F/G pixel in the high mask + // check if there is an 8-connected foreground pixel + if(high_mask(r-1,c-1)) + output(r,c) = FOREGROUND; + else if(high_mask(r-1,c)) + output(r,c) = FOREGROUND; + else if(high_mask(r-1,c+1)) + output(r,c) = FOREGROUND; + else if(high_mask(r,c-1)) + output(r,c) = FOREGROUND; + else if(high_mask(r,c+1)) + output(r,c) = FOREGROUND; + else if(high_mask(r+1,c-1)) + output(r,c) = FOREGROUND; + else if(high_mask(r+1,c)) + output(r,c) = FOREGROUND; + else if(high_mask(r+1,c+1)) + output(r,c) = FOREGROUND; + } + } + } +} + +void PratiMediodBGS::CalculateMasks(int r, int c, const RgbPixel& pixel) +{ + int pos = r*m_params.Width()+c; + + // calculate l-inf distance between current value and median value + unsigned char dist = 0; + for(int ch = 0; ch < NUM_CHANNELS; ++ch) + { + int tempDist = abs(pixel(ch) - m_median_buffer[pos].median(ch)); + if(tempDist > dist) + dist = tempDist; + } + m_background(r,c) = m_median_buffer[pos].median; + + // check if pixel is a B/G or F/G pixel according to the low threshold B/G model + m_mask_low_threshold(r,c) = BACKGROUND; + if(dist > m_params.LowThreshold()) + { + m_mask_low_threshold(r,c) = FOREGROUND; + } + + // check if pixel is a B/G or F/G pixel according to the high threshold B/G model + m_mask_high_threshold(r,c)= BACKGROUND; + if(dist > m_params.HighThreshold()) + { + m_mask_high_threshold(r,c) = FOREGROUND; + } +} + +/////////////////////////////////////////////////////////////////////////////// +//Input: +// data - a pointer to the data of a RGB image of the same size +//Output: +// output - a pointer to the data of a gray value image of the same size +// values: 255-foreground, 0-background +/////////////////////////////////////////////////////////////////////////////// +void PratiMediodBGS::Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mark, BwImage& high_threshold_mark) +{ + if(frame_num < m_params.HistorySize()) + { + low_threshold_mark.Clear(); + high_threshold_mark.Clear(); + return; + } + + // update each pixel of the image + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + // need at least one frame of data before we can start calculating the masks + CalculateMasks(r, c, data(r,c)); + } + } + + // combine low and high threshold masks + Combine(m_mask_low_threshold, m_mask_high_threshold, low_threshold_mark); + Combine(m_mask_low_threshold, m_mask_high_threshold, high_threshold_mark); +} + + + + diff --git a/package_bgs/dp/PratiMediodBGS.h b/package_bgs/dp/PratiMediodBGS.h new file mode 100644 index 0000000..0b373d7 --- /dev/null +++ b/package_bgs/dp/PratiMediodBGS.h @@ -0,0 +1,142 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* PratiMediodBGS.hpp +* +* Purpose: Implementation of the temporal median background +* subtraction algorithm described in: +* +* [1] "Detecting Moving Objects, Shosts, and Shadows in Video Stream" +* by R. Cucchiara et al (2003) +* +* [2] "Reliable Background Suppression for Complex Scenes" +* by S. Calderara et al (2006) +* +* Author: Donovan Parks, September 2007 +* +* Please note that this is not an implementation of the complete system +* given in the above papers. It simply implements the temporal media background +* subtraction algorithm. + +Example: +Algorithms::BackgroundSubtraction::PratiParams params; +params.SetFrameSize(width, height); +params.LowThreshold() = 30; +params.HighThreshold() = 2*params.LowThreshold(); // Note: high threshold is used by post-processing +params.SamplingRate() = 5; +params.HistorySize() = 16; +params.Weight() = 5; + +Algorithms::BackgroundSubtraction::PratiMediodBGS bgs; +bgs.Initalize(params); +******************************************************************************/ + +#ifndef PRATI_MEDIA_BGS_H +#define PRATI_MEDIA_BGS_H + +#include <vector> +#include "Bgs.h" + +namespace Algorithms +{ + namespace BackgroundSubtraction + { + // --- Parameters used by the Prati Mediod BGS algorithm --- + class PratiParams : public BgsParams + { + public: + unsigned int &LowThreshold() { return m_low_threshold; } + unsigned int &HighThreshold() { return m_high_threshold; } + + int &Weight() { return m_weight; } + int &SamplingRate() { return m_sampling_rate; } + int &HistorySize() { return m_history_size; } + + private: + // The low threshold is used to supress noise. The high thresohld is used + // to find pixels highly likely to be foreground. This implementation uses an L-inf + // distance measure and a pixel p is considered F/G if D(I(p), B(p)) > threshold. + // The two threshold maps are combined as in [2]. + unsigned int m_low_threshold; + unsigned int m_high_threshold; + + // The weight parameter controls the amount of influence given to previous background samples + // see w_b in equation (2) of [1] + // in [2] this value is set to 1 + int m_weight; + + // Number of samples to consider when calculating temporal mediod value + int m_history_size; + + // Rate at which to obtain new samples + int m_sampling_rate; + }; + + // --- Prati Mediod BGS algorithm --- + class PratiMediodBGS : public Bgs + { + private: + // sum of L-inf distances from a sample point to all other sample points + struct MEDIAN_BUFFER + { + std::vector<RgbPixel> pixels; // vector of pixels at give location in image + std::vector<int> dist; // distance from pixel to all other pixels + int pos; // current position in circular buffer + + RgbPixel median; // median at this pixel location + int medianDist; // distance from median pixel to all other pixels + }; + + public: + PratiMediodBGS(); + ~PratiMediodBGS(); + + void Initalize(const BgsParams& param); + + void InitModel(const RgbImage& data); + void Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask); + void Update(int frame_num, const RgbImage& data, const BwImage& update_mask); + + RgbImage* Background() { return &m_background; } + + private: + MEDIAN_BUFFER* m_median_buffer; + + void CalculateMasks(int r, int c, const RgbPixel& pixel); + void Combine(const BwImage& low_mask, const BwImage& high_mask, BwImage& output); + void UpdateMediod(int r, int c, const RgbImage& new_frame, int& dist); + + PratiParams m_params; + + RgbImage m_background; + + BwImage m_mask_low_threshold; + BwImage m_mask_high_threshold; + }; + + }; +}; + +#endif + + + + + + diff --git a/package_bgs/dp/TextureBGS.cpp b/package_bgs/dp/TextureBGS.cpp new file mode 100644 index 0000000..7ccac37 --- /dev/null +++ b/package_bgs/dp/TextureBGS.cpp @@ -0,0 +1,153 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "TextureBGS.h" + +TextureBGS::TextureBGS(){} +TextureBGS::~TextureBGS(){} + +void TextureBGS::LBP(RgbImage& image, RgbImage& texture) +{ + for(int y = TEXTURE_R; y < image.Ptr()->height-TEXTURE_R; ++y) + { + for(int x = TEXTURE_R; x < image.Ptr()->width-TEXTURE_R; ++x) + { + for(int ch = 0; ch < NUM_CHANNELS; ++ch) + { + unsigned char textureCode = 0; + int centerValue = (int)image(y, x, ch); + + // this only works for a texture radius of 2 + if(centerValue - (int)image(y-2, x, ch) + HYSTERSIS >= 0) + textureCode += 1; + + if(centerValue - (int)image(y-1, x-2, ch) + HYSTERSIS >= 0) + textureCode += 2; + + if(centerValue - (int)image(y-1, x+2, ch) + HYSTERSIS >= 0) + textureCode += 4; + + if(centerValue - (int)image(y+1, x-2, ch) + HYSTERSIS >= 0) + textureCode += 8; + + if(centerValue - (int)image(y+1, x+2, ch) + HYSTERSIS >= 0) + textureCode += 16; + + if(centerValue - (int)image(y+2, x, ch) + HYSTERSIS >= 0) + textureCode += 32; + + texture(y,x,ch) = textureCode; + } + } + } +} + +void TextureBGS::Histogram(RgbImage& texture, TextureHistogram* curTextureHist) +{ + // calculate histogram within a 2*REGION_R square + for(int y = REGION_R+TEXTURE_R; y < texture.Ptr()->height-REGION_R-TEXTURE_R; ++y) + { + for(int x = REGION_R+TEXTURE_R; x < texture.Ptr()->width-REGION_R-TEXTURE_R; ++x) + { + int index = x+y*(texture.Ptr()->width); + + // clear histogram + for(int i = 0; i < NUM_BINS; ++i) + { + curTextureHist[index].r[i] = 0; + curTextureHist[index].g[i] = 0; + curTextureHist[index].b[i] = 0; + } + + // calculate histogram + for(int j = -REGION_R; j <= REGION_R; ++j) + { + for(int i = -REGION_R; i <= REGION_R; ++i) + { + curTextureHist[index].r[texture(y+j,x+i,2)]++; + curTextureHist[index].g[texture(y+j,x+i,1)]++; + curTextureHist[index].b[texture(y+j,x+i,0)]++; + } + } + } + } +} + +int TextureBGS::ProximityMeasure(TextureHistogram& bgTexture, TextureHistogram& curTextureHist) +{ + int proximity = 0; + for(int i = 0; i < NUM_BINS; ++i) + { + proximity += std::min(bgTexture.r[i], curTextureHist.r[i]); + proximity += std::min(bgTexture.g[i], curTextureHist.g[i]); + proximity += std::min(bgTexture.b[i], curTextureHist.b[i]); + } + + return proximity; +} + +void TextureBGS::BgsCompare(TextureArray* bgModel, TextureHistogram* curTextureHist, + unsigned char* modeArray, float threshold, BwImage& fgMask) +{ + cvZero(fgMask.Ptr()); + + for(int y = REGION_R+TEXTURE_R; y < fgMask.Ptr()->height-REGION_R-TEXTURE_R; ++y) + { + for(int x = REGION_R+TEXTURE_R; x < fgMask.Ptr()->width-REGION_R-TEXTURE_R; ++x) + { + int index = x+y*(fgMask.Ptr()->width); + + // find closest matching texture in background model + int maxProximity = -1; + + for(int m = 0; m < NUM_MODES; ++m) + { + int proximity = ProximityMeasure(bgModel[index].mode[m], curTextureHist[index]); + + if(proximity > maxProximity) + { + maxProximity = proximity; + modeArray[index] = m; + } + } + + if(maxProximity < threshold) + fgMask(y,x) = 255; + } + } +} + +void TextureBGS::UpdateModel(BwImage& fgMask, TextureArray* bgModel, + TextureHistogram* curTextureHist, unsigned char* modeArray) +{ + for(int y = REGION_R+TEXTURE_R; y < fgMask.Ptr()->height-REGION_R-TEXTURE_R; ++y) + { + for(int x = REGION_R+TEXTURE_R; x < fgMask.Ptr()->width-REGION_R-TEXTURE_R; ++x) + { + int index = x+y*(fgMask.Ptr()->width); + + if(fgMask(x,y) == 0) + { + for(int i = 0; i < NUM_BINS; ++i) + { + bgModel[index].mode[modeArray[index]].r[i] + = (unsigned char)(ALPHA*curTextureHist[index].r[i] + + (1-ALPHA)*bgModel[index].mode[modeArray[index]].r[i] + 0.5); + } + } + } + } +} diff --git a/package_bgs/dp/TextureBGS.h b/package_bgs/dp/TextureBGS.h new file mode 100644 index 0000000..573e6f9 --- /dev/null +++ b/package_bgs/dp/TextureBGS.h @@ -0,0 +1,55 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include <math.h> +#include "Image.h" + +const int REGION_R = 5; // Note: the code currently assumes this value is <= 7 +const int TEXTURE_POINTS = 6; // Note: the code currently assumes this value is 6 +const int TEXTURE_R = 2; // Note: the code currently assumes this value is 2 +const int NUM_BINS = 64; // 2^TEXTURE_POINTS +const int HYSTERSIS = 3; +const double ALPHA = 0.05f; +const double THRESHOLD = 0.5*(REGION_R+REGION_R+1)*(REGION_R+REGION_R+1)*NUM_CHANNELS; +const int NUM_MODES = 1; // The paper describes how multiple modes can be maintained, +// but this implementation does not fully support more than one + +struct TextureHistogram +{ + unsigned char r[NUM_BINS]; // histogram for red channel + unsigned char g[NUM_BINS]; // histogram for green channel + unsigned char b[NUM_BINS]; // histogram for blue channel +}; + +struct TextureArray +{ + TextureHistogram mode[NUM_MODES]; +}; + +class TextureBGS +{ +public: + TextureBGS(); + ~TextureBGS(); + + void LBP(RgbImage& image, RgbImage& texture); + void Histogram(RgbImage& texture, TextureHistogram* curTextureHist); + int ProximityMeasure(TextureHistogram& bgTexture, TextureHistogram& curTextureHist); + void BgsCompare(TextureArray* bgModel, TextureHistogram* curTextureHist, + unsigned char* modeArray, float threshold, BwImage& fgMask); + void UpdateModel(BwImage& fgMask, TextureArray* bgModel, + TextureHistogram* curTextureHist, unsigned char* modeArray); +}; diff --git a/package_bgs/dp/WrenGA.cpp b/package_bgs/dp/WrenGA.cpp new file mode 100644 index 0000000..8ae10dd --- /dev/null +++ b/package_bgs/dp/WrenGA.cpp @@ -0,0 +1,174 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* WrenGA.h +* +* Purpose: Implementation of the running Gaussian average background +* subtraction algorithm described in: +* "Pfinder: real-time tracking of the human body" +* by C. Wren et al (1997) +* +* Author: Donovan Parks, September 2007 +* +* Please note that this is not an implementation of Pfinder. It implements +* a simple background subtraction algorithm where each pixel is represented +* by a single Gaussian and update using a simple weighting function. +******************************************************************************/ + +#include "WrenGA.h" + +using namespace Algorithms::BackgroundSubtraction; + +WrenGA::WrenGA() +{ + m_gaussian = NULL; +} + +WrenGA::~WrenGA() +{ + if(m_gaussian != NULL) + delete[] m_gaussian; +} + +void WrenGA::Initalize(const BgsParams& param) +{ + m_params = (WrenParams&)param; + + m_variance = 36.0f; + + // GMM for each pixel + m_gaussian = new GAUSSIAN[m_params.Size()]; + for(unsigned int i = 0; i < m_params.Size(); ++i) + { + for(int ch = 0; ch < NUM_CHANNELS; ++ch) + { + m_gaussian[i].mu[ch] = 0; + m_gaussian[i].var[ch] = 0; + } + } + + m_background = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 3); +} + +void WrenGA::InitModel(const RgbImage& data) +{ + int pos = 0; + + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + for(int ch = 0; ch < NUM_CHANNELS; ++ch) + { + m_gaussian[pos].mu[ch] = data(r,c,ch); + m_gaussian[pos].var[ch] = m_variance; + } + + pos++; + } + } +} + +void WrenGA::Update(int frame_num, const RgbImage& data, const BwImage& update_mask) +{ + int pos = 0; + + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + // perform conditional updating only if we are passed the learning phase + if(update_mask(r,c) == BACKGROUND || frame_num < m_params.LearningFrames()) + { + float dR = m_gaussian[pos].mu[0] - data(r,c,0); + float dG = m_gaussian[pos].mu[1] - data(r,c,1); + float dB = m_gaussian[pos].mu[2] - data(r,c,2); + + float dist = (dR*dR + dG*dG + dB*dB); + + m_gaussian[pos].mu[0] -= m_params.Alpha()*(dR); + m_gaussian[pos].mu[1] -= m_params.Alpha()*(dG); + m_gaussian[pos].mu[2] -= m_params.Alpha()*(dB); + + float sigmanew = m_gaussian[pos].var[0] + m_params.Alpha()*(dist-m_gaussian[pos].var[0]); + m_gaussian[pos].var[0] = sigmanew < 4 ? 4 : sigmanew > 5*m_variance ? 5*m_variance : sigmanew; + + m_background(r, c, 0) = (unsigned char)(m_gaussian[pos].mu[0] + 0.5); + m_background(r, c, 1) = (unsigned char)(m_gaussian[pos].mu[1] + 0.5); + m_background(r, c, 2) = (unsigned char)(m_gaussian[pos].mu[2] + 0.5); + } + + pos++; + } + } +} + +void WrenGA::SubtractPixel(int r, int c, const RgbPixel& pixel, + unsigned char& low_threshold, + unsigned char& high_threshold) +{ + unsigned int pos = r*m_params.Width()+c; + + // calculate distance between model and pixel + float mu[NUM_CHANNELS]; + float var[1]; + float delta[NUM_CHANNELS]; + float dist = 0; + for(int ch = 0; ch < NUM_CHANNELS; ++ch) + { + mu[ch] = m_gaussian[pos].mu[ch]; + var[0] = m_gaussian[pos].var[0]; + delta[ch] = mu[ch] - pixel(ch); + dist += delta[ch]*delta[ch]; + } + + // calculate the squared distance and see if pixel fits the B/G model + low_threshold = BACKGROUND; + high_threshold = BACKGROUND; + + if(dist > m_params.LowThreshold()*var[0]) + low_threshold = FOREGROUND; + if(dist > m_params.HighThreshold()*var[0]) + high_threshold = FOREGROUND; +} + +/////////////////////////////////////////////////////////////////////////////// +//Input: +// data - a pointer to the data of a RGB image of the same size +//Output: +// output - a pointer to the data of a gray value image of the same size +// (the memory should already be reserved) +// values: 255-foreground, 125-shadow, 0-background +/////////////////////////////////////////////////////////////////////////////// +void WrenGA::Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask) +{ + unsigned char low_threshold, high_threshold; + + // update each pixel of the image + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + SubtractPixel(r, c, data(r,c), low_threshold, high_threshold); + low_threshold_mask(r,c) = low_threshold; + high_threshold_mask(r,c) = high_threshold; + } + } +} + diff --git a/package_bgs/dp/WrenGA.h b/package_bgs/dp/WrenGA.h new file mode 100644 index 0000000..d623e20 --- /dev/null +++ b/package_bgs/dp/WrenGA.h @@ -0,0 +1,120 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* WrenGA.hpp +* +* Purpose: Implementation of the running Gaussian average background +* subtraction algorithm described in: +* "Pfinder: real-time tracking of the human body" +* by C. Wren et al (1997) +* +* Author: Donovan Parks, September 2007 +* +* Please note that this is not an implementation of Pfinder. It implements +* a simple background subtraction algorithm where each pixel is represented +* by a single Gaussian and update using a simple weighting function. + +Example: +Algorithms::BackgroundSubtraction::WrenParams params; +params.SetFrameSize(width, height); +params.LowThreshold() = 3.5f*3.5f; +params.HighThreshold() = 2*params.LowThreshold(); // Note: high threshold is used by post-processing +params.Alpha() = 0.005f; +params.LearningFrames() = 30; + +Algorithms::BackgroundSubtraction::WrenGA bgs; +bgs.Initalize(params); +******************************************************************************/ + +#ifndef WREN_GA_H +#define WREN_GA_H + +#include "Bgs.h" + +namespace Algorithms +{ + namespace BackgroundSubtraction + { + // --- Parameters used by the Mean BGS algorithm --- + class WrenParams : public BgsParams + { + public: + float &LowThreshold() { return m_low_threshold; } + float &HighThreshold() { return m_high_threshold; } + + float &Alpha() { return m_alpha; } + int &LearningFrames() { return m_learning_frames; } + + private: + // The threshold indicates the number of variances (not standard deviations) away + // from the mean before a pixel is considered to be from the foreground. + float m_low_threshold; + float m_high_threshold; + + float m_alpha; + int m_learning_frames; + }; + + + // --- Mean BGS algorithm --- + class WrenGA : public Bgs + { + private: + struct GAUSSIAN + { + float mu[NUM_CHANNELS]; + float var[NUM_CHANNELS]; + }; + + public: + WrenGA(); + ~WrenGA(); + + void Initalize(const BgsParams& param); + + void InitModel(const RgbImage& data); + void Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask); + void Update(int frame_num, const RgbImage& data, const BwImage& update_mask); + + RgbImage* Background() { return &m_background; } + + private: + void SubtractPixel(int r, int c, const RgbPixel& pixel, + unsigned char& lowThreshold, unsigned char& highThreshold); + + WrenParams m_params; + + // Initial variance for the newly generated components. + float m_variance; + + // dynamic array for the mixture of Gaussians + GAUSSIAN* m_gaussian; + + RgbImage m_background; + }; + }; +}; + +#endif + + + + + + diff --git a/package_bgs/dp/ZivkovicAGMM.cpp b/package_bgs/dp/ZivkovicAGMM.cpp new file mode 100644 index 0000000..c260132 --- /dev/null +++ b/package_bgs/dp/ZivkovicAGMM.cpp @@ -0,0 +1,411 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* ZivkovicAGMM.cpp +* +* Purpose: Implementation of the Gaussian mixture model (GMM) background +* subtraction algorithm developed by Z. Zivkovic. +* +* Author: Donovan Parks, September 2007 +* +* This code is based on code by Z. Zivkovic's. I have changed it from a pure +* C implementation to a cleaner (IMHO) C++ implementation. It is based on the +* following papers: +* +* "Improved adaptive Gausian mixture model for background subtraction" +* Z.Zivkovic +* International Conference Pattern Recognition, UK, August, 2004 +* +* +* "Efficient Adaptive Density Estimapion per Image Pixel for the +* Task of Background Subtraction" +* Z.Zivkovic, F. van der Heijden +* Pattern Recognition Letters, vol. 27, no. 7, pages 773-780, 2006. +* +* Zivkovic's code can be obtained at: www.zoranz.net +******************************************************************************/ + +#include "ZivkovicAGMM.h" + +using namespace Algorithms::BackgroundSubtraction; + +ZivkovicAGMM::ZivkovicAGMM() +{ + m_modes = NULL; + m_modes_per_pixel = NULL; +} + +ZivkovicAGMM::~ZivkovicAGMM() +{ + if(m_modes != NULL) + delete[] m_modes; + + if(m_modes_per_pixel != NULL) + delete[] m_modes_per_pixel; +} + +void ZivkovicAGMM::Initalize(const BgsParams& param) +{ + m_params = (ZivkovicParams&)param; + + m_num_bands = 3; //always 3 - not implemented for other values! + m_bg_threshold = 0.75f; //1-cf from the paper + m_variance = 36.0f; // variance for the new mode + m_complexity_prior = 0.05f; // complexity reduction prior constant + + // GMM for each pixel + m_modes = new GMM[m_params.Size()*m_params.MaxModes()]; + + // used modes per pixel + m_modes_per_pixel = new unsigned char[m_params.Size()]; + + m_background = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 3); +} + +void ZivkovicAGMM::InitModel(const RgbImage& data) +{ + for(unsigned int i = 0; i < m_params.Size(); ++i) + { + m_modes_per_pixel[i] = 0; + } + + for(unsigned int i = 0; i < m_params.Size()*m_params.MaxModes(); ++i) + { + m_modes[i].weight = 0; + m_modes[i].sigma = 0; + m_modes[i].muR = 0; + m_modes[i].muG = 0; + m_modes[i].muB = 0; + } +} + +void ZivkovicAGMM::Update(int frame_num, const RgbImage& data, const BwImage& update_mask) +{ + // it doesn't make sense to have conditional updates in the GMM framework +} + +void ZivkovicAGMM::SubtractPixel(long posPixel, const RgbPixel& pixel, unsigned char* pModesUsed, + unsigned char& low_threshold, unsigned char& high_threshold) +{ + //calculate distances to the modes (+ sort???) + //here we need to go in descending order!!! + long pos; + bool bFitsPDF=0; + bool bBackgroundLow=false; + bool bBackgroundHigh=false; + + float fOneMinAlpha = 1-m_params.Alpha(); + + float prune = -m_params.Alpha()*m_complexity_prior; + + int nModes =* pModesUsed; + float totalWeight = 0.0f; + + // calculate number of Gaussians to include in the background model + int backgroundGaussians = 0; + double sum = 0.0; + for(int i = 0; i < nModes; ++i) + { + if(sum < m_bg_threshold) + { + backgroundGaussians++; + sum += m_modes[posPixel+i].weight; + } + else + { + break; + } + } + + // update all distributions and check for match with current pixel + for (int iModes = 0; iModes < nModes; iModes++) + { + pos=posPixel+iModes; + float weight = m_modes[pos].weight; + + //fit not found yet + if (!bFitsPDF) + { + //check if it belongs to some of the modes + //calculate distance + float var = m_modes[pos].sigma; + float muR = m_modes[pos].muR; + float muG = m_modes[pos].muG; + float muB = m_modes[pos].muB; + + float dR=muR - pixel(0); + float dG=muG - pixel(1); + float dB=muB - pixel(2); + + // calculate the squared distance + float dist = (dR*dR + dG*dG + dB*dB); + + if(dist < m_params.HighThreshold()*var && iModes < backgroundGaussians) + bBackgroundHigh = true; + + //check fit + if (dist < m_params.LowThreshold()*var) + { + ///// + //belongs to the mode + bFitsPDF = true; + + // check if this Gaussian is part of the background model + if(iModes < backgroundGaussians) + bBackgroundLow = true; + + //update distribution + float k = m_params.Alpha()/weight; + weight = fOneMinAlpha*weight+prune; + weight += m_params.Alpha(); + m_modes[pos].weight = weight; + m_modes[pos].muR = muR - k*(dR); + m_modes[pos].muG = muG - k*(dG); + m_modes[pos].muB = muB - k*(dB); + + //limit update speed for cov matrice + //not needed + //k=k>20*m_m_params.Alpha()?20*m_m_params.Alpha():k; + //float sigmanew = var + k*((0.33*(dR*dR+dG*dG+dB*dB))-var); + //float sigmanew = var + k*((dR*dR+dG*dG+dB*dB)-var); + //float sigmanew = var + k*((0.33*dist)-var); + float sigmanew = var + k*(dist-var); + + //limit the variance + m_modes[pos].sigma = sigmanew < 4 ? 4 : sigmanew > 5*m_variance ? 5*m_variance : sigmanew; + + // Sort weights so they are in desending order. Note that only the weight for this + // mode will increase and that the weight for all modes that were previously larger than + // this one have already been modified and will not be modified again. Thus, we just need to + // the correct position of this mode in the already sorted list. + + // Zivkovic implementation has been modified for clarity, but the results are equivalent + /* + for (int iLocal = iModes;iLocal>0;iLocal--) + { + long posLocal=posPixel + iLocal; + if (weight < (m_modes[posLocal-1].weight)) + { + break; + } + else + { + //swap + GMM temp = m_modes[posLocal]; + m_modes[posLocal] = m_modes[posLocal-1]; + m_modes[posLocal-1] = temp; + } + } + */ + + for (int iLocal = iModes; iLocal > 0; iLocal--) + { + long posLocal = posPixel + iLocal; + if (m_modes[posLocal].weight > m_modes[posLocal-1].weight) + { + //swap + GMM temp = m_modes[posLocal]; + m_modes[posLocal] = m_modes[posLocal-1]; + m_modes[posLocal-1] = temp; + } + else + { + break; + } + } + } + else + { + weight = fOneMinAlpha*weight+prune; + //check prune + if (weight < -prune) + { + weight=0.0; + nModes--; + } + m_modes[pos].weight = weight; + } + //check if it fits the current mode (2.5 sigma) + /////// + } + //fit not found yet + ///// + else + { + weight = fOneMinAlpha*weight + prune; + //check prune + if (weight < -prune) + { + weight=0.0; + nModes--; + } + m_modes[pos].weight = weight; + } + totalWeight += weight; + } + + //renormalize weights so they sum to 1 + for (int iLocal = 0; iLocal < nModes; iLocal++) + { + m_modes[posPixel+ iLocal].weight = m_modes[posPixel+ iLocal].weight/totalWeight; + } + + //make new mode if needed and exit + if (!bFitsPDF) + { + if (nModes == m_params.MaxModes()) + { + //replace the weakest + } + else + { + nModes++; + } + pos = posPixel + nModes-1; + + if (nModes==1) + m_modes[pos].weight=1; + else + m_modes[pos].weight=m_params.Alpha(); + + // Zivkovic implementation changes as this will not result in the + // weights adding to 1 + /* + int iLocal; + for (iLocal = 0; iLocal < m_params.MaxModes()odes-1; iLocal++) + { + m_modes[posPixel+ iLocal].weight *= fOneMinAlpha; + } + */ + + // Revised implementation: + //renormalize weights + int iLocal; + float sum = 0.0; + for (iLocal = 0; iLocal < nModes; iLocal++) + { + sum += m_modes[posPixel+ iLocal].weight; + } + + float invSum = 1.0f/sum; + for (iLocal = 0; iLocal < nModes; iLocal++) + { + m_modes[posPixel+ iLocal].weight *= invSum; + } + + m_modes[pos].muR=pixel(0); + m_modes[pos].muG=pixel(1); + m_modes[pos].muB=pixel(2); + m_modes[pos].sigma=m_variance; + + // Zivkovic implementation to sort GMM so they are sorted in descending order according to their weight. + // It has been revised for clarity, but the results are equivalent + /* + for (iLocal = m_params.MaxModes()odes-1; iLocal > 0; iLocal--) + { + long posLocal = posPixel + iLocal; + if (m_params.Alpha() < (m_modes[posLocal-1].weight)) + { + break; + } + else + { + //swap + GMM temp = m_modes[posLocal]; + m_modes[posLocal] = m_modes[posLocal-1]; + m_modes[posLocal-1] = temp; + } + } + */ + + // sort GMM so they are sorted in descending order according to their weight + for (iLocal = nModes-1; iLocal > 0; iLocal--) + { + long posLocal = posPixel + iLocal; + if (m_modes[posLocal].weight > m_modes[posLocal-1].weight) + { + //swap + GMM temp = m_modes[posLocal]; + m_modes[posLocal] = m_modes[posLocal-1]; + m_modes[posLocal-1] = temp; + } + else + { + break; + } + } + } + + //set the number of modes + *pModesUsed=nModes; + + if(bBackgroundLow) + { + low_threshold = BACKGROUND; + } + else + { + low_threshold = FOREGROUND; + } + + if(bBackgroundHigh) + { + high_threshold = BACKGROUND; + } + else + { + high_threshold = FOREGROUND; + } +} + + +/////////////////////////////////////////////////////////////////////////////// +//Input: +// data - a pointer to the data of a RGB image of the same size +//Output: +// output - a pointer to the data of a gray value image of the same size +// (the memory should already be reserved) +// values: 255-foreground, 125-shadow, 0-background +/////////////////////////////////////////////////////////////////////////////// +void ZivkovicAGMM::Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask) +{ + unsigned char low_threshold, high_threshold; + + // update each pixel of the image + long posPixel; + unsigned char* pUsedModes=m_modes_per_pixel; + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + //update model+ background subtract + posPixel=(r*m_params.Width()+c)*m_params.MaxModes(); + SubtractPixel(posPixel, data(r,c), pUsedModes, low_threshold, high_threshold); + low_threshold_mask(r,c) = low_threshold; + high_threshold_mask(r,c) = high_threshold; + + m_background(r,c,0) = (unsigned char)m_modes[posPixel].muR; + m_background(r,c,1) = (unsigned char)m_modes[posPixel].muG; + m_background(r,c,2) = (unsigned char)m_modes[posPixel].muB; + + pUsedModes++; + } + } +} + diff --git a/package_bgs/dp/ZivkovicAGMM.h b/package_bgs/dp/ZivkovicAGMM.h new file mode 100644 index 0000000..c58fac4 --- /dev/null +++ b/package_bgs/dp/ZivkovicAGMM.h @@ -0,0 +1,160 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* ZivkovicAGMM.hpp +* +* Purpose: Implementation of the Gaussian mixture model (GMM) background +* subtraction algorithm developed by Z. Zivkovic. +* +* Author: Donovan Parks, September 2007 +* +* This code is based on code by Z. Zivkovic's. I have changed it from a pure +* C implementation to a cleaner (IMHO) C++ implementation. It is based on the +* following papers: +* +* "Improved adaptive Gausian mixture model for background subtraction" +* Z.Zivkovic +* International Conference Pattern Recognition, UK, August, 2004 +* +* +* "Efficient Adaptive Density Estimapion per Image Pixel for the +* Task of Background Subtraction" +* Z.Zivkovic, F. van der Heijden +* Pattern Recognition Letters, vol. 27, no. 7, pages 773-780, 2006. +* +* Zivkovic's code can be obtained at: www.zoranz.net + +Example: +Algorithms::BackgroundSubtraction::ZivkovicParams params; +params.SetFrameSize(width, height); +params.LowThreshold() = 5.0f*5.0f; +params.HighThreshold() = 2*params.LowThreshold(); // Note: high threshold is used by post-processing +params.Alpha() = 0.001f; +params.MaxModes() = 3; + +Algorithms::BackgroundSubtraction::ZivkovicAGMM bgs; +bgs.Initalize(params); +******************************************************************************/ + +#ifndef ZIVKOVIC_AGMM_H +#define ZIVKOVIC_AGMM_H + +#include "Bgs.h" + +namespace Algorithms +{ + namespace BackgroundSubtraction + { + // --- User adjustable parameters used by the Grimson GMM BGS algorithm --- + class ZivkovicParams : public BgsParams + { + public: + float &LowThreshold() { return m_low_threshold; } + float &HighThreshold() { return m_high_threshold; } + + float &Alpha() { return m_alpha; } + int &MaxModes() { return m_max_modes; } + + private: + // Threshold on the squared dist. to decide when a sample is close to an existing + // components. If it is not close to any a new component will be generated. + // Smaller threshold values lead to more generated components and higher threshold values + // lead to a small number of components but they can grow too large. + // + // It is usual easiest to think of these thresholds as being the number of variances (not standard deviations) + // away from the mean of a pixel before it is considered to be from the foreground. + float m_low_threshold; + float m_high_threshold; + + // alpha - speed of update - if the time interval you want to average over is T + // set alpha=1/T. + float m_alpha; + + // Maximum number of modes (Gaussian components) that will be used per pixel + int m_max_modes; + }; + + // --- Zivkovic AGMM BGS algorithm --- + class ZivkovicAGMM : public Bgs + { + private: + struct GMM + { + float sigma; + float muR; + float muG; + float muB; + float weight; + }; + + public: + ZivkovicAGMM(); + ~ZivkovicAGMM(); + + void Initalize(const BgsParams& param); + + void InitModel(const RgbImage& data); + void Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask); + void Update(int frame_num, const RgbImage& data, const BwImage& update_mask); + + RgbImage* Background() { return &m_background; } + + private: + void SubtractPixel(long posPixel, const RgbPixel& pixel, unsigned char* pModesUsed, + unsigned char& lowThreshold, unsigned char& highThreshold); + + // User adjustable parameters + ZivkovicParams m_params; + + // Threshold when the component becomes significant enough to be included into + // the background model. It is the TB = 1-cf from the paper. So I use cf=0.1 => TB=0.9 + // For alpha=0.001 it means that the mode should exist for approximately 105 frames before + // it is considered foreground + float m_bg_threshold; //1-cf from the paper + + // Initial variance for the newly generated components. + // It will will influence the speed of adaptation. A good guess should be made. + // A simple way is to estimate the typical standard deviation from the images. + float m_variance; + + // This is related to the number of samples needed to accept that a component + // actually exists. + float m_complexity_prior; + + //data + int m_num_bands; //only RGB now ==3 + + // dynamic array for the mixture of Gaussians + GMM* m_modes; + + RgbImage m_background; + + //number of Gaussian components per pixel + unsigned char* m_modes_per_pixel; + }; + }; +}; + +#endif + + + + + + diff --git a/package_bgs/jmo/BGS.h b/package_bgs/jmo/BGS.h new file mode 100644 index 0000000..1fc0e44 --- /dev/null +++ b/package_bgs/jmo/BGS.h @@ -0,0 +1,216 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- +* Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. The name of the author may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#if !defined(_BGS_H_) +#define _BGS_H_ + +#include <cv.h> + + +// TODO check these defines are not used (or not redundant with real params) +#define MAX_LBP_MODE_NUM 5 + +#define ROBUST_COLOR_OFFSET 6.0f + +#define LOW_INITIAL_MODE_WEIGHT 0.01f + +#define MODE_UPDATING_LEARN_RATE 0.01f +#define WEIGHT_UPDATING_LEARN_RATE 0.01f + +#define COLOR_MAX_MIN_OFFSET 5 + +#define BACKGROUND_MODEL_PERCENT 0.6f + +#define PATTERN_COLOR_DIST_BACKGROUND_THRESHOLD 0.2f + +#define PATTERN_DIST_SMOOTH_NEIG_HALF_SIZE 6 +#define PATTERN_DIST_CONV_GAUSSIAN_SIGMA 2.5f + +#define ROBUST_SHADOW_RATE 0.6f +#define ROBUST_HIGHLIGHT_RATE 1.20f + +#define BINARY_PATTERM_ELEM(c1, c2, offset) \ + ((float)(c2)-(float)(c1)+offset>0) + +/* +#define BINARY_PATTERM_ELEM(c1, c2, offset) \ +( fabsf((float)(c2)-(float)(c1)) <= offset ? 1 : (float)(c2)-(float)(c1) >=0 ) +*/ + +#ifndef PI +#define PI 3.141592653589793f +#endif + +/************************************************************************/ +/* some data structures for multi-level LBP (local binary pattern) */ +/* texture feature for background subtraction */ +/************************************************************************/ +typedef struct _LBP +{ + float* bg_pattern; /* the average local binary pattern of background mode */ + float* bg_intensity; /* the average color intensity of background mode */ + float* max_intensity; /* the maximal color intensity of background mode */ + float* min_intensity; /* the minimal color intensity of background mode */ + float weight; /* the weight of background mode, i.e. probability that the background mode belongs to background */ + float max_weight; /* the maximal weight of background mode */ + int bg_layer_num; /* the background layer number of background mode */ + unsigned long first_time; /* the first time of background mode appearing */ + unsigned long last_time; /* the last time of background model appearing */ + int freq; /* the appearing frequency */ + //long mnrl; /* maximum negative run-length */ + unsigned long layer_time; /* the first time of background mode becoming a background layer */ +} +LBPStruct; + +typedef struct _PixelLBP +{ + LBPStruct* LBPs; /* the background modes */ + unsigned short* lbp_idxes; /* the indices of background modes */ + unsigned int cur_bg_layer_no; + unsigned int num; /* the total number of background modes */ + unsigned int bg_num; /* the number of the first background modes for foreground detection */ + unsigned char* cur_intensity; /* the color intensity of current pixel */ + float* cur_pattern; /* the local binary pattern of current pixel */ + float matched_mode_first_time; /* the index of currently matched pixel mode */ +} +PixelLBPStruct; + +/*********************************************************************************/ +/* should replace the above structure using class in the future (not finished) */ +/*********************************************************************************/ + +class BG_PIXEL_MODE +{ +public: + float* bg_lbp_pattern; /* the average local binary pattern of background mode */ + float* bg_intensity; /* the average color intensity of background mode */ + float* max_intensity; /* the maximal color intensity of background mode */ + float* min_intensity; /* the minimal color intensity of background mode */ + float weight; /* the weight of background mode, i.e. probability that the background mode belongs to background */ + float max_weight; /* the maximal weight of background mode */ + int bg_layer_num; /* the background layer number of background mode */ + + int lbp_pattern_length; + int color_channel; + + BG_PIXEL_MODE(int _lbp_pattern_length, int _color_channel=3) { + lbp_pattern_length = _lbp_pattern_length; + color_channel = _color_channel; + + bg_lbp_pattern = new float[lbp_pattern_length]; + bg_intensity = new float[color_channel]; + max_intensity = new float[color_channel]; + min_intensity = new float[color_channel]; + }; + + virtual ~BG_PIXEL_MODE() { + delete [] bg_lbp_pattern; + delete [] bg_intensity; + delete [] max_intensity; + delete [] min_intensity; + }; +}; + +class BG_PIXEL_PATTERN +{ +public: + BG_PIXEL_MODE** pixel_MODEs; /* the background modes */ + unsigned short* lbp_pattern_idxes; /* the indices of background modes */ + unsigned int cur_bg_layer_no; + unsigned int num; /* the total number of background modes */ + unsigned int bg_num; /* the number of the first background modes for foreground detection */ + unsigned char* cur_intensity; /* the color intensity of current pixel */ + float* cur_lbp_pattern; /* the local binary pattern of current pixel */ + + int lbp_pattern_length; + int color_channel; + int pixel_mode_num; + + BG_PIXEL_PATTERN(int _pixel_mode_num, int _lbp_pattern_length, int _color_channel=3) { + pixel_mode_num = _pixel_mode_num; + lbp_pattern_length = _lbp_pattern_length; + color_channel = _color_channel; + + pixel_MODEs = new BG_PIXEL_MODE*[pixel_mode_num]; + + for ( int i = 0 ; i < pixel_mode_num ; i++ ) { + pixel_MODEs[i] = new BG_PIXEL_MODE(_lbp_pattern_length, _color_channel); + } + + lbp_pattern_idxes = new unsigned short[pixel_mode_num]; + cur_intensity = new unsigned char[color_channel]; + cur_lbp_pattern = new float[lbp_pattern_length]; + }; + + virtual ~BG_PIXEL_PATTERN() { + delete [] lbp_pattern_idxes; + delete [] cur_intensity; + delete [] cur_lbp_pattern; + + for ( int i = 0 ; i < pixel_mode_num ; i++ ) + delete pixel_MODEs[i]; + delete [] pixel_MODEs; + }; +}; + +class IMAGE_BG_MODEL +{ + int pixel_length; + + BG_PIXEL_PATTERN** pixel_PATTERNs; + + IMAGE_BG_MODEL(int _pixel_length, int _pixel_mode_num, int _lbp_pattern_length, int _color_channel=3) { + pixel_length = _pixel_length; + + pixel_PATTERNs = new BG_PIXEL_PATTERN*[pixel_length]; + for ( int i = 0 ; i < pixel_length ; i++ ) + pixel_PATTERNs[i] = new BG_PIXEL_PATTERN(_pixel_mode_num, _lbp_pattern_length, _color_channel); + } + virtual ~IMAGE_BG_MODEL() { + for ( int i = 0 ; i < pixel_length ; i++ ) + delete pixel_PATTERNs[i]; + delete [] pixel_PATTERNs; + } +}; + + +#endif // !defined(_BGS_H_) diff --git a/package_bgs/jmo/BackgroundSubtractionAPI.h b/package_bgs/jmo/BackgroundSubtractionAPI.h new file mode 100644 index 0000000..7d01d69 --- /dev/null +++ b/package_bgs/jmo/BackgroundSubtractionAPI.h @@ -0,0 +1,158 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- +* Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. The name of the author may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +////////////////////////////////////////////////////////////////////// +// +// BackgroundSubtractionAPI.h: +// interface for the BackgroundSubtractionAPI class. +// +// A background subtraction algorithm takes as input +// an RGB image and provide as ouput a Binary mask +// with a value of 0 for points belonging to the +// background, and non zero for points belonging +// to the foreground. +// +// +// +// To add: +// - a function indicating the valid input and ouput +// images +// e.g. RGB image (default) or greylevel image for the input +// char image for the output +// +////////////////////////////////////////////////////////////////////// + + +#if !defined(_BACKGROUND_SUBTRACTION_API_H_) +#define _BACKGROUND_SUBTRACTION_API_H_ + +#include "cv.h" + +class CBackgroundSubtractionAPI +{ +public: + //CBackgroundSubtractionAPI(){}; + //virtual ~CBackgroundSubtractionAPI(){}; + + //------------------------------------------------------------- + // TO CALL AT INITIALISATION: DEFINES THE SIZE OF THE INPUT IMAGES + // NORMALLY, UNNECESSARY IF A CONFIGURATION FILE IS LOADED + void Init(int width,int height); + + //------------------------------------------------------------- + // PROVIDE A MASK TO DEFINE THE SET OF POINTS WHERE BACKGROUND + // SUBTRACTION DOES NOT NEED TO BE PERFORMED + // + // mode is useful to specify if the points to remove from + // processing are in addition to the ones potentially + // removed according to the configuration file, + // or if they are the only ones to be removed + // + // mode=0 : provided points need to be removed + // in addition to those already removed + // mode=1 : the provided points are the only one to remove + // from processing + // Note: maskImage(li,co)=0 indicate the points to remove + // from background processing + void SetValidPointMask(IplImage* maskImage, int mode); + + //------------------------------------------------------------- + // + // set the frame rate, to adjust the update parameters + // to the actual frame rate. + // Can be called only once at initialisation, + // but in online cases, can be used to indicate + // the time interval during the last processed frame + // + // frameDuration is in millisecond + void SetFrameRate(float frameDuration); + + //------------------------------------------------------------- + // PROVIDE A POINTER TO THE INPUT IMAGE + // -> INDICATE WHERE THE NEW IMAGE TO PROCESS IS STORED + // + // Here assumes that the input image will contain RGB images. + // The memory of this image is handled by the caller. + // + // The return value indicate whether the actual Background + // Subtraction algorithm handles RGB images (1) or not (0). + // + int SetRGBInputImage(IplImage * inputImage); + + //------------------------------------------------------------- + // PROVIDE A POINTER TO THE RESULT IMAGE + // INDICATE WHERE THE BACKGROUND RESULT NEED TO BE STORED + // + // The return value is 1 if correct image format is provided, + // otherwise the return value is 0. + // e.g. fg_mask_img = cvCreateImage(imgSize, IPL_DEPTH_8U, 1); + int SetForegroundMaskImage(IplImage *fg_mask_img); + + // The return value is 1 if the function is implemented + // with correct format, otherwise the return value is 0 + // e.g. fg_prob_img = cvCreateImage(imgSize, IPL_DEPTH_32F, 1); + int SetForegroundProbImage(IplImage *fg_prob_img); + + //------------------------------------------------------------- + // This function should be called each time a new image is + // available in the input image. + // + // The return value is 1 if everything goes well, + // otherwise the return value is 0. + // + int Process(); + + //------------------------------------------------------------- + // this function should save parameters and information of the model + // (e.g. after a training of the model, or in such a way + // that the model can be reload to process the next frame + // type of save: + void Save(char *bg_model_fn); + + //------------------------------------------------------------- + // this function should load the parameters necessary + // for the processing of the background subtraction or + // load background model information + void Load(char *bg_model_fn); +}; + +#endif // !defined(_BACKGROUND_SUBTRACTION_API_H_) diff --git a/package_bgs/jmo/BlobExtraction.cpp b/package_bgs/jmo/BlobExtraction.cpp new file mode 100644 index 0000000..04560b9 --- /dev/null +++ b/package_bgs/jmo/BlobExtraction.cpp @@ -0,0 +1,1490 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- +* Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. The name of the author may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +//***********************************************************// +//* Blob analysis package 8 August 2003 *// +//* Version 1.0 *// +//* Input: IplImage* binary image *// +//* Output: attributes of each connected region *// +//* Author: Dave Grossman *// +//* Modifications: Francesc Pinyol and Ricard Borras *// +//* Email: dgrossman@cdr.stanford.edu *// +//* Email: fpinyol@cvc.uab.es rborras@cvc.uab.es *// +//* Acknowledgement: the algorithm has been around > 20 yrs *// +//***********************************************************// + +//! Indica si la connectivitat es a 8 (si es desactiva es a 4) +#define B_CONNECTIVITAT_8 + +//! si la imatge �s c�clica verticalment (els blobs que toquen +//! les vores superior i inferior no es consideren externs) +#define IMATGE_CICLICA_VERTICAL 1 +//! si la imatge �s c�clica horitzontalment (els blobs que toquen +//! les vores dreta i esquerra no es consideren externs) +#define IMATGE_CICLICA_HORITZONTAL 0 + +#define PERIMETRE_DIAGONAL (1.41421356237310 - 2) +#define SQRT2 1.41421356237310 +// color dels p�xels de la m�scara per ser exteriors +#define PIXEL_EXTERIOR 0 + + +#include "BlobResult.h" +#include "BlobExtraction.h" + +namespace Blob +{ + +/** +- FUNCI�: BlobAnalysis +- FUNCIONALITAT: Extreu els blobs d'una imatge d'un sol canal +- PAR�METRES: +- inputImage: Imatge d'entrada. Ha de ser d'un sol canal +- threshold: Nivell de gris per considerar un pixel blanc o negre +- maskImage: Imatge de m�scara fora de la cual no es calculen els blobs. A m�s, +els blobs que toquen els pixels de la m�scara a 0, s�n considerats +externs +- borderColor: Color del marc de la imatge (0=black or 1=white) +- findmoments: calcula els moments dels blobs o no +- RegionData: on es desar� el resultat +- RESULTAT: +- retorna true si tot ha anat b�, false si no. Deixa el resultat a blobs. +- RESTRICCIONS: +- La imatge d'entrada ha de ser d'un sol canal +- AUTOR: dgrossman@cdr.stanford.edu +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +- fpinyol@cvc.uab.es, rborras@cvc.uab.es: adaptaci� a les OpenCV +*/ +bool BlobAnalysis( IplImage* inputImage, + uchar threshold, + IplImage* maskImage, + bool borderColor, + bool findmoments, + blob_vector &RegionData ) +{ + // dimensions of input image taking in account the ROI + int Cols, Rows, startCol, startRow; + + if( inputImage->roi ) + { + CvRect imageRoi = cvGetImageROI( inputImage ); + startCol = imageRoi.x; + startRow = imageRoi.y; + Cols = imageRoi.width; + Rows = imageRoi.height; + } + else + { + startCol = 0; + startRow = 0; + Cols = inputImage->width; + Rows = inputImage->height; + } + + int Trans = Cols; // MAX trans in any row + char* pMask = NULL; + char* pImage; + + // Convert image array into transition array. In each row + // the transition array tells which columns have a color change + int iCol,iRow,iTran, Tran; // Data for a given run + bool ThisCell, LastCell; // Contents (colors (0 or 1)) within this row + int TransitionOffset = 0; // Performance booster to avoid multiplication + + // row 0 and row Rows+1 represent the border + int i; + int *Transition; // Transition Matrix + + int nombre_pixels_mascara = 0; + //! Imatge amb el perimetre extern de cada pixel + IplImage *imatgePerimetreExtern; + + // input images must have only 1-channel and be an image + if( !CV_IS_IMAGE( inputImage ) || (inputImage->nChannels != 1) ) + { + return false; + } + if( maskImage != NULL ) + { + // input image and mask are a valid image? + if( !CV_IS_IMAGE( inputImage ) || !CV_IS_IMAGE( maskImage )) + return false; + + // comprova que la m�scara tingui les mateixes dimensions que la imatge + if( inputImage->width != maskImage->width || inputImage->height != maskImage->height ) + { + return false; + } + + // comprova que la m�scara sigui una imatge d'un sol canal (grayscale) + if( maskImage->nChannels != 1 ) + { + return false; + } + + } + + // Initialize Transition array + Transition=new int[(Rows + 2)*(Cols + 2)]; + memset(Transition,0,(Rows + 2) * (Cols + 2)*sizeof(int)); + Transition[0] = Transition[(Rows + 1) * (Cols + 2)] = Cols + 2; + + // Start at the beginning of the image (startCol, startRow) + pImage = inputImage->imageData + startCol - 1 + startRow * inputImage->widthStep; + + /* + Paral�lelitzaci� del c�lcul de la matriu de transicions + Fem que cada iteraci� del for el faci un thread o l'altre ( tenim 2 possibles threads ) + */ + if(maskImage == NULL) + { + imatgePerimetreExtern = NULL; + + //Fill Transition array + for(iRow = 1; iRow < Rows + 1; iRow++) // Choose a row of Bordered image + { + TransitionOffset = iRow*(Cols + 2); //per a que sigui paral�litzable + iTran = 0; // Index into Transition array + Tran = 0; // No transitions at row start + LastCell = borderColor; + + for(iCol = 0; iCol < Cols + 2; iCol++) // Scan that row of Bordered image + { + if(iCol == 0 || iCol == Cols+1) + ThisCell = borderColor; + else + ThisCell = ((unsigned char) *(pImage)) > threshold; + + if(ThisCell != LastCell) + { + Transition[TransitionOffset + iTran] = Tran; // Save completed Tran + iTran++; // Prepare new index + LastCell = ThisCell; // With this color + } + + Tran++; // Tran continues + pImage++; + } + + Transition[TransitionOffset + iTran] = Tran; // Save completed run + if ( (TransitionOffset + iTran + 1) < (Rows + 1)*(Cols + 2) ) + { + Transition[TransitionOffset + iTran + 1] = -1; + } + //jump to next row (beginning from (startCol, startRow)) + pImage = inputImage->imageData - 1 + startCol + (iRow+startRow)*inputImage->widthStep; + } + } + else + { + //maskImage not NULL: Cal rec�rrer la m�scara tamb� per calcular la matriu de transicions + + char perimeter; + char *pPerimetre; + + // creem la imatge que contindr� el perimetre extern de cada pixel + imatgePerimetreExtern = cvCreateImage( cvSize(maskImage->width, maskImage->height), IPL_DEPTH_8U, 1); + cvSetZero( imatgePerimetreExtern ); + + pMask = maskImage->imageData - 1; + + //Fill Transition array + for(iRow = 1; iRow < Rows + 1; iRow++) // Choose a row of Bordered image + { + TransitionOffset = iRow*(Cols + 2); + iTran = 0; // Index into Transition array + Tran = 0; // No transitions at row start + LastCell = borderColor; + + pPerimetre = imatgePerimetreExtern->imageData + (iRow - 1) * imatgePerimetreExtern->widthStep; + //pMask = maskImage->imageData + (iRow-1) * maskImage->widthStep; + + for(iCol = 0; iCol < Cols + 2; iCol++) // Scan that row of Bordered image + { + if(iCol == 0 || iCol == Cols+1 || ((unsigned char) *pMask) == PIXEL_EXTERIOR) + ThisCell = borderColor; + else + ThisCell = ((unsigned char) *(pImage)) > threshold; + + if(ThisCell != LastCell) + { + Transition[TransitionOffset + iTran] = Tran; // Save completed Tran + iTran++; // Prepare new index + LastCell = ThisCell; // With this color + } + + /*//////////////////////////////////////////////////////////////////////// + Calcul de la imatge amb els pixels externs + ////////////////////////////////////////////////////////////////////////*/ + // pels pixels externs no cal calcular res pq no hi accedir-hem + if( (iCol > 0) && (iCol < Cols) ) + { + if( *pMask == PIXEL_EXTERIOR ) + { + *pPerimetre = 0; + } + else + { + perimeter = 0; + + // pixels al nord de l'actual + if(iRow>1) + { + if( *(pMask - maskImage->widthStep ) == PIXEL_EXTERIOR) perimeter++; + } + + // pixels a l'est i oest de l'actual + if( iRow < imatgePerimetreExtern->height ) + { + if( (iCol>0) && (*(pMask-1) == PIXEL_EXTERIOR) ) perimeter++; + + if( ( iCol < imatgePerimetreExtern->width - 1) && (*(pMask+1) == PIXEL_EXTERIOR) ) perimeter++; + } + + // pixels al sud de l'actual + if( iRow < imatgePerimetreExtern->height - 1) + { + if( (*(pMask+maskImage->widthStep) == PIXEL_EXTERIOR) ) perimeter++; + } + + *pPerimetre = perimeter; + } + } + + Tran++; // Tran continues + pImage++; + pMask++; + pPerimetre++; + } + Transition[TransitionOffset + iTran] = Tran; // Save completed run + + if ( (TransitionOffset + iTran + 1) < (Rows + 1)*(Cols + 2) ) + { + Transition[TransitionOffset + iTran + 1] = -1; + } + + + //jump to next row (beginning from (startCol, startRow)) + pImage = inputImage->imageData - 1 + startCol + (iRow+startRow)*inputImage->widthStep; + //the mask should be the same size as image Roi, so don't take into account the offset + pMask = maskImage->imageData - 1 + iRow*maskImage->widthStep; + } + } + + // Process transition code depending on Last row and This row + // + // Last ---++++++--+++++++++++++++-----+++++++++++++++++++-----++++++-------+++--- + // This -----+++-----++++----+++++++++----+++++++---++------------------++++++++-- + // + // There are various possibilities: + // + // Case 1 2 3 4 5 6 7 8 + // Last |xxx |xxxxoo |xxxxxxx|xxxxxxx|ooxxxxx|ooxxx |ooxxxxx| xxx| + // This | yyy| yyy| yyyy | yyyyy|yyyyyyy|yyyyyyy|yyyy |yyyy | + // Here o is optional + // + // Here are the primitive tests to distinguish these 6 cases: + // A) Last end < This start - 1 OR NOT Note: -1 + // B) This end < Last start OR NOT + // C) Last start < This start OR NOT + // D) This end < Last end OR NOT + // E) This end = Last end OR NOT + // + // Here is how to use these tests to determine the case: + // Case 1 = A [=> NOT B AND C AND NOT D AND NOT E] + // Case 2 = C AND NOT D AND NOT E [AND NOT A AND NOT B] + // Case 3 = C AND D [=> NOT E] [AND NOT A AND NOT B] + // Case 4 = C AND NOT D AND E [AND NOT A AND NOT B] + // Case 5 = NOT C AND E [=> NOT D] [AND NOT A AND NOT B] + // Case 6 = NOT C AND NOT D AND NOT E [AND NOT A AND NOT B] + // Case 7 = NOT C AND D [=> NOT E] [AND NOT A AND NOT B] + // Case 8 = B [=> NOT A AND NOT C AND D AND NOT E] + // + // In cases 2,3,4,5,6,7 the following additional test is needed: + // Match) This color = Last color OR NOT + // + // In cases 5,6,7 the following additional test is needed: + // Known) This region was already matched OR NOT + // + // Here are the main tests and actions: + // Case 1: LastIndex++; + // Case 2: if(Match) {y = x;} + // LastIndex++; + // Case 3: if(Match) {y = x;} + // else {y = new} + // ThisIndex++; + // Case 4: if(Match) {y = x;} + // else {y = new} + // LastIndex++; + // ThisIndex++; + // Case 5: if(Match AND NOT Known) {y = x} + // else if(Match AND Known) {Subsume(x,y)} + // LastIndex++;ThisIndex++ + // Case 6: if(Match AND NOT Known) {y = x} + // else if(Match AND Known) {Subsume(x,y)} + // LastIndex++; + // Case 7: if(Match AND NOT Known) {y = x} + // else if(Match AND Known) {Subsume(x,y)} + // ThisIndex++; + // Case 8: ThisIndex++; + + int *SubsumedRegion = NULL; + + double ThisParent; // These data can change when the line is current + double ThisArea; + double ThisPerimeter; + double ThisSumX = 0; + double ThisSumY = 0; + double ThisSumXX = 0; + double ThisSumYY = 0; + double ThisSumXY = 0; + double ThisMinX; + double ThisMaxX; + double ThisMinY; + double ThisMaxY; + double LastPerimeter; // This is the only data for retroactive change + double ThisExternPerimeter; + + int HighRegionNum = 0; + //int RegionNum = 0; + int ErrorFlag = 0; + + int LastRow, ThisRow; // Row number + int LastStart, ThisStart; // Starting column of run + int LastEnd, ThisEnd; // Ending column of run + int LastColor, ThisColor; // Color of run + + int LastIndex, ThisIndex; // Which run are we up to + int LastIndexCount, ThisIndexCount; // Out of these runs + int LastRegionNum, ThisRegionNum; // Which assignment + int *LastRegion; // Row assignment of region number + int *ThisRegion; // Row assignment of region number + + int LastOffset = -(Trans + 2); // For performance to avoid multiplication + int ThisOffset = 0; // For performance to avoid multiplication + int ComputeData; + + CvPoint actualedge; + uchar imagevalue; + bool CandidatExterior = false; + + // apuntadors als blobs de la regi� actual i last + CBlob *regionDataThisRegion, *regionDataLastRegion; + + LastRegion=new int[Cols+2]; + ThisRegion=new int[Cols+2]; + + for(i = 0; i < Cols + 2; i++) // Initialize result arrays + { + LastRegion[i] = -1; + ThisRegion[i] = -1; + } + + //create the external blob + RegionData.push_back( new CBlob() ); + SubsumedRegion = NewSubsume(SubsumedRegion,0); + RegionData[0]->parent = -1; + RegionData[0]->area = (double) Transition[0]; + RegionData[0]->perimeter = (double) (2 + 2 * Transition[0]); + + ThisIndexCount = 1; + ThisRegion[0] = 0; // Border region + + // beginning of the image + // en cada linia, pimage apunta al primer pixel de la fila + pImage = inputImage->imageData - 1 + startCol + startRow * inputImage->widthStep; + //the mask should be the same size as image Roi, so don't take into account the offset + if(maskImage!=NULL) pMask = maskImage->imageData - 1; + + char *pImageAux, *pMaskAux = NULL; + + // Loop over all rows + for(ThisRow = 1; ThisRow < Rows + 2; ThisRow++) + { + //cout << "========= THIS ROW = " << ThisRow << endl; // for debugging + ThisOffset += Trans + 2; + ThisIndex = 0; + LastOffset += Trans + 2;; + LastRow = ThisRow - 1; + LastIndexCount = ThisIndexCount; + LastIndex = 0; + + int EndLast = 0; + int EndThis = 0; + + for(int j = 0; j < Trans + 2; j++) + { + int Index = ThisOffset + j; + int TranVal = Transition[Index]; + if(TranVal > 0) ThisIndexCount = j + 1; // stop at highest + + if(ThisRegion[j] == -1) { EndLast = 1; } + if(TranVal < 0) { EndThis = 1; } + + if(EndLast > 0 && EndThis > 0) { break; } + + LastRegion[j] = ThisRegion[j]; + ThisRegion[j] = -1; // Flag indicates region is not initialized + } + + int MaxIndexCount = LastIndexCount; + if(ThisIndexCount > MaxIndexCount) MaxIndexCount = ThisIndexCount; + + // Main loop over runs within Last and This rows + while (LastIndex < LastIndexCount && ThisIndex < ThisIndexCount) + { + ComputeData = 0; + + if(LastIndex == 0) LastStart = 0; + else LastStart = Transition[LastOffset + LastIndex - 1]; + LastEnd = Transition[LastOffset + LastIndex] - 1; + LastColor = LastIndex - 2 * (LastIndex / 2); + LastRegionNum = LastRegion[LastIndex]; + + regionDataLastRegion = RegionData[LastRegionNum]; + + + if(ThisIndex == 0) ThisStart = 0; + else ThisStart = Transition[ThisOffset + ThisIndex - 1]; + ThisEnd = Transition[ThisOffset + ThisIndex] - 1; + ThisColor = ThisIndex - 2 * (ThisIndex / 2); + ThisRegionNum = ThisRegion[ThisIndex]; + + if( ThisRegionNum >= 0 ) + regionDataThisRegion = RegionData[ThisRegionNum]; + else + regionDataThisRegion = NULL; + + + // blobs externs + CandidatExterior = false; + if( +#if !IMATGE_CICLICA_VERTICAL + ThisRow == 1 || ThisRow == Rows || +#endif +#if !IMATGE_CICLICA_HORITZONTAL + ThisStart <= 1 || ThisEnd >= Cols || +#endif + GetExternPerimeter( ThisStart, ThisEnd, ThisRow, inputImage->width, inputImage->height, imatgePerimetreExtern ) + ) + { + CandidatExterior = true; + } + + int TestA = (LastEnd < ThisStart - 1); // initially false + int TestB = (ThisEnd < LastStart); // initially false + int TestC = (LastStart < ThisStart); // initially false + int TestD = (ThisEnd < LastEnd); + int TestE = (ThisEnd == LastEnd); + + int TestMatch = (ThisColor == LastColor); // initially true + int TestKnown = (ThisRegion[ThisIndex] >= 0); // initially false + + int Case = 0; + if(TestA) Case = 1; + else if(TestB) Case = 8; + else if(TestC) + { + if(TestD) Case = 3; + else if(!TestE) Case = 2; + else Case = 4; + } + else + { + if(TestE) Case = 5; + else if(TestD) Case = 7; + else Case = 6; + } + + // Initialize common variables + ThisArea = (float) 0.0; + + if(findmoments) + { + ThisSumX = ThisSumY = (float) 0.0; + ThisSumXX = ThisSumYY = ThisSumXY = (float) 0.0; + } + ThisMinX = ThisMinY = (float) 1000000.0; + ThisMaxX = ThisMaxY = (float) -1.0; + + LastPerimeter = ThisPerimeter = (float) 0.0; + ThisParent = (float) -1; + ThisExternPerimeter = 0.0; + + // Determine necessary action and take it + switch (Case) + { + case 1: //|xxx | + //| yyy| + + ThisRegion[ThisIndex] = ThisRegionNum; + LastRegion[LastIndex] = LastRegionNum; + LastIndex++; + + //afegim la cantonada a LastRegion + actualedge.x = ThisEnd; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataLastRegion->edges,&actualedge); + + //afegim la cantonada a ThisRegion + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + + break; + + + case 2: //|xxxxoo | + //| yyy| + + if(TestMatch) // Same color + { + ThisRegionNum = LastRegionNum; + regionDataThisRegion = regionDataLastRegion; + + ThisArea = ThisEnd - ThisStart + 1; + LastPerimeter = LastEnd - ThisStart + 1; // to subtract + ThisPerimeter = 2 + 2 * ThisArea - LastPerimeter + + PERIMETRE_DIAGONAL*2; + + if( CandidatExterior ) + { + ThisExternPerimeter = GetExternPerimeter( ThisStart, ThisEnd, ThisRow, + inputImage->width, inputImage->height, + imatgePerimetreExtern ); + ThisExternPerimeter += PERIMETRE_DIAGONAL*2; + } + ComputeData = 1; + } + + //afegim la cantonada a ThisRegion + if(ThisRegionNum!=-1) + { + // afegim dos vertexs si s�n diferents, nom�s + if(ThisStart - 1 != ThisEnd) + { + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + } + actualedge.x = ThisEnd; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + } + //afegim la cantonada a ThisRegion + if(LastRegionNum!=-1 && LastRegionNum != ThisRegionNum ) + { + // afegim dos vertexs si s�n diferents, nom�s + if(ThisStart - 1 != ThisEnd) + { + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataLastRegion->edges,&actualedge); + } + } + + ThisRegion[ThisIndex] = ThisRegionNum; + LastRegion[LastIndex] = LastRegionNum; + LastIndex++; + break; + + + case 3: //|xxxxxxx| + //| yyyy | + + if(TestMatch) // Same color + { + ThisRegionNum = LastRegionNum; + regionDataThisRegion = regionDataLastRegion; + + ThisArea = ThisEnd - ThisStart + 1; + LastPerimeter = ThisArea; // to subtract + ThisPerimeter = 2 + ThisArea + PERIMETRE_DIAGONAL*2; + if( CandidatExterior ) + { + ThisExternPerimeter = GetExternPerimeter( ThisStart, ThisEnd, ThisRow, + inputImage->width, inputImage->height, + imatgePerimetreExtern ); + + ThisExternPerimeter += PERIMETRE_DIAGONAL * 2; + } + } + else // Different color => New region + { + ThisParent = LastRegionNum; + ThisRegionNum = ++HighRegionNum; + ThisArea = ThisEnd - ThisStart + 1; + ThisPerimeter = 2 + 2 * ThisArea; + RegionData.push_back( new CBlob() ); + regionDataThisRegion = RegionData.back(); + + SubsumedRegion = NewSubsume(SubsumedRegion,HighRegionNum); + if( CandidatExterior ) + ThisExternPerimeter = GetExternPerimeter( ThisStart, ThisEnd, ThisRow, + inputImage->width, inputImage->height, + imatgePerimetreExtern ); + + } + + if(ThisRegionNum!=-1) + { + //afegim la cantonada a la regio + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + //afegim la cantonada a la regio + actualedge.x = ThisEnd; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + } + // si hem creat un nou blob, afegim tb a l'anterior + if(!TestMatch && LastRegionNum!=-1 && LastRegionNum != ThisRegionNum ) + { + //afegim la cantonada a la regio + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataLastRegion->edges,&actualedge); + //afegim la cantonada a la regio + actualedge.x = ThisEnd; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataLastRegion->edges,&actualedge); + } + + ThisRegion[ThisIndex] = ThisRegionNum; + LastRegion[LastIndex] = LastRegionNum; + ComputeData = 1; + ThisIndex++; + break; + + + case 4: //|xxxxxxx| + //| yyyyy| + + if(TestMatch) // Same color + { + ThisRegionNum = LastRegionNum; + regionDataThisRegion = regionDataLastRegion; + ThisArea = ThisEnd - ThisStart + 1; + LastPerimeter = ThisArea; // to subtract + ThisPerimeter = 2 + ThisArea + PERIMETRE_DIAGONAL; + if( CandidatExterior ) + { + ThisExternPerimeter = GetExternPerimeter( ThisStart, ThisEnd, ThisRow, + inputImage->width, inputImage->height, + imatgePerimetreExtern ); + + ThisExternPerimeter += PERIMETRE_DIAGONAL; + } + } + else // Different color => New region + { + ThisParent = LastRegionNum; + ThisRegionNum = ++HighRegionNum; + ThisArea = ThisEnd - ThisStart + 1; + ThisPerimeter = 2 + 2 * ThisArea; + RegionData.push_back( new CBlob() ); + regionDataThisRegion = RegionData.back(); + SubsumedRegion = NewSubsume(SubsumedRegion,HighRegionNum); + if( CandidatExterior ) + ThisExternPerimeter = GetExternPerimeter( ThisStart, ThisEnd, ThisRow, + inputImage->width, inputImage->height, + imatgePerimetreExtern ); + + } + + if(ThisRegionNum!=-1) + { + //afegim la cantonada a la regio + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + actualedge.x = ThisEnd; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + } + // si hem creat un nou blob, afegim tb a l'anterior + if(!TestMatch && LastRegionNum!=-1 && LastRegionNum != ThisRegionNum ) + { + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataLastRegion->edges,&actualedge); + actualedge.x = ThisEnd; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataLastRegion->edges,&actualedge); + } + + ThisRegion[ThisIndex] = ThisRegionNum; + LastRegion[LastIndex] = LastRegionNum; + ComputeData = 1; + +#ifdef B_CONNECTIVITAT_8 + if( TestMatch ) + { + LastIndex++; + ThisIndex++; + } + else + { + LastIndex++; + } +#else + LastIndex++; + ThisIndex++; +#endif + break; + + + case 5: //|ooxxxxx| + //|yyyyyyy| + + if(!TestMatch && !TestKnown) // Different color and unknown => new region + { + ThisParent = LastRegionNum; + ThisRegionNum = ++HighRegionNum; + ThisArea = ThisEnd - ThisStart + 1; + ThisPerimeter = 2 + 2 * ThisArea; + RegionData.push_back( new CBlob() ); + regionDataThisRegion = RegionData.back(); + SubsumedRegion = NewSubsume(SubsumedRegion,HighRegionNum); + if( CandidatExterior ) + ThisExternPerimeter = GetExternPerimeter( ThisStart, ThisEnd, ThisRow, + inputImage->width, inputImage->height, + imatgePerimetreExtern ); + + } + else if(TestMatch && !TestKnown) // Same color and unknown + { + ThisRegionNum = LastRegionNum; + regionDataThisRegion = regionDataLastRegion; + ThisArea = ThisEnd - ThisStart + 1; + LastPerimeter = LastEnd - LastStart + 1; // to subtract + ThisPerimeter = 2 + 2 * ThisArea - LastPerimeter + + PERIMETRE_DIAGONAL * (LastStart != ThisStart); + if( CandidatExterior ) + { + ThisExternPerimeter = GetExternPerimeter( ThisStart, ThisEnd, ThisRow, + inputImage->width, inputImage->height, + imatgePerimetreExtern ); + + + ThisExternPerimeter += PERIMETRE_DIAGONAL * (LastStart != ThisStart); + } + ComputeData = 1; + } + else if(TestMatch && TestKnown) // Same color and known + { + LastPerimeter = LastEnd - LastStart + 1; // to subtract + //ThisPerimeter = - LastPerimeter; + ThisPerimeter = - 2 * LastPerimeter + + PERIMETRE_DIAGONAL * (LastStart != ThisStart); + + if(ThisRegionNum > LastRegionNum) + { + Subsume(RegionData, HighRegionNum, SubsumedRegion, regionDataThisRegion, regionDataLastRegion, + findmoments, ThisRegionNum, LastRegionNum ); + for(int iOld = 0; iOld < MaxIndexCount; iOld++) + { + if(ThisRegion[iOld] == ThisRegionNum) ThisRegion[iOld] = LastRegionNum; + if(LastRegion[iOld] == ThisRegionNum) LastRegion[iOld] = LastRegionNum; + } + ThisRegionNum = LastRegionNum; + } + else if(ThisRegionNum < LastRegionNum) + { + Subsume(RegionData, HighRegionNum, SubsumedRegion, regionDataLastRegion, regionDataThisRegion, + findmoments, LastRegionNum, ThisRegionNum ); + + for(int iOld = 0; iOld < MaxIndexCount; iOld++) + { + if(ThisRegion[iOld] == LastRegionNum) ThisRegion[iOld] = ThisRegionNum; + if(LastRegion[iOld] == LastRegionNum) LastRegion[iOld] = ThisRegionNum; + } + LastRegionNum = ThisRegionNum; + } + } + + + if(ThisRegionNum!=-1) + { + actualedge.x = ThisEnd; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + + if( ThisStart - 1 != LastEnd ) + { + //afegim la cantonada a la regio + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + } + } + // si hem creat un nou blob, afegim tb a l'anterior + if(!TestMatch && LastRegionNum!=-1 && LastRegionNum != ThisRegionNum ) + { + actualedge.x = ThisEnd; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataLastRegion->edges,&actualedge); + } + + ThisRegion[ThisIndex] = ThisRegionNum; + LastRegion[LastIndex] = LastRegionNum; + +#ifdef B_CONNECTIVITAT_8 + if( TestMatch ) + { + LastIndex++; + ThisIndex++; + } + else + { + LastIndex++; + } +#else + LastIndex++; + ThisIndex++; +#endif + break; + + + case 6: //|ooxxx | + //|yyyyyyy| + + if(TestMatch && !TestKnown) + { + ThisRegionNum = LastRegionNum; + regionDataThisRegion = regionDataLastRegion; + ThisArea = ThisEnd - ThisStart + 1; + LastPerimeter = LastEnd - LastStart + 1; // to subtract + ThisPerimeter = 2 + 2 * ThisArea - LastPerimeter + + PERIMETRE_DIAGONAL + PERIMETRE_DIAGONAL * (ThisStart!=LastStart); + if( CandidatExterior ) + { + ThisExternPerimeter = GetExternPerimeter( ThisStart, ThisEnd, ThisRow, + inputImage->width, inputImage->height, + imatgePerimetreExtern ); + + + ThisExternPerimeter += PERIMETRE_DIAGONAL + PERIMETRE_DIAGONAL * (ThisStart!=LastStart); + } + ComputeData = 1; + } + else if(TestMatch && TestKnown) + { + LastPerimeter = LastEnd - LastStart + 1; // to subtract + //ThisPerimeter = - LastPerimeter; + ThisPerimeter = - 2 * LastPerimeter + + PERIMETRE_DIAGONAL + PERIMETRE_DIAGONAL * (ThisStart!=LastStart); + + if(ThisRegionNum > LastRegionNum) + { + Subsume(RegionData, HighRegionNum, SubsumedRegion, regionDataThisRegion, regionDataLastRegion, + findmoments, ThisRegionNum, LastRegionNum ); + for(int iOld = 0; iOld < MaxIndexCount; iOld++) + { + if(ThisRegion[iOld] == ThisRegionNum) ThisRegion[iOld] = LastRegionNum; + if(LastRegion[iOld] == ThisRegionNum) LastRegion[iOld] = LastRegionNum; + } + ThisRegionNum = LastRegionNum; + } + else if(ThisRegionNum < LastRegionNum) + { + Subsume(RegionData, HighRegionNum, SubsumedRegion, regionDataLastRegion, regionDataThisRegion, + findmoments, LastRegionNum, ThisRegionNum ); + for(int iOld = 0; iOld < MaxIndexCount; iOld++) + { + if(ThisRegion[iOld] == LastRegionNum) ThisRegion[iOld] = ThisRegionNum; + if(LastRegion[iOld] == LastRegionNum) LastRegion[iOld] = ThisRegionNum; + } + LastRegionNum = ThisRegionNum; + } + } + + + if(ThisRegionNum!=-1) + { + //afegim la cantonada a la regio + actualedge.x = ThisEnd; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + if( ThisStart - 1 != LastEnd ) + { + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + } + } + // si hem creat un nou blob, afegim tb a l'anterior + if(!TestMatch && LastRegionNum!=-1 && LastRegionNum != ThisRegionNum ) + { + //afegim la cantonada a la regio + if( ThisStart - 1 != LastEnd ) + { + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + } + } + + ThisRegion[ThisIndex] = ThisRegionNum; + LastRegion[LastIndex] = LastRegionNum; + LastIndex++; + break; + + + case 7: //|ooxxxxx| + //|yyyy | + + if(!TestMatch && !TestKnown) // Different color and unknown => new region + { + ThisParent = LastRegionNum; + ThisRegionNum = ++HighRegionNum; + ThisArea = ThisEnd - ThisStart + 1; + ThisPerimeter = 2 + 2 * ThisArea; + RegionData.push_back( new CBlob() ); + regionDataThisRegion = RegionData.back(); + SubsumedRegion = NewSubsume(SubsumedRegion,HighRegionNum); + if( CandidatExterior ) + ThisExternPerimeter = GetExternPerimeter( ThisStart, ThisEnd, ThisRow, + inputImage->width, inputImage->height, + imatgePerimetreExtern ); + + } + else if(TestMatch && !TestKnown) + { + ThisRegionNum = LastRegionNum; + regionDataThisRegion = regionDataLastRegion; + ThisArea = ThisEnd - ThisStart + 1; + ThisPerimeter = 2 + ThisArea; + LastPerimeter = ThisEnd - LastStart + 1; + ThisPerimeter = 2 + 2 * ThisArea - LastPerimeter + + PERIMETRE_DIAGONAL + PERIMETRE_DIAGONAL * (ThisStart!=LastStart); + if( CandidatExterior ) + { + ThisExternPerimeter = GetExternPerimeter( ThisStart, ThisEnd, ThisRow, + inputImage->width, inputImage->height, + imatgePerimetreExtern ); + + ThisExternPerimeter += PERIMETRE_DIAGONAL + PERIMETRE_DIAGONAL * (ThisStart!=LastStart); + } + ComputeData = 1; + } + else if(TestMatch && TestKnown) + { + LastPerimeter = ThisEnd - LastStart + 1; // to subtract + //ThisPerimeter = - LastPerimeter; + ThisPerimeter = - 2 * LastPerimeter + + PERIMETRE_DIAGONAL + PERIMETRE_DIAGONAL * (ThisStart!=LastStart); + + if(ThisRegionNum > LastRegionNum) + { + Subsume(RegionData, HighRegionNum, SubsumedRegion, regionDataThisRegion, regionDataLastRegion, + findmoments, ThisRegionNum, LastRegionNum ); + for(int iOld = 0; iOld < MaxIndexCount; iOld++) + { + if(ThisRegion[iOld] == ThisRegionNum) ThisRegion[iOld] = LastRegionNum; + if(LastRegion[iOld] == ThisRegionNum) LastRegion[iOld] = LastRegionNum; + } + ThisRegionNum = LastRegionNum; + } + else if(ThisRegionNum < LastRegionNum) + { + Subsume(RegionData, HighRegionNum, SubsumedRegion, regionDataLastRegion, regionDataThisRegion, + findmoments, LastRegionNum, ThisRegionNum ); + for(int iOld = 0; iOld < MaxIndexCount; iOld++) + { + if(ThisRegion[iOld] == LastRegionNum) ThisRegion[iOld] = ThisRegionNum; + if(LastRegion[iOld] == LastRegionNum) LastRegion[iOld] = ThisRegionNum; + } + LastRegionNum = ThisRegionNum; + } + } + + if(ThisRegionNum!=-1) + { + //afegim la cantonada a la regio + actualedge.x = ThisEnd; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + if( ThisStart - 1 != LastEnd ) + { + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + } + } + // si hem creat un nou blob, afegim tb a l'anterior + if(!TestMatch && LastRegionNum!=-1 && LastRegionNum != ThisRegionNum ) + { + //afegim la cantonada a la regio + actualedge.x = ThisEnd; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataLastRegion->edges,&actualedge); + if( ThisStart - 1 != LastEnd ) + { + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + } + } + + ThisRegion[ThisIndex] = ThisRegionNum; + LastRegion[LastIndex] = LastRegionNum; + ThisIndex++; + break; + + case 8: //| xxx| + //|yyyy | + +#ifdef B_CONNECTIVITAT_8 + // fusionem blobs + if( TestMatch ) + { + if(ThisRegionNum > LastRegionNum) + { + Subsume(RegionData, HighRegionNum, SubsumedRegion, regionDataThisRegion, regionDataLastRegion, + findmoments, ThisRegionNum, LastRegionNum ); + for(int iOld = 0; iOld < MaxIndexCount; iOld++) + { + if(ThisRegion[iOld] == ThisRegionNum) ThisRegion[iOld] = LastRegionNum; + if(LastRegion[iOld] == ThisRegionNum) LastRegion[iOld] = LastRegionNum; + } + ThisRegionNum = LastRegionNum; + } + else if(ThisRegionNum < LastRegionNum) + { + Subsume(RegionData, HighRegionNum, SubsumedRegion, regionDataLastRegion, regionDataThisRegion, + findmoments, LastRegionNum, ThisRegionNum ); + for(int iOld = 0; iOld < MaxIndexCount; iOld++) + { + if(ThisRegion[iOld] == LastRegionNum) ThisRegion[iOld] = ThisRegionNum; + if(LastRegion[iOld] == LastRegionNum) LastRegion[iOld] = ThisRegionNum; + } + LastRegionNum = ThisRegionNum; + } + + regionDataThisRegion->perimeter = regionDataThisRegion->perimeter + PERIMETRE_DIAGONAL*2; + } +#endif + + if(ThisRegionNum!=-1) + { + //afegim la cantonada a la regio + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataThisRegion->edges,&actualedge); + } +#ifdef B_CONNECTIVITAT_8 + // si hem creat un nou blob, afegim tb a l'anterior + if(!TestMatch && LastRegionNum!=-1 && LastRegionNum != ThisRegionNum ) + { +#endif + //afegim la cantonada a la regio + actualedge.x = ThisStart - 1; + actualedge.y = ThisRow - 1; + cvSeqPush(regionDataLastRegion->edges,&actualedge); +#ifdef B_CONNECTIVITAT_8 + } +#endif + + ThisRegion[ThisIndex] = ThisRegionNum; + LastRegion[LastIndex] = LastRegionNum; + ThisIndex++; +#ifdef B_CONNECTIVITAT_8 + LastIndex--; +#endif + break; + + default: + ErrorFlag = -1; + } // end switch case + + // calculate the blob moments and mean gray level of the current blob (ThisRegionNum) + if(ComputeData > 0) + { + // compute blob moments if necessary + if(findmoments) + { + float ImageRow = (float) (ThisRow - 1); + + for(int k = ThisStart; k <= ThisEnd; k++) + { + ThisSumX += (float) (k - 1); + ThisSumXX += (float) (k - 1) * (k - 1); + } + + ThisSumXY = ThisSumX * ImageRow; + ThisSumY = ThisArea * ImageRow; + ThisSumYY = ThisSumY * ImageRow; + + } + + // compute the mean gray level and its std deviation + if(ThisRow <= Rows ) + { + pImageAux = pImage + ThisStart; + if(maskImage!=NULL) pMaskAux = pMask + ThisStart; + for(int k = ThisStart; k <= ThisEnd; k++) + { + if((k>0) && (k <= Cols)) + { + if( maskImage!= NULL) + { + // nom�s es t� en compte el valor del p�xel de la + // imatge que queda dins de la m�scara + // (de pas, comptem el nombre de p�xels de la m�scara) + if( ((unsigned char) *pMaskAux) != PIXEL_EXTERIOR ) + { + imagevalue = (unsigned char) (*pImageAux); + regionDataThisRegion->mean+=imagevalue; + regionDataThisRegion->stddev+=imagevalue*imagevalue; + } + else + { + nombre_pixels_mascara++; + } + } + else + { + imagevalue = (unsigned char) (*pImageAux); + regionDataThisRegion->mean+=imagevalue; + regionDataThisRegion->stddev+=imagevalue*imagevalue; + + } + } + pImageAux++; + if(maskImage!=NULL) pMaskAux++; + } + } + + // compute the min and max values of X and Y + if(ThisStart - 1 < (int) ThisMinX) ThisMinX = (float) (ThisStart - 1); + if(ThisMinX < (float) 0.0) ThisMinX = (float) 0.0; + if(ThisEnd > (int) ThisMaxX) ThisMaxX = (float) ThisEnd; + + if(ThisRow - 1 < ThisMinY) ThisMinY = ThisRow - 1; + if(ThisMinY < (float) 0.0) ThisMinY = (float) 0.0; + if(ThisRow > ThisMaxY) ThisMaxY = ThisRow; + } + + // put the current results into RegionData + if(ThisRegionNum >= 0) + { + if(ThisParent >= 0) { regionDataThisRegion->parent = (int) ThisParent; } + regionDataThisRegion->etiqueta = ThisRegionNum; + regionDataThisRegion->area += ThisArea; + regionDataThisRegion->perimeter += ThisPerimeter; + regionDataThisRegion->externPerimeter += ThisExternPerimeter; + + if(ComputeData > 0) + { + if(findmoments) + { + regionDataThisRegion->sumx += ThisSumX; + regionDataThisRegion->sumy += ThisSumY; + regionDataThisRegion->sumxx += ThisSumXX; + regionDataThisRegion->sumyy += ThisSumYY; + regionDataThisRegion->sumxy += ThisSumXY; + } + regionDataThisRegion->perimeter -= LastPerimeter; + regionDataThisRegion->minx=MIN(regionDataThisRegion->minx,ThisMinX); + regionDataThisRegion->maxx=MAX(regionDataThisRegion->maxx,ThisMaxX); + regionDataThisRegion->miny=MIN(regionDataThisRegion->miny,ThisMinY); + regionDataThisRegion->maxy=MAX(regionDataThisRegion->maxy,ThisMaxY); + } + // blobs externs + if( CandidatExterior ) + { + regionDataThisRegion->exterior = true; + } + + } + } // end Main loop + + if(ErrorFlag != 0) return false; + // ens situem al primer pixel de la seguent fila + pImage = inputImage->imageData - 1 + startCol + (ThisRow+startRow) * inputImage->widthStep; + + if(maskImage!=NULL) + pMask = maskImage->imageData - 1 + ThisRow * maskImage->widthStep; + } // end Loop over all rows + + // eliminem l'�rea del marc + // i tamb� els p�xels de la m�scara + // ATENCIO: PERFER: el fet de restar el nombre_pixels_mascara del + // blob 0 nom�s ser� cert si la m�scara t� contacte amb el marc. + // Si no, s'haur� de trobar quin �s el blob que cont� m�s p�xels del + // compte. + RegionData[0]->area -= ( Rows + 1 + Cols + 1 )*2 + nombre_pixels_mascara; + + // eliminem el per�metre de m�s: + // - sense marc: 2m+2n (per�metre extern) + // - amb marc: 2(m+2)+2(n+2) = 2m+2n + 8 + // (segurament no �s del tot acurat) + // (i amb les m�scares encara menys...) + RegionData[0]->perimeter -= 8.0; + + // Condense the list + blob_vector::iterator itNew, itOld, iti; + CBlob *blobActual; + + itNew = RegionData.begin(); + itOld = RegionData.begin(); + int iNew = 0; + for(int iOld = 0; iOld <= HighRegionNum; iOld++, itOld++) + { + if(SubsumedRegion[iOld] < 1) // This number not subsumed + { + // Move data from old region number to new region number + //*RegionData[iNew] = *RegionData[iOld]; + **itNew = **itOld; + + // Update and parent pointer if necessary + iti = RegionData.begin(); + for(int i = 0; i <= HighRegionNum; i++) + { + //if(RegionData[i]->parent == iOld) { RegionData[i]->parent = iNew; } + if((*iti)->parent == iOld) { (*iti)->parent = iNew; } + + iti++; + } + iNew++; + itNew++; + } + } + + + HighRegionNum = iNew - 1; // Update where the data ends + RegionData[HighRegionNum]->parent = -1; // and set end of array flag + + + if(findmoments) + { + iti = RegionData.begin(); + // Normalize summation fields into moments + for(ThisRegionNum = 0; ThisRegionNum <= HighRegionNum; ThisRegionNum++, iti++) + { + blobActual = *iti; + + // Get averages + blobActual->sumx /= blobActual->area; + blobActual->sumy /= blobActual->area; + blobActual->sumxx /= blobActual->area; + blobActual->sumyy /= blobActual->area; + blobActual->sumxy /= blobActual->area; + + // Create moments + blobActual->sumxx -= blobActual->sumx * blobActual->sumx; + blobActual->sumyy -= blobActual->sumy * blobActual->sumy; + blobActual->sumxy -= blobActual->sumx * blobActual->sumy; + if(blobActual->sumxy > -1.0E-14 && blobActual->sumxy < 1.0E-14) + { + blobActual->sumxy = (float) 0.0; // Eliminate roundoff error + } + + } + } + + //Get the real mean and std deviation + iti = RegionData.begin(); + for(ThisRegionNum = 0; ThisRegionNum <= HighRegionNum; ThisRegionNum++, iti++) + { + blobActual = *iti; + if(blobActual->area > 1) + { + blobActual->stddev = + sqrt( + ( + blobActual->stddev * blobActual->area - + blobActual->mean * blobActual->mean + )/ + (blobActual->area*(blobActual->area-1)) + ); + } + else + blobActual->stddev=0; + + if(blobActual->area > 0) + blobActual->mean/=blobActual->area; + else + blobActual->mean = 0; + + } + // eliminem els blobs subsumats + blob_vector::iterator itBlobs = RegionData.begin() + HighRegionNum + 1; + while( itBlobs != RegionData.end() ) + { + delete *itBlobs; + //RegionData.erase( itBlobs ); + itBlobs++; + } + RegionData.erase( RegionData.begin() + HighRegionNum + 1, RegionData.end() ); + + //free(RegionData); + free(SubsumedRegion); + delete Transition; + delete ThisRegion; + delete LastRegion; + + if( imatgePerimetreExtern ) cvReleaseImage(&imatgePerimetreExtern); + + return true; +} + + +int *NewSubsume(int *subsumed, int index_subsume) +{ + if( index_subsume == 0 ) + { + subsumed = (int*)malloc(sizeof(int)); + } + else + { + subsumed = (int*)realloc(subsumed,(index_subsume+1)*sizeof(int)); + } + subsumed[index_subsume]=0; + return subsumed; +} + +/** +Fusiona dos blobs i afegeix el blob les caracter�stiques del blob RegionData[HiNum] +al blob RegionData[LoNum]. Al final allibera el blob de RegionData[HiNum] +*/ +void Subsume(blob_vector &RegionData, + int HighRegionNum, + int* SubsumedRegion, + CBlob* blobHi, + CBlob* blobLo, + bool findmoments, + int HiNum, + int LoNum) +{ + // cout << "\nSubsuming " << HiNum << " into " << LoNum << endl; // for debugging + + int i; + + blobLo->minx=MIN(blobHi->minx,blobLo->minx); + blobLo->miny=MIN(blobHi->miny,blobLo->miny); + blobLo->maxx=MAX(blobHi->maxx,blobLo->maxx); + blobLo->maxy=MAX(blobHi->maxy,blobLo->maxy); + blobLo->area+=blobHi->area; + blobLo->perimeter+=blobHi->perimeter; + blobLo->externPerimeter += blobHi->externPerimeter; + blobLo->exterior = blobLo->exterior || blobHi->exterior; + blobLo->mean += blobHi->mean; + blobLo->stddev += blobHi->stddev; + + if( findmoments ) + { + blobLo->sumx+=blobHi->sumx; + blobLo->sumy+=blobHi->sumy; + blobLo->sumxx+=blobHi->sumxx; + blobLo->sumyy+=blobHi->sumyy; + blobLo->sumxy+=blobHi->sumxy; + } + // Make sure no region still has subsumed region as parent + blob_vector::iterator it = (RegionData.begin() + HiNum + 1); + + for(i = HiNum + 1; i <= HighRegionNum; i++, it++) + { + if((*it)->parent == (float) HiNum) { (*it)->parent = LoNum; } + } + + // Mark dead region number for future compression + SubsumedRegion[HiNum] = 1; + // marquem el blob com a lliure + blobHi->etiqueta=-1; + + // Atenci�!!!! abans d'eliminar els edges + // s'han de traspassar del blob HiNum al blob LoNum + blobHi->CopyEdges( *blobLo ); + blobHi->ClearEdges(); +} + +/** +- FUNCI�: GetExternPerimeter +- FUNCIONALITAT: Retorna el perimetre extern d'una run lenght +- PAR�METRES: +- start: columna d'inici del run +- end: columna final del run +- row: fila del run +- maskImage: m�scara pels pixels externs +- RESULTAT: +- quantitat de perimetre extern d'un run, suposant que �s un blob +d'una �nica fila d'al�ada +- RESTRICCIONS: +- AUTOR: +- DATA DE CREACI�: 2006/02/27 +- MODIFICACI�: Data. Autor. Descripci�. +*/ +double GetExternPerimeter( int start, int end, int row, int width, int height, IplImage *imatgePerimetreExtern ) +{ + double perimeter = 0.0f; + char *pPerimetre; + + + // comprovem les dimensions de la imatge + perimeter += ( start <= 0 ) + ( end >= width - 1 ); + if(row <= 1 ) perimeter+= start - end; + if(row >= height - 1 ) perimeter+= start - end; + + + // comprovem els pixels que toquen a la m�scara (si s'escau) + if( imatgePerimetreExtern != NULL ) + { + if( row <= 0 || row >= height ) return perimeter; + + if( start < 0 ) start = 1; + if( end >= width ) end = width - 2; + + pPerimetre = imatgePerimetreExtern->imageData + (row - 1) * imatgePerimetreExtern->widthStep + start; + for (int x = start - 1; x <= end; x++ ) + { + perimeter += *pPerimetre; + pPerimetre++; + } + } + + return perimeter; +} + +} diff --git a/package_bgs/jmo/BlobExtraction.h b/package_bgs/jmo/BlobExtraction.h new file mode 100644 index 0000000..157ee58 --- /dev/null +++ b/package_bgs/jmo/BlobExtraction.h @@ -0,0 +1,76 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- +* Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. The name of the author may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +//***********************************************************// +//* Blob analysis package 8 August 2003 *// +//* Version 1.0 *// +//* Input: IplImage* binary image *// +//* Output: attributes of each connected region *// +//* Author: Dave Grossman *// +//* Email: dgrossman@cdr.stanford.edu *// +//* Acknowledgement: the algorithm has been around > 20 yrs *// +//***********************************************************// + + +#if !defined(_CLASSE_BLOBEXTRACTION_INCLUDED) +#define _CLASSE_BLOBEXTRACTION_INCLUDED + +namespace Blob +{ + +//! Extreu els blobs d'una imatge +bool BlobAnalysis(IplImage* inputImage, uchar threshold, IplImage* maskImage, + bool borderColor, bool findmoments, blob_vector &RegionData ); + + +// FUNCIONS AUXILIARS + +//! Fusiona dos blobs +void Subsume(blob_vector &RegionData, int, int*, CBlob*, CBlob*, bool, int, int ); +//! Reallocata el vector auxiliar de blobs subsumats +int *NewSubsume(int *SubSumedRegion, int elems_inbuffer); +//! Retorna el perimetre extern d'una run lenght +double GetExternPerimeter( int start, int end, int row, int width, int height, IplImage *maskImage ); +} + +#endif //_CLASSE_BLOBEXTRACTION_INCLUDED + diff --git a/package_bgs/jmo/BlobLibraryConfiguration.h b/package_bgs/jmo/BlobLibraryConfiguration.h new file mode 100644 index 0000000..48119f7 --- /dev/null +++ b/package_bgs/jmo/BlobLibraryConfiguration.h @@ -0,0 +1,62 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- +* Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. The name of the author may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/************************************************************************ +BlobLibraryConfiguration.h + +FUNCIONALITAT: Configuraci� del comportament global de la llibreria +AUTOR: Inspecta S.L. +MODIFICACIONS (Modificaci�, Autor, Data): + +FUNCTIONALITY: Global configuration of the library +AUTHOR: Inspecta S.L. +MODIFICATIONS (Modification, Author, Date): + +**************************************************************************/ + +//! Indica si es volen fer servir les MatrixCV o no +//! Use/Not use the MatrixCV class +//#define MATRIXCV_ACTIU + +// Uses/not use the blob object factory +//#define BLOB_OBJECT_FACTORY + diff --git a/package_bgs/jmo/BlobResult.cpp b/package_bgs/jmo/BlobResult.cpp new file mode 100644 index 0000000..fbd312a --- /dev/null +++ b/package_bgs/jmo/BlobResult.cpp @@ -0,0 +1,920 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- +* Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. The name of the author may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/************************************************************************ +BlobResult.cpp + +FUNCIONALITAT: Implementaci� de la classe CBlobResult +AUTOR: Inspecta S.L. +MODIFICACIONS (Modificaci�, Autor, Data): + +**************************************************************************/ + +#include <limits.h> +#include <stdio.h> +#include <functional> +#include <algorithm> +#include "BlobResult.h" +#include "BlobExtraction.h" +#ifdef _DEBUG +#include <afx.h> //suport per a CStrings +#include <afxwin.h> //suport per a AfxMessageBox +#endif + +/************************************************************************** +Constructors / Destructors +**************************************************************************/ + +namespace Blob +{ + +/** +- FUNCI�: CBlobResult +- FUNCIONALITAT: Constructor estandard. +- PAR�METRES: +- RESULTAT: +- Crea un CBlobResult sense cap blob +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 20-07-2004. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: CBlobResult +- FUNCTIONALITY: Standard constructor +- PARAMETERS: +- RESULT: +- creates an empty set of blobs +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +CBlobResult::CBlobResult() +{ + m_blobs = blob_vector(); +} + +/** +- FUNCI�: CBlobResult +- FUNCIONALITAT: Constructor a partir d'una imatge. Inicialitza la seq��ncia de blobs +amb els blobs resultants de l'an�lisi de blobs de la imatge. +- PAR�METRES: +- source: imatge d'on s'extreuran els blobs +- mask: m�scara a aplicar. Nom�s es calcularan els blobs on la m�scara sigui +diferent de 0. Els blobs que toquin a un pixel 0 de la m�scara seran +considerats exteriors. +- threshold: llindar que s'aplicar� a la imatge source abans de calcular els blobs +- findmoments: indica si s'han de calcular els moments de cada blob +- RESULTAT: +- objecte CBlobResult amb els blobs de la imatge source +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: CBlob +- FUNCTIONALITY: Constructor from an image. Fills an object with all the blobs in +the image +- PARAMETERS: +- source: image to extract the blobs from +- mask: optional mask to apply. The blobs will be extracted where the mask is +not 0. All the neighbouring blobs where the mask is 0 will be extern blobs +- threshold: threshold level to apply to the image before computing blobs +- findmoments: true to calculate the blob moments (slower) +- RESULT: +- object with all the blobs in the image. It throws an EXCEPCIO_CALCUL_BLOBS +if some error appears in the BlobAnalysis function +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +CBlobResult::CBlobResult(IplImage *source, IplImage *mask, int threshold, bool findmoments) +{ + bool success; + + try + { + // cridem la funci� amb el marc a true=1=blanc (aix� no unir� els blobs externs) + success = BlobAnalysis(source,(uchar)threshold,mask,true,findmoments, m_blobs ); + } + catch(...) + { + success = false; + } + + if( !success ) throw EXCEPCIO_CALCUL_BLOBS; +} + +/** +- FUNCI�: CBlobResult +- FUNCIONALITAT: Constructor de c�pia. Inicialitza la seq��ncia de blobs +amb els blobs del par�metre. +- PAR�METRES: +- source: objecte que es copiar� +- RESULTAT: +- objecte CBlobResult amb els blobs de l'objecte source +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: CBlobResult +- FUNCTIONALITY: Copy constructor +- PARAMETERS: +- source: object to copy +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +CBlobResult::CBlobResult( const CBlobResult &source ) +{ + m_blobs = blob_vector( source.GetNumBlobs() ); + + // creem el nou a partir del passat com a par�metre + m_blobs = blob_vector( source.GetNumBlobs() ); + // copiem els blobs de l'origen a l'actual + blob_vector::const_iterator pBlobsSrc = source.m_blobs.begin(); + blob_vector::iterator pBlobsDst = m_blobs.begin(); + + while( pBlobsSrc != source.m_blobs.end() ) + { + // no podem cridar a l'operador = ja que blob_vector �s un + // vector de CBlob*. Per tant, creem un blob nou a partir del + // blob original + *pBlobsDst = new CBlob(**pBlobsSrc); + pBlobsSrc++; + pBlobsDst++; + } +} + + + +/** +- FUNCI�: ~CBlobResult +- FUNCIONALITAT: Destructor estandard. +- PAR�METRES: +- RESULTAT: +- Allibera la mem�ria reservada de cadascun dels blobs de la classe +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: ~CBlobResult +- FUNCTIONALITY: Destructor +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +CBlobResult::~CBlobResult() +{ + ClearBlobs(); +} + +/************************************************************************** +Operadors / Operators +**************************************************************************/ + + +/** +- FUNCI�: operador = +- FUNCIONALITAT: Assigna un objecte source a l'actual +- PAR�METRES: +- source: objecte a assignar +- RESULTAT: +- Substitueix els blobs actuals per els de l'objecte source +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: Assigment operator +- FUNCTIONALITY: +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +CBlobResult& CBlobResult::operator=(const CBlobResult& source) +{ + // si ja s�n el mateix, no cal fer res + if (this != &source) + { + // alliberem el conjunt de blobs antic + for( int i = 0; i < GetNumBlobs(); i++ ) + { + delete m_blobs[i]; + } + m_blobs.clear(); + // creem el nou a partir del passat com a par�metre + m_blobs = blob_vector( source.GetNumBlobs() ); + // copiem els blobs de l'origen a l'actual + blob_vector::const_iterator pBlobsSrc = source.m_blobs.begin(); + blob_vector::iterator pBlobsDst = m_blobs.begin(); + + while( pBlobsSrc != source.m_blobs.end() ) + { + // no podem cridar a l'operador = ja que blob_vector �s un + // vector de CBlob*. Per tant, creem un blob nou a partir del + // blob original + *pBlobsDst = new CBlob(**pBlobsSrc); + pBlobsSrc++; + pBlobsDst++; + } + } + return *this; +} + + +/** +- FUNCI�: operador + +- FUNCIONALITAT: Concatena els blobs de dos CBlobResult +- PAR�METRES: +- source: d'on s'agafaran els blobs afegits a l'actual +- RESULTAT: +- retorna un nou CBlobResult amb els dos CBlobResult concatenats +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- NOTA: per la implementaci�, els blobs del par�metre es posen en ordre invers +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: + operator +- FUNCTIONALITY: Joins the blobs in source with the current ones +- PARAMETERS: +- source: object to copy the blobs +- RESULT: +- object with the actual blobs and the source blobs +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +CBlobResult CBlobResult::operator+( const CBlobResult& source ) +{ + //creem el resultat a partir dels blobs actuals + CBlobResult resultat( *this ); + + // reservem mem�ria per als nous blobs + resultat.m_blobs.resize( resultat.GetNumBlobs() + source.GetNumBlobs() ); + + // declarem els iterador per rec�rrer els blobs d'origen i desti + blob_vector::const_iterator pBlobsSrc = source.m_blobs.begin(); + blob_vector::iterator pBlobsDst = resultat.m_blobs.end(); + + // insertem els blobs de l'origen a l'actual + while( pBlobsSrc != source.m_blobs.end() ) + { + pBlobsDst--; + *pBlobsDst = new CBlob(**pBlobsSrc); + pBlobsSrc++; + } + + return resultat; +} + +/************************************************************************** +Operacions / Operations +**************************************************************************/ + +/** +- FUNCI�: AddBlob +- FUNCIONALITAT: Afegeix un blob al conjunt +- PAR�METRES: +- blob: blob a afegir +- RESULTAT: +- modifica el conjunt de blobs actual +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 2006/03/01 +- MODIFICACI�: Data. Autor. Descripci�. +*/ +void CBlobResult::AddBlob( CBlob *blob ) +{ + if( blob != NULL ) + m_blobs.push_back( new CBlob( blob ) ); +} + + +#ifdef MATRIXCV_ACTIU + +/** +- FUNCI�: GetResult +- FUNCIONALITAT: Calcula el resultat especificat sobre tots els blobs de la classe +- PAR�METRES: +- evaluador: Qualsevol objecte derivat de COperadorBlob +- RESULTAT: +- Retorna un array de double's amb el resultat per cada blob +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: GetResult +- FUNCTIONALITY: Computes the function evaluador on all the blobs of the class +and returns a vector with the result +- PARAMETERS: +- evaluador: function to apply to each blob (any object derived from the +COperadorBlob class ) +- RESULT: +- vector with all the results in the same order as the blobs +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double_vector CBlobResult::GetResult( funcio_calculBlob *evaluador ) const +{ + if( GetNumBlobs() <= 0 ) + { + return double_vector(); + } + + // definim el resultat + double_vector result = double_vector( GetNumBlobs() ); + // i iteradors sobre els blobs i el resultat + double_vector::iterator itResult = result.GetIterator(); + blob_vector::const_iterator itBlobs = m_blobs.begin(); + + // avaluem la funci� en tots els blobs + while( itBlobs != m_blobs.end() ) + { + *itResult = (*evaluador)(**itBlobs); + itBlobs++; + itResult++; + } + return result; +} +#endif + +/** +- FUNCI�: GetSTLResult +- FUNCIONALITAT: Calcula el resultat especificat sobre tots els blobs de la classe +- PAR�METRES: +- evaluador: Qualsevol objecte derivat de COperadorBlob +- RESULTAT: +- Retorna un array de double's STL amb el resultat per cada blob +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: GetResult +- FUNCTIONALITY: Computes the function evaluador on all the blobs of the class +and returns a vector with the result +- PARAMETERS: +- evaluador: function to apply to each blob (any object derived from the +COperadorBlob class ) +- RESULT: +- vector with all the results in the same order as the blobs +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double_stl_vector CBlobResult::GetSTLResult( funcio_calculBlob *evaluador ) const +{ + if( GetNumBlobs() <= 0 ) + { + return double_stl_vector(); + } + + // definim el resultat + double_stl_vector result = double_stl_vector( GetNumBlobs() ); + // i iteradors sobre els blobs i el resultat + double_stl_vector::iterator itResult = result.begin(); + blob_vector::const_iterator itBlobs = m_blobs.begin(); + + // avaluem la funci� en tots els blobs + while( itBlobs != m_blobs.end() ) + { + *itResult = (*evaluador)(**itBlobs); + itBlobs++; + itResult++; + } + return result; +} + +/** +- FUNCI�: GetNumber +- FUNCIONALITAT: Calcula el resultat especificat sobre un �nic blob de la classe +- PAR�METRES: +- evaluador: Qualsevol objecte derivat de COperadorBlob +- indexblob: n�mero de blob del que volem calcular el resultat. +- RESULTAT: +- Retorna un double amb el resultat +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: GetNumber +- FUNCTIONALITY: Computes the function evaluador on a blob of the class +- PARAMETERS: +- indexBlob: index of the blob to compute the function +- evaluador: function to apply to each blob (any object derived from the +COperadorBlob class ) +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobResult::GetNumber( int indexBlob, funcio_calculBlob *evaluador ) const +{ + if( indexBlob < 0 || indexBlob >= GetNumBlobs() ) + RaiseError( EXCEPTION_BLOB_OUT_OF_BOUNDS ); + return (*evaluador)( *m_blobs[indexBlob] ); +} + +/////////////////////////// FILTRAT DE BLOBS //////////////////////////////////// + +/** +- FUNCI�: Filter +- FUNCIONALITAT: Filtra els blobs de la classe i deixa el resultat amb nom�s +els blobs que han passat el filtre. +El filtrat es basa en especificar condicions sobre un resultat dels blobs +i seleccionar (o excloure) aquells blobs que no compleixen una determinada +condicio +- PAR�METRES: +- dst: variable per deixar els blobs filtrats +- filterAction: acci� de filtrat. Incloure els blobs trobats (B_INCLUDE), +o excloure els blobs trobats (B_EXCLUDE) +- evaluador: Funci� per evaluar els blobs (qualsevol objecte derivat de COperadorBlob +- Condition: tipus de condici� que ha de superar la mesura (FilterType) +sobre cada blob per a ser considerat. +B_EQUAL,B_NOT_EQUAL,B_GREATER,B_LESS,B_GREATER_OR_EQUAL, +B_LESS_OR_EQUAL,B_INSIDE,B_OUTSIDE +- LowLimit: valor num�ric per a la comparaci� (Condition) de la mesura (FilterType) +- HighLimit: valor num�ric per a la comparaci� (Condition) de la mesura (FilterType) +(nom�s t� sentit per a aquelles condicions que tenen dos valors +(B_INSIDE, per exemple). +- RESULTAT: +- Deixa els blobs resultants del filtrat a destination +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: Filter +- FUNCTIONALITY: Get some blobs from the class based on conditions on measures +of the blobs. +- PARAMETERS: +- dst: where to store the selected blobs +- filterAction: B_INCLUDE: include the blobs which pass the filter in the result +B_EXCLUDE: exclude the blobs which pass the filter in the result +- evaluador: Object to evaluate the blob +- Condition: How to decide if the result returned by evaluador on each blob +is included or not. It can be: +B_EQUAL,B_NOT_EQUAL,B_GREATER,B_LESS,B_GREATER_OR_EQUAL, +B_LESS_OR_EQUAL,B_INSIDE,B_OUTSIDE +- LowLimit: numerical value to evaluate the Condition on evaluador(blob) +- HighLimit: numerical value to evaluate the Condition on evaluador(blob). +Only useful for B_INSIDE and B_OUTSIDE +- RESULT: +- It returns on dst the blobs that accomplish (B_INCLUDE) or discards (B_EXCLUDE) +the Condition on the result returned by evaluador on each blob +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +void CBlobResult::Filter(CBlobResult &dst, + int filterAction, + funcio_calculBlob *evaluador, + int condition, + double lowLimit, double highLimit /*=0*/) + +{ + int i, numBlobs; + bool resultavaluacio; + double_stl_vector avaluacioBlobs; + double_stl_vector::iterator itavaluacioBlobs; + + if( GetNumBlobs() <= 0 ) return; + if( !evaluador ) return; + //avaluem els blobs amb la funci� pertinent + avaluacioBlobs = GetSTLResult(evaluador); + itavaluacioBlobs = avaluacioBlobs.begin(); + numBlobs = GetNumBlobs(); + switch(condition) + { + case B_EQUAL: + for(i=0;i<numBlobs;i++, itavaluacioBlobs++) + { + resultavaluacio= *itavaluacioBlobs == lowLimit; + if( ( resultavaluacio && filterAction == B_INCLUDE ) || + ( !resultavaluacio && filterAction == B_EXCLUDE )) + { + dst.m_blobs.push_back( new CBlob( GetBlob( i ) )); + } + } + break; + case B_NOT_EQUAL: + for(i=0;i<numBlobs;i++, itavaluacioBlobs++) + { + resultavaluacio = *itavaluacioBlobs != lowLimit; + if( ( resultavaluacio && filterAction == B_INCLUDE ) || + ( !resultavaluacio && filterAction == B_EXCLUDE )) + { + dst.m_blobs.push_back( new CBlob( GetBlob( i ) )); + } + } + break; + case B_GREATER: + for(i=0;i<numBlobs;i++, itavaluacioBlobs++) + { + resultavaluacio= *itavaluacioBlobs > lowLimit; + if( ( resultavaluacio && filterAction == B_INCLUDE ) || + ( !resultavaluacio && filterAction == B_EXCLUDE )) + { + dst.m_blobs.push_back( new CBlob( GetBlob( i ) )); + } + } + break; + case B_LESS: + for(i=0;i<numBlobs;i++, itavaluacioBlobs++) + { + resultavaluacio= *itavaluacioBlobs < lowLimit; + if( ( resultavaluacio && filterAction == B_INCLUDE ) || + ( !resultavaluacio && filterAction == B_EXCLUDE )) + { + dst.m_blobs.push_back( new CBlob( GetBlob( i ) )); + } + } + break; + case B_GREATER_OR_EQUAL: + for(i=0;i<numBlobs;i++, itavaluacioBlobs++) + { + resultavaluacio= *itavaluacioBlobs>= lowLimit; + if( ( resultavaluacio && filterAction == B_INCLUDE ) || + ( !resultavaluacio && filterAction == B_EXCLUDE )) + { + dst.m_blobs.push_back( new CBlob( GetBlob( i ) )); + } + } + break; + case B_LESS_OR_EQUAL: + for(i=0;i<numBlobs;i++, itavaluacioBlobs++) + { + resultavaluacio= *itavaluacioBlobs <= lowLimit; + if( ( resultavaluacio && filterAction == B_INCLUDE ) || + ( !resultavaluacio && filterAction == B_EXCLUDE )) + { + dst.m_blobs.push_back( new CBlob( GetBlob( i ) )); + } + } + break; + case B_INSIDE: + for(i=0;i<numBlobs;i++, itavaluacioBlobs++) + { + resultavaluacio=( *itavaluacioBlobs >= lowLimit) && ( *itavaluacioBlobs <= highLimit); + if( ( resultavaluacio && filterAction == B_INCLUDE ) || + ( !resultavaluacio && filterAction == B_EXCLUDE )) + { + dst.m_blobs.push_back( new CBlob( GetBlob( i ) )); + } + } + break; + case B_OUTSIDE: + for(i=0;i<numBlobs;i++, itavaluacioBlobs++) + { + resultavaluacio=( *itavaluacioBlobs < lowLimit) || ( *itavaluacioBlobs > highLimit); + if( ( resultavaluacio && filterAction == B_INCLUDE ) || + ( !resultavaluacio && filterAction == B_EXCLUDE )) + { + dst.m_blobs.push_back( new CBlob( GetBlob( i ) )); + } + } + break; + } + + + // en cas de voler filtrar un CBlobResult i deixar-ho en el mateix CBlobResult + // ( operacio inline ) + if( &dst == this ) + { + // esborrem els primers blobs ( que s�n els originals ) + // ja que els tindrem replicats al final si passen el filtre + blob_vector::iterator itBlobs = m_blobs.begin(); + for( int i = 0; i < numBlobs; i++ ) + { + delete *itBlobs; + itBlobs++; + } + m_blobs.erase( m_blobs.begin(), itBlobs ); + } +} + + +/** +- FUNCI�: GetBlob +- FUNCIONALITAT: Retorna un blob si aquest existeix (index != -1) +- PAR�METRES: +- indexblob: index del blob a retornar +- RESULTAT: +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/* +- FUNCTION: GetBlob +- FUNCTIONALITY: Gets the n-th blob (without ordering the blobs) +- PARAMETERS: +- indexblob: index in the blob array +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +CBlob CBlobResult::GetBlob(int indexblob) const +{ + if( indexblob < 0 || indexblob >= GetNumBlobs() ) + RaiseError( EXCEPTION_BLOB_OUT_OF_BOUNDS ); + + return *m_blobs[indexblob]; +} +CBlob *CBlobResult::GetBlob(int indexblob) +{ + if( indexblob < 0 || indexblob >= GetNumBlobs() ) + RaiseError( EXCEPTION_BLOB_OUT_OF_BOUNDS ); + + return m_blobs[indexblob]; +} + +/** +- FUNCI�: GetNthBlob +- FUNCIONALITAT: Retorna l'en�ssim blob segons un determinat criteri +- PAR�METRES: +- criteri: criteri per ordenar els blobs (objectes derivats de COperadorBlob) +- nBlob: index del blob a retornar +- dst: on es retorna el resultat +- RESULTAT: +- retorna el blob nBlob a dst ordenant els blobs de la classe segons el criteri +en ordre DESCENDENT. Per exemple, per obtenir el blob major: +GetNthBlob( CBlobGetArea(), 0, blobMajor ); +GetNthBlob( CBlobGetArea(), 1, blobMajor ); (segon blob m�s gran) +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/* +- FUNCTION: GetNthBlob +- FUNCTIONALITY: Gets the n-th blob ordering first the blobs with some criteria +- PARAMETERS: +- criteri: criteria to order the blob array +- nBlob: index of the returned blob in the ordered blob array +- dst: where to store the result +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +void CBlobResult::GetNthBlob( funcio_calculBlob *criteri, int nBlob, CBlob &dst ) const +{ + // verifiquem que no estem accedint fora el vector de blobs + if( nBlob < 0 || nBlob >= GetNumBlobs() ) + { + //RaiseError( EXCEPTION_BLOB_OUT_OF_BOUNDS ); + dst = CBlob(); + return; + } + + double_stl_vector avaluacioBlobs, avaluacioBlobsOrdenat; + double valorEnessim; + + //avaluem els blobs amb la funci� pertinent + avaluacioBlobs = GetSTLResult(criteri); + + avaluacioBlobsOrdenat = double_stl_vector( GetNumBlobs() ); + + // obtenim els nBlob primers resultats (en ordre descendent) + std::partial_sort_copy( avaluacioBlobs.begin(), + avaluacioBlobs.end(), + avaluacioBlobsOrdenat.begin(), + avaluacioBlobsOrdenat.end(), + std::greater<double>() ); + + valorEnessim = avaluacioBlobsOrdenat[nBlob]; + + // busquem el primer blob que t� el valor n-ssim + double_stl_vector::const_iterator itAvaluacio = avaluacioBlobs.begin(); + + bool trobatBlob = false; + int indexBlob = 0; + while( itAvaluacio != avaluacioBlobs.end() && !trobatBlob ) + { + if( *itAvaluacio == valorEnessim ) + { + trobatBlob = true; + dst = CBlob( GetBlob(indexBlob)); + } + itAvaluacio++; + indexBlob++; + } +} + +/** +- FUNCI�: ClearBlobs +- FUNCIONALITAT: Elimina tots els blobs de l'objecte +- PAR�METRES: +- RESULTAT: +- Allibera tota la mem�ria dels blobs +- RESTRICCIONS: +- AUTOR: Ricard Borr�s Navarra +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/* +- FUNCTION: ClearBlobs +- FUNCTIONALITY: Clears all the blobs from the object and releases all its memory +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +void CBlobResult::ClearBlobs() +{ + /*for( int i = 0; i < GetNumBlobs(); i++ ) + { + delete m_blobs[i]; + }*/ + blob_vector::iterator itBlobs = m_blobs.begin(); + while( itBlobs != m_blobs.end() ) + { + delete *itBlobs; + itBlobs++; + } + + m_blobs.clear(); +} + +/** +- FUNCI�: RaiseError +- FUNCIONALITAT: Funci� per a notificar errors al l'usuari (en debug) i llen�a +les excepcions +- PAR�METRES: +- errorCode: codi d'error +- RESULTAT: +- Ensenya un missatge a l'usuari (en debug) i llen�a una excepci� +- RESTRICCIONS: +- AUTOR: Ricard Borr�s Navarra +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/* +- FUNCTION: RaiseError +- FUNCTIONALITY: Error handling function +- PARAMETERS: +- errorCode: reason of the error +- RESULT: +- in _DEBUG version, shows a message box with the error. In release is silent. +In both cases throws an exception with the error. +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +void CBlobResult::RaiseError(const int errorCode) const +{ + // estem en mode debug? +#ifdef _DEBUG + CString msg, format = "Error en CBlobResult: %s"; + + switch (errorCode) + { + case EXCEPTION_BLOB_OUT_OF_BOUNDS: + msg.Format(format, "Intentant accedir a un blob no existent"); + break; + default: + msg.Format(format, "Codi d'error desconegut"); + break; + } + + AfxMessageBox(msg); + +#endif + throw errorCode; +} + + + +/************************************************************************** +Auxiliars / Auxiliary functions +**************************************************************************/ + + +/** +- FUNCI�: PrintBlobs +- FUNCIONALITAT: Escriu els par�metres (�rea, per�metre, exterior, mitjana) +de tots els blobs a un fitxer. +- PAR�METRES: +- nom_fitxer: path complet del fitxer amb el resultat +- RESULTAT: +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/* +- FUNCTION: PrintBlobs +- FUNCTIONALITY: Prints some blob features in an ASCII file +- PARAMETERS: +- nom_fitxer: full path + filename to generate +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +void CBlobResult::PrintBlobs( char *nom_fitxer ) const +{ + double_stl_vector area, /*perimetre,*/ exterior, mitjana, compacitat, longitud, + externPerimeter, perimetreConvex, perimetre; + int i; + FILE *fitxer_sortida; + + area = GetSTLResult( CBlobGetArea()); + perimetre = GetSTLResult( CBlobGetPerimeter()); + exterior = GetSTLResult( CBlobGetExterior()); + mitjana = GetSTLResult( CBlobGetMean()); + compacitat = GetSTLResult(CBlobGetCompactness()); + longitud = GetSTLResult( CBlobGetLength()); + externPerimeter = GetSTLResult( CBlobGetExternPerimeter()); + perimetreConvex = GetSTLResult( CBlobGetHullPerimeter()); + + fitxer_sortida = fopen( nom_fitxer, "w" ); + + for(i=0; i<GetNumBlobs(); i++) + { + fprintf( fitxer_sortida, "blob %d ->\t a=%7.0f\t p=%8.2f (%8.2f extern)\t pconvex=%8.2f\t ext=%.0f\t m=%7.2f\t c=%3.2f\t l=%8.2f\n", + i, area[i], perimetre[i], externPerimeter[i], perimetreConvex[i], exterior[i], mitjana[i], compacitat[i], longitud[i] ); + } + fclose( fitxer_sortida ); + +} + +} diff --git a/package_bgs/jmo/BlobResult.h b/package_bgs/jmo/BlobResult.h new file mode 100644 index 0000000..ef1fd40 --- /dev/null +++ b/package_bgs/jmo/BlobResult.h @@ -0,0 +1,213 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- + * Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/************************************************************************ + BlobResult.h + +FUNCIONALITAT: Definici� de la classe CBlobResult +AUTOR: Inspecta S.L. +MODIFICACIONS (Modificaci�, Autor, Data): + +FUNCTIONALITY: Definition of the CBlobResult class +AUTHOR: Inspecta S.L. +MODIFICATIONS (Modification, Author, Date): + +**************************************************************************/ + + +#if !defined(_CLASSE_BLOBRESULT_INCLUDED) +#define _CLASSE_BLOBRESULT_INCLUDED + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "BlobLibraryConfiguration.h" +#include <math.h> +#include "cxcore.h" + +#ifdef MATRIXCV_ACTIU + #include "matrixCV.h" +#else + // llibreria STL + #include "vector" + //! Vector de doubles + typedef std::vector<double> double_stl_vector; +#endif + +#include <vector> // vectors de la STL +#include <functional> +#include "blob.h" + +/************************************************************************** + Filtres / Filters +**************************************************************************/ + +//! accions que es poden fer amb els filtres +//! Actions performed by a filter (include or exclude blobs) +#define B_INCLUDE 1L +#define B_EXCLUDE 2L + +//! condicions sobre els filtres +//! Conditions to apply the filters +#define B_EQUAL 3L +#define B_NOT_EQUAL 4L +#define B_GREATER 5L +#define B_LESS 6L +#define B_GREATER_OR_EQUAL 7L +#define B_LESS_OR_EQUAL 8L +#define B_INSIDE 9L +#define B_OUTSIDE 10L + + +/************************************************************************** + Excepcions / Exceptions +**************************************************************************/ + +//! Excepcions llen�ades per les funcions: +#define EXCEPTION_BLOB_OUT_OF_BOUNDS 1000 +#define EXCEPCIO_CALCUL_BLOBS 1001 + +namespace Blob +{ + +//! definici� de que es un vector de blobs +typedef std::vector<CBlob*> blob_vector; + +/** + Classe que cont� un conjunt de blobs i permet extreure'n propietats + o filtrar-los segons determinats criteris. + Class to calculate the blobs of an image and calculate some properties + on them. Also, the class provides functions to filter the blobs using + some criteria. +*/ +class CBlobResult +{ +public: + + //! constructor estandard, crea un conjunt buit de blobs + //! Standard constructor, it creates an empty set of blobs + CBlobResult(); + //! constructor a partir d'una imatge + //! Image constructor, it creates an object with the blobs of the image + CBlobResult(IplImage *source, IplImage *mask, int threshold, bool findmoments); + //! constructor de c�pia + //! Copy constructor + CBlobResult( const CBlobResult &source ); + //! Destructor + virtual ~CBlobResult(); + + //! operador = per a fer assignacions entre CBlobResult + //! Assigment operator + CBlobResult& operator=(const CBlobResult& source); + //! operador + per concatenar dos CBlobResult + //! Addition operator to concatenate two sets of blobs + CBlobResult operator+( const CBlobResult& source ); + + //! Afegeix un blob al conjunt + //! Adds a blob to the set of blobs + void AddBlob( CBlob *blob ); + +#ifdef MATRIXCV_ACTIU + //! Calcula un valor sobre tots els blobs de la classe retornant una MatrixCV + //! Computes some property on all the blobs of the class + double_vector GetResult( funcio_calculBlob *evaluador ) const; +#endif + //! Calcula un valor sobre tots els blobs de la classe retornant un std::vector<double> + //! Computes some property on all the blobs of the class + double_stl_vector GetSTLResult( funcio_calculBlob *evaluador ) const; + + //! Calcula un valor sobre un blob de la classe + //! Computes some property on one blob of the class + double GetNumber( int indexblob, funcio_calculBlob *evaluador ) const; + + //! Retorna aquells blobs que compleixen les condicions del filtre en el destination + //! Filters the blobs of the class using some property + void Filter(CBlobResult &dst, + int filterAction, funcio_calculBlob *evaluador, + int condition, double lowLimit, double highLimit = 0 ); + + //! Retorna l'en�ssim blob segons un determinat criteri + //! Sorts the blobs of the class acording to some criteria and returns the n-th blob + void GetNthBlob( funcio_calculBlob *criteri, int nBlob, CBlob &dst ) const; + + //! Retorna el blob en�ssim + //! Gets the n-th blob of the class ( without sorting ) + CBlob GetBlob(int indexblob) const; + CBlob *GetBlob(int indexblob); + + //! Elimina tots els blobs de l'objecte + //! Clears all the blobs of the class + void ClearBlobs(); + + //! Escriu els blobs a un fitxer + //! Prints some features of all the blobs in a file + void PrintBlobs( char *nom_fitxer ) const; + + +//Metodes GET/SET + + //! Retorna el total de blobs + //! Gets the total number of blobs + int GetNumBlobs() const + { + return(m_blobs.size()); + } + + +private: + + //! Funci� per gestionar els errors + //! Function to manage the errors + void RaiseError(const int errorCode) const; + +protected: + + //! Vector amb els blobs + //! Vector with all the blobs + blob_vector m_blobs; +}; + +} + +#endif // !defined(_CLASSE_BLOBRESULT_INCLUDED) + diff --git a/package_bgs/jmo/CMultiLayerBGS.cpp b/package_bgs/jmo/CMultiLayerBGS.cpp new file mode 100644 index 0000000..134a24c --- /dev/null +++ b/package_bgs/jmo/CMultiLayerBGS.cpp @@ -0,0 +1,2128 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- +* Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. The name of the author may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// BackgroundSubtraction.cpp: implementation of the CMultiLayerBGS class. +// +////////////////////////////////////////////////////////////////////// + +#include "CMultiLayerBGS.h" + +#include <ctime> // clock +#include <cstdlib> // C standard library +#include <cstdio> // C I/O (for sscanf) +#include <cstring> // string manipulation +#include <fstream> // file I/O +#include <cmath> // math includes +#include <iostream> // I/O streams + +using namespace Blob; + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CMultiLayerBGS::CMultiLayerBGS() { + m_nMaxLBPModeNum = MAX_LBP_MODE_NUM; + + m_fModeUpdatingLearnRate = MODE_UPDATING_LEARN_RATE; + m_f1_ModeUpdatingLearnRate = 1.0f - m_fModeUpdatingLearnRate; + + m_fWeightUpdatingLearnRate = WEIGHT_UPDATING_LEARN_RATE; + m_f1_WeightUpdatingLearnRate = 1.0f - m_fWeightUpdatingLearnRate; + + m_fRobustColorOffset = ROBUST_COLOR_OFFSET; + + m_fLowInitialModeWeight = LOW_INITIAL_MODE_WEIGHT; + + m_fPatternColorDistBgThreshold = PATTERN_COLOR_DIST_BACKGROUND_THRESHOLD; + m_fPatternColorDistBgUpdatedThreshold = PATTERN_COLOR_DIST_BACKGROUND_THRESHOLD; + + m_fBackgroundModelPercent = BACKGROUND_MODEL_PERCENT; + + m_nPatternDistSmoothNeigHalfSize = PATTERN_DIST_SMOOTH_NEIG_HALF_SIZE; + m_fPatternDistConvGaussianSigma = PATTERN_DIST_CONV_GAUSSIAN_SIGMA; + + m_fRobustShadowRate = ROBUST_SHADOW_RATE; + m_fRobustHighlightRate = ROBUST_HIGHLIGHT_RATE; + + m_nCurImgFrameIdx = 0; + + m_pBkMaskImg = NULL; + + m_bUsedColorLBP = false; + m_bUsedGradImage = false; + + m_fMinLBPBinaryProb = 0.1f; + m_f1_MinLBPBinaryProb = 1.0f - m_fMinLBPBinaryProb; + + m_pOrgImg = m_pFgImg = m_pBgImg = m_pFgMaskImg = m_pBgDistImg = m_pEdgeImg = NULL; + m_ppOrgLBPImgs = NULL; + + m_disableLearning = false; + m_fSigmaS = 3.0f; + m_fSigmaR = 0.1f; + + m_fTextureWeight = 0.5f; + m_fColorWeight = 1.0f - m_fTextureWeight; + + m_fWeightUpdatingConstant = 5.0f; + + m_fReliableBackgroundModeWeight = 0.9f; + + //m_fMinBgLayerWeight = m_fLowInitialModeWeight/50.0f; + m_fMinBgLayerWeight = 0.0001f; + //m_fMinBgLayerWeight = 0.88f; + + m_fMinNoisedAngle = 3.0f / 180.0f * PI; + m_fMinNoisedAngleSine = sinf(m_fMinNoisedAngle); + + m_fFrameDuration = 1.0f / 25.0f; /* 25 frames per second */ + + m_fModeUpdatingLearnRatePerSecond = 0.2f; + m_fWeightUpdatingLearnRatePerSecond = 0.2f; + + m_pROI = NULL; +} + +CMultiLayerBGS::~CMultiLayerBGS() { + int img_length = m_cvImgSize.height * m_cvImgSize.width; + PixelLBPStruct* PLBP = m_pPixelLBPs; + for (int yx = 0; yx < img_length; yx++) { + delete (*PLBP).cur_intensity; + delete (*PLBP).cur_pattern; + delete (*PLBP).lbp_idxes; + for (int a = 0; a < m_nMaxLBPModeNum; a++) { + delete (*PLBP).LBPs[a].bg_intensity; + delete (*PLBP).LBPs[a].max_intensity; + delete (*PLBP).LBPs[a].min_intensity; + delete (*PLBP).LBPs[a].bg_pattern; + } + delete (*PLBP).LBPs; + PLBP++; + } + delete m_pPixelLBPs; + + /* release memories */ + if (m_pFgImg != NULL) + cvReleaseImage(&m_pFgImg); + if (m_pBgImg != NULL) + cvReleaseImage(&m_pBgImg); + if (m_pBgDistImg != NULL) + cvReleaseImage(&m_pBgDistImg); + if (m_ppOrgLBPImgs != NULL) { + int a; + for (a = 0; a < m_nLBPImgNum; a++) + cvReleaseImage(&m_ppOrgLBPImgs[a]); + delete [] m_ppOrgLBPImgs; + } + if (m_pEdgeImg) + cvReleaseImage(&m_pEdgeImg); +} + +void CMultiLayerBGS::ResetAllParameters() { + m_f1_ModeUpdatingLearnRate = 1.0f - m_fModeUpdatingLearnRate; + m_f1_WeightUpdatingLearnRate = 1.0f - m_fWeightUpdatingLearnRate; + m_f1_MinLBPBinaryProb = 1.0f - m_fMinLBPBinaryProb; + + m_fColorWeight = 1.0f - m_fTextureWeight; + + m_fMinNoisedAngleSine = sinf(m_fMinNoisedAngle); + + //m_fMinBgLayerWeight = m_fLowInitialModeWeight/50.0f; + m_fMinBgLayerWeight = 0.0001f; + + m_cLBP.m_fRobustWhiteNoise = m_fRobustColorOffset; +} + +void CMultiLayerBGS::MergeImages(int num, ...) { + if (num < 1 || num > 9) { + printf("Error: the number %d of merging images.\n", num); + exit(0); + } + + int nCols = 0, nRows = 0; + switch (num) { + case 1: nCols = nRows = 1; + break; + case 2: nCols = 1; + nRows = 2; + break; + case 3: + case 4: nCols = 2; + nRows = 2; + break; + case 5: + case 6: nCols = 3; + nRows = 2; + break; + case 7: + case 8: + case 9: nCols = 3; + nRows = 3; + break; + } + + int a, b; + + IplImage** ppIplImg = new IplImage*[num + 1]; + + va_list arg_ptr; + va_start(arg_ptr, num); + for (a = 0; a < num + 1; a++) + ppIplImg[a] = va_arg(arg_ptr, IplImage*); + va_end(arg_ptr); + + CvRect imgROIRect; + CvSize imgSize = cvGetSize(ppIplImg[0]); + if (ppIplImg[num] == NULL) { // for the output video + ppIplImg[num] = cvCreateImage(cvSize(imgSize.width*nCols, imgSize.height * nRows), IPL_DEPTH_8U, ppIplImg[0]->nChannels); + } + + int img_idx = 0; + for (a = 0; a < nRows; a++) + for (b = 0; b < nCols; b++) { + if (img_idx >= num) + break; + + imgROIRect = cvRect(b * imgSize.width, a * imgSize.height, imgSize.width, imgSize.height); + + cvSetImageROI(ppIplImg[num], imgROIRect); + cvCopyImage(ppIplImg[img_idx++], ppIplImg[num]); + cvResetImageROI(ppIplImg[num]); + } + + delete [] ppIplImg; +} + +void CMultiLayerBGS::Update_MAX_MIN_Intensity(unsigned char *cur_intensity, float *max_intensity, float *min_intensity) { + int a; + float curI; + for (a = 0; a < m_nChannel; a++) { + curI = (float) cur_intensity[a]; + + min_intensity[a] = MIN(curI, min_intensity[a]); + max_intensity[a] = MAX(curI, max_intensity[a]); + } +} + +void CMultiLayerBGS::UpdateBgPixelColor(unsigned char *cur_intensity, float* bg_intensity) { + int a; + for (a = 0; a < m_nChannel; a++) + bg_intensity[a] = m_f1_ModeUpdatingLearnRate * bg_intensity[a] + m_fModeUpdatingLearnRate * (float) cur_intensity[a]; +} + +void CMultiLayerBGS::UpdateBgPixelPattern(float *cur_pattern, float *bg_pattern) { + int a; + for (a = 0; a < m_nLBPLength; a++) + bg_pattern[a] = m_f1_ModeUpdatingLearnRate * bg_pattern[a] + m_fModeUpdatingLearnRate * cur_pattern[a]; +} + +/* sort everything inbetween `low' <-> `high' */ +void CMultiLayerBGS::QuickSort(float *pData, unsigned short *pIdxes, long low, long high, bool bAscent) { + long i = low; + long j = high; + float y = 0; + int idx = 0; + + /* compare value */ + float z = pData[(low + high) / 2]; + + /* partition */ + do { + if (bAscent) { + /* find member above ... */ + while (pData[i] < z) i++; + + /* find element below ... */ + while (pData[j] > z) j--; + } else { + /* find member below ... */ + while (pData[i] > z) i++; + + /* find element above ... */ + while (pData[j] < z) j--; + } + + if (i <= j) { + /* swap two elements */ + y = pData[i]; + pData[i] = pData[j]; + pData[j] = y; + + idx = pIdxes[i]; + pIdxes[i] = pIdxes[j]; + pIdxes[j] = idx; + + i++; + j--; + } + } while (i <= j); + + /* recurse */ + if (low < j) + QuickSort(pData, pIdxes, low, j, bAscent); + + if (i < high) + QuickSort(pData, pIdxes, i, high, bAscent); +} + +float CMultiLayerBGS::DistLBP(LBPStruct *LBP1, LBPStruct *LBP2) { + int a; + + float pattern_dist = 0; + for (a = 0; a < m_nLBPLength; a++) { + pattern_dist = fabsf(LBP1->bg_pattern[a] - LBP1->bg_pattern[a]); + } + pattern_dist /= (float) m_nLBPLength; + + float color_dist = 0; + for (a = 0; a < m_nChannel; a++) { + color_dist += fabsf((float) LBP1->bg_intensity[a]-(float) LBP2->bg_intensity[a]); + } + color_dist /= 3.0f * 125.0f; + + //return MAX(pattern_dist, color_dist); + return color_dist; +} + +void CMultiLayerBGS::SetNewImage(IplImage *new_img, CvRect *roi) { + m_pOrgImg = new_img; + m_pROI = roi; + if (roi && (roi->width <= 0 || roi->height <= 0)) + return; + + if (roi) { + cvSetImageROI(m_pOrgImg, *roi); + for (int a = 0; a < m_nLBPImgNum; a++) + cvSetImageROI(m_ppOrgLBPImgs[a], *roi); + } + + switch (m_nLBPImgNum) { + case 1: + cvCvtColor(m_pOrgImg, m_ppOrgLBPImgs[0], CV_BGR2GRAY); + break; + case 2: + cvCvtColor(m_pOrgImg, m_ppOrgLBPImgs[0], CV_BGR2GRAY); + ComputeGradientImage(m_ppOrgLBPImgs[0], m_ppOrgLBPImgs[1], false); + break; + case 3: + cvSplit(m_pOrgImg, m_ppOrgLBPImgs[0], m_ppOrgLBPImgs[1], m_ppOrgLBPImgs[2], NULL); + break; + case 4: + cvSplit(m_pOrgImg, m_ppOrgLBPImgs[0], m_ppOrgLBPImgs[1], m_ppOrgLBPImgs[2], NULL); + ComputeGradientImage(m_ppOrgLBPImgs[0], m_ppOrgLBPImgs[3], false); + break; + } + + if (roi) { + cvResetImageROI(m_pOrgImg); + for (int a = 0; a < m_nLBPImgNum; a++) + cvResetImageROI(m_ppOrgLBPImgs[a]); + } + m_cLBP.SetNewImages(m_ppOrgLBPImgs); + + m_nCurImgFrameIdx++; +} + +void CMultiLayerBGS::SetBkMaskImage(IplImage *mask_img) { + if (m_pBkMaskImg == NULL) { + m_pBkMaskImg = cvCreateImage(cvGetSize(mask_img), mask_img->depth, mask_img->nChannels); + } + cvCopyImage(mask_img, m_pBkMaskImg); +} + +void CMultiLayerBGS::BackgroundSubtractionProcess() { + CvRect *roi = m_pROI; + + if (roi && (roi->width <= 0 || roi->height <= 0)) + return; + LBPStruct* LBPs; + unsigned int bg_num; + float* cur_pattern; + unsigned char* cur_intensity; + int a, b; + unsigned int lbp_num; + unsigned short* lbp_idxes; + unsigned short cur_lbp_idx; + bool bBackgroundUpdating; + + PixelLBPStruct *PLBP = m_pPixelLBPs; + + bool bFirstFrame = (PLBP[0].num == 0); + float best_match_bg_dist, bg_pattern_dist, bg_color_dist, bg_pattern_color_dist; + + // compute the local binary pattern + if (m_fTextureWeight > 0) + m_cLBP.ComputeLBP(PLBP, roi); + + LBPStruct* curLBP; + + int data_length; + + if (roi) + data_length = roi->width * roi->height; + else + data_length = m_cvImgSize.width * m_cvImgSize.height; + + int best_match_idx; + + COpencvDataConversion<uchar, uchar> ODC1; + if (roi) { + cvSetImageROI(m_pBkMaskImg, *roi); + cvSetImageROI(m_pOrgImg, *roi); + } + uchar *_mask = ODC1.GetImageData(m_pBkMaskImg); + uchar *_org_intensity = ODC1.GetImageData(m_pOrgImg); + + if (roi) { + cvResetImageROI(m_pBkMaskImg); + cvResetImageROI(m_pOrgImg); + } + + COpencvDataConversion<float, float> ODC2; + float *_bg_dist = new float[data_length]; + + uchar *mask = _mask; + uchar *org_intensity = _org_intensity; + float *bg_dist = _bg_dist; + + bool removed_modes[10]; + + // scanning the point via first x-axis and then y-axis + int x, y; + + for (y = 0; y < (roi ? roi->height : m_cvImgSize.height); y++) { + if (roi) + PLBP = m_pPixelLBPs + (roi->y + y) * m_cvImgSize.width + roi->x; + else + PLBP = m_pPixelLBPs + y * m_cvImgSize.width; + + for (x = 0; x < (roi ? roi->width : m_cvImgSize.width); x++) { + // check whether the current pixel is the pixel to be modeled + if (*mask++ == 0) { + PLBP++; + *bg_dist++ = 0.0f; //m_fPatternColorDistBgThreshold*1.01f; + org_intensity += m_nChannel; + continue; + } + + // removing the background layers + if (!m_disableLearning) { + RemoveBackgroundLayers(PLBP); + } + + // check whether the current image is the first image + bFirstFrame = ((*PLBP).num == 0); + + // get lbp information + lbp_num = (*PLBP).num; + LBPs = (*PLBP).LBPs; + lbp_idxes = (*PLBP).lbp_idxes; + + (*PLBP).cur_bg_layer_no = 0; + + // set the current pixel's intensity + cur_intensity = (*PLBP).cur_intensity; + for (a = 0; a < m_nChannel; a++) + cur_intensity[a] = *org_intensity++; + + // get the current lbp pattern + cur_pattern = (*PLBP).cur_pattern; + + // first check whether the pixel is background or foreground and then update the background pattern model + if (lbp_num == 0) { // empty pattern list + curLBP = (&(LBPs[0])); + for (a = 0; a < m_nLBPLength; a++) { + curLBP->bg_pattern[a] = (float) cur_pattern[a]; + } + + curLBP->bg_layer_num = 0; + curLBP->weight = m_fLowInitialModeWeight; + curLBP->max_weight = m_fLowInitialModeWeight; + + curLBP->first_time = m_nCurImgFrameIdx; + curLBP->last_time = m_nCurImgFrameIdx; + curLBP->freq = 1; + + (*PLBP).matched_mode_first_time = (float) m_nCurImgFrameIdx; + + for (a = 0; a < m_nChannel; a++) { + curLBP->bg_intensity[a] = (float) cur_intensity[a]; + curLBP->min_intensity[a] = (float) cur_intensity[a]; + curLBP->max_intensity[a] = (float) cur_intensity[a]; + } + + lbp_idxes[0] = 0; + + lbp_num++; + (*PLBP).num = 1; + (*PLBP).bg_num = 1; + + PLBP++; + *bg_dist++ = 0.0f; + continue; + } else { // not empty pattern list + /* + // remove the background layers + // end of removing the background layer + */ + + best_match_idx = -1; + best_match_bg_dist = 999.0f; + + // find the best match + for (a = 0; a < (int) lbp_num; a++) { + // get the current index for lbp pattern + cur_lbp_idx = lbp_idxes[a]; + + // get the current LBP pointer + curLBP = &(LBPs[cur_lbp_idx]); + + // compute the background probability based on lbp pattern + bg_pattern_dist = 0.0f; + if (m_fTextureWeight > 0) + bg_pattern_dist = CalPatternBgDist(cur_pattern, curLBP->bg_pattern); + + // compute the color invariant probability based on RGB color + bg_color_dist = 0.0f; + if (m_fColorWeight > 0) + bg_color_dist = CalColorBgDist(cur_intensity, curLBP->bg_intensity, curLBP->max_intensity, curLBP->min_intensity); + + // compute the joint background probability + //bg_pattern_color_dist = sqrtf(bg_color_dist*bg_pattern_dist); + + //UpdatePatternColorDistWeights(cur_pattern, curLBP->bg_pattern); + + bg_pattern_color_dist = m_fColorWeight * bg_color_dist + m_fTextureWeight*bg_pattern_dist; + //bg_pattern_color_dist = MAX(bg_color_dist, bg_pattern_dist); + + //bg_pattern_color_dist = 1.0f - (1.0f-bg_color_dist)*(1.0-bg_pattern_dist); + //bg_pattern_color_dist = bg_pattern_dist; + + //bg_pattern_color_dist = bg_color_dist; + + if (bg_pattern_color_dist < best_match_bg_dist) { + best_match_bg_dist = bg_pattern_color_dist; + best_match_idx = a; + } + } + + bg_num = (*PLBP).bg_num; + + // check + bBackgroundUpdating = ((best_match_bg_dist < m_fPatternColorDistBgUpdatedThreshold)); + + // reset the weight of the mode + if (best_match_idx >= (int) bg_num && LBPs[lbp_idxes[best_match_idx]].max_weight < m_fReliableBackgroundModeWeight) // found not in the background models + best_match_bg_dist = MAX(best_match_bg_dist, m_fPatternColorDistBgThreshold * 2.5f); + + *bg_dist = best_match_bg_dist; + } + if (m_disableLearning) { + // no creation or update when learning is disabled + } else if (!bBackgroundUpdating) { // no match + + for (a = 0; a < (int) lbp_num; a++) { // decrease the weights + curLBP = &(LBPs[lbp_idxes[a]]); + curLBP->weight *= (1.0f - m_fWeightUpdatingLearnRate / (1.0f + m_fWeightUpdatingConstant * curLBP->max_weight)); + } + + if ((int) lbp_num < m_nMaxLBPModeNum) { // add a new pattern + // find the pattern index for addition + int add_lbp_idx = 0; + bool bFound; + for (a = 0; a < m_nMaxLBPModeNum; a++) { + bFound = true; + for (b = 0; b < (int) lbp_num; b++) + bFound &= (a != lbp_idxes[b]); + if (bFound) { + add_lbp_idx = a; + break; + } + } + curLBP = &(LBPs[add_lbp_idx]); + + curLBP->first_time = m_nCurImgFrameIdx; + curLBP->last_time = m_nCurImgFrameIdx; + curLBP->freq = 1; + curLBP->layer_time = -1; + + (*PLBP).matched_mode_first_time = (float) m_nCurImgFrameIdx; + + for (a = 0; a < m_nLBPLength; a++) { + curLBP->bg_pattern[a] = (float) cur_pattern[a]; + } + + curLBP->bg_layer_num = 0; + curLBP->weight = m_fLowInitialModeWeight; + curLBP->max_weight = m_fLowInitialModeWeight; + + for (a = 0; a < m_nChannel; a++) { + curLBP->bg_intensity[a] = (float) cur_intensity[a]; + curLBP->min_intensity[a] = (float) cur_intensity[a]; + curLBP->max_intensity[a] = (float) cur_intensity[a]; + } + + lbp_idxes[lbp_num] = add_lbp_idx; + + lbp_num++; + (*PLBP).num = lbp_num; + } else { // replacing the pattern with the minimal weight + // find the replaced pattern index + /* + int rep_pattern_idx = -1; + for ( a = m_nLBPLength-1 ; a >= 0 ; a-- ) { + if ( LBPs[lbp_idxes[a]].bg_layer_num == 0 ) + rep_pattern_idx = lbp_idxes[a]; + } + if ( rep_pattern_idx < 0 ) { + rep_pattern_idx = lbp_idxes[m_nMaxLBPModeNum-1]; + for ( a = 0 ; a < m_nLBPLength ; a++ ) { + if ( LBPs[lbp_idxes[a]].bg_layer_num > LBPs[rep_pattern_idx].bg_layer_num ) + LBPs[lbp_idxes[a]].bg_layer_num--; + } + } + */ + int rep_pattern_idx = lbp_idxes[m_nMaxLBPModeNum - 1]; + + curLBP = &(LBPs[rep_pattern_idx]); + + curLBP->first_time = m_nCurImgFrameIdx; + curLBP->last_time = m_nCurImgFrameIdx; + curLBP->freq = 1; + curLBP->layer_time = -1; + + (*PLBP).matched_mode_first_time = (float) m_nCurImgFrameIdx; + + for (a = 0; a < m_nLBPLength; a++) { + curLBP->bg_pattern[a] = (float) cur_pattern[a]; + } + + curLBP->bg_layer_num = 0; + curLBP->weight = m_fLowInitialModeWeight; + curLBP->max_weight = m_fLowInitialModeWeight; + + for (a = 0; a < m_nChannel; a++) { + curLBP->bg_intensity[a] = (float) cur_intensity[a]; + curLBP->min_intensity[a] = (float) cur_intensity[a]; + curLBP->max_intensity[a] = (float) cur_intensity[a]; + } + } + } else { // find match + // updating the background pattern model + cur_lbp_idx = lbp_idxes[best_match_idx]; + curLBP = &(LBPs[cur_lbp_idx]); + + curLBP->first_time = MAX(MIN(curLBP->first_time, m_nCurImgFrameIdx), 0); + (*PLBP).matched_mode_first_time = curLBP->first_time; + + curLBP->last_time = m_nCurImgFrameIdx; + curLBP->freq++; + + if (m_fColorWeight > 0) { + // update the color information + UpdateBgPixelColor(cur_intensity, curLBP->bg_intensity); + // update the MAX and MIN color intensity + Update_MAX_MIN_Intensity(cur_intensity, curLBP->max_intensity, curLBP->min_intensity); + } + + // update the texture information + if (m_fTextureWeight > 0) + UpdateBgPixelPattern(cur_pattern, curLBP->bg_pattern); + + + // increase the weight of the best matched mode + float increasing_weight_factor = m_fWeightUpdatingLearnRate * (1.0f + m_fWeightUpdatingConstant * curLBP->max_weight); + curLBP->weight = (1.0f - increasing_weight_factor) * curLBP->weight + increasing_weight_factor; //*expf(-best_match_dist/m_fPatternColorDistBgThreshold); + + // update the maximal weight for the best matched mode + curLBP->max_weight = MAX(curLBP->weight, curLBP->max_weight); + + // calculate the number of background layer + if (curLBP->bg_layer_num > 0) { + bool removed_bg_layers = false; + if (curLBP->weight > curLBP->max_weight * 0.2f) { + for (a = 0; a < (int) lbp_num; a++) { + removed_modes[a] = false; + if (LBPs[lbp_idxes[a]].bg_layer_num > curLBP->bg_layer_num && + LBPs[lbp_idxes[a]].weight < LBPs[lbp_idxes[a]].max_weight * 0.9f) { /* remove layers */ + //LBPs[lbp_idxes[a]].bg_layer_num = 0; + removed_modes[a] = true; + removed_bg_layers = true; + } + } + } + + if (removed_bg_layers) { + RemoveBackgroundLayers(PLBP, removed_modes); + lbp_num = (*PLBP).num; + } + } else if (curLBP->max_weight > m_fReliableBackgroundModeWeight && curLBP->bg_layer_num == 0) { + int max_bg_layer_num = LBPs[lbp_idxes[0]].bg_layer_num; + for (a = 1; a < (int) lbp_num; a++) + max_bg_layer_num = MAX(max_bg_layer_num, LBPs[lbp_idxes[a]].bg_layer_num); + curLBP->bg_layer_num = max_bg_layer_num + 1; + curLBP->layer_time = m_nCurImgFrameIdx; + } + + (*PLBP).cur_bg_layer_no = curLBP->bg_layer_num; + + // decrease the weights of non-best matched modes + for (a = 0; a < (int) lbp_num; a++) { + if (a != best_match_idx) { + curLBP = &(LBPs[lbp_idxes[a]]); + curLBP->weight *= (1.0f - m_fWeightUpdatingLearnRate / (1.0f + m_fWeightUpdatingConstant * curLBP->max_weight)); + } + } + } + + // sort the list of modes based on the weights of modes + if ((int) lbp_num > 1 && !m_disableLearning) { + float weights[100], tot_weights = 0; + for (a = 0; a < (int) lbp_num; a++) { + weights[a] = LBPs[lbp_idxes[a]].weight; + tot_weights += weights[a]; + } + + // sort weights in the descent order + QuickSort(weights, lbp_idxes, 0, (int) lbp_num - 1, false); + + // calculate the first potential background modes number, bg_num + float threshold_weight = m_fBackgroundModelPercent*tot_weights; + tot_weights = 0; + for (a = 0; a < (int) lbp_num; a++) { + tot_weights += LBPs[lbp_idxes[a]].weight; + if (tot_weights > threshold_weight) { + bg_num = a + 1; + break; + } + } + (*PLBP).bg_num = bg_num; + } + + PLBP++; + bg_dist++; + } + } + + if (bFirstFrame) { // check whether it is the first frame for background modeling + if (m_pFgMaskImg) + cvSetZero(m_pFgMaskImg); + cvSetZero(m_pBgDistImg); + } else { + // set the image data + if (roi) { + cvSetZero(m_pBgDistImg); + cvSetImageROI(m_pBgDistImg, *roi); + } + ODC2.SetImageData(m_pBgDistImg, _bg_dist); + + // do gaussian smooth + if (m_nPatternDistSmoothNeigHalfSize >= 0) + cvSmooth(m_pBgDistImg, m_pBgDistImg, CV_GAUSSIAN, (2 * m_nPatternDistSmoothNeigHalfSize + 1), (2 * m_nPatternDistSmoothNeigHalfSize + 1), m_fPatternDistConvGaussianSigma); + + if (roi) + cvResetImageROI(m_pBgDistImg); +#ifdef LINUX_BILATERAL_FILTER + // do cross bilateral filter + fprintf(stderr, "%f %f\n", m_fSigmaS, m_fSigmaR); + if (m_fSigmaS > 0 && m_fSigmaR > 0) { + GetFloatEdgeImage(m_ppOrgLBPImgs[0], m_pEdgeImg); + //ComputeGradientImage(m_ppOrgLBPImgs[0], m_pEdgeImg, true); + m_cCrossBF.SetNewImages(m_pBgDistImg, m_pEdgeImg); + m_cCrossBF.FastCrossBF(); + m_cCrossBF.GetFilteredImage(m_pBgDistImg); + } +#endif + + // get the foreground mask by thresholding + if (m_pFgMaskImg) + cvThreshold(m_pBgDistImg, m_pFgMaskImg, m_fPatternColorDistBgThreshold, 255, CV_THRESH_BINARY); + + // get the foreground probability image (uchar) + if (m_pFgProbImg) + GetForegroundProbabilityImage(m_pFgProbImg); + + // do post-processing + //Postprocessing(); + } + + // release memories + delete [] _mask; + delete [] _bg_dist; + delete [] _org_intensity; +} + +void CMultiLayerBGS::GetBackgroundImage(IplImage *bk_img) { + IplImage *bg_img = m_pBgImg; + uchar *c1; + float *c2; + int bg_img_idx; + int channel; + int img_length = m_cvImgSize.height * m_cvImgSize.width; + int yx; + + COpencvDataConversion<uchar, uchar> ODC; + uchar *org_data = ODC.GetImageData(bg_img); + c1 = org_data; + + //c1 = (uchar*)(bg_img->imageData); + + PixelLBPStruct* PLBP = m_pPixelLBPs; + + for (yx = 0; yx < img_length; yx++) { + // the newest background image + bg_img_idx = (*PLBP).lbp_idxes[0]; + if ((*PLBP).num == 0) { + for (channel = 0; channel < m_nChannel; channel++) + *c1++ = 0; + } else { + c2 = (*PLBP).LBPs[bg_img_idx].bg_intensity; + for (channel = 0; channel < m_nChannel; channel++) + *c1++ = cvRound(*c2++); + } + PLBP++; + } + + ODC.SetImageData(bg_img, org_data); + delete [] org_data; + + cvCopyImage(m_pBgImg, bk_img); +} + +void CMultiLayerBGS::GetForegroundImage(IplImage *fg_img, CvScalar bg_color) { + if (m_pROI && (m_pROI->width <= 0 || m_pROI->height <= 0)) + return; + IplImage* org_img; + IplImage* fg_mask_img; // the Mat pointer of the foreground mask matrices at different levels + + org_img = m_pOrgImg; + fg_mask_img = m_pFgMaskImg; + + cvSet(fg_img, bg_color); + if (m_pROI) { + cvSetImageROI(org_img, *m_pROI); + cvSetImageROI(fg_img, *m_pROI); + cvSetImageROI(fg_mask_img, *m_pROI); + cvCopy(org_img, fg_img, fg_mask_img); + cvResetImageROI(org_img); + cvResetImageROI(fg_img); + cvResetImageROI(fg_mask_img); + } else + cvCopy(org_img, fg_img, fg_mask_img); +} + +void CMultiLayerBGS::GetForegroundMaskImage(IplImage *fg_mask_img) { + if (m_pROI && (m_pROI->width <= 0 || m_pROI->height <= 0)) + return; + + //cvCopyImage(m_pFgMaskImg, fg_mask_img); + if (m_pROI) { + cvSetImageROI(m_pFgMaskImg, *m_pROI); + cvSetImageROI(fg_mask_img, *m_pROI); + cvThreshold(m_pFgMaskImg, fg_mask_img, 0, 255, CV_THRESH_BINARY); + cvResetImageROI(m_pFgMaskImg); + cvResetImageROI(fg_mask_img); + } else + cvThreshold(m_pFgMaskImg, fg_mask_img, 0, 255, CV_THRESH_BINARY); +} + +void CMultiLayerBGS::GetForegroundMaskMap(CvMat *fg_mask_mat) { + COpencvDataConversion<uchar, uchar> ODC; + ODC.ConvertData(m_pFgMaskImg, fg_mask_mat); +} + +void CMultiLayerBGS::GetCurrentBackgroundDistMap(CvMat *bk_dist_map) { + cvCopy(m_pBgDistImg, bk_dist_map); +} + +void CMultiLayerBGS::Initialization(IplImage *first_img, int lbp_level_num, float *radiuses, int *neig_pt_nums) { + int a; + + m_nLBPLength = 0; + m_nLBPLevelNum = lbp_level_num; + for (a = 0; a < lbp_level_num; a++) { + m_nLBPLength += neig_pt_nums[a]; + m_pLBPRadiuses[a] = radiuses[a]; + m_pLBPMeigPointNums[a] = neig_pt_nums[a]; + } + + m_pFgImg = NULL; + m_pFgMaskImg = NULL; + m_pBgDistImg = NULL; + m_pOrgImg = NULL; + m_pBgImg = NULL; + m_ppOrgLBPImgs = NULL; + m_pFgProbImg = NULL; + + m_cvImgSize = cvGetSize(first_img); + + m_nChannel = first_img->nChannels; + + m_pOrgImg = first_img; + + if (m_bUsedColorLBP && m_bUsedGradImage) + m_nLBPImgNum = 4; + else if (m_bUsedColorLBP && !m_bUsedGradImage) + m_nLBPImgNum = 3; + else if (!m_bUsedColorLBP && m_bUsedGradImage) + m_nLBPImgNum = 2; + else + m_nLBPImgNum = 1; + + m_nLBPLength *= m_nLBPImgNum; + + m_ppOrgLBPImgs = new IplImage*[m_nLBPImgNum]; + for (a = 0; a < m_nLBPImgNum; a++) + m_ppOrgLBPImgs[a] = cvCreateImage(m_cvImgSize, IPL_DEPTH_8U, 1); + + m_pBgImg = cvCreateImage(m_cvImgSize, IPL_DEPTH_8U, m_nChannel); + m_pFgImg = cvCreateImage(m_cvImgSize, IPL_DEPTH_8U, m_nChannel); + m_pEdgeImg = cvCreateImage(m_cvImgSize, IPL_DEPTH_32F, 1); + m_pBgDistImg = cvCreateImage(m_cvImgSize, IPL_DEPTH_32F, 1); + + ResetAllParameters(); + + int img_length = m_cvImgSize.height * m_cvImgSize.width; + m_pPixelLBPs = new PixelLBPStruct[img_length]; + PixelLBPStruct* PLBP = m_pPixelLBPs; + int yx; + for (yx = 0; yx < img_length; yx++) { + (*PLBP).cur_intensity = new unsigned char[m_nChannel]; + (*PLBP).cur_pattern = new float[m_nLBPLength]; + (*PLBP).LBPs = new LBPStruct[m_nMaxLBPModeNum]; + (*PLBP).lbp_idxes = new unsigned short[m_nMaxLBPModeNum]; + (*PLBP).lbp_idxes[0] = 0; + (*PLBP).num = 0; + (*PLBP).cur_bg_layer_no = 0; + (*PLBP).matched_mode_first_time = 0; + for (a = 0; a < m_nMaxLBPModeNum; a++) { + (*PLBP).LBPs[a].bg_intensity = new float[m_nChannel]; + (*PLBP).LBPs[a].max_intensity = new float[m_nChannel]; + (*PLBP).LBPs[a].min_intensity = new float[m_nChannel]; + (*PLBP).LBPs[a].bg_pattern = new float[m_nLBPLength]; + (*PLBP).LBPs[a].first_time = -1; + (*PLBP).LBPs[a].last_time = -1; + (*PLBP).LBPs[a].freq = -1; + (*PLBP).LBPs[a].layer_time = -1; + } + PLBP++; + } + + m_pBkMaskImg = cvCreateImage(m_cvImgSize, IPL_DEPTH_8U, 1); + cvSet(m_pBkMaskImg, cvScalar(1)); + + m_cLBP.Initialization(m_ppOrgLBPImgs, m_nLBPImgNum, lbp_level_num, radiuses, neig_pt_nums, m_fRobustColorOffset); + +#ifdef LINUX_BILATERAL_FILTER + if (m_fSigmaS > 0 && m_fSigmaR > 0) + m_cCrossBF.Initialization(m_pBgDistImg, m_pBgDistImg, m_fSigmaS, m_fSigmaR); +#endif +} + +float CMultiLayerBGS::CalPatternBgDist(float *cur_pattern, float *bg_pattern) { + float bg_hamming_dist = 0; + int a; + for (a = 0; a < m_nLBPLength; a++) + bg_hamming_dist += fabsf(cur_pattern[a] - bg_pattern[a]) > m_f1_MinLBPBinaryProb; + + bg_hamming_dist /= (float) m_nLBPLength; + + return bg_hamming_dist; +} + +float CMultiLayerBGS::CalColorBgDist(uchar *cur_intensity, float *bg_intensity, float *max_intensity, float *min_intensity) { + float noised_angle, range_dist, bg_color_dist; + + range_dist = CalColorRangeDist(cur_intensity, bg_intensity, max_intensity, min_intensity, m_fRobustShadowRate, m_fRobustHighlightRate); + + if (range_dist == 1.0f) + bg_color_dist = range_dist; + else { + noised_angle = CalVectorsNoisedAngle(bg_intensity, cur_intensity, MAX(m_fRobustColorOffset, 5.0f), m_nChannel); + bg_color_dist = (1.0f - expf(-100.0f * noised_angle * noised_angle)); + } + + //float bg_color_dist = (expf(-100.0f*noised_angle*noised_angle)*(1.0f-range_dist); + + //float bg_color_dist = 0.5f*(1.0f-expf(-noised_angle*noised_angle/0.005f)) + 0.5f*range_dist; + //float bg_color_dist = MAX((float)(noised_angle>0.08f), range_dist); + + return bg_color_dist; +} + +void CMultiLayerBGS::ComputeGradientImage(IplImage *src, IplImage *dst, bool bIsFloat) { + if (src->nChannels != 1 || dst->nChannels != 1) { + printf("Input images error for computing gradient images!"); + exit(1); + } + + int a; + + IplImage* _dX = cvCreateImage(cvGetSize(dst), IPL_DEPTH_16S, 1); + IplImage* _dY = cvCreateImage(cvGetSize(dst), IPL_DEPTH_16S, 1); + + int aperture_size = 3; + + cvSobel(src, _dX, 1, 0, aperture_size); + cvSobel(src, _dY, 0, 1, aperture_size); + + COpencvDataConversion<short, short> ODC1; + COpencvDataConversion<uchar, uchar> ODC2; + COpencvDataConversion<float, float> ODC3; + + short* dX_data = ODC1.GetImageData(_dX); + short* dY_data = ODC1.GetImageData(_dY); + + uchar* dst_u_data = NULL; + float* dst_f_data = NULL; + + if (bIsFloat) + dst_f_data = ODC3.GetImageData(dst); + else + dst_u_data = ODC2.GetImageData(dst); + + short* dX = dX_data; + short* dY = dY_data; + uchar *uSrc = dst_u_data; + float *fSrc = dst_f_data; + + /* + short* dX = (short*)(_dX->imageData); + short* dY = (short*)(_dY->imageData); + uchar *dSrc = (uchar*)(dst->imageData); + */ + + int length; + if (src->roi) + length = dst->width * dst->height; + else + length = dst->roi->width * dst->roi->height; + /* + int x, y; + uchar *x_u_data; + float *x_f_data; + */ + + if (bIsFloat) { + for (a = 0; a < length; a++) { + *fSrc = cvSqrt((float) ((*dX)*(*dX)+(*dY)*(*dY)) / (32.0f * 255.0f)); + fSrc++; + dX++; + dY++; + } + ODC3.SetImageData(dst, dst_f_data); + delete [] dst_f_data; + } else { + for (a = 0; a < length; a++) { + *uSrc = cvRound(cvSqrt((float) ((*dX)*(*dX)+(*dY)*(*dY)) / 32.0f)); + uSrc++; + dX++; + dY++; + } + ODC2.SetImageData(dst, dst_u_data); + delete [] dst_u_data; + } + + delete [] dX_data; + delete [] dY_data; + + cvReleaseImage(&_dX); + cvReleaseImage(&_dY); +} + +float CMultiLayerBGS::CalVectorsNoisedAngle(float *bg_color, unsigned char *noised_color, float offset, int length) { + float org_angle = CalVectorsAngle(bg_color, noised_color, length); + float norm_color = 0, elem, noised_angle; + int a; + for (a = 0; a < length; a++) { + elem = bg_color[a]; + norm_color += elem*elem; + } + norm_color = sqrtf(norm_color); + if (norm_color == 0) + noised_angle = PI; + else { + float sin_angle = offset / norm_color; + if (sin_angle < m_fMinNoisedAngleSine) + noised_angle = m_fMinNoisedAngle; + else + //noised_angle = ( sin_angle >= 1 ? PI : asinf(sin_angle)); + noised_angle = (sin_angle >= 1 ? PI : sin_angle); + } + + float angle = org_angle - noised_angle; + if (angle < 0) + angle = 0; + return angle; + + /* + float org_angle = CalVectorsAngle(bg_color, noised_color, length); + float max_norm_color, bg_norm_color = 0, noised_norm_color = 0, elem, noised_angle; + int a; + for ( a = 0 ; a < length ; a++ ) { + elem = bg_color[a]; + bg_norm_color += elem*elem; + elem = (float)noised_color[a]; + noised_norm_color += elem*elem; + } + max_norm_color = MIN(bg_norm_color, noised_norm_color); + max_norm_color = sqrtf(max_norm_color); + if ( max_norm_color == 0 ) + noised_angle = PI; + else { + float sin_angle = offset/max_norm_color; + noised_angle = ( sin_angle >= 1 ? PI : asinf(sin_angle)); + } + + float angle = org_angle-noised_angle; + if ( angle < 0 ) + angle = 0; + return angle; + */ +} + +float CMultiLayerBGS::CalVectorsAngle(float *c1, unsigned char *c2, int length) { + float angle; + float dot2, norm1, norm2, elem1, elem2; + + dot2 = norm1 = norm2 = 0; + + int a; + for (a = 0; a < length; a++) { + elem1 = (float) (c1[a]); + elem2 = (float) (c2[a]); + dot2 += elem1*elem2; + norm1 += elem1*elem1; + norm2 += elem2*elem2; + } + + //angle = (norm1*norm2==0 ? 0 : acosf(dot2/sqrtf(norm1*norm2))); + //angle = (norm1 * norm2 == 0 ? 0 : sqrtf(fmax(1.0f - dot2 * dot2 / (norm1 * norm2), 0.f))); + angle = (norm1 * norm2 == 0 ? 0 : sqrtf(std::max(1.0f - dot2 * dot2 / (norm1 * norm2), 0.f))); + + return angle; +} + +float CMultiLayerBGS::CalColorRangeDist(unsigned char *cur_intensity, float *bg_intensity, float *max_intensity, float *min_intensity, float shadow_rate, float highlight_rate) { + float dist = 0.0f, minI, maxI, bgI, curI; + int channel; + //float cdist; + + + for (channel = 0; channel < m_nChannel; channel++) { + bgI = bg_intensity[channel]; + + /* + minI = MIN(MIN(min_intensity[channel], bgI*shadow_rate), min_intensity[channel]-15.0f); + maxI = MAX(MAX(max_intensity[channel], bgI*highlight_rate), max_intensity[channel]+15.0f); + */ + + minI = MIN(min_intensity[channel], bgI * shadow_rate - 5.0f); + maxI = MAX(max_intensity[channel], bgI * highlight_rate + 5.0f); + + /* + if ( rand()/((double)RAND_MAX+1) > 0.999 ) { + char msg[200]; + sprintf(msg, "%d\t%d\n", min_intensity[channel]<bgI*shadow_rate-5.0f ? 1 : 0, max_intensity[channel]>bgI*highlight_rate+5.0f ? 1 : 0); + ExportLogMessage(msg); + } + */ + + /* + minI = max_intensity[channel]*shadow_rate; + maxI = MAX(bg_intensity[channel]+m_fRobustColorOffset, MIN(max_intensity[channel]*highlight_rate,min_intensity[channel]/shadow_rate)); + */ + + curI = (float) (cur_intensity[channel]); + + /* + //cdist = fabsf(bgI-curI)/512.0f; + if ( curI > bgI ) + cdist = fabsf(bgI-curI)/256.0f; + else + cdist = fabsf(bgI-curI)/512.0f; + + if ( curI > maxI ) + //cdist += (curI-maxI)/(2.0f*(255.0f-maxI))*0.5f; + cdist += (1.0f-expf(10.0f*(maxI-curI)/MAX(255.0f-maxI,10.0f)))*0.5f; + else if ( curI < minI ) + //cdist += (minI-curI)/(2.0f*minI)*0.5f; + cdist += (1.0f-expf(10.0f*(curI-minI)/MAX(minI,10.0f)))*0.5f; + //dist += cdist; + if ( cdist > dist ) + dist = cdist; + */ + + if (curI > maxI || curI < minI) { + dist = 1.0f; + break; + } + } + //dist = powf(dist, 1.0f/(float)m_nChannel); + //dist /= (float)m_nChannel; + + return dist; +} + +void CMultiLayerBGS::GetLayeredBackgroundImage(int layered_no, IplImage *layered_bg_img, CvScalar empty_color) { + PixelLBPStruct *PLBP = m_pPixelLBPs; + LBPStruct* LBPs; + unsigned short* lbp_idxes; + + int a, b, c; + int img_length = m_pOrgImg->width * m_pOrgImg->height; + + cvSet(layered_bg_img, empty_color); + + COpencvDataConversion<uchar, uchar> ODC; + + uchar *bg_img_data = ODC.GetImageData(layered_bg_img); + uchar *_bg_img_data = bg_img_data; + float *cur_bg_intensity; + int lbp_num; + + for (a = 0; a < img_length; a++) { + // get lbp information + LBPs = (*PLBP).LBPs; + lbp_idxes = (*PLBP).lbp_idxes; + lbp_num = (int) ((*PLBP).num); + bool found = false; + for (b = 0; b < lbp_num; b++) { + if (LBPs[lbp_idxes[b]].bg_layer_num == layered_no) { + cur_bg_intensity = LBPs[lbp_idxes[b]].bg_intensity; + for (c = 0; c < m_pOrgImg->nChannels; c++) + *_bg_img_data++ = (uchar) * cur_bg_intensity++; + found = true; + break; + } + } + if (!found) + _bg_img_data += m_pOrgImg->nChannels; + + PLBP++; + } + + ODC.SetImageData(layered_bg_img, bg_img_data); + + delete [] bg_img_data; +} + +void CMultiLayerBGS::GetBgLayerNoImage(IplImage *bg_layer_no_img, CvScalar *layer_colors, int layer_num) { + if (layer_num != 0 && layer_num != m_nMaxLBPModeNum) { + printf("Must be set in %d layers in function GetBgLayerNoImage!\n", m_nMaxLBPModeNum); + exit(1); + } + + CvScalar *bg_layer_colors; + int bg_layer_color_num = layer_num; + if (bg_layer_color_num == 0) + bg_layer_color_num = m_nMaxLBPModeNum; + bg_layer_colors = new CvScalar[bg_layer_color_num]; + if (layer_colors) { + for (int l = 0; l < layer_num; l++) + bg_layer_colors[l] = layer_colors[l]; + } else { + int rgb[3]; + rgb[0] = rgb[1] = rgb[2] = 0; + int rgb_idx = 0; + for (int l = 0; l < bg_layer_color_num; l++) { + bg_layer_colors[l] = CV_RGB(rgb[0], rgb[1], rgb[2]); + rgb[rgb_idx] += 200; + rgb[rgb_idx] %= 255; + rgb_idx++; + rgb_idx %= 3; + } + } + + int img_length = m_pOrgImg->width * m_pOrgImg->height; + uchar *bg_layer_data = new uchar[img_length * bg_layer_no_img->nChannels]; + uchar *_bg_layer_data = bg_layer_data; + + PixelLBPStruct *PLBP = m_pPixelLBPs; + unsigned int cur_bg_layer_no; + + for (int a = 0; a < img_length; a++) { + cur_bg_layer_no = (*PLBP).cur_bg_layer_no; + for (int b = 0; b < bg_layer_no_img->nChannels; b++) { + *_bg_layer_data++ = (uchar) (bg_layer_colors[cur_bg_layer_no].val[b]); + } + PLBP++; + } + + COpencvDataConversion<uchar, uchar> ODC; + ODC.SetImageData(bg_layer_no_img, bg_layer_data); + + delete [] bg_layer_data; + delete [] bg_layer_colors; +} + +void CMultiLayerBGS::GetCurrentLayeredBackgroundImage(int layered_no, IplImage *layered_bg_img, IplImage *layered_fg_img, CvScalar layered_bg_bk_color, CvScalar layered_fg_color, + int smooth_win, float smooth_sigma, float below_layer_noise, float above_layer_noise, int min_blob_size) { + PixelLBPStruct *PLBP = m_pPixelLBPs; + LBPStruct* LBPs; + unsigned short* lbp_idxes; + + int a; + int img_length = m_pOrgImg->width * m_pOrgImg->height; + + float *bg_layer_mask = new float[img_length]; + float *_bg_layer_mask = bg_layer_mask; + + for (a = 0; a < img_length; a++) { + // get lbp information + LBPs = (*PLBP).LBPs; + lbp_idxes = (*PLBP).lbp_idxes; + *_bg_layer_mask++ = (float) (*PLBP).cur_bg_layer_no; + PLBP++; + } + + COpencvDataConversion<float, float> ODC; + IplImage* bg_layer_float_mask_img = cvCreateImage(cvGetSize(m_pOrgImg), IPL_DEPTH_32F, 1); + IplImage* bg_layer_low_mask_img = cvCreateImage(cvGetSize(m_pOrgImg), IPL_DEPTH_8U, 1); + IplImage* bg_layer_high_mask_img = cvCreateImage(cvGetSize(m_pOrgImg), IPL_DEPTH_8U, 1); + IplImage* bg_layer_mask_img = cvCreateImage(cvGetSize(m_pOrgImg), IPL_DEPTH_8U, 1); + + ODC.SetImageData(bg_layer_float_mask_img, bg_layer_mask); + + /* method 1 using smooth */ + /* + cvSmooth(bg_layer_float_mask_img, bg_layer_float_mask_img, CV_GAUSSIAN, smooth_win, smooth_win, smooth_sigma); + + cvThreshold(bg_layer_float_mask_img, bg_layer_low_mask_img, (float)layered_no-below_layer_noise, 1, CV_THRESH_BINARY); + cvThreshold(bg_layer_float_mask_img, bg_layer_high_mask_img, (float)layered_no+above_layer_noise, 1, CV_THRESH_BINARY_INV); + + cvAnd(bg_layer_low_mask_img, bg_layer_high_mask_img, bg_layer_mask_img); + */ + + /* method 2 using dilate, erode, blob removing */ + cvSmooth(bg_layer_float_mask_img, bg_layer_float_mask_img, CV_GAUSSIAN, smooth_win, smooth_win, smooth_sigma); + + cvThreshold(bg_layer_float_mask_img, bg_layer_low_mask_img, (float) layered_no - below_layer_noise, 1, CV_THRESH_BINARY); + cvThreshold(bg_layer_float_mask_img, bg_layer_high_mask_img, (float) layered_no + above_layer_noise, 1, CV_THRESH_BINARY_INV); + cvAnd(bg_layer_low_mask_img, bg_layer_high_mask_img, bg_layer_mask_img); + + cvDilate(bg_layer_mask_img, bg_layer_mask_img, 0, 2); + cvErode(bg_layer_mask_img, bg_layer_mask_img, 0, 2); + + //cvMorphologyEx(bg_layer_mask_img, bg_layer_mask_img, NULL, 0, CV_MOP_OPEN|CV_MOP_CLOSE, 1); + + // Extract the blobs using a threshold of 100 in the image + CBlobResult blobs = CBlobResult(bg_layer_mask_img, NULL, 0, true); + // discard the blobs with less area than 100 pixels + // ( the criteria to filter can be any class derived from COperadorBlob ) + blobs.Filter(blobs, B_INCLUDE, CBlobGetArea(), B_GREATER, min_blob_size); + + CBlob filtered_blob; + cvSetZero(bg_layer_mask_img); + for (a = 0; a < blobs.GetNumBlobs(); a++) { + filtered_blob = blobs.GetBlob(a); + filtered_blob.FillBlob(bg_layer_mask_img, cvScalar(1)); + } + blobs.GetNthBlob(CBlobGetArea(), 0, filtered_blob); + filtered_blob.FillBlob(bg_layer_mask_img, cvScalar(0)); + + + cvSet(layered_bg_img, layered_bg_bk_color); + cvCopy(m_pBgImg, layered_bg_img, bg_layer_mask_img); + + if (layered_fg_img) { + cvCopy(m_pOrgImg, layered_fg_img); + cvSet(layered_fg_img, layered_fg_color, bg_layer_mask_img); + } + + cvReleaseImage(&bg_layer_float_mask_img); + cvReleaseImage(&bg_layer_low_mask_img); + cvReleaseImage(&bg_layer_high_mask_img); + cvReleaseImage(&bg_layer_mask_img); + delete [] bg_layer_mask; +} + +void CMultiLayerBGS::GetColoredBgMultiLayeredImage(IplImage *bg_multi_layer_img, CvScalar *layer_colors) { + cvCopyImage(m_pOrgImg, bg_multi_layer_img); + + COpencvDataConversion<uchar, uchar> ODC; + + uchar *bg_ml_imgD = ODC.GetImageData(bg_multi_layer_img); + uchar *fg_maskD = ODC.GetImageData(m_pFgMaskImg); + + uchar *_bg_ml_imgD = bg_ml_imgD; + uchar *_fg_maskD = fg_maskD; + + PixelLBPStruct *PLBP = m_pPixelLBPs; + LBPStruct* LBPs; + unsigned short* lbp_idxes; + unsigned int lbp_num; + int bg_layer_num; + + int a, c; + int img_length = m_pOrgImg->width * m_pOrgImg->height; + int channels = m_pOrgImg->nChannels; + bool bLayeredBg; + + for (a = 0; a < img_length; a++) { + // get lbp information + lbp_num = (*PLBP).num; + LBPs = (*PLBP).LBPs; + lbp_idxes = (*PLBP).lbp_idxes; + bLayeredBg = false; + + if ((*_fg_maskD == 0)) { + bg_layer_num = LBPs[lbp_idxes[0]].bg_layer_num; + int first_layer_idx = 0; + for (c = 0; c < (int) lbp_num; c++) { + if (LBPs[lbp_idxes[c]].bg_layer_num == 1) { + first_layer_idx = c; + break; + } + } + if (bg_layer_num > 1 && DistLBP(&(LBPs[lbp_idxes[0]]), &(LBPs[first_layer_idx])) > 0.1f) { + for (c = 0; c < channels; c++) + *_bg_ml_imgD++ = (uchar) (layer_colors[bg_layer_num].val[c]); + bLayeredBg = true; + } + + if (!bLayeredBg) + _bg_ml_imgD += channels; + } else { + _bg_ml_imgD += channels; + } + + PLBP++; + _fg_maskD++; + } + + ODC.SetImageData(bg_multi_layer_img, bg_ml_imgD); + + delete [] fg_maskD; + delete [] bg_ml_imgD; +} + +void CMultiLayerBGS::GetForegroundProbabilityImage(IplImage *fg_dist_img) { + COpencvDataConversion<float, float> ODC1; + COpencvDataConversion<uchar, uchar> ODC2; + + float *_fg_distD = ODC1.GetImageData(m_pBgDistImg); + uchar *_fg_progI = ODC2.GetImageData(fg_dist_img); + float *fg_distD = _fg_distD; + uchar *fg_progI = _fg_progI; + + /* + float *fg_distD = (float*)(m_pBgDistImg->imageData); + uchar *fg_progI = (uchar*)(fg_dist_img->imageData); + */ + + int channels = fg_dist_img->nChannels; + + int a, b; + int img_length = fg_dist_img->width * fg_dist_img->height; + uchar temp; + for (a = 0; a < img_length; a++) { + temp = cvRound(255.0f * ((*fg_distD++))); + for (b = 0; b < channels; b++) + *fg_progI++ = temp; + } + + ODC2.SetImageData(fg_dist_img, _fg_progI); + + delete [] _fg_distD; + delete [] _fg_progI; +} + +void CMultiLayerBGS::RemoveBackgroundLayers(PixelLBPStruct *PLBP, bool *removed_modes) { + int a, b; + int lbp_num = PLBP->num; + + /* + if ( lbp_num < m_nMaxLBPModeNum ) + return; + */ + + /* testing */ + + unsigned short* lbp_idxes = PLBP->lbp_idxes; + if (!removed_modes) { + int removed_bg_layer_num = 0; + for (a = 0; a < lbp_num; a++) { + if (PLBP->LBPs[lbp_idxes[a]].bg_layer_num && PLBP->LBPs[lbp_idxes[a]].weight < m_fMinBgLayerWeight) { // should be removed + removed_bg_layer_num = PLBP->LBPs[lbp_idxes[a]].bg_layer_num; + lbp_num--; + for (b = a; b < lbp_num; b++) + lbp_idxes[b] = lbp_idxes[b + 1]; + break; + } + } + if (removed_bg_layer_num) { + for (a = 0; a < lbp_num; a++) { + if (PLBP->LBPs[lbp_idxes[a]].bg_layer_num > removed_bg_layer_num) + PLBP->LBPs[lbp_idxes[a]].bg_layer_num--; + } + } + } else { + int removed_bg_layer_nums[10]; + int removed_layer_num = 0; + for (a = 0; a < lbp_num; a++) { + if (removed_modes[a] && PLBP->LBPs[lbp_idxes[a]].bg_layer_num) { // should be removed + removed_bg_layer_nums[removed_layer_num++] = PLBP->LBPs[lbp_idxes[a]].bg_layer_num; + } + } + + for (a = 0; a < lbp_num; a++) { + if (removed_modes[a]) { // should be removed + lbp_num--; + for (b = a; b < lbp_num; b++) + lbp_idxes[b] = lbp_idxes[b + 1]; + } + } + + for (a = 0; a < lbp_num; a++) { + for (b = 0; b < removed_layer_num; b++) { + if (PLBP->LBPs[lbp_idxes[a]].bg_layer_num > removed_bg_layer_nums[b]) + PLBP->LBPs[lbp_idxes[a]].bg_layer_num--; + } + } + } + + // sort the list of modes based on the weights of modes + if (lbp_num != (int) PLBP->num) { + float weights[100], tot_weights = 0; + for (a = 0; a < (int) lbp_num; a++) { + weights[a] = PLBP->LBPs[lbp_idxes[a]].weight; + tot_weights += weights[a]; + } + + // sort weights in the descent order + QuickSort(weights, lbp_idxes, 0, (int) lbp_num - 1, false); + + // calculate the first potential background modes number, bg_num + float threshold_weight = m_fBackgroundModelPercent*tot_weights; + int bg_num = 0; + tot_weights = 0; + for (a = 0; a < (int) lbp_num; a++) { + tot_weights += PLBP->LBPs[lbp_idxes[a]].weight; + if (tot_weights > threshold_weight) { + bg_num = a + 1; + break; + } + } + (*PLBP).bg_num = bg_num; + + } + + PLBP->num = lbp_num; + + float bg_layer_data[10]; + unsigned short bg_layer_idxes[10]; + int bg_layer_num; + int tot_bg_layer_num = 0; + for (a = 0; a < lbp_num; a++) { + bg_layer_num = PLBP->LBPs[lbp_idxes[a]].bg_layer_num; + if (bg_layer_num) { + bg_layer_data[tot_bg_layer_num] = (float) bg_layer_num; + bg_layer_idxes[tot_bg_layer_num++] = lbp_idxes[a]; + } + } + if (tot_bg_layer_num == 1) { + PLBP->LBPs[bg_layer_idxes[0]].bg_layer_num = 1; + } else if (tot_bg_layer_num) { + // sort weights in the descent order + QuickSort(bg_layer_data, bg_layer_idxes, 0, tot_bg_layer_num - 1, true); + for (a = 0; a < tot_bg_layer_num; a++) + PLBP->LBPs[bg_layer_idxes[a]].bg_layer_num = a + 1; + } + + /* + int max_bg_layer_num = 0; + for ( a = 0 ; a < lbp_num ; a++ ) + max_bg_layer_num = MAX(max_bg_layer_num, PLBP->LBPs[lbp_idxes[a]].bg_layer_num); + if ( max_bg_layer_num >= 2 ) { + bool find_first_layer = false; + for ( a = 0 ; a < lbp_num ; a++ ) { + max_bg_layer_num = MAX(max_bg_layer_num, PLBP->LBPs[lbp_idxes[a]].bg_layer_num); + if ( PLBP->LBPs[lbp_idxes[a]].bg_layer_num == 1 ) { + find_first_layer = true; + break; + } + } + if ( !find_first_layer ) { + printf("\n===============================================\n"); + printf(" have second layer, no first layer \n"); + printf("\n===============================================\n"); + exit(1); + } + } + */ +} + +void CMultiLayerBGS::Postprocessing() { + // post-processing for background subtraction results + cvDilate(m_pFgMaskImg, m_pFgMaskImg, 0, 2); + cvErode(m_pFgMaskImg, m_pFgMaskImg, 0, 2); + + /** Example of extracting and filtering the blobs of an image */ + + // object that will contain blobs of inputImage + CBlobResult blobs; + + IplImage *inputImage = m_pFgMaskImg; + + // Extract the blobs using a threshold of 100 in the image + blobs = CBlobResult(inputImage, NULL, 0, true); + + // create a file with some of the extracted features + //blobs.PrintBlobs( ".\\blobs.txt" ); + + // discard the blobs with less area than 100 pixels + // ( the criteria to filter can be any class derived from COperadorBlob ) + blobs.Filter(blobs, B_INCLUDE, CBlobGetArea(), B_GREATER, 100); + + // create a file with filtered results + //blobs.PrintBlobs( ".\\filteredBlobs.txt" ); + + // build an output image equal to the input but with 3 channels (to draw the coloured blobs) + IplImage *outputImage; + outputImage = cvCreateImage(cvSize(inputImage->width, inputImage->height), IPL_DEPTH_8U, 1); + cvSet(outputImage, cvScalar(0)); + + // plot the selected blobs in a output image + CBlob filtered_blob; + //cvSet(outputImage, CV_RGB(0,0,255)); + int a; + for (a = 0; a < blobs.GetNumBlobs(); a++) { + filtered_blob = blobs.GetBlob(a); + filtered_blob.FillBlob(outputImage, cvScalar(255)); + } + blobs.GetNthBlob(CBlobGetArea(), 0, filtered_blob); + filtered_blob.FillBlob(outputImage, cvScalar(0)); + + /* + char *win_name = "blob filtered image"; + cvNamedWindow(win_name); + cvShowImage(win_name, outputImage); + cvWaitKey(3); + */ + + cvReleaseImage(&outputImage); +} + +void CMultiLayerBGS::GetFloatEdgeImage(IplImage *src, IplImage *dst) { + if (src->nChannels > 1) { + printf("Error: the input source image must be single-channel image!\n"); + exit(1); + } + if (dst->depth != IPL_DEPTH_32F) { + printf("Error: the output edge image must be float image ranging in [0,1]!\n"); + exit(1); + } + + uchar *src_x_data; + float *dst_x_data; + + int x, y; + for (y = 0; y < dst->height; y++) { + src_x_data = (uchar*) (src->imageData + src->widthStep * y); + dst_x_data = (float*) (dst->imageData + dst->widthStep * y); + for (x = 0; x < dst->width; x++) { + *dst_x_data++ = (float) (*src_x_data++) / 255.0f; + } + } +} + +void CMultiLayerBGS::ExportLogMessage(char *msg) { + const char *log_fn = "log_message.txt"; + ofstream fout(log_fn, ios::app); + if (fout.fail()) { + printf("Error opening log output file %s.\n", log_fn); + fout.close(); + exit(0); + } + + fout << msg; + fout.close(); +} + +void CMultiLayerBGS::UpdatePatternColorDistWeights(float *cur_pattern, float *bg_pattern) { + return; + + int cur_true_num = 0, cur_false_num = 0, bg_true_num = 0, bg_false_num = 0; + int a; + + for (a = 0; a < m_nLBPLength; a++) { + cur_true_num += (cur_pattern[a] > 0.5f ? 1 : 0); + cur_false_num += (cur_pattern[a] < 0.5f ? 0 : 1); + bg_true_num += (bg_pattern[a] > 0.5f); + bg_false_num += (bg_pattern[a] < 0.5f); + } + m_fTextureWeight = expf(-(fabsf(cur_true_num - cur_false_num) + fabsf(bg_true_num - bg_false_num) + 0.8f) / (float) m_nLBPLength); + m_fTextureWeight = MAX(MIN(m_fTextureWeight, 0.5f), 0.1f); + m_fColorWeight = 1.0f - m_fTextureWeight; +} + +void CMultiLayerBGS::Save(const char *bg_model_fn) { + Save(bg_model_fn, 2); +} + +void CMultiLayerBGS::Save(const char *bg_model_fn, int save_type) { + FILE * fout = fopen(bg_model_fn, "w"); + if (!fout) { + printf("Error opening background model output file %s.\n", bg_model_fn); + fclose(fout); + //exit(0); + return; + } + + int i, j; + if (save_type == 0) { /* save the background model information */ + fprintf(fout, "FILE_TYPE: MODEL_INFO\n\n"); + + fprintf(fout, "MAX_MODEL_NUM: %5d\n", m_nMaxLBPModeNum); + fprintf(fout, "LBP_LENGTH: %5d\n", m_nLBPLength); + fprintf(fout, "CHANNELS_NUM: %5d\n", m_nChannel); + fprintf(fout, "IMAGE_SIZE: %5d %5d\n\n", m_cvImgSize.width, m_cvImgSize.height); + + fprintf(fout, "MODEL_INFO_PIXEL_BY_PIXEL:\n"); + + int img_length = m_cvImgSize.height * m_cvImgSize.width; + PixelLBPStruct* PLBP = m_pPixelLBPs; + + for (int yx = 0; yx < img_length; yx++) { + fprintf(fout, "%3d %3d %3d", (*PLBP).num, (*PLBP).bg_num, (*PLBP).cur_bg_layer_no); + for (i = 0; i < (int) (*PLBP).num; i++) + fprintf(fout, " %3d", (*PLBP).lbp_idxes[i]); + for (i = 0; i < (int) (*PLBP).num; i++) { + int li = (*PLBP).lbp_idxes[i]; + for (j = 0; j < m_nChannel; j++) { + fprintf(fout, " %7.1f %7.1f %7.1f", (*PLBP).LBPs[li].bg_intensity[j], + (*PLBP).LBPs[li].max_intensity[j], (*PLBP).LBPs[li].min_intensity[j]); + } + for (j = 0; j < m_nLBPLength; j++) + fprintf(fout, " %7.3f", (*PLBP).LBPs[li].bg_pattern[j]); + fprintf(fout, " %10.5f", (*PLBP).LBPs[li].weight); + fprintf(fout, " %10.5f", (*PLBP).LBPs[li].max_weight); + fprintf(fout, " %3d", (*PLBP).LBPs[li].bg_layer_num); + fprintf(fout, " %20lu", (*PLBP).LBPs[li].first_time); + fprintf(fout, " %20lu", (*PLBP).LBPs[li].last_time); + fprintf(fout, " %8d", (*PLBP).LBPs[li].freq); + } + fprintf(fout, "\n"); + PLBP++; + } + } else if (save_type == 1) { /* save current parameters for background subtraction */ + fprintf(fout, "FILE_TYPE: MODEL_PARAS\n\n"); + + fprintf(fout, "MAX_MODEL_NUM: %5d\n", m_nMaxLBPModeNum); + fprintf(fout, "FRAME_DURATION: %f\n", m_fFrameDuration); + fprintf(fout, "MODEL_UPDATING_LEARN_RATE: %f\n", m_fModeUpdatingLearnRate); + fprintf(fout, "WEIGHT_UPDATING_LEARN_RATE: %f\n", m_fWeightUpdatingLearnRate); + fprintf(fout, "WEIGHT_UPDATING_CONSTANT: %f\n", m_fWeightUpdatingConstant); + fprintf(fout, "LOW_INITIAL_MODE_WEIGHT: %f\n", m_fLowInitialModeWeight); + fprintf(fout, "RELIABLE_BACKGROUND_MODE_WEIGHT: %f\n", m_fReliableBackgroundModeWeight); + fprintf(fout, "ROBUST_COLOR_OFFSET: %f\n", m_fRobustColorOffset); + fprintf(fout, "BACKGROUND_MODEL_PERCENT: %f\n", m_fBackgroundModelPercent); + fprintf(fout, "ROBUST_SHADOW_RATE: %f\n", m_fRobustShadowRate); + fprintf(fout, "ROBUST_HIGHLIGHT_RATE: %f\n", m_fRobustHighlightRate); + fprintf(fout, "PATTERN_COLOR_DIST_BACKGROUND_THRESHOLD: %f\n", m_fPatternColorDistBgThreshold); + fprintf(fout, "PATTERN_COLOR_DIST_BACKGROUND_UPDATED_THRESHOLD: %f\n", m_fPatternColorDistBgUpdatedThreshold); + fprintf(fout, "MIN_BACKGROUND_LAYER_WEIGHT: %f\n", m_fMinBgLayerWeight); + fprintf(fout, "PATTERN_DIST_SMOOTH_NEIG_HALF_SIZE: %d\n", m_nPatternDistSmoothNeigHalfSize); + fprintf(fout, "PATTERN_DIST_CONV_GAUSSIAN_SIGMA: %f\n", m_fPatternDistConvGaussianSigma); + fprintf(fout, "TEXTURE_WEIGHT: %f\n", m_fTextureWeight); + fprintf(fout, "MIN_NOISED_ANGLE: %f\n", m_fMinNoisedAngle); + fprintf(fout, "MIN_NOISED_ANGLE_SINE: %f\n", m_fMinNoisedAngleSine); + fprintf(fout, "BILATERAL_SIGMA_S: %f\n", m_fSigmaS); + fprintf(fout, "BILATERAL_SIGMA_R: %f\n", m_fSigmaR); + fprintf(fout, "LBP_LENGTH: %5d\n", m_nLBPLength); + fprintf(fout, "LBP_LEVEL_NUM: %5d\n", m_nLBPLevelNum); + fprintf(fout, "LBP_RADIUSES: "); + for (i = 0; i < m_nLBPLevelNum; i++) + fprintf(fout, "%10.5f", m_pLBPRadiuses[i]); + fprintf(fout, "\nLBP_NEIG_POINT_NUMS: "); + for (i = 0; i < m_nLBPLevelNum; i++) + fprintf(fout, "%6d", m_pLBPMeigPointNums[i]); + } else if (save_type == 2) { /* save the background model information and parameters */ + fprintf(fout, "FILE_TYPE: MODEL_PARAS_INFO\n\n"); + + fprintf(fout, "MAX_MODEL_NUM: %5d\n", m_nMaxLBPModeNum); + fprintf(fout, "FRAME_DURATION: %f\n", m_fFrameDuration); + fprintf(fout, "MODEL_UPDATING_LEARN_RATE: %f\n", m_fModeUpdatingLearnRate); + fprintf(fout, "WEIGHT_UPDATING_LEARN_RATE: %f\n", m_fWeightUpdatingLearnRate); + fprintf(fout, "WEIGHT_UPDATING_CONSTANT: %f\n", m_fWeightUpdatingConstant); + fprintf(fout, "LOW_INITIAL_MODE_WEIGHT: %f\n", m_fLowInitialModeWeight); + fprintf(fout, "RELIABLE_BACKGROUND_MODE_WEIGHT: %f\n", m_fReliableBackgroundModeWeight); + fprintf(fout, "ROBUST_COLOR_OFFSET: %f\n", m_fRobustColorOffset); + fprintf(fout, "BACKGROUND_MODEL_PERCENT: %f\n", m_fBackgroundModelPercent); + fprintf(fout, "ROBUST_SHADOW_RATE: %f\n", m_fRobustShadowRate); + fprintf(fout, "ROBUST_HIGHLIGHT_RATE: %f\n", m_fRobustHighlightRate); + fprintf(fout, "PATTERN_COLOR_DIST_BACKGROUND_THRESHOLD: %f\n", m_fPatternColorDistBgThreshold); + fprintf(fout, "PATTERN_COLOR_DIST_BACKGROUND_UPDATED_THRESHOLD: %f\n", m_fPatternColorDistBgUpdatedThreshold); + fprintf(fout, "MIN_BACKGROUND_LAYER_WEIGHT: %f\n", m_fMinBgLayerWeight); + fprintf(fout, "PATTERN_DIST_SMOOTH_NEIG_HALF_SIZE: %d\n", m_nPatternDistSmoothNeigHalfSize); + fprintf(fout, "PATTERN_DIST_CONV_GAUSSIAN_SIGMA: %f\n", m_fPatternDistConvGaussianSigma); + fprintf(fout, "TEXTURE_WEIGHT: %f\n", m_fTextureWeight); + fprintf(fout, "MIN_NOISED_ANGLE: %f\n", m_fMinNoisedAngle); + fprintf(fout, "MIN_NOISED_ANGLE_SINE: %f\n", m_fMinNoisedAngleSine); + fprintf(fout, "BILATERAL_SIGMA_S: %f\n", m_fSigmaS); + fprintf(fout, "BILATERAL_SIGMA_R: %f\n", m_fSigmaR); + fprintf(fout, "LBP_LENGTH: %5d\n", m_nLBPLength); + fprintf(fout, "LBP_LEVEL_NUM: %5d\n", m_nLBPLevelNum); + fprintf(fout, "LBP_RADIUSES: "); + for (i = 0; i < m_nLBPLevelNum; i++) + fprintf(fout, "%10.5f", m_pLBPRadiuses[i]); + fprintf(fout, "\nLBP_NEIG_POINT_NUMS: "); + for (i = 0; i < m_nLBPLevelNum; i++) + fprintf(fout, "%6d", m_pLBPMeigPointNums[i]); + + fprintf(fout, "\nMAX_MODEL_NUM: %5d\n", m_nMaxLBPModeNum); + fprintf(fout, "LBP_LENGTH: %5d\n", m_nLBPLength); + fprintf(fout, "CHANNELS_NUM: %5d\n", m_nChannel); + fprintf(fout, "IMAGE_SIZE: %5d %5d\n\n", m_cvImgSize.width, m_cvImgSize.height); + + fprintf(fout, "MODEL_INFO_PIXEL_BY_PIXEL:\n"); + + int img_length = m_cvImgSize.height * m_cvImgSize.width; + PixelLBPStruct* PLBP = m_pPixelLBPs; + + for (int yx = 0; yx < img_length; yx++) { + fprintf(fout, "%3d %3d %3d", (*PLBP).num, (*PLBP).bg_num, (*PLBP).cur_bg_layer_no); + for (i = 0; i < (int) (*PLBP).num; i++) + fprintf(fout, " %3d", (*PLBP).lbp_idxes[i]); + for (i = 0; i < (int) (*PLBP).num; i++) { + int li = (*PLBP).lbp_idxes[i]; + for (j = 0; j < m_nChannel; j++) { + fprintf(fout, " %7.1f %7.1f %7.1f", (*PLBP).LBPs[li].bg_intensity[j], + (*PLBP).LBPs[li].max_intensity[j], (*PLBP).LBPs[li].min_intensity[j]); + } + for (j = 0; j < m_nLBPLength; j++) + fprintf(fout, " %7.3f", (*PLBP).LBPs[li].bg_pattern[j]); + fprintf(fout, " %10.5f", (*PLBP).LBPs[li].weight); + fprintf(fout, " %10.5f", (*PLBP).LBPs[li].max_weight); + fprintf(fout, " %3d", (*PLBP).LBPs[li].bg_layer_num); + fprintf(fout, " %20lu", (*PLBP).LBPs[li].first_time); + fprintf(fout, " %20lu", (*PLBP).LBPs[li].last_time); + fprintf(fout, " %8d", (*PLBP).LBPs[li].freq); + } + fprintf(fout, "\n"); + PLBP++; + } + } else { /* wrong save type */ + printf("Please input correct save type: 0 - model_info 1 - model_paras 2 - model_paras_info\n"); + fclose(fout); + exit(0); + } + + fclose(fout); +} + +bool CMultiLayerBGS::Load(const char *bg_model_fn) { + ifstream fin(bg_model_fn, ios::in); + if (fin.fail()) { + printf("Error opening background model file %s.\n", bg_model_fn); + fin.close(); + return false; + } + + char para_name[1024], model_type[1024]; + + fin >> para_name >> model_type; + + int i, j; + CvSize img_size; + int img_length = m_cvImgSize.width * m_cvImgSize.height; + int max_lbp_mode_num = m_nMaxLBPModeNum; + + if (!strcmp(model_type, "MODEL_INFO")) { + fin >> para_name >> m_nMaxLBPModeNum; + fin >> para_name >> m_nLBPLength; + fin >> para_name >> m_nChannel; + fin >> para_name >> img_size.width >> img_size.height; + + if (m_cvImgSize.width != img_size.width || m_cvImgSize.height != img_size.height) { + printf("Image size is not matched!\n"); + return false; + } + + if (max_lbp_mode_num != m_nMaxLBPModeNum) { + PixelLBPStruct* PLBP = m_pPixelLBPs; + for (int yx = 0; yx < img_length; yx++) { + delete [] (*PLBP).LBPs; + delete [] (*PLBP).lbp_idxes; + (*PLBP).LBPs = new LBPStruct[m_nMaxLBPModeNum]; + (*PLBP).lbp_idxes = new unsigned short[m_nMaxLBPModeNum]; + } + } + + fin >> para_name; + + int img_length = m_cvImgSize.height * m_cvImgSize.width; + PixelLBPStruct* PLBP = m_pPixelLBPs; + + for (int yx = 0; yx < img_length; yx++) { + fin >> (*PLBP).num >> (*PLBP).bg_num >> (*PLBP).cur_bg_layer_no; + for (i = 0; i < (int) (*PLBP).num; i++) + fin >> (*PLBP).lbp_idxes[i]; + for (i = 0; i < (int) (*PLBP).num; i++) { + int li = (*PLBP).lbp_idxes[i]; + for (j = 0; j < m_nChannel; j++) { + fin >> (*PLBP).LBPs[li].bg_intensity[j] >> + (*PLBP).LBPs[li].max_intensity[j] >> (*PLBP).LBPs[li].min_intensity[j]; + } + for (j = 0; j < m_nLBPLength; j++) + fin >> (*PLBP).LBPs[li].bg_pattern[j]; + fin >> (*PLBP).LBPs[li].weight >> (*PLBP).LBPs[li].max_weight >> (*PLBP).LBPs[li].bg_layer_num + >> (*PLBP).LBPs[li].first_time >> (*PLBP).LBPs[li].last_time >> (*PLBP).LBPs[li].freq; + } + PLBP++; + } + } else if (!strcmp(model_type, "MODEL_PARAS")) { + fin >> para_name >> m_nMaxLBPModeNum; + fin >> para_name >> m_fFrameDuration; + fin >> para_name >> m_fModeUpdatingLearnRate; + fin >> para_name >> m_fWeightUpdatingLearnRate; + fin >> para_name >> m_fWeightUpdatingConstant; + fin >> para_name >> m_fLowInitialModeWeight; + fin >> para_name >> m_fReliableBackgroundModeWeight; + fin >> para_name >> m_fRobustColorOffset; + fin >> para_name >> m_fBackgroundModelPercent; + fin >> para_name >> m_fRobustShadowRate; + fin >> para_name >> m_fRobustHighlightRate; + fin >> para_name >> m_fPatternColorDistBgThreshold; + fin >> para_name >> m_fPatternColorDistBgUpdatedThreshold; + fin >> para_name >> m_fMinBgLayerWeight; + fin >> para_name >> m_nPatternDistSmoothNeigHalfSize; + fin >> para_name >> m_fPatternDistConvGaussianSigma; + fin >> para_name >> m_fTextureWeight; + fin >> para_name >> m_fMinNoisedAngle; + fin >> para_name >> m_fMinNoisedAngleSine; + fin >> para_name >> m_fSigmaS; + fin >> para_name >> m_fSigmaR; + fin >> para_name >> m_nLBPLength; + fin >> para_name >> m_nLBPLevelNum; + fin >> para_name; + for (i = 0; i < m_nLBPLevelNum; i++) + fin >> m_pLBPRadiuses[i]; + fin >> para_name; + for (i = 0; i < m_nLBPLevelNum; i++) + fin >> m_pLBPMeigPointNums[i]; + } else if (!strcmp(model_type, "MODEL_PARAS_INFO")) { + fin >> para_name >> m_nMaxLBPModeNum; + fin >> para_name >> m_fFrameDuration; + fin >> para_name >> m_fModeUpdatingLearnRate; + fin >> para_name >> m_fWeightUpdatingLearnRate; + fin >> para_name >> m_fWeightUpdatingConstant; + fin >> para_name >> m_fLowInitialModeWeight; + fin >> para_name >> m_fReliableBackgroundModeWeight; + fin >> para_name >> m_fRobustColorOffset; + fin >> para_name >> m_fBackgroundModelPercent; + fin >> para_name >> m_fRobustShadowRate; + fin >> para_name >> m_fRobustHighlightRate; + fin >> para_name >> m_fPatternColorDistBgThreshold; + fin >> para_name >> m_fPatternColorDistBgUpdatedThreshold; + fin >> para_name >> m_fMinBgLayerWeight; + fin >> para_name >> m_nPatternDistSmoothNeigHalfSize; + fin >> para_name >> m_fPatternDistConvGaussianSigma; + fin >> para_name >> m_fTextureWeight; + fin >> para_name >> m_fMinNoisedAngle; + fin >> para_name >> m_fMinNoisedAngleSine; + fin >> para_name >> m_fSigmaS; + fin >> para_name >> m_fSigmaR; + fin >> para_name >> m_nLBPLength; + fin >> para_name >> m_nLBPLevelNum; + fin >> para_name; + for (i = 0; i < m_nLBPLevelNum; i++) + fin >> m_pLBPRadiuses[i]; + fin >> para_name; + for (i = 0; i < m_nLBPLevelNum; i++) + fin >> m_pLBPMeigPointNums[i]; + + fin >> para_name >> m_nMaxLBPModeNum; + fin >> para_name >> m_nLBPLength; + fin >> para_name >> m_nChannel; + fin >> para_name >> img_size.width >> img_size.height; + + if (m_cvImgSize.width != img_size.width || m_cvImgSize.height != img_size.height) { + printf("Image size is not matched!\n"); + return false; + } + + if (max_lbp_mode_num != m_nMaxLBPModeNum) { + PixelLBPStruct* PLBP = m_pPixelLBPs; + for (int yx = 0; yx < img_length; yx++) { + delete [] (*PLBP).LBPs; + delete [] (*PLBP).lbp_idxes; + (*PLBP).LBPs = new LBPStruct[m_nMaxLBPModeNum]; + (*PLBP).lbp_idxes = new unsigned short[m_nMaxLBPModeNum]; + } + } + + fin >> para_name; + + int img_length = m_cvImgSize.height * m_cvImgSize.width; + PixelLBPStruct* PLBP = m_pPixelLBPs; + + for (int yx = 0; yx < img_length; yx++) { + fin >> (*PLBP).num >> (*PLBP).bg_num >> (*PLBP).cur_bg_layer_no; + for (i = 0; i < (int) (*PLBP).num; i++) + fin >> (*PLBP).lbp_idxes[i]; + for (i = 0; i < (int) (*PLBP).num; i++) { + int li = (*PLBP).lbp_idxes[i]; + for (j = 0; j < m_nChannel; j++) { + fin >> (*PLBP).LBPs[li].bg_intensity[j] >> + (*PLBP).LBPs[li].max_intensity[j] >> (*PLBP).LBPs[li].min_intensity[j]; + } + for (j = 0; j < m_nLBPLength; j++) + fin >> (*PLBP).LBPs[li].bg_pattern[j]; + fin >> (*PLBP).LBPs[li].weight >> (*PLBP).LBPs[li].max_weight >> (*PLBP).LBPs[li].bg_layer_num + >> (*PLBP).LBPs[li].first_time >> (*PLBP).LBPs[li].last_time >> (*PLBP).LBPs[li].freq; + } + PLBP++; + } + } else { + printf("Not correct model save type!\n"); + fin.close(); + exit(0); + } + + fin.close(); + + ResetAllParameters(); + + return true; +} + +void CMultiLayerBGS::SetValidPointMask(IplImage *maskImage, int mode) { + if (mode == 1) + SetBkMaskImage(maskImage); + else + cvAnd(m_pBkMaskImg, maskImage, m_pBkMaskImg); +} + +void CMultiLayerBGS::SetFrameRate(float frameDuration) { + m_fModeUpdatingLearnRate = m_fModeUpdatingLearnRatePerSecond*frameDuration; + m_fWeightUpdatingLearnRate = m_fWeightUpdatingLearnRatePerSecond*frameDuration; + + m_fFrameDuration = frameDuration; + + m_f1_ModeUpdatingLearnRate = 1.0f - m_fModeUpdatingLearnRate; + m_f1_WeightUpdatingLearnRate = 1.0f - m_fWeightUpdatingLearnRate; +} + +void CMultiLayerBGS::Init(int width, int height) { + IplImage* first_img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); + int lbp_level_num = 1; + float radiuses[] = {2.0f}; + int neig_pt_nums[] = {6}; + Initialization(first_img, lbp_level_num, radiuses, neig_pt_nums); + cvReleaseImage(&first_img); +} + +int CMultiLayerBGS::SetRGBInputImage(IplImage *inputImage, CvRect *roi) { + if (!inputImage) { + printf("Please allocate the IplImage memory!\n"); + return 0; + } + if (inputImage->width != m_cvImgSize.width || + inputImage->height != m_cvImgSize.height || + inputImage->depth != IPL_DEPTH_8U || + inputImage->nChannels != 3) { + printf("Please provide the correct IplImage pointer, \ne.g. inputImage = cvCreateImage(imgSize, IPL_DEPTH_8U, 3);\n"); + return 0; + } + SetNewImage(inputImage, roi); + return 1; +} + +void CMultiLayerBGS::SetParameters(int max_lbp_mode_num, float mode_updating_learn_rate_per_second, float weight_updating_learn_rate_per_second, float low_init_mode_weight) { + m_nMaxLBPModeNum = max_lbp_mode_num; + m_fModeUpdatingLearnRate = mode_updating_learn_rate_per_second*m_fFrameDuration; + m_fWeightUpdatingLearnRate = weight_updating_learn_rate_per_second*m_fFrameDuration; + m_fLowInitialModeWeight = low_init_mode_weight; + + m_fModeUpdatingLearnRatePerSecond = mode_updating_learn_rate_per_second; + m_fWeightUpdatingLearnRatePerSecond = weight_updating_learn_rate_per_second; + + m_f1_ModeUpdatingLearnRate = 1.0f - m_fModeUpdatingLearnRate; + m_f1_WeightUpdatingLearnRate = 1.0f - m_fWeightUpdatingLearnRate; +} + +int CMultiLayerBGS::Process() { + BackgroundSubtractionProcess(); + return 1; +} + +int CMultiLayerBGS::SetForegroundMaskImage(IplImage* fg_mask_img) { + if (!fg_mask_img) { + printf("Please allocate the IplImage memory!\n"); + return 0; + } + if (fg_mask_img->width != m_cvImgSize.width || + fg_mask_img->height != m_cvImgSize.height || + fg_mask_img->depth != IPL_DEPTH_8U || + fg_mask_img->nChannels != 1) { + printf("Please provide the correct IplImage pointer, \ne.g. fg_mask_img = cvCreateImage(imgSize, IPL_DEPTH_8U, 1);\n"); + return 0; + } + + m_pFgMaskImg = fg_mask_img; + + return 1; +} + +int CMultiLayerBGS::SetForegroundProbImage(IplImage* fg_prob_img) { + if (!fg_prob_img) { + printf("Please allocate the IplImage memory!\n"); + return 0; + } + if (fg_prob_img->width != m_cvImgSize.width || + fg_prob_img->height != m_cvImgSize.height || + fg_prob_img->depth != IPL_DEPTH_8U) { + printf("Please provide the correct IplImage pointer, \ne.g. fg_prob_img = cvCreateImage(imgSize, IPL_DEPTH_8U, 1);\n"); + return 0; + } + + m_pFgProbImg = fg_prob_img; + + return 1; +} + +void CMultiLayerBGS::SetCurrentFrameNumber(unsigned long cur_frame_no) { + m_nCurImgFrameIdx = cur_frame_no; +} diff --git a/package_bgs/jmo/CMultiLayerBGS.h b/package_bgs/jmo/CMultiLayerBGS.h new file mode 100644 index 0000000..1eda55b --- /dev/null +++ b/package_bgs/jmo/CMultiLayerBGS.h @@ -0,0 +1,313 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- +* Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. The name of the author may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// BackgroundSubtraction.h: interface for the CBackgroundSubtraction class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(_MULTI_LAYER_BGS_H_) +#define _MULTI_LAYER_BGS_H_ + +/* +Since the used fast cross bilateral filter codes can not be compiled under Windows, +we don't use the bilateral filter to remove the noise in the foreground detection +step. If you compile it under Linux, please uncomment it. +*/ +//#define LINUX_BILATERAL_FILTER + +#include "LocalBinaryPattern.h" +#include "BGS.h" +#include <stdio.h> +#include <stdarg.h> +#include "BlobResult.h" +#include "OpenCvDataConversion.h" + +#include "BackgroundSubtractionAPI.h" + +#ifdef LINUX_BILATERAL_FILTER +#include "CrossBilateralFilter.h" // cross bilateral filter +#endif + +#include <ctime> // clock +#include <cstdlib> // C standard library +#include <cstdio> // C I/O (for sscanf) +#include <cstring> // string manipulation +#include <fstream> // file I/O +#include <cmath> // math includes +#include <iostream> // I/O streams + +using namespace std; // make std:: accessible + +class CMultiLayerBGS : public CBackgroundSubtractionAPI +{ +public: + //------------------------------------------------------------- + // TO CALL AT INITIALISATION: DEFINES THE SIZE OF THE INPUT IMAGES + // NORMALLY, UNNECESSARY IF A CONFIGURATION FILE IS LOADED + void Init(int width,int height); + + //------------------------------------------------------------- + // PROVIDE A MASK TO DEFINE THE SET OF POINTS WHERE BACKGROUND + // SUBTRACTION DOES NOT NEED TO BE PERFORMED + // + // mode is useful to specify if the points to remove from + // processing are in addition to the ones potentially + // removed according to the configuration file, + // or if they are the only ones to be removed + // + // mode=0 : provided points need to be removed + // in addition to those already removed + // mode=1 : the provided points are the only one to remove + // from processing + // Note: maskImage(li,co)=0 indicate the points to remove + // from background processing + void SetValidPointMask(IplImage* maskImage, int mode); + + //------------------------------------------------------------- + // + // set the frame rate, to adjust the update parameters + // to the actual frame rate. + // Can be called only once at initialisation, + // but in online cases, can be used to indicate + // the time interval during the last processed frame + // + // frameDuration is in millisecond + void SetFrameRate(float frameDuration); + + //------------------------------------------------------------- + // + // set some main parameters for background model learning. + // in general, we can set large updating rates for background + // model learning and set small updating rates in foreground + // detection + void SetParameters(int max_lbp_mode_num, // maximal LBP mode number + float mode_updating_learn_rate_per_second, // background mode updating learning rate per second + float weight_updating_learn_rate_per_second, // mode's weight updating learning rate per second + float low_init_mode_weight); // the low initial mode weight + + //------------------------------------------------------------- + // PROVIDE A POINTER TO THE INPUT IMAGE + // -> INDICATE WHERE THE NEW IMAGE TO PROCESS IS STORED + // + // Here assumes that the input image will contain RGB images. + // The memory of this image is handled by the caller. + // + // The return value indicate whether the actual Background + // Subtraction algorithm handles RGB images (1) or not (0). + // + int SetRGBInputImage(IplImage * inputImage, CvRect *roi=NULL); + + //------------------------------------------------------------- + // PROVIDE A POINTER TO THE RESULT IMAGE + // INDICATE WHERE THE BACKGROUND RESULT NEED TO BE STORED + // + int SetForegroundMaskImage(IplImage* fg_mask_img); + int SetForegroundProbImage(IplImage* fg_prob_img); + + //------------------------------------------------------------- + // This function should be called each time a new image is + // available in the input image. + // + // The return value is 0 if everything goes well, a non-zero value + // otherwise. + // + int Process(); + + //------------------------------------------------------------- + // this function should save parameters and information of the model + // (e.g. after a training of the model, or in such a way + // that the model can be reload to process the next frame + // type of save: + // 0 - background model information (pixel by pixel) + // 1 - background model parameters + // 2 - both background information (pixel by pixel) and parameters + void Save(const char *bg_model_fn, int save_type); + void Save(const char* bg_model_fn); + + //------------------------------------------------------------- + // this function should load the parameters necessary + // for the processing of the background subtraction or + // load background model information + bool Load(const char *bg_model_fn); + + + void SetCurrentFrameNumber(unsigned long cur_frame_no); + + void GetForegroundMaskImage(IplImage *fg_mask_img); + void GetForegroundImage(IplImage *fg_img, CvScalar bg_color=CV_RGB(0,255,0)); + void GetBackgroundImage(IplImage *bk_img); + void GetForegroundProbabilityImage(IplImage* fg_prob_img); + + void GetBgLayerNoImage(IplImage *bg_layer_no_img, CvScalar* layer_colors=NULL, int layer_num=0); + void GetLayeredBackgroundImage(int layered_no, IplImage *layered_bg_img, CvScalar empty_color=CV_RGB(0,0,0)); + void GetCurrentLayeredBackgroundImage(int layered_no, IplImage *layered_bg_img, IplImage *layered_fg_img=NULL, + CvScalar layered_bg_bk_color=CV_RGB(0,0,0), CvScalar layered_fg_color=CV_RGB(255,0,0), + int smooth_win=13, float smooth_sigma=3.0f, float below_layer_noise=0.5f, float above_layer_noise=0.3f, int min_blob_size=50); + float DistLBP(LBPStruct *LBP1, LBPStruct *LBP2); + void GetColoredBgMultiLayeredImage(IplImage *bg_multi_layer_img, CvScalar *layer_colors); + void UpdatePatternColorDistWeights(float *cur_pattern, float *bg_pattern); + void ExportLogMessage(char* msg); + void Postprocessing(); + void GetFloatEdgeImage(IplImage *src, IplImage *dst); + void RemoveBackgroundLayers(PixelLBPStruct *PLBP, bool *removed_modes=NULL); + float CalColorRangeDist(unsigned char *cur_intensity, float *bg_intensity, float *max_intensity, + float *min_intensity, float shadow_rate, float highlight_rate); + float CalVectorsAngle(float *c1, unsigned char *c2, int length); + float CalVectorsNoisedAngle(float *bg_color, unsigned char *noised_color, float offset, int length); + void ComputeGradientImage(IplImage *src, IplImage *dst, bool bIsFloat); + float CalColorBgDist(uchar *cur_intensity, float *bg_intensity, float *max_intensity, float *min_intensity); + float CalPatternBgDist(float *cur_pattern, float *bg_pattern); + + void GetForegroundMaskMap(CvMat *fg_mask_mat); + void Initialization(IplImage *first_img, int lbp_level_num, float *radiuses, int *neig_pt_nums); + void GetCurrentBackgroundDistMap(CvMat *bk_dist_map); + void BackgroundSubtractionProcess(); + void SetBkMaskImage(IplImage *mask_img); + void SetNewImage(IplImage *new_img, CvRect *roi=NULL); + + void ResetAllParameters(); + void QuickSort(float *pData, unsigned short *pIdxes, long low, long high, bool bAscent); + void UpdateBgPixelPattern(float *cur_pattern, float *bg_bg_pattern); + void UpdateBgPixelColor(unsigned char* cur_intensity, float* bg_intensity); + void Update_MAX_MIN_Intensity(unsigned char *cur_intensity, float *max_intensity, float *min_intensity); + void MergeImages(int num, ...); + + int m_nChannel; /* most of opencv functions support 1,2,3 or 4 channels, for the input images */ + + PixelLBPStruct* m_pPixelLBPs; /* the LBP texture patterns for each image */ + int m_nMaxLBPModeNum; /* the maximal number for the used LBP pattern models */ + float m_fModeUpdatingLearnRate; /* the background mode learning rate */ + float m_fWeightUpdatingLearnRate; /* the background mode weight updating rate */ + float m_f1_ModeUpdatingLearnRate; /* 1 - background_mode_learning_rate */ + float m_f1_WeightUpdatingLearnRate; /* 1 - background_mode_weight_updating_rate */ + float m_fRobustColorOffset; /* the intensity offset robust to noise */ + float m_fLowInitialModeWeight; /* the lowest weight of initial background mode */ + int m_nLBPLength; /* the length of texture LBP operator */ + float m_fPatternColorDistBgThreshold; /* the threshold value used to classify background and foreground */ + float m_fPatternColorDistBgUpdatedThreshold; /* the threshold value used to update the background modeling */ + float m_fMinBgLayerWeight; /* the minimal weight to remove background layers */ + + int m_nPatternDistSmoothNeigHalfSize; /* the neighboring half size of gaussian window to remove the noise + on the distance map */ + float m_fPatternDistConvGaussianSigma; /* the gaussian sigma used to remove the noise on the distance map */ + + float m_fBackgroundModelPercent; /* the background mode percent, the first several background modes + with high mode weights should be regarded as reliable background modes */ + + float m_fRobustShadowRate; /* the minimal shadow rate, [0.4, 0.7] */ + float m_fRobustHighlightRate; /* the maximal highlight rate, [1.1, 1.4] */ + + int m_nLBPImgNum; /* the number of images used for texture LBP feature */ + + float m_fMinLBPBinaryProb; /* the minimal LBP binary probability */ + float m_f1_MinLBPBinaryProb; /* 1 - minimal_LBP_binary_probability */ + + CvSize m_cvImgSize; /* the image size (width, height) */ + + unsigned long m_nCurImgFrameIdx; /* the frame index of current image */ + + bool m_bUsedGradImage; /* the boolean variable signaling whether the gradient image is used + or not for computing LBP operator */ + + bool m_bUsedColorLBP; /* true - multi-channel color image for LBP operator, + false - gray-scale image for LBP operator */ + + CLocalBinaryPattern m_cLBP; /* the class instant for computing LBP (local binary pattern) texture feature */ + + IplImage* m_pBkMaskImg; /* the mask image corresponding to the input image, + i.e. all the masked pixels should be processed */ + + IplImage* m_pOrgImg; /* the original image */ + IplImage** m_ppOrgLBPImgs; /* the multi-layer images used for LBP feature extraction */ + IplImage* m_pFgImg; /* the foreground image */ + IplImage* m_pBgImg; /* the background image */ + IplImage* m_pFgMaskImg; /* the foreground mask image */ + IplImage* m_pBgDistImg; /* the background distance image (float) */ + IplImage* m_pEdgeImg; /* the edge image used for cross bilateral filter */ + IplImage* m_pFgProbImg; /* the foreground probability image (uchar) */ + + IplImage* m_pFirstAppearingTimeMap; + +#ifdef LINUX_BILATERAL_FILTER + CCrossBilateralFilter m_cCrossBF; /* the class instant for cross bilateral filter + which should be used to remove noise on the distance map */ +#endif + + bool m_disableLearning; + float m_fSigmaS; /* sigma in the spatial domain for cross bilateral filter */ + float m_fSigmaR; /* sigma in the normalized intensity domain for cross bilateral filter */ + + float m_fTextureWeight; /* the weight value of texture LBP feature + for background modeling & foreground detection */ + + float m_fColorWeight; /* the weight value of color invariant feature + for background modeling & foreground detection */ + + float m_fWeightUpdatingConstant; /* the constant ( >= 1 ) for 'hysteries' weight updating scheme + (increase when matched, decrease when un-matched */ + + float m_fReliableBackgroundModeWeight; /* the weight value for background mode + which should be regarded as a reliable background mode, + which is useful for multi-layer scheme */ + + float m_fMinNoisedAngle; /* the minimal angle value between the background color + and the noised observed color */ + + float m_fMinNoisedAngleSine; /* the minimal angle sine value between the background color + and the noised observed color */ + + float m_fFrameDuration; /* frame duration */ + + float m_fModeUpdatingLearnRatePerSecond; + float m_fWeightUpdatingLearnRatePerSecond; + + int m_nLBPLevelNum; + float m_pLBPRadiuses[10]; + int m_pLBPMeigPointNums[10]; + + CvRect* m_pROI; + CMultiLayerBGS(); + virtual ~CMultiLayerBGS(); +}; + +#endif // !defined(_MULTI_LAYER_BGS_H_) + diff --git a/package_bgs/jmo/LocalBinaryPattern.cpp b/package_bgs/jmo/LocalBinaryPattern.cpp new file mode 100644 index 0000000..45528aa --- /dev/null +++ b/package_bgs/jmo/LocalBinaryPattern.cpp @@ -0,0 +1,314 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- +* Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. The name of the author may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// LocalBinaryPattern.cpp: implementation of the CLocalBinaryPattern class. +// +////////////////////////////////////////////////////////////////////// + +#include "LocalBinaryPattern.h" + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CLocalBinaryPattern::CLocalBinaryPattern() +{ + m_ppOrgImgs = NULL; + m_pRadiuses = NULL; + m_fRobustWhiteNoise = 3.0f; + m_pNeigPointsNums = NULL; + m_pXYShifts = NULL; + m_pShiftedImg = NULL; +} + +CLocalBinaryPattern::~CLocalBinaryPattern() +{ + FreeMemories(); +} + +void CLocalBinaryPattern::Initialization(IplImage **first_imgs, int imgs_num, int level_num, float *radius, int *neig_pt_num, float robust_white_noise, int type) +{ + + m_nImgsNum = imgs_num; + + m_nLBPLevelNum = level_num; + + m_pRadiuses = new float[m_nLBPLevelNum]; + m_pNeigPointsNums= new int[m_nLBPLevelNum]; + m_ppOrgImgs = first_imgs; + + int a, b; + for ( a = 0 ; a < m_nImgsNum ; a++ ) { + m_cvImgSize = cvGetSize(first_imgs[a]); + + if ( first_imgs[a]->nChannels > 1 ) { + printf("Input image channel must be 1!"); + exit(1); + } + } + + int tot_neig_pts_num = 0; + for ( a = 0 ; a < m_nLBPLevelNum ; a++ ) { + m_pRadiuses[a] = radius[a]; + m_pNeigPointsNums[a] = neig_pt_num[a]; + tot_neig_pts_num += neig_pt_num[a]; + if ( m_pNeigPointsNums[a] % 2 != 0 ) { + printf("Even number must be given for points number for LBP!\n"); + exit(1); + } + } + + m_pShiftedImg = cvCloneImage(m_ppOrgImgs[0]); + + m_pXYShifts = new CvPoint[tot_neig_pts_num]; + + m_nMaxShift.x = 0; + m_nMaxShift.y = 0; + int shift_idx = 0; + for ( a = 0 ; a < m_nLBPLevelNum ; a++ ) + for ( b = 0 ; b < m_pNeigPointsNums[a] ; b++ ) { + // compute the offset of neig point + CalNeigPixelOffset(m_pRadiuses[a], m_pNeigPointsNums[a], b, m_pXYShifts[shift_idx].x, m_pXYShifts[shift_idx].y); + m_nMaxShift.x = MAX(m_nMaxShift.x, m_pXYShifts[shift_idx].x); + m_nMaxShift.y = MAX(m_nMaxShift.y, m_pXYShifts[shift_idx].y); + shift_idx++; + } + + m_fRobustWhiteNoise = robust_white_noise; +} + +void CLocalBinaryPattern::SetNewImages(IplImage **new_imgs) +{ + m_ppOrgImgs = new_imgs; +} + +void CLocalBinaryPattern::ComputeLBP(PixelLBPStruct *PLBP, CvRect *roi) +{ + float *dif_pattern; + float *_dif_pattern; + PixelLBPStruct *_PLBP; + int data_length; + float *cur_pattern; + + // allocate memories + if ( roi ) + data_length = roi->height*roi->width; + else + data_length = m_cvImgSize.width*m_cvImgSize.height; + + dif_pattern = new float[data_length]; + + int img_idx, pt_idx, yx, level; + int pattern_idx = 0; + for ( img_idx = 0 ; img_idx < m_nImgsNum ; img_idx++ ) { + for ( level = 0 ; level < m_nLBPLevelNum ; level++ ) { + for ( pt_idx = 0 ; pt_idx < m_pNeigPointsNums[level] ; pt_idx++ ) { + + // computing the shifted image + CalShiftedImage(m_ppOrgImgs[img_idx], m_pXYShifts[pattern_idx].x, m_pXYShifts[pattern_idx].y, m_pShiftedImg, roi); + + // computing the different binary images + CalImageDifferenceMap(m_ppOrgImgs[img_idx], m_pShiftedImg, dif_pattern, roi); + + // set the binary values + _PLBP = PLBP; + _dif_pattern = dif_pattern; + + if ( roi ) { + int x, y; + for ( y = 0 ; y < roi->height ; y++ ) { + _PLBP = PLBP + (y+roi->y)*m_cvImgSize.width + roi->x; + for ( x = 0 ; x < roi->width ; x++ ) { + cur_pattern = (*_PLBP++).cur_pattern; + cur_pattern[pattern_idx] = *_dif_pattern++; + } + } + } + else { + for ( yx = 0 ; yx < data_length ; yx++ ) { + cur_pattern = (*_PLBP++).cur_pattern; + cur_pattern[pattern_idx] = *_dif_pattern++; + } + } + + pattern_idx++; + + } + } + } + + // release memories + delete [] dif_pattern; + + //delete [] shifted_dif_pattern; + //cvReleaseImage(&shifted_img); + //cvReleaseImage(&pattern_img); +} + +void CLocalBinaryPattern::FreeMemories() +{ + if ( m_pRadiuses != NULL ) + delete [] m_pRadiuses; + if ( m_pNeigPointsNums != NULL ) + delete [] m_pNeigPointsNums; + if ( m_pXYShifts ) + delete [] m_pXYShifts; + if ( m_pShiftedImg ) + cvReleaseImage(&m_pShiftedImg); + + m_pXYShifts = NULL; + m_pRadiuses = NULL; + m_pNeigPointsNums = NULL; + m_pShiftedImg = NULL; +} + +void CLocalBinaryPattern::SetShiftedMeshGrid(CvSize img_size, float offset_x, float offset_y, CvMat *grid_map_x, CvMat *grid_map_y) +{ + float *gX = (float*)(grid_map_x->data.ptr); + float *gY = (float*)(grid_map_y->data.ptr); + + int x, y; + for ( y = 0 ; y < img_size.height ; y++ ) { + for ( x = 0 ; x < img_size.width ; x++ ) { + *gX++ = (float)x + offset_x; + *gY++ = (float)y + offset_y; + } + } +} + +void CLocalBinaryPattern::CalShiftedImage(IplImage *src, int offset_x, int offset_y, IplImage *dst, CvRect *roi) +{ + CvRect src_roi, dst_roi; + int roi_width, roi_height; + + if ( roi ) { + src_roi.x = MAX(offset_x+roi->x, 0); + src_roi.y = MAX(offset_y+roi->y, 0); + + dst_roi.x = MAX(-(offset_x+roi->x), roi->x); + dst_roi.y = MAX(-(offset_y+roi->y), roi->y); + + roi_width = MIN(MIN(roi->width+(int)fabsf((float)offset_x), src->width-src_roi.x), dst->width-dst_roi.x); + roi_height = MIN(MIN(roi->height+(int)fabsf((float)offset_y), src->height-src_roi.y), dst->height-dst_roi.y); + + src_roi.width = roi_width; + src_roi.height = roi_height; + + dst_roi.width = roi_width; + dst_roi.height = roi_height; + } + else { + roi_width = src->width-(int)fabsf((float)offset_x); + roi_height = src->height-(int)fabsf((float)offset_y); + + src_roi.x = MAX(offset_x, 0); + src_roi.y = MAX(offset_y, 0); + src_roi.width = roi_width; + src_roi.height = roi_height; + + dst_roi.x = MAX(-offset_x, 0); + dst_roi.y = MAX(-offset_y, 0); + dst_roi.width = roi_width; + dst_roi.height = roi_height; + } + + cvSet(dst,cvScalar(0)); + + if ( roi_width <= 0 || roi_height <= 0 ) + return; + + cvSetImageROI(src, src_roi); + cvSetImageROI(dst, dst_roi); + cvCopy(src, dst); + cvResetImageROI(src); + cvResetImageROI(dst); +} + +void CLocalBinaryPattern::CalNeigPixelOffset(float radius, int tot_neig_pts_num, int neig_pt_idx, int &offset_x, int &offset_y) +{ + float angle = (float)neig_pt_idx/(float)tot_neig_pts_num*2.0f*PI; + offset_x = cvRound(radius*cosf(angle)); + offset_y = cvRound(-radius*sinf(angle)); +} + +void CLocalBinaryPattern::CalImageDifferenceMap(IplImage *cent_img, IplImage *neig_img, float *pattern, CvRect *roi) +{ + COpencvDataConversion<uchar, uchar> ODC; + + if ( roi ) { + cvSetImageROI(cent_img, *roi); + cvSetImageROI(neig_img, *roi); + } + + uchar *_centI = ODC.GetImageData(cent_img); + uchar *_neigI = ODC.GetImageData(neig_img); + uchar *centI = _centI; + uchar *neigI = _neigI; + + float *tmp_pattern = pattern; + + int xy; + int length; + + if ( roi ) + length = roi->height*roi->width; + else + length = cent_img->height*cent_img->width; + + for ( xy = 0 ; xy < length ; xy++ ) { + *tmp_pattern = (float)BINARY_PATTERM_ELEM(*neigI, *centI, m_fRobustWhiteNoise); + tmp_pattern++; + centI++; + neigI++; + } + + if ( roi ) { + cvResetImageROI(cent_img); + cvResetImageROI(neig_img); + } + + // release memories + delete [] _centI; + delete [] _neigI; + +} + diff --git a/package_bgs/jmo/LocalBinaryPattern.h b/package_bgs/jmo/LocalBinaryPattern.h new file mode 100644 index 0000000..307d94f --- /dev/null +++ b/package_bgs/jmo/LocalBinaryPattern.h @@ -0,0 +1,103 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- +* Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. The name of the author may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// LocalBinaryPattern.h: interface for the CLocalBinaryPattern class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(_LOCAL_BINARY_PATTERN_H_) +#define _LOCAL_BINARY_PATTERN_H_ + +#include <cv.h> +#include "BGS.h" + + +/************************************************************************/ +/* two types of computing the LBP operators but currently GENERAL_LBP */ +/* has been implemented. */ +/************************************************************************/ +#define GENERAL_LBP 0 +#define SYMMETRIC_LBP 1 + +#include <cstdio> // C I/O (for sscanf) +#include "OpenCvDataConversion.h" + + +class CLocalBinaryPattern +{ +public: + void CalImageDifferenceMap(IplImage *cent_img, IplImage *neig_img, float *pattern, CvRect *roi=NULL); + void CalNeigPixelOffset(float radius, int tot_neig_pts_num, int neig_pt_idx, int &offset_x, int &offset_y); + void CalShiftedImage(IplImage *src, int offset_x, int offset_y, IplImage *dst, CvRect *roi=NULL); + void FreeMemories(); + void ComputeLBP(PixelLBPStruct *PLBP, CvRect *roi=NULL); + void SetNewImages(IplImage **new_imgs); + + IplImage** m_ppOrgImgs; /* the original images used for computing the LBP operators */ + + void Initialization(IplImage **first_imgs, int imgs_num, + int level_num, float *radius, int *neig_pt_num, + float robust_white_noise = 3.0f, int type = GENERAL_LBP); + + CLocalBinaryPattern(); + virtual ~CLocalBinaryPattern(); + + float m_fRobustWhiteNoise; /* the robust noise value for computing the LBP operator in each channel */ + +private: + void SetShiftedMeshGrid(CvSize img_size, float offset_x, float offset_y, CvMat *grid_map_x, CvMat *grid_map_y); + + float* m_pRadiuses; /* the circle radiuses for the LBP operator */ + int m_nLBPType; /* the type of computing LBP operator */ + int* m_pNeigPointsNums; /* the numbers of neighboring pixels on multi-level circles */ + int m_nImgsNum; /* the number of multi-channel image */ + int m_nLBPLevelNum; /* the number of multi-level LBP operator */ + CvSize m_cvImgSize; /* the image size (width, height) */ + + CvPoint* m_pXYShifts; + CvPoint m_nMaxShift; + + IplImage* m_pShiftedImg; +}; + +#endif // !defined(_LOCAL_BINARY_PATTERN_H_) + diff --git a/package_bgs/jmo/MultiLayerBGS.cpp b/package_bgs/jmo/MultiLayerBGS.cpp new file mode 100644 index 0000000..dc0a6e8 --- /dev/null +++ b/package_bgs/jmo/MultiLayerBGS.cpp @@ -0,0 +1,332 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "MultiLayerBGS.h" + +MultiLayerBGS::MultiLayerBGS() : firstTime(true), showOutput(true), + bg_model_preload(""), saveModel(false), disableLearning(false), disableDetectMode(true), loadDefaultParams(true), + detectAfter(0), frameNumber(0) +{ + std::cout << "MultiLayerBGS()" << std::endl; +} + +MultiLayerBGS::~MultiLayerBGS() +{ + finish(); + std::cout << "~MultiLayerBGS()" << std::endl; +} + +void MultiLayerBGS::setStatus(Status _status) +{ + status = _status; +} + +void MultiLayerBGS::finish(void) +{ + if(bg_model_preload.empty()) + { + bg_model_preload = "./models/MultiLayerBGSModel.yml"; + saveConfig(); + } + + if(status == MLBGS_LEARN && saveModel == true) + { + std::cout << "MultiLayerBGS saving background model: " << bg_model_preload << std::endl; + BGS->Save(bg_model_preload.c_str()); + } + + cvReleaseImage(&fg_img); + cvReleaseImage(&bg_img); + cvReleaseImage(&fg_prob_img); + cvReleaseImage(&fg_mask_img); + cvReleaseImage(&fg_prob_img3); + cvReleaseImage(&merged_img); + + delete BGS; +} + +void MultiLayerBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + CvSize img_size = cvSize(cvCeil((double) img_input.size().width), cvCeil((double) img_input.size().height)); + + if(firstTime) + { + if(disableDetectMode) + status = MLBGS_LEARN; + + if(status == MLBGS_LEARN) + std::cout << "MultiLayerBGS in LEARN mode" << std::endl; + + if(status == MLBGS_DETECT) + std::cout << "MultiLayerBGS in DETECT mode" << std::endl; + + org_img = new IplImage(img_input); + + fg_img = cvCreateImage(img_size, org_img->depth, org_img->nChannels); + bg_img = cvCreateImage(img_size, org_img->depth, org_img->nChannels); + fg_prob_img = cvCreateImage(img_size, org_img->depth, 1); + fg_mask_img = cvCreateImage(img_size, org_img->depth, 1); + fg_prob_img3 = cvCreateImage(img_size, org_img->depth, org_img->nChannels); + merged_img = cvCreateImage(cvSize(img_size.width * 2, img_size.height * 2), org_img->depth, org_img->nChannels); + + BGS = new CMultiLayerBGS(); + BGS->Init(img_size.width, img_size.height); + BGS->SetForegroundMaskImage(fg_mask_img); + BGS->SetForegroundProbImage(fg_prob_img); + + if(bg_model_preload.empty() == false) + { + std::cout << "MultiLayerBGS loading background model: " << bg_model_preload << std::endl; + BGS->Load(bg_model_preload.c_str()); + } + + if(status == MLBGS_DETECT) + { + BGS->m_disableLearning = disableLearning; + + if(disableLearning) + std::cout << "MultiLayerBGS disabled learning in DETECT mode" << std::endl; + else + std::cout << "MultiLayerBGS enabled learning in DETECT mode" << std::endl; + } + + if(loadDefaultParams) + { + std::cout << "MultiLayerBGS loading default params" << std::endl; + + max_mode_num = 5; + weight_updating_constant = 5.0; + texture_weight = 0.5; + bg_mode_percent = 0.6; + pattern_neig_half_size = 4; + pattern_neig_gaus_sigma = 3.0; + bg_prob_threshold = 0.2; + bg_prob_updating_threshold = 0.2; + robust_LBP_constant = 3; + min_noised_angle = 10.0 / 180.0 * PI; //0,01768 + shadow_rate = 0.6; + highlight_rate = 1.2; + bilater_filter_sigma_s = 3.0; + bilater_filter_sigma_r = 0.1; + } + else + std::cout << "MultiLayerBGS loading config params" << std::endl; + + BGS->m_nMaxLBPModeNum = max_mode_num; + BGS->m_fWeightUpdatingConstant = weight_updating_constant; + BGS->m_fTextureWeight = texture_weight; + BGS->m_fBackgroundModelPercent = bg_mode_percent; + BGS->m_nPatternDistSmoothNeigHalfSize = pattern_neig_half_size; + BGS->m_fPatternDistConvGaussianSigma = pattern_neig_gaus_sigma; + BGS->m_fPatternColorDistBgThreshold = bg_prob_threshold; + BGS->m_fPatternColorDistBgUpdatedThreshold = bg_prob_updating_threshold; + BGS->m_fRobustColorOffset = robust_LBP_constant; + BGS->m_fMinNoisedAngle = min_noised_angle; + BGS->m_fRobustShadowRate = shadow_rate; + BGS->m_fRobustHighlightRate = highlight_rate; + BGS->m_fSigmaS = bilater_filter_sigma_s; + BGS->m_fSigmaR = bilater_filter_sigma_r; + + if(loadDefaultParams) + { + //frame_duration = 1.0 / 30.0; + //frame_duration = 1.0 / 25.0; + frame_duration = 1.0 / 10.0; + } + + BGS->SetFrameRate(frame_duration); + + if(status == MLBGS_LEARN) + { + if(loadDefaultParams) + { + mode_learn_rate_per_second = 0.5; + weight_learn_rate_per_second = 0.5; + init_mode_weight = 0.05; + } + else + { + mode_learn_rate_per_second = learn_mode_learn_rate_per_second; + weight_learn_rate_per_second = learn_weight_learn_rate_per_second; + init_mode_weight = learn_init_mode_weight; + } + } + + if(status == MLBGS_DETECT) + { + if(loadDefaultParams) + { + mode_learn_rate_per_second = 0.01; + weight_learn_rate_per_second = 0.01; + init_mode_weight = 0.001; + } + else + { + mode_learn_rate_per_second = detect_mode_learn_rate_per_second; + weight_learn_rate_per_second = detect_weight_learn_rate_per_second; + init_mode_weight = detect_init_mode_weight; + } + } + + BGS->SetParameters(max_mode_num, mode_learn_rate_per_second, weight_learn_rate_per_second, init_mode_weight); + + saveConfig(); + + delete org_img; + } + + //IplImage* inputImage = new IplImage(img_input); + //IplImage* img = cvCreateImage(img_size, IPL_DEPTH_8U, 3); + //cvCopy(inputImage, img); + //delete inputImage; + + if(detectAfter > 0 && detectAfter == frameNumber) + { + std::cout << "MultiLayerBGS in DETECT mode" << std::endl; + + status = MLBGS_DETECT; + + mode_learn_rate_per_second = 0.01; + weight_learn_rate_per_second = 0.01; + init_mode_weight = 0.001; + + BGS->SetParameters(max_mode_num, mode_learn_rate_per_second, weight_learn_rate_per_second, init_mode_weight); + + BGS->m_disableLearning = disableLearning; + + if(disableLearning) + std::cout << "MultiLayerBGS disabled learning in DETECT mode" << std::endl; + else + std::cout << "MultiLayerBGS enabled learning in DETECT mode" << std::endl; + } + + IplImage* img = new IplImage(img_input); + + BGS->SetRGBInputImage(img); + BGS->Process(); + + BGS->GetBackgroundImage(bg_img); + BGS->GetForegroundImage(fg_img); + BGS->GetForegroundProbabilityImage(fg_prob_img3); + BGS->GetForegroundMaskImage(fg_mask_img); + BGS->MergeImages(4, img, bg_img, fg_prob_img3, fg_img, merged_img); + + img_merged = cv::Mat(merged_img); + img_foreground = cv::Mat(fg_mask_img); + img_background = cv::Mat(bg_img); + + if(showOutput) + { + cv::imshow("MLBGS Layers", img_merged); + cv::imshow("MLBGS FG Mask", img_foreground); + } + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + delete img; + //cvReleaseImage(&img); + + firstTime = false; + frameNumber++; +} + +void MultiLayerBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/MultiLayerBGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteString(fs, "preloadModel", bg_model_preload.c_str()); + cvWriteInt(fs, "saveModel", saveModel); + cvWriteInt(fs, "detectAfter", detectAfter); + cvWriteInt(fs, "disableDetectMode", disableDetectMode); + cvWriteInt(fs, "disableLearningInDetecMode", disableLearning); + cvWriteInt(fs, "loadDefaultParams", loadDefaultParams); + + cvWriteInt(fs, "max_mode_num", max_mode_num); + cvWriteReal(fs, "weight_updating_constant", weight_updating_constant); + cvWriteReal(fs, "texture_weight", texture_weight); + cvWriteReal(fs, "bg_mode_percent", bg_mode_percent); + cvWriteInt(fs, "pattern_neig_half_size", pattern_neig_half_size); + cvWriteReal(fs, "pattern_neig_gaus_sigma", pattern_neig_gaus_sigma); + cvWriteReal(fs, "bg_prob_threshold", bg_prob_threshold); + cvWriteReal(fs, "bg_prob_updating_threshold", bg_prob_updating_threshold); + cvWriteInt(fs, "robust_LBP_constant", robust_LBP_constant); + cvWriteReal(fs, "min_noised_angle", min_noised_angle); + cvWriteReal(fs, "shadow_rate", shadow_rate); + cvWriteReal(fs, "highlight_rate", highlight_rate); + cvWriteReal(fs, "bilater_filter_sigma_s", bilater_filter_sigma_s); + cvWriteReal(fs, "bilater_filter_sigma_r", bilater_filter_sigma_r); + + cvWriteReal(fs, "frame_duration", frame_duration); + + cvWriteReal(fs, "learn_mode_learn_rate_per_second", learn_mode_learn_rate_per_second); + cvWriteReal(fs, "learn_weight_learn_rate_per_second", learn_weight_learn_rate_per_second); + cvWriteReal(fs, "learn_init_mode_weight", learn_init_mode_weight); + + cvWriteReal(fs, "detect_mode_learn_rate_per_second", detect_mode_learn_rate_per_second); + cvWriteReal(fs, "detect_weight_learn_rate_per_second", detect_weight_learn_rate_per_second); + cvWriteReal(fs, "detect_init_mode_weight", detect_init_mode_weight); + + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void MultiLayerBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/MultiLayerBGS.xml", 0, CV_STORAGE_READ); + + bg_model_preload = cvReadStringByName(fs, 0, "preloadModel", ""); + saveModel = cvReadIntByName(fs, 0, "saveModel", false); + detectAfter = cvReadIntByName(fs, 0, "detectAfter", 0); + disableDetectMode = cvReadIntByName(fs, 0, "disableDetectMode", true); + disableLearning = cvReadIntByName(fs, 0, "disableLearningInDetecMode", false); + loadDefaultParams = cvReadIntByName(fs, 0, "loadDefaultParams", true); + + max_mode_num = cvReadIntByName(fs, 0, "max_mode_num", 5); + weight_updating_constant = cvReadRealByName(fs, 0, "weight_updating_constant", 5.0); + texture_weight = cvReadRealByName(fs, 0, "texture_weight", 0.5); + bg_mode_percent = cvReadRealByName(fs, 0, "bg_mode_percent", 0.6); + pattern_neig_half_size = cvReadIntByName(fs, 0, "pattern_neig_half_size", 4); + pattern_neig_gaus_sigma = cvReadRealByName(fs, 0, "pattern_neig_gaus_sigma", 3.0); + bg_prob_threshold = cvReadRealByName(fs, 0, "bg_prob_threshold", 0.2); + bg_prob_updating_threshold = cvReadRealByName(fs, 0, "bg_prob_updating_threshold", 0.2); + robust_LBP_constant = cvReadIntByName(fs, 0, "robust_LBP_constant", 3); + min_noised_angle = cvReadRealByName(fs, 0, "min_noised_angle", 0.01768); + shadow_rate = cvReadRealByName(fs, 0, "shadow_rate", 0.6); + highlight_rate = cvReadRealByName(fs, 0, "highlight_rate", 1.2); + bilater_filter_sigma_s = cvReadRealByName(fs, 0, "bilater_filter_sigma_s", 3.0); + bilater_filter_sigma_r = cvReadRealByName(fs, 0, "bilater_filter_sigma_r", 0.1); + + frame_duration = cvReadRealByName(fs, 0, "frame_duration", 0.1); + + learn_mode_learn_rate_per_second = cvReadRealByName(fs, 0, "learn_mode_learn_rate_per_second", 0.5); + learn_weight_learn_rate_per_second = cvReadRealByName(fs, 0, "learn_weight_learn_rate_per_second", 0.5); + learn_init_mode_weight = cvReadRealByName(fs, 0, "learn_init_mode_weight", 0.05); + + detect_mode_learn_rate_per_second = cvReadRealByName(fs, 0, "detect_mode_learn_rate_per_second", 0.01); + detect_weight_learn_rate_per_second = cvReadRealByName(fs, 0, "detect_weight_learn_rate_per_second", 0.01); + detect_init_mode_weight = cvReadRealByName(fs, 0, "detect_init_mode_weight", 0.001); + + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/jmo/MultiLayerBGS.h b/package_bgs/jmo/MultiLayerBGS.h new file mode 100644 index 0000000..671a788 --- /dev/null +++ b/package_bgs/jmo/MultiLayerBGS.h @@ -0,0 +1,101 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" +#include "CMultiLayerBGS.h" + +class MultiLayerBGS : public IBGS +{ +public: + enum Status + { + MLBGS_NONE = -1, + MLBGS_LEARN = 0, + MLBGS_DETECT = 1 + }; + +private: + bool firstTime; + long long frameNumber; + cv::Mat img_foreground; + cv::Mat img_merged; + cv::Mat img_background; + bool showOutput; + bool saveModel; + bool disableDetectMode; + bool disableLearning; + int detectAfter; + CMultiLayerBGS* BGS; + Status status; + IplImage* img; + IplImage* org_img; + IplImage* fg_img; + IplImage* bg_img; + IplImage* fg_prob_img; + IplImage* fg_mask_img; + IplImage* fg_prob_img3; + IplImage* merged_img; + std::string bg_model_preload; + + bool loadDefaultParams; + + int max_mode_num; + float weight_updating_constant; + float texture_weight; + float bg_mode_percent; + int pattern_neig_half_size; + float pattern_neig_gaus_sigma; + float bg_prob_threshold; + float bg_prob_updating_threshold; + int robust_LBP_constant; + float min_noised_angle; + float shadow_rate; + float highlight_rate; + float bilater_filter_sigma_s; + float bilater_filter_sigma_r; + + float frame_duration; + + float mode_learn_rate_per_second; + float weight_learn_rate_per_second; + float init_mode_weight; + + float learn_mode_learn_rate_per_second; + float learn_weight_learn_rate_per_second; + float learn_init_mode_weight; + + float detect_mode_learn_rate_per_second; + float detect_weight_learn_rate_per_second; + float detect_init_mode_weight; + +public: + MultiLayerBGS(); + ~MultiLayerBGS(); + + void setStatus(Status status); + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void finish(void); + void saveConfig(); + void loadConfig(); +}; \ No newline at end of file diff --git a/package_bgs/jmo/OpenCvDataConversion.h b/package_bgs/jmo/OpenCvDataConversion.h new file mode 100644 index 0000000..22d6ec9 --- /dev/null +++ b/package_bgs/jmo/OpenCvDataConversion.h @@ -0,0 +1,224 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- +* Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. The name of the author may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// OpencvDataConversion.h: interface for the COpencvDataConversion class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(_OPENCV_DATA_CONVERSION_H_) +#define _OPENCV_DATA_CONVERSION_H_ + +#include <cv.h> +#include <stdio.h> + +template <class TI, class TM> /* class TI - the type of image data, class TM - the type of matrix data */ +class COpencvDataConversion +{ +public: + + /* get the image data */ + TI * GetImageData(IplImage *img) + { + if ( !img->roi ) { /* no ROI used, i.e. the whole image */ + int y; //, x; + TI* img_data = new TI[img->width*img->height*img->nChannels]; + TI* temp = img_data; + TI* x_data; + + for ( y = 0 ; y < img->height ; y++ ) { + x_data = (TI*)(img->imageData + img->widthStep*y); + int row_length = img->width*img->nChannels; + memcpy(temp, x_data, sizeof(TI)*row_length); + temp += row_length; + /* + for ( x = 0 ; x < img->width*img->nChannels ; x++ ) + *temp++ = *x_data++; + */ + } + + return img_data; + } + else { /* get image data only in ROI */ + int y;//, x; + TI* img_data = new TI[img->roi->width*img->roi->height*img->nChannels]; + TI* temp = img_data; + TI* x_data; + for ( y = img->roi->yOffset ; y < img->roi->yOffset+img->roi->height ; y++ ) { + x_data = (TI*)(img->imageData + img->widthStep*y + img->roi->xOffset*sizeof(TI)*img->nChannels); + int row_length = img->roi->width*img->nChannels; + memcpy(temp, x_data, sizeof(TI)*row_length); + temp += row_length; + /* + for ( x = 0 ; x < img->roi->width*img->nChannels ; x++ ) + *temp++ = *x_data++; + */ + } + return img_data; + } + }; + + /* set the image data */ + void SetImageData(IplImage *img, TI *img_data) + { + if ( !img->roi ) { /* no ROI used, i.e. the whole image */ + int y;//, x; + TI* temp = img_data; + TI* x_data; + for ( y = 0 ; y < img->height ; y++ ) { + x_data = (TI*)(img->imageData + img->widthStep*y); + int row_length = img->width*img->nChannels; + memcpy(x_data, temp, sizeof(TI)*row_length); + temp += row_length; + /* + for ( x = 0 ; x < img->width*img->nChannels ; x++ ) + *x_data++ = *temp++; + */ + } + } + else { /* set image data only in ROI */ + int y;//, x; + TI* temp = img_data; + TI* x_data; + for ( y = img->roi->yOffset ; y < img->roi->yOffset+img->roi->height ; y++ ) { + x_data = (TI*)(img->imageData + img->widthStep*y + img->roi->xOffset*sizeof(TI)*img->nChannels); + int row_length = img->roi->width*img->nChannels; + memcpy(x_data, temp, sizeof(TI)*row_length); + temp += row_length; + /* + for ( x = 0 ; x < img->roi->width*img->nChannels ; x++ ) + *x_data++ = *temp++; + */ + } + } + } + + /* get the matrix data */ + TM * GetMatData(CvMat *mat) + { + TM* mat_data = new TM[mat->width*mat->height]; + memcpy(mat_data, mat->data.ptr, sizeof(TM)*mat->width*mat->height); + return mat_data; + + /* + int y, x; + TM* mat_data = new TM[mat->width*mat->height]; + TM* temp = mat_data; + TM* x_data; + for ( y = 0 ; y < mat->height ; y++ ) { + x_data = (TM*)(mat->data.ptr + mat->step*y); + for ( x = 0 ; x < mat->width ; x++ ) + *temp++ = *x_data++; + } + return mat_data; + */ + }; + + /* set the matrix data */ + void SetMatData(CvMat *mat, TM *mat_data) + { + memcpy(mat->data.ptr, mat_data, sizeof(TM)*mat->width*mat->height); + + /* + int y, x; + TM* temp = mat_data; + TM* x_data; + for ( y = 0 ; y < mat->height ; y++ ) { + x_data = (TM*)(mat->data.ptr + mat->step*y); + for ( x = 0 ; x < mat->width ; x++ ) + *x_data++ = *temp++; + } + */ + } + + /* convert the image data to the matrix data */ + void ConvertData(IplImage *img_src, CvMat *mat_dst) + { + if ( img_src->nChannels > 1 ) { + printf("Must be one-channel image for ConvertImageData!\n"); + exit(1); + } + + TI* _img_data = GetImageData(img_src); + TM* _mat_data = new TM[img_src->width*img_src->height]; + + TI* img_data = _img_data; + TM* mat_data = _mat_data; + int i; + for ( i = 0 ; i < img_src->width*img_src->height ; i++ ) + *mat_data++ = (TM)(*img_data++); + + SetMatData(mat_dst, _mat_data); + + delete [] _img_data; + delete [] _mat_data; + } + + /* convert the matrix data to the image data */ + void ConvertData(CvMat *mat_src, IplImage *img_dst) + { + if ( img_dst->nChannels > 1 ) { + printf("Must be one-channel image for ConvertImageData!\n"); + exit(1); + } + + TM* _mat_data = GetMatData(mat_src); + TI* _img_data = new TI[mat_src->width*mat_src->height]; + + TM* mat_data = _mat_data; + TI* img_data = _img_data; + + int i; + for ( i = 0 ; i < mat_src->width*mat_src->height ; i++ ) + *img_data++ = (TI)(*mat_data++); + + SetImageData(img_dst, _img_data); + + delete [] _img_data; + delete [] _mat_data; + } + + COpencvDataConversion() {}; + virtual ~COpencvDataConversion() {}; +}; + +#endif // !defined(_OPENCV_DATA_CONVERSION_H_) + diff --git a/package_bgs/jmo/blob.cpp b/package_bgs/jmo/blob.cpp new file mode 100644 index 0000000..2b99b2a --- /dev/null +++ b/package_bgs/jmo/blob.cpp @@ -0,0 +1,1149 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- +* Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. The name of the author may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/************************************************************************ +Blob.cpp + +- FUNCIONALITAT: Implementaci� de la classe CBlob +- AUTOR: Inspecta S.L. +MODIFICACIONS (Modificaci�, Autor, Data): + + +FUNCTIONALITY: Implementation of the CBlob class and some helper classes to perform +some calculations on it +AUTHOR: Inspecta S.L. +MODIFICATIONS (Modification, Author, Date): + +**************************************************************************/ + + +#include <limits.h> +#include "blob.h" +#include "cv.h" + +namespace Blob +{ + +/** +- FUNCI�: CBlob +- FUNCIONALITAT: Constructor est�ndard +- PAR�METRES: +- RESULTAT: +- inicialitzaci� de totes les variables internes i de l'storage i la sequencia +per a les cantonades del blob +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: CBlob +- FUNCTIONALITY: Standard constructor +- PARAMETERS: +- RESULT: +- memory allocation for the blob edges and initialization of member variables +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +CBlob::CBlob() +{ + etiqueta = -1; // Flag indicates null region + exterior = 0; + area = 0.0f; + perimeter = 0.0f; + parent = -1; + minx = LONG_MAX; + maxx = 0; + miny = LONG_MAX; + maxy = 0; + sumx = 0; + sumy = 0; + sumxx = 0; + sumyy = 0; + sumxy = 0; + mean = 0; + stddev = 0; + externPerimeter = 0; + + m_storage = cvCreateMemStorage(0); + edges = cvCreateSeq( CV_SEQ_KIND_GENERIC|CV_32SC2, + sizeof(CvContour), + sizeof(CvPoint),m_storage); +} + +/** +- FUNCI�: CBlob +- FUNCIONALITAT: Constructor de c�pia +- PAR�METRES: +- RESULTAT: +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: CBlob +- FUNCTIONALITY: Copy constructor +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +CBlob::CBlob( const CBlob &src ) +{ + // copiem les propietats del blob origen a l'actual + etiqueta = src.etiqueta; + exterior = src.exterior; + area = src.Area(); + perimeter = src.Perimeter(); + parent = src.parent; + minx = src.minx; + maxx = src.maxx; + miny = src.miny; + maxy = src.maxy; + sumx = src.sumx; + sumy = src.sumy; + sumxx = src.sumxx; + sumyy = src.sumyy; + sumxy = src.sumxy; + mean = src.mean; + stddev = src.stddev; + externPerimeter = src.externPerimeter; + + // copiem els edges del blob origen a l'actual + CvSeqReader reader; + CvSeqWriter writer; + CvPoint edgeactual; + + // creem una sequencia buida per als edges + m_storage = cvCreateMemStorage(0); + edges = cvCreateSeq( CV_SEQ_KIND_GENERIC|CV_32SC2, + sizeof(CvContour), + sizeof(CvPoint),m_storage); + + cvStartReadSeq( src.Edges(), &reader); + cvStartAppendToSeq( edges, &writer ); + + for( int i=0; i< src.Edges()->total; i++) + { + CV_READ_SEQ_ELEM( edgeactual ,reader); + CV_WRITE_SEQ_ELEM( edgeactual , writer ); + } + + cvEndWriteSeq( &writer ); +} +CBlob::CBlob( const CBlob *src ) +{ + // copiem les propietats del blob origen a l'actual + etiqueta = src->etiqueta; + exterior = src->exterior; + area = src->Area(); + perimeter = src->Perimeter(); + parent = src->parent; + minx = src->minx; + maxx = src->maxx; + miny = src->miny; + maxy = src->maxy; + sumx = src->sumx; + sumy = src->sumy; + sumxx = src->sumxx; + sumyy = src->sumyy; + sumxy = src->sumxy; + mean = src->mean; + stddev = src->stddev; + externPerimeter = src->externPerimeter; + + // copiem els edges del blob origen a l'actual + CvSeqReader reader; + CvSeqWriter writer; + CvPoint edgeactual; + + // creem una sequencia buida per als edges + m_storage = cvCreateMemStorage(0); + edges = cvCreateSeq( CV_SEQ_KIND_GENERIC|CV_32SC2, + sizeof(CvContour), + sizeof(CvPoint),m_storage); + + cvStartReadSeq( src->Edges(), &reader); + cvStartAppendToSeq( edges, &writer ); + + for( int i=0; i< src->Edges()->total; i++) + { + CV_READ_SEQ_ELEM( edgeactual ,reader); + CV_WRITE_SEQ_ELEM( edgeactual , writer ); + } + + cvEndWriteSeq( &writer ); +} + +/** +- FUNCI�: ~CBlob +- FUNCIONALITAT: Destructor est�ndard +- PAR�METRES: +- RESULTAT: +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: CBlob +- FUNCTIONALITY: Standard destructor +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +CBlob::~CBlob() +{ + // Eliminar v�rtexs del blob + cvClearSeq(edges); + // i la zona de mem�ria on s�n + cvReleaseMemStorage( &m_storage ); +} + +/** +- FUNCI�: operator= +- FUNCIONALITAT: Operador d'assignaci� +- PAR�METRES: +- src: blob a assignar a l'actual +- RESULTAT: +- Substitueix el blob actual per el src +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: Assigment operator +- FUNCTIONALITY: Assigns a blob to the current +- PARAMETERS: +- src: blob to assign +- RESULT: +- the current blob is replaced by the src blob +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +CBlob& CBlob::operator=(const CBlob &src ) +{ + // si ja s�n el mateix, no cal fer res + if (this != &src) + { + // Eliminar v�rtexs del blob + cvClearSeq(edges); + // i la zona de mem�ria on s�n + cvReleaseMemStorage( &m_storage ); + + // creem una sequencia buida per als edges + m_storage = cvCreateMemStorage(0); + edges = cvCreateSeq( CV_SEQ_KIND_GENERIC|CV_32SC2, + sizeof(CvContour), + sizeof(CvPoint),m_storage); + + // copiem les propietats del blob origen a l'actual + etiqueta = src.etiqueta; + exterior = src.exterior; + area = src.Area(); + perimeter = src.Perimeter(); + parent = src.parent; + minx = src.minx; + maxx = src.maxx; + miny = src.miny; + maxy = src.maxy; + sumx = src.sumx; + sumy = src.sumy; + sumxx = src.sumxx; + sumyy = src.sumyy; + sumxy = src.sumxy; + mean = src.mean; + stddev = src.stddev; + externPerimeter = src.externPerimeter; + + // copiem els edges del blob origen a l'actual + CvSeqReader reader; + CvSeqWriter writer; + CvPoint edgeactual; + + cvStartReadSeq( src.Edges(), &reader); + cvStartAppendToSeq( edges, &writer ); + + for( int i=0; i< src.Edges()->total; i++) + { + CV_READ_SEQ_ELEM( edgeactual ,reader); + CV_WRITE_SEQ_ELEM( edgeactual , writer ); + } + + cvEndWriteSeq( &writer ); + } + return *this; +} + +/** +- FUNCI�: FillBlob +- FUNCIONALITAT: Pinta l'interior d'un blob amb el color especificat +- PAR�METRES: +- imatge: imatge on es vol pintar el el blob +- color: color amb que es vol pintar el blob +- RESULTAT: +- retorna la imatge d'entrada amb el blob pintat +- RESTRICCIONS: +- AUTOR: +- Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: FillBlob +- FUNCTIONALITY: +- Fills the blob with a specified colour +- PARAMETERS: +- imatge: where to paint +- color: colour to paint the blob +- RESULT: +- modifies input image and returns the seed point used to fill the blob +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +void CBlob::FillBlob( IplImage *imatge, CvScalar color, int offsetX /*=0*/, int offsetY /*=0*/) const +{ + + //verifiquem que existeixi el blob i que tingui cantonades + if( edges == NULL || edges->total == 0 ) return; + + CvPoint edgeactual, pt1, pt2; + CvSeqReader reader; + vectorPunts vectorEdges = vectorPunts( edges->total ); + vectorPunts::iterator itEdges, itEdgesSeguent; + bool dinsBlob; + int yActual; + + // passem els punts del blob a un vector de punts de les STL + cvStartReadSeq( edges, &reader); + itEdges = vectorEdges.begin(); + while( itEdges != vectorEdges.end() ) + { + CV_READ_SEQ_ELEM( edgeactual ,reader); + *itEdges = edgeactual; + itEdges++; + } + // ordenem el vector per les Y's i les X's d'esquerra a dreta + std::sort( vectorEdges.begin(), vectorEdges.end(), comparaCvPoint() ); + + // recorrem el vector ordenat i fem linies entre punts consecutius + itEdges = vectorEdges.begin(); + itEdgesSeguent = vectorEdges.begin() + 1; + dinsBlob = true; + while( itEdges != (vectorEdges.end() - 1)) + { + yActual = (*itEdges).y; + + if( ( (*itEdges).x != (*itEdgesSeguent).x ) && + ( (*itEdgesSeguent).y == yActual ) + ) + { + if( dinsBlob ) + { + pt1 = *itEdges; + pt1.x += offsetX; + pt1.y += offsetY; + + pt2 = *itEdgesSeguent; + pt2.x += offsetX; + pt2.y += offsetY; + + cvLine( imatge, pt1, pt2, color ); + } + dinsBlob =! dinsBlob; + } + itEdges++; + itEdgesSeguent++; + if( (*itEdges).y != yActual ) dinsBlob = true; + } + vectorEdges.clear(); +} + +/** +- FUNCI�: CopyEdges +- FUNCIONALITAT: Afegeix els v�rtexs del blob al blob destination +- PAR�METRES: +- destination: blob al que volem afegir els v�rtexs +- RESULTAT: +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: CopyEdges +- FUNCTIONALITY: Adds the blob edges to destination +- PARAMETERS: +- destination: where to add the edges +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +void CBlob::CopyEdges( CBlob &destination ) const +{ + CvSeqReader reader; + CvSeqWriter writer; + CvPoint edgeactual; + + cvStartReadSeq( edges, &reader); + cvStartAppendToSeq( destination.Edges(), &writer ); + + for( int i=0; i<edges->total; i++) + { + CV_READ_SEQ_ELEM( edgeactual ,reader); + CV_WRITE_SEQ_ELEM( edgeactual , writer ); + } + + cvEndWriteSeq( &writer ); +} + +/** +- FUNCI�: ClearEdges +- FUNCIONALITAT: Elimina els v�rtexs del blob +- PAR�METRES: +- RESULTAT: +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: ClearEdges +- FUNCTIONALITY: Delete current blob edges +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +void CBlob::ClearEdges() +{ + // Eliminar v�rtexs del blob eliminat + cvClearSeq( edges ); +} + +/** +- FUNCI�: GetConvexHull +- FUNCIONALITAT: Retorna el poligon convex del blob +- PAR�METRES: +- dst: sequencia on desarem el resultat (no ha d'estar inicialitzada) +- RESULTAT: +- true si tot ha anat b� +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: GetConvexHull +- FUNCTIONALITY: Calculates the convex hull polygon of the blob +- PARAMETERS: +- dst: where to store the result +- RESULT: +- true if no error ocurred +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +bool CBlob::GetConvexHull( CvSeq **dst ) const +{ + if( edges != NULL && edges->total > 0) + { + *dst = cvConvexHull2( edges, 0, CV_CLOCKWISE, 0 ); + return true; + } + return false; +} + +/** +- FUNCI�: GetEllipse +- FUNCIONALITAT: Retorna l'ellipse que s'ajusta millor a les cantonades del blob +- PAR�METRES: +- RESULTAT: +- estructura amb l'ellipse +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 25-05-2005. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: GetEllipse +- FUNCTIONALITY: Calculates the ellipse that best fits the edges of the blob +- PARAMETERS: +- RESULT: +- CvBox2D struct with the calculated ellipse +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +CvBox2D CBlob::GetEllipse() const +{ + CvBox2D elipse; + // necessitem 6 punts per calcular l'elipse + if( edges != NULL && edges->total > 6) + { + elipse = cvFitEllipse2( edges ); + } + else + { + elipse.center.x = 0.0; + elipse.center.y = 0.0; + elipse.size.width = 0.0; + elipse.size.height = 0.0; + elipse.angle = 0.0; + } + return elipse; +} + + + +/*************************************************************************** +Implementaci� de les classes per al c�lcul de caracter�stiques sobre el blob + +Implementation of the helper classes to perform operations on blobs +**************************************************************************/ + +/** +- FUNCI�: Moment +- FUNCIONALITAT: Calcula el moment pq del blob +- RESULTAT: +- retorna el moment pq especificat o 0 si el moment no est� implementat +- RESTRICCIONS: +- Implementats els moments pq: 00, 01, 10, 20, 02 +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 20-07-2004. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: Moment +- FUNCTIONALITY: Calculates the pq moment of the blob +- PARAMETERS: +- RESULT: +- returns the pq moment or 0 if the moment it is not implemented +- RESTRICTIONS: +- Currently, only implemented the 00, 01, 10, 20, 02 pq moments +- AUTHOR: Ricard Borr�s +- CREATION DATE: 20-07-2004. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobGetMoment::operator()(const CBlob &blob) const +{ + //Moment 00 + if((m_p==0) && (m_q==0)) + return blob.Area(); + + //Moment 10 + if((m_p==1) && (m_q==0)) + return blob.SumX(); + + //Moment 01 + if((m_p==0) && (m_q==1)) + return blob.SumY(); + + //Moment 20 + if((m_p==2) && (m_q==0)) + return blob.SumXX(); + + //Moment 02 + if((m_p==0) && (m_q==2)) + return blob.SumYY(); + + return 0; +} + +/** +- FUNCI�: HullPerimeter +- FUNCIONALITAT: Calcula la longitud del perimetre convex del blob. +Fa servir la funci� d'OpenCV cvConvexHull2 per a +calcular el perimetre convex. + +- PAR�METRES: +- RESULTAT: +- retorna la longitud del per�metre convex del blob. Si el blob no t� coordenades +associades retorna el per�metre normal del blob. +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 20-07-2004. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: CBlobGetHullPerimeter +- FUNCTIONALITY: Calculates the convex hull perimeter of the blob +- PARAMETERS: +- RESULT: +- returns the convex hull perimeter of the blob or the perimeter if the +blob edges could not be retrieved +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobGetHullPerimeter::operator()(const CBlob &blob) const +{ + if(blob.Edges() != NULL && blob.Edges()->total > 0) + { + CvSeq *hull = cvConvexHull2( blob.Edges(), 0, CV_CLOCKWISE, 1 ); + return fabs(cvArcLength(hull,CV_WHOLE_SEQ,1)); + } + return blob.Perimeter(); +} + +double CBlobGetHullArea::operator()(const CBlob &blob) const +{ + if(blob.Edges() != NULL && blob.Edges()->total > 0) + { + CvSeq *hull = cvConvexHull2( blob.Edges(), 0, CV_CLOCKWISE, 1 ); + return fabs(cvContourArea(hull)); + } + return blob.Perimeter(); +} + +/** +- FUNCI�: MinX_at_MinY +- FUNCIONALITAT: Calcula el valor MinX a MinY. +- PAR�METRES: +- blob: blob del que volem calcular el valor +- RESULTAT: +- retorna la X minima en la Y minima. +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 20-07-2004. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: CBlobGetMinXatMinY +- FUNCTIONALITY: Calculates the minimum X on the minimum Y +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobGetMinXatMinY::operator()(const CBlob &blob) const +{ + double MinX_at_MinY = LONG_MAX; + + CvSeqReader reader; + CvPoint edgeactual; + + cvStartReadSeq(blob.Edges(),&reader); + + for(int j=0;j<blob.Edges()->total;j++) + { + CV_READ_SEQ_ELEM(edgeactual,reader); + if( (edgeactual.y == blob.MinY()) && (edgeactual.x < MinX_at_MinY) ) + { + MinX_at_MinY = edgeactual.x; + } + } + + return MinX_at_MinY; +} + +/** +- FUNCI�: MinY_at_MaxX +- FUNCIONALITAT: Calcula el valor MinX a MaxX. +- PAR�METRES: +- blob: blob del que volem calcular el valor +- RESULTAT: +- retorna la Y minima en la X maxima. +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 20-07-2004. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: CBlobGetMinXatMinY +- FUNCTIONALITY: Calculates the minimum Y on the maximum X +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobGetMinYatMaxX::operator()(const CBlob &blob) const +{ + double MinY_at_MaxX = LONG_MAX; + + CvSeqReader reader; + CvPoint edgeactual; + + cvStartReadSeq(blob.Edges(),&reader); + + for(int j=0;j<blob.Edges()->total;j++) + { + CV_READ_SEQ_ELEM(edgeactual,reader); + if( (edgeactual.x == blob.MaxX()) && (edgeactual.y < MinY_at_MaxX) ) + { + MinY_at_MaxX = edgeactual.y; + } + } + + return MinY_at_MaxX; +} + +/** +- FUNCI�: MaxX_at_MaxY +- FUNCIONALITAT: Calcula el valor MaxX a MaxY. +- PAR�METRES: +- blob: blob del que volem calcular el valor +- RESULTAT: +- retorna la X maxima en la Y maxima. +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 20-07-2004. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: CBlobGetMaxXatMaxY +- FUNCTIONALITY: Calculates the maximum X on the maximum Y +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobGetMaxXatMaxY::operator()(const CBlob &blob) const +{ + double MaxX_at_MaxY = LONG_MIN; + + CvSeqReader reader; + CvPoint edgeactual; + + cvStartReadSeq(blob.Edges(),&reader); + + for(int j=0;j<blob.Edges()->total;j++) + { + CV_READ_SEQ_ELEM(edgeactual,reader); + if( (edgeactual.y == blob.MaxY()) && (edgeactual.x > MaxX_at_MaxY) ) + { + MaxX_at_MaxY = edgeactual.x; + } + } + + return MaxX_at_MaxY; +} + +/** +- FUNCI�: MaxY_at_MinX +- FUNCIONALITAT: Calcula el valor MaxY a MinX. +- PAR�METRES: +- blob: blob del que volem calcular el valor +- RESULTAT: +- retorna la Y maxima en la X minima. +- RESTRICCIONS: +- AUTOR: Ricard Borr�s +- DATA DE CREACI�: 20-07-2004. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: CBlobGetMaxYatMinX +- FUNCTIONALITY: Calculates the maximum Y on the minimum X +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobGetMaxYatMinX::operator()(const CBlob &blob) const +{ + double MaxY_at_MinX = LONG_MIN; + + CvSeqReader reader; + CvPoint edgeactual; + + cvStartReadSeq(blob.Edges(),&reader); + + for(int j=0;j<blob.Edges()->total;j++) + { + CV_READ_SEQ_ELEM(edgeactual,reader); + if( (edgeactual.x == blob.MinY()) && (edgeactual.y > MaxY_at_MinX) ) + { + MaxY_at_MinX = edgeactual.y; + } + } + + return MaxY_at_MinX; +} + +/** +Retorna l'elongaci� del blob (longitud/amplada) +*/ +/** +- FUNCTION: CBlobGetElongation +- FUNCTIONALITY: Calculates the elongation of the blob ( length/breadth ) +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- See below to see how the lenght and the breadth are aproximated +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobGetElongation::operator()(const CBlob &blob) const +{ + double ampladaC,longitudC,amplada,longitud; + + ampladaC=(double) (blob.Perimeter()+sqrt(pow(blob.Perimeter(),2)-16*blob.Area()))/4; + if(ampladaC<=0.0) return 0; + longitudC=(double) blob.Area()/ampladaC; + + longitud=MAX( longitudC , ampladaC ); + amplada=MIN( longitudC , ampladaC ); + + return (double) longitud/amplada; +} + +/** +Retorna la compacitat del blob +*/ +/** +- FUNCTION: CBlobGetCompactness +- FUNCTIONALITY: Calculates the compactness of the blob +( maximum for circle shaped blobs, minimum for the rest) +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobGetCompactness::operator()(const CBlob &blob) const +{ + if( blob.Area() != 0.0 ) + return (double) pow(blob.Perimeter(),2)/(4*CV_PI*blob.Area()); + else + return 0.0; +} + +/** +Retorna la rugositat del blob +*/ +/** +- FUNCTION: CBlobGetRoughness +- FUNCTIONALITY: Calculates the roughness of the blob +( ratio between perimeter and convex hull perimeter) +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobGetRoughness::operator()(const CBlob &blob) const +{ + CBlobGetHullPerimeter getHullPerimeter = CBlobGetHullPerimeter(); + + double hullPerimeter = getHullPerimeter(blob); + + if( hullPerimeter != 0.0 ) + return blob.Perimeter() / hullPerimeter;//HullPerimeter(); + + return 0.0; +} + +/** +Retorna la longitud del blob +*/ +/** +- FUNCTION: CBlobGetLength +- FUNCTIONALITY: Calculates the lenght of the blob (the biggest axis of the blob) +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- The lenght is an aproximation to the real lenght +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobGetLength::operator()(const CBlob &blob) const +{ + double ampladaC,longitudC; + double tmp; + + tmp = blob.Perimeter()*blob.Perimeter() - 16*blob.Area(); + + if( tmp > 0.0 ) + ampladaC = (double) (blob.Perimeter()+sqrt(tmp))/4; + // error intr�nsec en els c�lculs de l'�rea i el per�metre + else + ampladaC = (double) (blob.Perimeter())/4; + + if(ampladaC<=0.0) return 0; + longitudC=(double) blob.Area()/ampladaC; + + return MAX( longitudC , ampladaC ); +} + +/** +Retorna l'amplada del blob +*/ +/** +- FUNCTION: CBlobGetBreadth +- FUNCTIONALITY: Calculates the breadth of the blob (the smallest axis of the blob) +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- The breadth is an aproximation to the real breadth +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobGetBreadth::operator()(const CBlob &blob) const +{ + double ampladaC,longitudC; + double tmp; + + tmp = blob.Perimeter()*blob.Perimeter() - 16*blob.Area(); + + if( tmp > 0.0 ) + ampladaC = (double) (blob.Perimeter()+sqrt(tmp))/4; + // error intr�nsec en els c�lculs de l'�rea i el per�metre + else + ampladaC = (double) (blob.Perimeter())/4; + + if(ampladaC<=0.0) return 0; + longitudC = (double) blob.Area()/ampladaC; + + return MIN( longitudC , ampladaC ); +} + +/** +Calcula la dist�ncia entre un punt i el centre del blob +*/ +/** +- FUNCTION: CBlobGetDistanceFromPoint +- FUNCTIONALITY: Calculates the euclidean distance between the blob center and +the point specified in the constructor +- PARAMETERS: +- RESULT: +- RESTRICTIONS: +- AUTHOR: Ricard Borr�s +- CREATION DATE: 25-05-2005. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobGetDistanceFromPoint::operator()(const CBlob &blob) const +{ + double xmitjana, ymitjana; + CBlobGetXCenter getXCenter; + CBlobGetYCenter getYCenter; + + xmitjana = m_x - getXCenter( blob ); + ymitjana = m_y - getYCenter( blob ); + + return sqrt((xmitjana*xmitjana)+(ymitjana*ymitjana)); +} + +/** +- FUNCI�: BlobGetXYInside +- FUNCIONALITAT: Calcula si un punt cau dins de la capsa rectangular +del blob +- RESULTAT: +- retorna 1 si hi est�; 0 si no +- RESTRICCIONS: +- AUTOR: Francesc Pinyol Margalef +- DATA DE CREACI�: 16-01-2006. +- MODIFICACI�: Data. Autor. Descripci�. +*/ +/** +- FUNCTION: BlobGetXYInside +- FUNCTIONALITY: Calculates whether a point is inside the +rectangular bounding box of a blob +- PARAMETERS: +- RESULT: +- returns 1 if it is inside; o if not +- RESTRICTIONS: +- AUTHOR: Francesc Pinyol Margalef +- CREATION DATE: 16-01-2006. +- MODIFICATION: Date. Author. Description. +*/ +double CBlobGetXYInside::operator()(const CBlob &blob) const +{ + if( blob.Edges() == NULL || blob.Edges()->total == 0 ) return 0.0; + + // passem els punts del blob a un vector de punts de les STL + CvSeqReader reader; + CBlob::vectorPunts vectorEdges; + CBlob::vectorPunts::iterator itEdges, itEdgesSeguent; + CvPoint edgeactual; + bool dinsBlob; + + // agafem tots els punts amb la mateixa y que l'actual + cvStartReadSeq( blob.Edges(), &reader); + + for( int i=0; i< blob.Edges()->total; i++) + { + CV_READ_SEQ_ELEM( edgeactual ,reader ); + if( edgeactual.y == m_p.y ) + vectorEdges.push_back( edgeactual ); + } + + if( vectorEdges.size() == 0 ) return 0.0; + + // ordenem el vector per les Y's i les X's d'esquerra a dreta + std::sort( vectorEdges.begin(), vectorEdges.end(), CBlob::comparaCvPoint() ); + + // recorrem el punts del blob de la mateixa fila que el punt d'entrada + // i mirem si la X del punt d'entrada est� entre dos coordenades "plenes" + // del blob + itEdges = vectorEdges.begin(); + itEdgesSeguent = vectorEdges.begin() + 1; + dinsBlob = true; + + while( itEdges != (vectorEdges.end() - 1) ) + { + if( (*itEdges).x <= m_p.x && (*itEdgesSeguent).x >= m_p.x && dinsBlob ) + { + vectorEdges.clear(); + return 1.0; + } + + itEdges++; + itEdgesSeguent++; + dinsBlob = !dinsBlob; + } + + vectorEdges.clear(); + return 0.0; +} + +#ifdef BLOB_OBJECT_FACTORY + +/** +- FUNCI�: RegistraTotsOperadors +- FUNCIONALITAT: Registrar tots els operadors definits a blob.h +- PAR�METRES: +- fabricaOperadorsBlob: f�brica on es registraran els operadors +- RESULTAT: +- Modifica l'objecte fabricaOperadorsBlob +- RESTRICCIONS: +- Nom�s es registraran els operadors de blob.h. Si se'n volen afegir, cal afegir-los amb +el m�tode Register de la f�brica. +- AUTOR: rborras +- DATA DE CREACI�: 2006/05/18 +- MODIFICACI�: Data. Autor. Descripci�. +*/ +void RegistraTotsOperadors( t_OperadorBlobFactory &fabricaOperadorsBlob ) +{ + // blob shape + fabricaOperadorsBlob.Register( CBlobGetArea().GetNom(), Type2Type<CBlobGetArea>()); + fabricaOperadorsBlob.Register( CBlobGetBreadth().GetNom(), Type2Type<CBlobGetBreadth>()); + fabricaOperadorsBlob.Register( CBlobGetCompactness().GetNom(), Type2Type<CBlobGetCompactness>()); + fabricaOperadorsBlob.Register( CBlobGetElongation().GetNom(), Type2Type<CBlobGetElongation>()); + fabricaOperadorsBlob.Register( CBlobGetExterior().GetNom(), Type2Type<CBlobGetExterior>()); + fabricaOperadorsBlob.Register( CBlobGetLength().GetNom(), Type2Type<CBlobGetLength>()); + fabricaOperadorsBlob.Register( CBlobGetPerimeter().GetNom(), Type2Type<CBlobGetPerimeter>()); + fabricaOperadorsBlob.Register( CBlobGetRoughness().GetNom(), Type2Type<CBlobGetRoughness>()); + + // extern pixels + fabricaOperadorsBlob.Register( CBlobGetExternPerimeterRatio().GetNom(), Type2Type<CBlobGetExternPerimeterRatio>()); + fabricaOperadorsBlob.Register( CBlobGetExternHullPerimeterRatio().GetNom(), Type2Type<CBlobGetExternHullPerimeterRatio>()); + fabricaOperadorsBlob.Register( CBlobGetExternPerimeter().GetNom(), Type2Type<CBlobGetExternPerimeter>()); + + + // hull + fabricaOperadorsBlob.Register( CBlobGetHullPerimeter().GetNom(), Type2Type<CBlobGetHullPerimeter>()); + fabricaOperadorsBlob.Register( CBlobGetHullArea().GetNom(), Type2Type<CBlobGetHullArea>()); + + + // elipse info + fabricaOperadorsBlob.Register( CBlobGetMajorAxisLength().GetNom(), Type2Type<CBlobGetMajorAxisLength>()); + fabricaOperadorsBlob.Register( CBlobGetMinorAxisLength().GetNom(), Type2Type<CBlobGetMinorAxisLength>()); + fabricaOperadorsBlob.Register( CBlobGetAxisRatio().GetNom(), Type2Type<CBlobGetAxisRatio>()); + fabricaOperadorsBlob.Register( CBlobGetOrientation().GetNom(), Type2Type<CBlobGetOrientation>()); + fabricaOperadorsBlob.Register( CBlobGetOrientationCos().GetNom(), Type2Type<CBlobGetOrientationCos>()); + fabricaOperadorsBlob.Register( CBlobGetAreaElipseRatio().GetNom(), Type2Type<CBlobGetAreaElipseRatio>()); + + // min an max + fabricaOperadorsBlob.Register( CBlobGetMaxX().GetNom(), Type2Type<CBlobGetMaxX>()); + fabricaOperadorsBlob.Register( CBlobGetMaxY().GetNom(), Type2Type<CBlobGetMaxY>()); + fabricaOperadorsBlob.Register( CBlobGetMinX().GetNom(), Type2Type<CBlobGetMinX>()); + fabricaOperadorsBlob.Register( CBlobGetMinY().GetNom(), Type2Type<CBlobGetMinY>()); + + fabricaOperadorsBlob.Register( CBlobGetMaxXatMaxY().GetNom(), Type2Type<CBlobGetMaxXatMaxY>()); + fabricaOperadorsBlob.Register( CBlobGetMaxYatMinX().GetNom(), Type2Type<CBlobGetMaxYatMinX>()); + fabricaOperadorsBlob.Register( CBlobGetMinXatMinY().GetNom(), Type2Type<CBlobGetMinXatMinY>()); + fabricaOperadorsBlob.Register( CBlobGetMinYatMaxX().GetNom(), Type2Type<CBlobGetMinYatMaxX>()); + + // grey level stats + fabricaOperadorsBlob.Register( CBlobGetMean().GetNom(), Type2Type<CBlobGetMean>()); + fabricaOperadorsBlob.Register( CBlobGetStdDev().GetNom(), Type2Type<CBlobGetStdDev>()); + + // coordinate info + fabricaOperadorsBlob.Register( CBlobGetXYInside().GetNom(), Type2Type<CBlobGetXYInside>()); + fabricaOperadorsBlob.Register( CBlobGetDiffY().GetNom(), Type2Type<CBlobGetDiffY>()); + fabricaOperadorsBlob.Register( CBlobGetDiffX().GetNom(), Type2Type<CBlobGetDiffX>()); + fabricaOperadorsBlob.Register( CBlobGetXCenter().GetNom(), Type2Type<CBlobGetXCenter>()); + fabricaOperadorsBlob.Register( CBlobGetYCenter().GetNom(), Type2Type<CBlobGetYCenter>()); + fabricaOperadorsBlob.Register( CBlobGetDistanceFromPoint().GetNom(), Type2Type<CBlobGetDistanceFromPoint>()); + + // moments + fabricaOperadorsBlob.Register( CBlobGetMoment().GetNom(), Type2Type<CBlobGetMoment>()); + +} + +#endif + +} + diff --git a/package_bgs/jmo/blob.h b/package_bgs/jmo/blob.h new file mode 100644 index 0000000..463e81a --- /dev/null +++ b/package_bgs/jmo/blob.h @@ -0,0 +1,853 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* --- --- --- +* Copyright (C) 2008--2010 Idiap Research Institute (.....@idiap.ch) +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. The name of the author may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/************************************************************************ +Blob.h + +FUNCIONALITAT: Definici� de la classe CBlob +AUTOR: Inspecta S.L. +MODIFICACIONS (Modificaci�, Autor, Data): + +FUNCTIONALITY: Definition of the CBlob class and some helper classes to perform +some calculations on it +AUTHOR: Inspecta S.L. +MODIFICATIONS (Modification, Author, Date): + +**************************************************************************/ + +//! Disable warnings referred to 255 character truncation for the std:map +//#pragma warning( disable : 4786 ) + +#ifndef CBLOB_INSPECTA_INCLUDED +#define CBLOB_INSPECTA_INCLUDED + +#include "cxcore.h" +#include "BlobLibraryConfiguration.h" +#include <functional> +#include <vector> +#include <algorithm> + + +#ifdef BLOB_OBJECT_FACTORY +//! Object factory pattern implementation +#include "..\inspecta\DesignPatterns\ObjectFactory.h" +#endif + + +//! Factor de conversi� de graus a radians +#define DEGREE2RAD (CV_PI / 180.0) + +namespace Blob +{ + +/** +Classe que representa un blob, ent�s com un conjunt de pixels del +mateix color contigus en una imatge binaritzada. + +Class to represent a blob, a group of connected pixels in a binary image +*/ +class CBlob +{ +public: + //! Constructor est�ndard + //! Standard constructor + CBlob(); + //! Constructor de c�pia + //! Copy constructor + CBlob( const CBlob &src ); + CBlob( const CBlob *src ); + + //! Destructor est�ndard + //! Standard Destructor + ~CBlob(); + + //! Operador d'assignaci� + //! Assigment operator + CBlob& operator=(const CBlob &src ); + + //! Indica si el blob est� buit ( no t� cap info associada ) + //! Shows if the blob has associated information + bool IsEmpty() const + { + return (area == 0.0 && perimeter == 0.0 ); + }; + + //! Neteja les cantonades del blob + //! Clears the edges of the blob + void ClearEdges(); + //! Copia les cantonades del blob a un altre (les afegeix al dest�) + //! Adds the blob edges to another blob + void CopyEdges( CBlob &destination ) const; + //! Retorna el poligon convex del blob + //! Calculates the convex hull of the blob + bool GetConvexHull( CvSeq **dst ) const; + //! Calcula l'elipse que s'adapta als v�rtexs del blob + //! Fits an ellipse to the blob edges + CvBox2D GetEllipse() const; + + //! Pinta l'interior d'un blob d'un color determinat + //! Paints the blob in an image + void FillBlob( IplImage *imatge, CvScalar color, int offsetX = 0, int offsetY = 0 ) const; + + //! Funcions GET sobre els valors dels blobs + //! Get functions + + inline int Label() const { return etiqueta; } + inline int Parent() const { return parent; } + inline double Area() const { return area; } + inline double Perimeter() const { return perimeter; } + inline double ExternPerimeter() const { return externPerimeter; } + inline int Exterior() const { return exterior; } + inline double Mean() const { return mean; } + inline double StdDev() const { return stddev; } + inline double MinX() const { return minx; } + inline double MinY() const { return miny; } + inline double MaxX() const { return maxx; } + inline double MaxY() const { return maxy; } + inline CvSeq *Edges() const { return edges; } + inline double SumX() const { return sumx; } + inline double SumY() const { return sumy; } + inline double SumXX() const { return sumxx; } + inline double SumYY() const { return sumyy; } + inline double SumXY() const { return sumxy; } + + //! etiqueta del blob + //! label of the blob + int etiqueta; + //! flag per indicar si es exterior o no + //! true for extern blobs + int exterior; + //! area del blob + //! Blob area + double area; + //! perimetre del blob + //! Blob perimeter + double perimeter; + //! quantitat de perimetre del blob extern + //! amount of blob perimeter which is exterior + double externPerimeter; + //! etiqueta del blob pare + //! label of the parent blob + int parent; + //! moments + double sumx; + double sumy; + double sumxx; + double sumyy; + double sumxy; + //! Bounding rect + double minx; + double maxx; + double miny; + double maxy; + + //! mitjana + //! mean of the grey scale values of the blob pixels + double mean; + //! desviaci� standard + //! standard deviation of the grey scale values of the blob pixels + double stddev; + + //! �rea de mem�ria on es desaran els punts de contorn del blob + //! storage which contains the edges of the blob + CvMemStorage *m_storage; + //! Sequ�ncia de punts del contorn del blob + //! Sequence with the edges of the blob + CvSeq *edges; + + + //! Point datatype for plotting (FillBlob) + typedef std::vector<CvPoint> vectorPunts; + + //! Helper class to compare two CvPoints (for sorting in FillBlob) + struct comparaCvPoint : public std::binary_function<CvPoint, CvPoint, bool> + { + //! Definim que un punt �s menor com m�s amunt a la dreta estigui + bool operator()(CvPoint a, CvPoint b) + { + if( a.y == b.y ) + return a.x < b.x; + else + return a.y < b.y; + } + }; +}; + + + +/************************************************************************** +Definici� de les classes per a fer operacions sobre els blobs + +Helper classes to perform operations on blobs +**************************************************************************/ + + +//! Classe d'on derivarem totes les operacions sobre els blobs +//! Interface to derive all blob operations +class COperadorBlob +{ +public: + virtual ~COperadorBlob(){}; + + //! Aplica l'operaci� al blob + virtual double operator()(const CBlob &blob) const = 0; + //! Obt� el nom de l'operador + virtual const char *GetNom() const = 0; + + operator COperadorBlob*() const + { + return (COperadorBlob*)this; + } +}; + +typedef COperadorBlob funcio_calculBlob; + +#ifdef BLOB_OBJECT_FACTORY +/** +Funci� per comparar dos identificadors dins de la f�brica de COperadorBlobs +*/ +struct functorComparacioIdOperador +{ + bool operator()(const char* s1, const char* s2) const + { + return strcmp(s1, s2) < 0; + } +}; + +//! Definition of Object factory type for COperadorBlob objects +typedef ObjectFactory<COperadorBlob, const char *, functorComparacioIdOperador > t_OperadorBlobFactory; + +//! Funci� global per a registrar tots els operadors definits a blob.h +void RegistraTotsOperadors( t_OperadorBlobFactory &fabricaOperadorsBlob ); + +#endif + +//! Classe per calcular l'�rea d'un blob +//! Class to get the area of a blob +class CBlobGetArea : public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.Area(); + } + const char *GetNom() const + { + return "CBlobGetArea"; + } +}; + +//! Classe per calcular el perimetre d'un blob +//! Class to get the perimeter of a blob +class CBlobGetPerimeter: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.Perimeter(); + } + const char *GetNom() const + { + return "CBlobGetPerimeter"; + } +}; + +//! Classe que diu si un blob �s extern o no +//! Class to get the extern flag of a blob +class CBlobGetExterior: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.Exterior(); + } + const char *GetNom() const + { + return "CBlobGetExterior"; + } +}; + +//! Classe per calcular la mitjana de nivells de gris d'un blob +//! Class to get the mean grey level of a blob +class CBlobGetMean: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.Mean(); + } + const char *GetNom() const + { + return "CBlobGetMean"; + } +}; + +//! Classe per calcular la desviaci� est�ndard dels nivells de gris d'un blob +//! Class to get the standard deviation of the grey level values of a blob +class CBlobGetStdDev: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.StdDev(); + } + const char *GetNom() const + { + return "CBlobGetStdDev"; + } +}; + +//! Classe per calcular la compacitat d'un blob +//! Class to calculate the compactness of a blob +class CBlobGetCompactness: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetCompactness"; + } +}; + +//! Classe per calcular la longitud d'un blob +//! Class to calculate the length of a blob +class CBlobGetLength: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetLength"; + } +}; + +//! Classe per calcular l'amplada d'un blob +//! Class to calculate the breadth of a blob +class CBlobGetBreadth: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetBreadth"; + } +}; + +//! Classe per calcular la difer�ncia en X del blob +class CBlobGetDiffX: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.maxx - blob.minx; + } + const char *GetNom() const + { + return "CBlobGetDiffX"; + } +}; + +//! Classe per calcular la difer�ncia en X del blob +class CBlobGetDiffY: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.maxy - blob.miny; + } + const char *GetNom() const + { + return "CBlobGetDiffY"; + } +}; + +//! Classe per calcular el moment PQ del blob +//! Class to calculate the P,Q moment of a blob +class CBlobGetMoment: public COperadorBlob +{ +public: + //! Constructor est�ndard + //! Standard constructor (gets the 00 moment) + CBlobGetMoment() + { + m_p = m_q = 0; + } + //! Constructor: indiquem el moment p,q a calcular + //! Constructor: gets the PQ moment + CBlobGetMoment( int p, int q ) + { + m_p = p; + m_q = q; + }; + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetMoment"; + } + +private: + //! moment que volem calcular + int m_p, m_q; +}; + +//! Classe per calcular el perimetre del poligon convex d'un blob +//! Class to calculate the convex hull perimeter of a blob +class CBlobGetHullPerimeter: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetHullPerimeter"; + } +}; + +//! Classe per calcular l'�rea del poligon convex d'un blob +//! Class to calculate the convex hull area of a blob +class CBlobGetHullArea: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetHullArea"; + } +}; + +//! Classe per calcular la x minima en la y minima +//! Class to calculate the minimum x on the minimum y +class CBlobGetMinXatMinY: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetMinXatMinY"; + } +}; + +//! Classe per calcular la y minima en la x maxima +//! Class to calculate the minimum y on the maximum x +class CBlobGetMinYatMaxX: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetMinYatMaxX"; + } +}; + +//! Classe per calcular la x maxima en la y maxima +//! Class to calculate the maximum x on the maximum y +class CBlobGetMaxXatMaxY: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetMaxXatMaxY"; + } +}; + +//! Classe per calcular la y maxima en la x minima +//! Class to calculate the maximum y on the minimum y +class CBlobGetMaxYatMinX: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetMaxYatMinX"; + } +}; + +//! Classe per a calcular la x m�nima +//! Class to get the minimum x +class CBlobGetMinX: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.MinX(); + } + const char *GetNom() const + { + return "CBlobGetMinX"; + } +}; + +//! Classe per a calcular la x m�xima +//! Class to get the maximum x +class CBlobGetMaxX: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.MaxX(); + } + const char *GetNom() const + { + return "CBlobGetMaxX"; + } +}; + +//! Classe per a calcular la y m�nima +//! Class to get the minimum y +class CBlobGetMinY: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.MinY(); + } + const char *GetNom() const + { + return "CBlobGetMinY"; + } +}; + +//! Classe per a calcular la y m�xima +//! Class to get the maximum y +class CBlobGetMaxY: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.MaxY(); + } + const char *GetNom() const + { + return "CBlobGetMax"; + } +}; + + +//! Classe per calcular l'elongacio d'un blob +//! Class to calculate the elongation of the blob +class CBlobGetElongation: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetElongation"; + } +}; + +//! Classe per calcular la rugositat d'un blob +//! Class to calculate the roughness of the blob +class CBlobGetRoughness: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetRoughness"; + } +}; + +//! Classe per calcular la dist�ncia entre el centre del blob i un punt donat +//! Class to calculate the euclidean distance between the center of a blob and a given point +class CBlobGetDistanceFromPoint: public COperadorBlob +{ +public: + //! Standard constructor (distance to point 0,0) + CBlobGetDistanceFromPoint() + { + m_x = m_y = 0.0; + } + //! Constructor (distance to point x,y) + CBlobGetDistanceFromPoint( const double x, const double y ) + { + m_x = x; + m_y = y; + } + + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetDistanceFromPoint"; + } + +private: + // coordenades del punt on volem calcular la dist�ncia + double m_x, m_y; +}; + +//! Classe per calcular el nombre de pixels externs d'un blob +//! Class to get the number of extern pixels of a blob +class CBlobGetExternPerimeter: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.ExternPerimeter(); + } + const char *GetNom() const + { + return "CBlobGetExternPerimeter"; + } +}; + +//! Classe per calcular el ratio entre el perimetre i nombre pixels externs +//! valors propers a 0 indiquen que la majoria del blob �s intern +//! valors propers a 1 indiquen que la majoria del blob �s extern +//! Class to calculate the ratio between the perimeter and the number of extern pixels +class CBlobGetExternPerimeterRatio: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + if( blob.Perimeter() != 0 ) + return blob.ExternPerimeter() / blob.Perimeter(); + else + return blob.ExternPerimeter(); + } + const char *GetNom() const + { + return "CBlobGetExternPerimeterRatio"; + } +}; + +//! Classe per calcular el ratio entre el perimetre convex i nombre pixels externs +//! valors propers a 0 indiquen que la majoria del blob �s intern +//! valors propers a 1 indiquen que la majoria del blob �s extern +//! Class to calculate the ratio between the perimeter and the number of extern pixels +class CBlobGetExternHullPerimeterRatio: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + CBlobGetHullPerimeter getHullPerimeter; + double hullPerimeter; + + if( (hullPerimeter = getHullPerimeter( blob ) ) != 0 ) + return blob.ExternPerimeter() / hullPerimeter; + else + return blob.ExternPerimeter(); + } + const char *GetNom() const + { + return "CBlobGetExternHullPerimeterRatio"; + } +}; + +//! Classe per calcular el centre en el eix X d'un blob +//! Class to calculate the center in the X direction +class CBlobGetXCenter: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.MinX() + (( blob.MaxX() - blob.MinX() ) / 2.0); + } + const char *GetNom() const + { + return "CBlobGetXCenter"; + } +}; + +//! Classe per calcular el centre en el eix Y d'un blob +//! Class to calculate the center in the Y direction +class CBlobGetYCenter: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + return blob.MinY() + (( blob.MaxY() - blob.MinY() ) / 2.0); + } + const char *GetNom() const + { + return "CBlobGetYCenter"; + } +}; + +//! Classe per calcular la longitud de l'eix major d'un blob +//! Class to calculate the length of the major axis of the ellipse that fits the blob edges +class CBlobGetMajorAxisLength: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + CvBox2D elipse = blob.GetEllipse(); + + return elipse.size.width; + } + const char *GetNom() const + { + return "CBlobGetMajorAxisLength"; + } +}; + +//! Classe per calcular el ratio entre l'area de la elipse i la de la taca +//! Class +class CBlobGetAreaElipseRatio: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + if( blob.Area()==0.0 ) return 0.0; + + CvBox2D elipse = blob.GetEllipse(); + double ratioAreaElipseAreaTaca = ( (elipse.size.width/2.0) + * + (elipse.size.height/2.0) + *CV_PI + ) + / + blob.Area(); + + return ratioAreaElipseAreaTaca; + } + const char *GetNom() const + { + return "CBlobGetAreaElipseRatio"; + } +}; + +//! Classe per calcular la longitud de l'eix menor d'un blob +//! Class to calculate the length of the minor axis of the ellipse that fits the blob edges +class CBlobGetMinorAxisLength: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + CvBox2D elipse = blob.GetEllipse(); + + return elipse.size.height; + } + const char *GetNom() const + { + return "CBlobGetMinorAxisLength"; + } +}; + +//! Classe per calcular l'orientaci� de l'ellipse del blob en radians +//! Class to calculate the orientation of the ellipse that fits the blob edges in radians +class CBlobGetOrientation: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + CvBox2D elipse = blob.GetEllipse(); + + if( elipse.angle > 180.0 ) + return (( elipse.angle - 180.0 )* DEGREE2RAD); + else + return ( elipse.angle * DEGREE2RAD); + + } + const char *GetNom() const + { + return "CBlobGetOrientation"; + } +}; + +//! Classe per calcular el cosinus de l'orientaci� de l'ellipse del blob +//! Class to calculate the cosinus of the orientation of the ellipse that fits the blob edges +class CBlobGetOrientationCos: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + CBlobGetOrientation getOrientation; + return fabs( cos( getOrientation(blob) )); + } + const char *GetNom() const + { + return "CBlobGetOrientationCos"; + } +}; + + +//! Classe per calcular el ratio entre l'eix major i menor de la el�lipse +//! Class to calculate the ratio between both axes of the ellipse +class CBlobGetAxisRatio: public COperadorBlob +{ +public: + double operator()(const CBlob &blob) const + { + CvBox2D elipse = blob.GetEllipse(); + + return elipse.size.height / elipse.size.width; + } + const char *GetNom() const + { + return "CBlobGetAxisRatio"; + } +}; + + +//! Classe per calcular si un punt cau dins del blob +//! Class to calculate whether a point is inside a blob +class CBlobGetXYInside: public COperadorBlob +{ +public: + //! Constructor est�ndard + //! Standard constructor + CBlobGetXYInside() + { + m_p = cvPoint(0,0); + } + //! Constructor: indiquem el punt + //! Constructor: sets the point + CBlobGetXYInside( CvPoint p ) + { + m_p = p; + }; + double operator()(const CBlob &blob) const; + const char *GetNom() const + { + return "CBlobGetXYInside"; + } + +private: + //! punt que considerem + //! point to be considered + CvPoint m_p; +}; + +} + +#endif //CBLOB_INSPECTA_INCLUDED + diff --git a/package_bgs/lb/BGModel.cpp b/package_bgs/lb/BGModel.cpp new file mode 100644 index 0000000..c42bec7 --- /dev/null +++ b/package_bgs/lb/BGModel.cpp @@ -0,0 +1,87 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* Scene 1.0.1 -- Background subtraction and object tracking for complex environments + BGModel.cpp + + Copyright (C) 2011 Laurence Bender <lbender@untref.edu.ar> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "BGModel.h" + +namespace lb_library +{ + BGModel::BGModel(int width, int height): m_width(width), m_height(height) + { + m_SrcImage = cvCreateImage(cvSize(m_width,m_height), IPL_DEPTH_8U, 3); + m_BGImage = cvCreateImage(cvSize(m_width,m_height), IPL_DEPTH_8U, 3); + m_FGImage = cvCreateImage(cvSize(m_width,m_height), IPL_DEPTH_8U, 3); + + cvZero(m_SrcImage); + cvZero(m_BGImage); + cvZero(m_FGImage); + } + + BGModel::~BGModel() + { + if (m_SrcImage!=NULL) cvReleaseImage(&m_SrcImage); + if (m_BGImage!=NULL) cvReleaseImage(&m_BGImage); + if (m_FGImage!=NULL) cvReleaseImage(&m_FGImage); + } + + IplImage* BGModel::GetSrc() + { + return m_SrcImage; + } + + IplImage* BGModel::GetFG() + { + return m_FGImage; + } + + IplImage* BGModel::GetBG() + { + return m_BGImage; + } + + void BGModel::InitModel(IplImage* image) + { + cvCopy(image,m_SrcImage); + Init(); + return; + } + + void BGModel::UpdateModel(IplImage* image) + { + cvCopy(image,m_SrcImage); + Update(); + return; + } +} \ No newline at end of file diff --git a/package_bgs/lb/BGModel.h b/package_bgs/lb/BGModel.h new file mode 100644 index 0000000..d53b52e --- /dev/null +++ b/package_bgs/lb/BGModel.h @@ -0,0 +1,78 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* Scene 1.0.1 -- Background subtraction and object tracking for complex environments + BGModel.h + + Copyright (C) 2011 Laurence Bender <lbender@untref.edu.ar> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef BGMODEL_H +#define BGMODEL_H + +#include <cv.h> +#include <math.h> +#include <float.h> + +#include "Types.h" + +namespace lb_library +{ + class BGModel + { + public: + + BGModel(int width, int height); + virtual ~BGModel(); + + void InitModel(IplImage* image); + void UpdateModel(IplImage* image); + + virtual void setBGModelParameter(int id, int value) {}; + + virtual IplImage* GetSrc(); + virtual IplImage* GetFG(); + virtual IplImage* GetBG(); + + protected: + + IplImage* m_SrcImage; + IplImage* m_BGImage; + IplImage* m_FGImage; + + const int m_width; + const int m_height; + + virtual void Init() = 0; + virtual void Update() = 0; + }; +} + +#endif diff --git a/package_bgs/lb/BGModelFuzzyGauss.cpp b/package_bgs/lb/BGModelFuzzyGauss.cpp new file mode 100644 index 0000000..8706b13 --- /dev/null +++ b/package_bgs/lb/BGModelFuzzyGauss.cpp @@ -0,0 +1,210 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* Scene 1.0.1 -- Background subtraction and object tracking for complex environments +BGModelFuzzyGauss.cpp + +Copyright (C) 2011 Laurence Bender <lbender@untref.edu.ar> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "BGModelFuzzyGauss.h" + +namespace lb_library +{ + namespace FuzzyGaussian + { + BGModelFuzzyGauss::BGModelFuzzyGauss(int width, int height) : BGModel(width,height) + { + m_alphamax = ALPHAFUZZYGAUSS; + m_threshold = THRESHOLDFUZZYGAUSS * THRESHOLDFUZZYGAUSS; + m_threshBG = THRESHOLDBG; + m_noise = NOISEFUZZYGAUSS; + + m_pMu = new DBLRGB[m_width * m_height]; + m_pVar = new DBLRGB[m_width * m_height]; + + DBLRGB *pMu = m_pMu; + DBLRGB *pVar = m_pVar; + + for(int k = 0; k < (m_width * m_height); k++) + { + pMu->Red = 0.0; + pMu->Green = 0.0; + pMu->Blue = 0.0; + + pVar->Red = m_noise; + pVar->Green = m_noise; + pVar->Blue = m_noise; + + pMu++; + pVar++; + } + } + + BGModelFuzzyGauss::~BGModelFuzzyGauss() + { + delete [] m_pMu; + delete [] m_pVar; + } + + void BGModelFuzzyGauss::setBGModelParameter(int id, int value) + { + double dvalue = (double)value/255.0; + + switch(id) + { + case 0: + m_threshold = 100.0*dvalue*dvalue; + break; + + case 1: + m_threshBG = dvalue; + break; + + case 2: + m_alphamax = dvalue*dvalue*dvalue; + break; + + case 3: + m_noise = 100.0*dvalue; + break; + } + + return; + } + + void BGModelFuzzyGauss::Init() + { + DBLRGB *pMu = m_pMu; + DBLRGB *pVar = m_pVar; + + Image<BYTERGB> prgbSrc(m_SrcImage); + + for(int i = 0; i < m_height; i++) + { + for(int j = 0; j < m_width; j++) + { + pMu->Red = prgbSrc[i][j].Red; + pMu->Green = prgbSrc[i][j].Green; + pMu->Blue = prgbSrc[i][j].Blue; + + pVar->Red = m_noise; + pVar->Green = m_noise; + pVar->Blue = m_noise; + + pMu++; + pVar++; + } + } + + return; + } + + void BGModelFuzzyGauss::Update() + { + DBLRGB *pMu = m_pMu; + DBLRGB *pVar = m_pVar; + + Image<BYTERGB> prgbSrc(m_SrcImage); + Image<BYTERGB> prgbBG(m_BGImage); + Image<BYTERGB> prgbFG(m_FGImage); + + for(int i = 0; i < m_height; i++) + { + for(int j = 0; j < m_width; j++) + { + double srcR = (double) prgbSrc[i][j].Red; + double srcG = (double) prgbSrc[i][j].Green; + double srcB = (double) prgbSrc[i][j].Blue; + + // Fuzzy background subtraction (Mahalanobis distance) + + double dr = srcR - pMu->Red; + double dg = srcG - pMu->Green; + double db = srcB - pMu->Blue; + + double d2 = dr*dr/pVar->Red + dg*dg/pVar->Green + db*db/pVar->Blue; + + double fuzzyBG = 1.0; + + if(d2 < m_threshold) + fuzzyBG = d2/m_threshold; + + // Fuzzy running average + + double alpha = m_alphamax*exp(FUZZYEXP*fuzzyBG); + + if(dr*dr > DBL_MIN) + pMu->Red += alpha*dr; + + if(dg*dg > DBL_MIN) + pMu->Green += alpha*dg; + + if(db*db > DBL_MIN) + pMu->Blue += alpha*db; + + double d; + + d = (srcR - pMu->Red)*(srcR - pMu->Red) - pVar->Red; + if(d*d > DBL_MIN) + pVar->Red += alpha*d; + + d = (srcG - pMu->Green)*(srcG - pMu->Green) - pVar->Green; + if(d*d > DBL_MIN) + pVar->Green += alpha*d; + + d = (srcB - pMu->Blue)*(srcB - pMu->Blue) - pVar->Blue; + if(d*d > DBL_MIN) + pVar->Blue += alpha*d; + + pVar->Red = (std::max)(pVar->Red,m_noise); + pVar->Green = (std::max)(pVar->Green,m_noise); + pVar->Blue = (std::max)(pVar->Blue,m_noise); + + // Set foreground and background + + if(fuzzyBG >= m_threshBG) + prgbFG[i][j].Red = prgbFG[i][j].Green = prgbFG[i][j].Blue = 255; + else + prgbFG[i][j].Red = prgbFG[i][j].Green = prgbFG[i][j].Blue = 0; + + prgbBG[i][j].Red = (unsigned char)pMu->Red; + prgbBG[i][j].Green = (unsigned char)pMu->Green; + prgbBG[i][j].Blue = (unsigned char)pMu->Blue; + + pMu++; + pVar++; + } + } + + return; + } + } +} \ No newline at end of file diff --git a/package_bgs/lb/BGModelFuzzyGauss.h b/package_bgs/lb/BGModelFuzzyGauss.h new file mode 100644 index 0000000..033eaf3 --- /dev/null +++ b/package_bgs/lb/BGModelFuzzyGauss.h @@ -0,0 +1,75 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* Scene 1.0.1 -- Background subtraction and object tracking for complex environments +BGModelFuzzyGauss.h + +Copyright (C) 2011 Laurence Bender <lbender@untref.edu.ar> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef BGMODELFUZZYGAUSS_H +#define BGMODELFUZZYGAUSS_H + +#include "BGModel.h" + +namespace lb_library +{ + namespace FuzzyGaussian + { + const float ALPHAFUZZYGAUSS = 0.02; + const float THRESHOLDFUZZYGAUSS = 3.5; + const float THRESHOLDBG = 0.5; + const float NOISEFUZZYGAUSS = 50.0; + const float FUZZYEXP = -5.0; + + class BGModelFuzzyGauss : public BGModel + { + public: + BGModelFuzzyGauss(int width, int height); + ~BGModelFuzzyGauss(); + + void setBGModelParameter(int id, int value); + + protected: + double m_alphamax; + double m_threshold; + double m_threshBG; + double m_noise; + + DBLRGB* m_pMu; + DBLRGB* m_pVar; + + void Init(); + void Update(); + }; + } +} + +#endif diff --git a/package_bgs/lb/BGModelFuzzySom.cpp b/package_bgs/lb/BGModelFuzzySom.cpp new file mode 100644 index 0000000..189cb1a --- /dev/null +++ b/package_bgs/lb/BGModelFuzzySom.cpp @@ -0,0 +1,298 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* Scene 1.0.1 -- Background subtraction and object tracking for complex environments +BGModelFuzzySom.cpp + +Copyright (C) 2011 Laurence Bender <lbender@untref.edu.ar> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "BGModelFuzzySom.h" + +namespace lb_library +{ + namespace FuzzyAdaptiveSOM + { + BGModelFuzzySom::BGModelFuzzySom(int width, int height) : BGModel(width,height) + { + m_offset = (KERNEL - 1)/2; + + if(SPAN_NEIGHBORS) + m_pad = 0; + else + m_pad = m_offset; + + // SOM models + + m_widthSOM = m_width*M + 2*m_offset + (m_width-1)*m_pad; + m_heightSOM = m_height*N + 2*m_offset + (m_height-1)*m_pad; + + m_ppSOM = new DBLRGB*[m_heightSOM]; + for(int n = 0; n < m_heightSOM; n++) + m_ppSOM[n] = new DBLRGB[m_widthSOM]; + + for(int j = 0; j < m_heightSOM; j++) + { + for(int i = 0; i < m_widthSOM; i++) + { + m_ppSOM[j][i].Red = 0.0; + m_ppSOM[j][i].Green = 0.0; + m_ppSOM[j][i].Blue = 0.0; + } + } + + // Create weights + + m_ppW = new double*[KERNEL]; + for(int n = 0; n < KERNEL; n++) + m_ppW[n] = new double[KERNEL]; + + // Construct Gaussian kernel using Pascal's triangle + + int cM; + int cN; + m_Wmax = DBL_MIN; + + cN = 1; + for(int j = 0; j < KERNEL; j++) + { + cM = 1; + + for(int i = 0; i < KERNEL; i++) + { + m_ppW[j][i] = cN*cM; + + if(m_ppW[j][i] > m_Wmax) + m_Wmax = m_ppW[j][i]; + + cM = cM * (KERNEL - 1 - i) / (i + 1); + } + + cN = cN * (KERNEL - 1 - j) / (j + 1); + } + + // Parameters + + m_epsilon1 = EPS1*EPS1; + m_epsilon2 = EPS2*EPS2; + + m_alpha1 = C1/m_Wmax; + m_alpha2 = C2/m_Wmax; + + m_K = 0; + m_TSteps = TRAINING_STEPS; + } + + BGModelFuzzySom::~BGModelFuzzySom() + { + for(int n = 0; n < m_heightSOM; n++) + delete [] m_ppSOM[n]; + + delete [] m_ppSOM; + + for(int n = 0; n < KERNEL; n++) + delete [] m_ppW[n]; + + delete [] m_ppW; + } + + void BGModelFuzzySom::setBGModelParameter(int id, int value) + { + double dvalue = (double)value/255.0; + + switch(id) + { + case 0: + m_epsilon2 = 255.0*255.0*dvalue*dvalue*dvalue*dvalue; + break; + + case 1: + m_epsilon1 = 255.0*255.0*dvalue*dvalue*dvalue*dvalue; + break; + + case 2: + m_alpha2 = dvalue*dvalue*dvalue/m_Wmax; + break; + + case 3: + m_alpha1 = dvalue*dvalue*dvalue/m_Wmax; + break; + + case 5: + m_TSteps = (int)(255.0*dvalue); + break; + } + + return; + } + + void BGModelFuzzySom::Init() + { + Image<BYTERGB> prgbSrc(m_SrcImage); + + for(int j = 0; j < m_height; j++) + { + int jj = m_offset + j*(N + m_pad); + + for(int i = 0; i < m_width; i++) + { + int ii = m_offset + i*(M + m_pad); + + for(int l = 0; l < N; l++) + { + for(int k = 0; k < M; k++) + { + m_ppSOM[jj+l][ii+k].Red = (double)prgbSrc[j][i].Red; + m_ppSOM[jj+l][ii+k].Green = (double)prgbSrc[j][i].Green; + m_ppSOM[jj+l][ii+k].Blue = (double)prgbSrc[j][i].Blue; + } + } + } + } + + m_K = 0; + + return; + } + + void BGModelFuzzySom::Update() + { + double alpha,a; + double epsilon; + + // calibration phase + if(m_K <= m_TSteps) + { + epsilon = m_epsilon1; + alpha = (m_alpha1 - m_K * (m_alpha1 - m_alpha2) / m_TSteps); + m_K++; + } + else // online phase + { + epsilon = m_epsilon2; + alpha = m_alpha2; + } + + Image<BYTERGB> prgbSrc(m_SrcImage); + Image<BYTERGB> prgbBG(m_BGImage); + Image<BYTERGB> prgbFG(m_FGImage); + + for(int j = 0; j < m_height; j++) + { + int jj = m_offset + j*(N + m_pad); + + for(int i = 0; i < m_width; i++) + { + int ii = m_offset + i*(M + m_pad); + + double srcR = (double)prgbSrc[j][i].Red; + double srcG = (double)prgbSrc[j][i].Green; + double srcB = (double)prgbSrc[j][i].Blue; + + // Find BMU + + double d2min = DBL_MAX; + int iiHit = ii; + int jjHit = jj; + + for(int l = 0; l < N; l++) + { + for(int k = 0; k < M; k++) + { + double dr = srcR - m_ppSOM[jj+l][ii+k].Red; + double dg = srcG - m_ppSOM[jj+l][ii+k].Green; + double db = srcB - m_ppSOM[jj+l][ii+k].Blue; + + double d2 = dr*dr + dg*dg + db*db; + + if(d2 < d2min) + { + d2min = d2; + iiHit = ii + k; + jjHit = jj + l; + } + } + } + + double fuzzyBG = 1.0; + + if(d2min < epsilon) + fuzzyBG = d2min/epsilon; + + // Update SOM + + double alphamax = alpha*exp(FUZZYEXP*fuzzyBG); + + for(int l = (jjHit - m_offset); l <= (jjHit + m_offset); l++) + { + for(int k = (iiHit - m_offset); k <= (iiHit + m_offset); k++) + { + a = alphamax * m_ppW[l - jjHit + m_offset][k - iiHit + m_offset]; + + // speed hack.. avoid very small increment values. abs() is sloooow. + + double d; + + d = srcR - m_ppSOM[l][k].Red; + if(d*d > DBL_MIN) + m_ppSOM[l][k].Red += a*d; + + d = srcG - m_ppSOM[l][k].Green; + if(d*d > DBL_MIN) + m_ppSOM[l][k].Green += a*d; + + d = srcB - m_ppSOM[l][k].Blue; + if(d*d > DBL_MIN) + m_ppSOM[l][k].Blue += a*d; + } + } + + if(fuzzyBG >= FUZZYTHRESH) + { + // Set foreground image + prgbFG[j][i].Red = prgbFG[j][i].Green = prgbFG[j][i].Blue = 255; + } + else + { + // Set background image + prgbBG[j][i].Red = m_ppSOM[jjHit][iiHit].Red; + prgbBG[j][i].Green = m_ppSOM[jjHit][iiHit].Green; + prgbBG[j][i].Blue = m_ppSOM[jjHit][iiHit].Blue; + + // Set foreground image + prgbFG[j][i].Red = prgbFG[j][i].Green = prgbFG[j][i].Blue = 0; + } + } + } + + return; + } + } +} \ No newline at end of file diff --git a/package_bgs/lb/BGModelFuzzySom.h b/package_bgs/lb/BGModelFuzzySom.h new file mode 100644 index 0000000..2f21d3e --- /dev/null +++ b/package_bgs/lb/BGModelFuzzySom.h @@ -0,0 +1,95 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* Scene 1.0.1 -- Background subtraction and object tracking for complex environments +BGModelFuzzySom.h + +Copyright (C) 2011 Laurence Bender <lbender@untref.edu.ar> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef BGMODELFUZZYSOM_H +#define BGMODELFUZZYSOM_H + +#include "BGModel.h" + +namespace lb_library +{ + namespace FuzzyAdaptiveSOM + { + // SOM parameters + + const int M = 3; // width SOM (per pixel) + const int N = 3; // height SOM (per pixel) + const int KERNEL = 3; // size Gaussian kernel + + const bool SPAN_NEIGHBORS = false; // true if update neighborhood spans different pixels // + const int TRAINING_STEPS = 100; // number of training steps + + const double EPS1 = 100.0; // model match distance during training + const double EPS2 = 20.0; // model match distance + const double C1 = 1.0; // learning rate during training + const double C2 = 0.05; // learning rate + + const double FUZZYEXP = -5.0; + const double FUZZYTHRESH = 0.8; + + class BGModelFuzzySom : public BGModel + { + public: + BGModelFuzzySom(int width, int height); + ~BGModelFuzzySom(); + + void setBGModelParameter(int id, int value); + + protected: + int m_widthSOM; + int m_heightSOM; + int m_offset; + int m_pad; + int m_K; + int m_TSteps; + + double m_Wmax; + + double m_epsilon1; + double m_epsilon2; + double m_alpha1; + double m_alpha2; + + DBLRGB** m_ppSOM; // SOM grid + double** m_ppW; // Weights + + void Init(); + void Update(); + }; + } +} + +#endif diff --git a/package_bgs/lb/BGModelGauss.cpp b/package_bgs/lb/BGModelGauss.cpp new file mode 100644 index 0000000..6892d13 --- /dev/null +++ b/package_bgs/lb/BGModelGauss.cpp @@ -0,0 +1,200 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* Scene 1.0.1 -- Background subtraction and object tracking for complex environments +BGModelGauss.cpp + +Copyright (C) 2011 Laurence Bender <lbender@untref.edu.ar> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "BGModelGauss.h" + +namespace lb_library +{ + namespace SimpleGaussian + { + BGModelGauss::BGModelGauss(int width, int height) : BGModel(width,height) + { + m_alpha = ALPHAGAUSS; + m_threshold = THRESHGAUSS*THRESHGAUSS; + m_noise = NOISEGAUSS; + + m_pMu = new DBLRGB[m_width * m_height]; + m_pVar = new DBLRGB[m_width * m_height]; + + DBLRGB *pMu = m_pMu; + DBLRGB *pVar = m_pVar; + + for(int k = 0; k < (m_width * m_height); k++) + { + pMu->Red = 0.0; + pMu->Green = 0.0; + pMu->Blue = 0.0; + + pVar->Red = m_noise; + pVar->Green = m_noise; + pVar->Blue = m_noise; + + pMu++; + pVar++; + } + } + + BGModelGauss::~BGModelGauss() + { + delete [] m_pMu; + delete [] m_pVar; + } + + void BGModelGauss::setBGModelParameter(int id, int value) + { + double dvalue = (double)value/255.0; + + switch(id) + { + case 0: + m_threshold = 100.0*dvalue*dvalue; + break; + + case 1: + m_noise = 100.0*dvalue; + break; + + case 2: + m_alpha = dvalue*dvalue*dvalue; + break; + } + + return; + } + + void BGModelGauss::Init() + { + DBLRGB *pMu = m_pMu; + DBLRGB *pVar = m_pVar; + + Image<BYTERGB> prgbSrc(m_SrcImage); + + for(int i = 0; i < m_height; i++) + { + for(int j = 0; j < m_width; j++) + { + pMu->Red = prgbSrc[i][j].Red; + pMu->Green = prgbSrc[i][j].Green; + pMu->Blue = prgbSrc[i][j].Blue; + + pVar->Red = m_noise; + pVar->Green = m_noise; + pVar->Blue = m_noise; + + pMu++; + pVar++; + } + } + + return; + } + + void BGModelGauss::Update() + { + DBLRGB *pMu = m_pMu; + DBLRGB *pVar = m_pVar; + + Image<BYTERGB> prgbSrc(m_SrcImage); + Image<BYTERGB> prgbBG(m_BGImage); + Image<BYTERGB> prgbFG(m_FGImage); + + for(int i = 0; i < m_height; i++) + { + for(int j = 0; j < m_width; j++) + { + double srcR = (double) prgbSrc[i][j].Red; + double srcG = (double) prgbSrc[i][j].Green; + double srcB = (double) prgbSrc[i][j].Blue; + + // Mahalanobis distance + + double dr = srcR - pMu->Red; + double dg = srcG - pMu->Green; + double db = srcB - pMu->Blue; + + double d2 = dr*dr/pVar->Red + dg*dg/pVar->Green + db*db/pVar->Blue; + + // Classify + + if(d2 < m_threshold) + prgbFG[i][j].Red = prgbFG[i][j].Green = prgbFG[i][j].Blue = 0; + else + prgbFG[i][j].Red = prgbFG[i][j].Green = prgbFG[i][j].Blue = 255; + + // Update parameters + + if(dr*dr > DBL_MIN) + pMu->Red += m_alpha*dr; + + if(dg*dg > DBL_MIN) + pMu->Green += m_alpha*dg; + + if(db*db > DBL_MIN) + pMu->Blue += m_alpha*db; + + double d; + + d = (srcR - pMu->Red)*(srcR - pMu->Red) - pVar->Red; + if(d*d > DBL_MIN) + pVar->Red += m_alpha*d; + + d = (srcG - pMu->Green)*(srcG - pMu->Green) - pVar->Green; + if(d*d > DBL_MIN) + pVar->Green += m_alpha*d; + + d = (srcB - pMu->Blue)*(srcB - pMu->Blue) - pVar->Blue; + if(d*d > DBL_MIN) + pVar->Blue += m_alpha*d; + + pVar->Red = (std::min)(pVar->Red,m_noise); + pVar->Green = (std::min)(pVar->Green,m_noise); + pVar->Blue = (std::min)(pVar->Blue,m_noise); + + // Set background + + prgbBG[i][j].Red = (unsigned char)pMu->Red; + prgbBG[i][j].Green = (unsigned char)pMu->Green; + prgbBG[i][j].Blue = (unsigned char)pMu->Blue; + + pMu++; + pVar++; + } + } + + return; + } + } +} \ No newline at end of file diff --git a/package_bgs/lb/BGModelGauss.h b/package_bgs/lb/BGModelGauss.h new file mode 100644 index 0000000..d36a716 --- /dev/null +++ b/package_bgs/lb/BGModelGauss.h @@ -0,0 +1,73 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* Scene 1.0.1 -- Background subtraction and object tracking for complex environments +BGModelGauss.h + +Copyright (C) 2011 Laurence Bender <lbender@untref.edu.ar> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef BGMODELGAUSS_H +#define BGMODELGAUSS_H + +#include "BGModel.h" + +namespace lb_library +{ + namespace SimpleGaussian + { + // Parameters + const double THRESHGAUSS = 2.5; // Threshold + const double ALPHAGAUSS = 0.0001; // Learning rate + const double NOISEGAUSS = 50.0; // Minimum variance (noise) + + class BGModelGauss : public BGModel + { + public: + BGModelGauss(int width, int height); + ~BGModelGauss(); + + void setBGModelParameter(int id, int value); + + protected: + double m_alpha; + double m_threshold; + double m_noise; + + DBLRGB* m_pMu; + DBLRGB* m_pVar; + + void Init(); + void Update(); + }; + } +} + +#endif diff --git a/package_bgs/lb/BGModelMog.cpp b/package_bgs/lb/BGModelMog.cpp new file mode 100644 index 0000000..df6986c --- /dev/null +++ b/package_bgs/lb/BGModelMog.cpp @@ -0,0 +1,309 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* Scene 1.0.1 -- Background subtraction and object tracking for complex environments +BGModelMog.cpp + +Copyright (C) 2011 Laurence Bender <lbender@untref.edu.ar> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "BGModelMog.h" + +namespace lb_library +{ + namespace MixtureOfGaussians + { + BGModelMog::BGModelMog(int width, int height) : BGModel(width, height) + { + m_alpha = LEARNINGRATEMOG; + m_threshold = THRESHOLDMOG*THRESHOLDMOG; + m_noise = INITIALVARMOG; + + m_T = BGTHRESHOLDMOG; + + m_pMOG = new MOGDATA[NUMBERGAUSSIANS*m_width*m_height]; + m_pK = new int[m_width*m_height]; + + MOGDATA *pMOG = m_pMOG; + int *pK = m_pK; + + for(int i = 0; i < (m_width * m_height); i++) + { + for(int k = 0; k < NUMBERGAUSSIANS; k++) + { + pMOG->mu.Red = 0.0; + pMOG->mu.Green = 0.0; + pMOG->mu.Blue = 0.0; + + pMOG->var.Red = 0.0; + pMOG->var.Green = 0.0; + pMOG->var.Blue = 0.0; + + pMOG->w = 0.0; + pMOG->sortKey = 0.0; + + pMOG++; + } + + pK[i] = 0; + } + } + + BGModelMog::~BGModelMog() + { + delete [] m_pMOG; + delete [] m_pK; + } + + void BGModelMog::setBGModelParameter(int id, int value) + { + double dvalue = (double)value/255.0; + + switch(id) + { + case 0: + m_threshold = 100.0*dvalue*dvalue; + break; + + case 1: + m_T = dvalue; + break; + + case 2: + m_alpha = dvalue*dvalue*dvalue; + break; + + case 3: + m_noise = 100.0*dvalue;; + break; + } + + return; + } + + void BGModelMog::Init() + { + MOGDATA *pMOG = m_pMOG; + int *pK = m_pK; + + Image<BYTERGB> prgbSrc(m_SrcImage); + + int n = 0; + for(int i = 0; i < m_height; i++) + { + for(int j = 0; j < m_width; j++) + { + pMOG[0].mu.Red = prgbSrc[i][j].Red; + pMOG[0].mu.Green = prgbSrc[i][j].Green; + pMOG[0].mu.Blue = prgbSrc[i][j].Blue; + + pMOG[0].var.Red = m_noise; + pMOG[0].var.Green = m_noise; + pMOG[0].var.Blue = m_noise; + + pMOG[0].w = 1.0; + pMOG[0].sortKey = pMOG[0].w/sqrt(pMOG[0].var.Red+pMOG[0].var.Green+pMOG[0].var.Blue); + + pK[n] = 1; + n++; + + pMOG += NUMBERGAUSSIANS; + } + } + + return; + } + + void BGModelMog::Update() + { + int kBG; + + MOGDATA *pMOG = m_pMOG; + int *pK = m_pK; + + Image<BYTERGB> prgbSrc(m_SrcImage); + Image<BYTERGB> prgbBG(m_BGImage); + Image<BYTERGB> prgbFG(m_FGImage); + + int n = 0; + for(int i = 0; i < m_height; i++) + { + for(int j = 0; j < m_width; j++) + { + double srcR = (double) prgbSrc[i][j].Red; + double srcG = (double) prgbSrc[i][j].Green; + double srcB = (double) prgbSrc[i][j].Blue; + + // Find matching distribution + + int kHit = -1; + + for(int k = 0; k < pK[n]; k++) + { + // Mahalanobis distance + double dr = srcR - pMOG[k].mu.Red; + double dg = srcG - pMOG[k].mu.Green; + double db = srcB - pMOG[k].mu.Blue; + double d2 = dr*dr/pMOG[k].var.Red + dg*dg/pMOG[k].var.Green + db*db/pMOG[k].var.Blue; + + if(d2 < m_threshold) + { + kHit = k; + break; + } + } + + // Adjust parameters + + // matching distribution found + if(kHit != -1) + { + for(int k = 0; k < pK[n]; k++) + { + if(k == kHit) + { + pMOG[k].w = pMOG[k].w + m_alpha*(1.0f - pMOG[k].w); + + double d; + + d = srcR - pMOG[k].mu.Red; + if(d*d > DBL_MIN) + pMOG[k].mu.Red += m_alpha*d; + + d = srcG - pMOG[k].mu.Green; + if(d*d > DBL_MIN) + pMOG[k].mu.Green += m_alpha*d; + + d = srcB - pMOG[k].mu.Blue; + if(d*d > DBL_MIN) + pMOG[k].mu.Blue += m_alpha*d; + + d = (srcR - pMOG[k].mu.Red)*(srcR - pMOG[k].mu.Red) - pMOG[k].var.Red; + if(d*d > DBL_MIN) + pMOG[k].var.Red += m_alpha*d; + + d = (srcG - pMOG[k].mu.Green)*(srcG - pMOG[k].mu.Green) - pMOG[k].var.Green; + if(d*d > DBL_MIN) + pMOG[k].var.Green += m_alpha*d; + + d = (srcB - pMOG[k].mu.Blue)*(srcB - pMOG[k].mu.Blue) - pMOG[k].var.Blue; + if(d*d > DBL_MIN) + pMOG[k].var.Blue += m_alpha*d; + + pMOG[k].var.Red = (std::max)(pMOG[k].var.Red,m_noise); + pMOG[k].var.Green = (std::max)(pMOG[k].var.Green,m_noise); + pMOG[k].var.Blue = (std::max)(pMOG[k].var.Blue,m_noise); + } + else + pMOG[k].w = (1.0 - m_alpha)*pMOG[k].w; + } + } + // no match found... create new one + else + { + if(pK[n] < NUMBERGAUSSIANS) + pK[n]++; + + kHit = pK[n] - 1; + + if(pK[n] == 1) + pMOG[kHit].w = 1.0; + else + pMOG[kHit].w = LEARNINGRATEMOG; + + pMOG[kHit].mu.Red = srcR; + pMOG[kHit].mu.Green = srcG; + pMOG[kHit].mu.Blue = srcB; + + pMOG[kHit].var.Red = m_noise; + pMOG[kHit].var.Green = m_noise; + pMOG[kHit].var.Blue = m_noise; + } + + // Normalize weights + + double wsum = 0.0; + + for(int k = 0; k < pK[n]; k++) + wsum += pMOG[k].w; + + double wfactor = 1.0/wsum; + + for(int k = 0; k < pK[n]; k++) + { + pMOG[k].w *= wfactor; + pMOG[k].sortKey = pMOG[k].w/sqrt(pMOG[k].var.Red+pMOG[k].var.Green+pMOG[k].var.Blue); + } + + // Sort distributions + + for (int k = 0; k < kHit; k++) + { + if(pMOG[kHit].sortKey > pMOG[k].sortKey) + { + std::swap(pMOG[kHit],pMOG[k]); + break; + } + } + + // Determine background distributions + + wsum = 0.0; + + for(int k = 0; k < pK[n]; k++) + { + wsum += pMOG[k].w; + + if(wsum > m_T) + { + kBG = k; + break; + } + } + + if(kHit > kBG) + prgbFG[i][j].Red = prgbFG[i][j].Green = prgbFG[i][j].Blue = 255; + else + prgbFG[i][j].Red = prgbFG[i][j].Green = prgbFG[i][j].Blue = 0; + + prgbBG[i][j].Red = (unsigned char)pMOG[0].mu.Red; + prgbBG[i][j].Green = (unsigned char)pMOG[0].mu.Green; + prgbBG[i][j].Blue = (unsigned char)pMOG[0].mu.Blue; + + pMOG += NUMBERGAUSSIANS; + + n++; + } + } + + return; + } + } +} \ No newline at end of file diff --git a/package_bgs/lb/BGModelMog.h b/package_bgs/lb/BGModelMog.h new file mode 100644 index 0000000..c4e51a4 --- /dev/null +++ b/package_bgs/lb/BGModelMog.h @@ -0,0 +1,83 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* Scene 1.0.1 -- Background subtraction and object tracking for complex environments +BGModelMog.h + +Copyright (C) 2011 Laurence Bender <lbender@untref.edu.ar> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef BGMODELMOGRGB_H +#define BGMODELMOGRGB_H + +#include "BGModel.h" + +namespace lb_library +{ + namespace MixtureOfGaussians + { + const unsigned int NUMBERGAUSSIANS = 3; + const float LEARNINGRATEMOG = 0.001f; + const float THRESHOLDMOG = 2.5f; + const float BGTHRESHOLDMOG = 0.5f; + const float INITIALVARMOG = 50.0f; + + typedef struct tagMOGDATA + { + DBLRGB mu; + DBLRGB var; + double w; + double sortKey; + } MOGDATA; + + class BGModelMog : public BGModel + { + public: + BGModelMog(int width, int height); + ~BGModelMog(); + + void setBGModelParameter(int id, int value); + + protected: + double m_alpha; + double m_threshold; + double m_noise; + double m_T; + + MOGDATA* m_pMOG; + int* m_pK; // number of distributions per pixel + + void Init(); + void Update(); + }; + } +} + +#endif diff --git a/package_bgs/lb/BGModelSom.cpp b/package_bgs/lb/BGModelSom.cpp new file mode 100644 index 0000000..256d485 --- /dev/null +++ b/package_bgs/lb/BGModelSom.cpp @@ -0,0 +1,291 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* Scene 1.0.1 -- Background subtraction and object tracking for complex environments +BGModelSom.cpp + +Copyright (C) 2011 Laurence Bender <lbender@untref.edu.ar> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "BGModelSom.h" + +namespace lb_library +{ + namespace AdaptiveSOM + { + BGModelSom::BGModelSom(int width, int height) : BGModel(width,height) + { + m_offset = (KERNEL - 1)/2; + + if(SPAN_NEIGHBORS) + m_pad = 0; + else + m_pad = m_offset; + + // SOM models + + m_widthSOM = m_width*M + 2*m_offset + (m_width-1)*m_pad; + m_heightSOM = m_height*N + 2*m_offset + (m_height-1)*m_pad; + + m_ppSOM = new DBLRGB*[m_heightSOM]; + for(int n = 0; n < m_heightSOM; n++) + m_ppSOM[n] = new DBLRGB[m_widthSOM]; + + for(int j = 0; j < m_heightSOM; j++) + { + for(int i = 0; i < m_widthSOM; i++) + { + m_ppSOM[j][i].Red = 0.0; + m_ppSOM[j][i].Green = 0.0; + m_ppSOM[j][i].Blue = 0.0; + } + } + + // Create weights + + m_ppW = new double*[KERNEL]; + for(int n = 0; n < KERNEL; n++) + m_ppW[n] = new double[KERNEL]; + + // Construct Gaussian kernel using Pascal's triangle + + int cM; + int cN; + m_Wmax = DBL_MIN; + + cN = 1; + for(int j = 0; j < KERNEL; j++) + { + cM = 1; + + for(int i = 0; i < KERNEL; i++) + { + m_ppW[j][i] = cN*cM; + + if(m_ppW[j][i] > m_Wmax) + m_Wmax = m_ppW[j][i]; + + cM = cM * (KERNEL - 1 - i) / (i + 1); + } + + cN = cN * (KERNEL - 1 - j) / (j + 1); + } + + // Parameters + + m_epsilon1 = EPS1*EPS1; + m_epsilon2 = EPS2*EPS2; + + m_alpha1 = C1/m_Wmax; + m_alpha2 = C2/m_Wmax; + + m_K = 0; + m_TSteps = TRAINING_STEPS; + } + + BGModelSom::~BGModelSom() + { + for(int n = 0; n < m_heightSOM; n++) + delete [] m_ppSOM[n]; + + delete [] m_ppSOM; + + for(int n = 0; n < KERNEL; n++) + delete [] m_ppW[n]; + + delete [] m_ppW; + } + + void BGModelSom::setBGModelParameter(int id, int value) + { + double dvalue = (double)value/255.0; + + switch(id) + { + case 0: + m_epsilon2 = 255.0*255.0*dvalue*dvalue*dvalue*dvalue; + break; + + case 1: + m_epsilon1 = 255.0*255.0*dvalue*dvalue*dvalue*dvalue; + break; + + case 2: + m_alpha2 = dvalue*dvalue*dvalue/m_Wmax; + break; + + case 3: + m_alpha1 = dvalue*dvalue*dvalue/m_Wmax; + break; + + case 5: + m_TSteps = (int)(255.0*dvalue); + break; + } + + return; + } + + void BGModelSom::Init() + { + Image<BYTERGB> prgbSrc(m_SrcImage); + + for(int j = 0; j < m_height; j++) + { + int jj = m_offset + j*(N + m_pad); + + for(int i = 0; i < m_width; i++) + { + int ii = m_offset + i*(M + m_pad); + + for(int l = 0; l < N; l++) + { + for(int k = 0; k < M; k++) + { + m_ppSOM[jj+l][ii+k].Red = (double)prgbSrc[j][i].Red; + m_ppSOM[jj+l][ii+k].Green = (double)prgbSrc[j][i].Green; + m_ppSOM[jj+l][ii+k].Blue = (double)prgbSrc[j][i].Blue; + } + } + } + } + + m_K = 0; + + return; + } + + void BGModelSom::Update() + { + double alpha,a; + double epsilon; + + // calibration phase + if(m_K <= m_TSteps) + { + epsilon = m_epsilon1; + alpha = (m_alpha1-m_K*(m_alpha1-m_alpha2)/m_TSteps); + m_K++; + } + else // online phase + { + epsilon = m_epsilon2; + alpha = m_alpha2; + } + + Image<BYTERGB> prgbSrc(m_SrcImage); + Image<BYTERGB> prgbBG(m_BGImage); + Image<BYTERGB> prgbFG(m_FGImage); + + for(int j = 0; j < m_height; j++) + { + int jj = m_offset + j*(N + m_pad); + + for(int i = 0; i < m_width; i++) + { + int ii = m_offset + i*(M + m_pad); + + double srcR = (double)prgbSrc[j][i].Red; + double srcG = (double)prgbSrc[j][i].Green; + double srcB = (double)prgbSrc[j][i].Blue; + + // Find BMU + + double d2min = DBL_MAX; + int iiHit = ii; + int jjHit = jj; + + for(int l = 0; l < N; l++) + { + for(int k = 0; k < M; k++) + { + double dr = srcR - m_ppSOM[jj+l][ii+k].Red; + double dg = srcG - m_ppSOM[jj+l][ii+k].Green; + double db = srcB - m_ppSOM[jj+l][ii+k].Blue; + + double d2 = dr*dr + dg*dg + db*db; + + if(d2 < d2min) + { + d2min = d2; + iiHit = ii + k; + jjHit = jj + l; + } + } + } + + // Update SOM + + if(d2min <= epsilon) // matching model found + { + for(int l = (jjHit - m_offset); l <= (jjHit + m_offset); l++) + { + for(int k = (iiHit - m_offset); k <= (iiHit + m_offset); k++) + { + a = alpha*m_ppW[l-jjHit+m_offset][k-iiHit+m_offset]; + + // speed hack.. avoid very small increment values. abs() is sloooow. + + double d; + + d = srcR - m_ppSOM[l][k].Red; + if(d*d > DBL_MIN) + m_ppSOM[l][k].Red += a*d; + + d = srcG - m_ppSOM[l][k].Green; + if(d*d > DBL_MIN) + m_ppSOM[l][k].Green += a*d; + + d = srcB - m_ppSOM[l][k].Blue; + if(d*d > DBL_MIN) + m_ppSOM[l][k].Blue += a*d; + } + } + + // Set background image + prgbBG[j][i].Red = m_ppSOM[jjHit][iiHit].Red; + prgbBG[j][i].Green = m_ppSOM[jjHit][iiHit].Green; + prgbBG[j][i].Blue = m_ppSOM[jjHit][iiHit].Blue; + + // Set foreground image + prgbFG[j][i].Red = prgbFG[j][i].Green = prgbFG[j][i].Blue = 0; + } + else + { + // Set foreground image + prgbFG[j][i].Red = prgbFG[j][i].Green = prgbFG[j][i].Blue = 255; + } + } + } + + return; + } + } +} \ No newline at end of file diff --git a/package_bgs/lb/BGModelSom.h b/package_bgs/lb/BGModelSom.h new file mode 100644 index 0000000..e95af11 --- /dev/null +++ b/package_bgs/lb/BGModelSom.h @@ -0,0 +1,92 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* Scene 1.0.1 -- Background subtraction and object tracking for complex environments +BGModelSom.h + +Copyright (C) 2011 Laurence Bender <lbender@untref.edu.ar> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef BGMODELSOM_H +#define BGMODELSOM_H + +#include "BGModel.h" + +namespace lb_library +{ + namespace AdaptiveSOM + { + // SOM parameters + + const int M = 3; // width SOM (per pixel) + const int N = 3; // height SOM (per pixel) + const int KERNEL = 3; // size Gaussian kernel + + const bool SPAN_NEIGHBORS = false; // true if update neighborhood spans different pixels // + const int TRAINING_STEPS = 100; // number of training steps + + const float EPS1 = 100.0; // model match distance during training + const float EPS2 = 20.0; // model match distance + const float C1 = 1.0; // learning rate during training + const float C2 = 0.05; // learning rate + + class BGModelSom : public BGModel + { + public: + BGModelSom(int width, int height); + ~BGModelSom(); + + void setBGModelParameter(int id, int value); + + protected: + int m_widthSOM; + int m_heightSOM; + int m_offset; + int m_pad; + int m_K; + int m_TSteps; + + double m_Wmax; + + double m_epsilon1; + double m_epsilon2; + double m_alpha1; + double m_alpha2; + + DBLRGB** m_ppSOM; // SOM grid + double** m_ppW; // Weights + + void Init(); + void Update(); + }; + } +} + +#endif diff --git a/package_bgs/lb/LBAdaptiveSOM.cpp b/package_bgs/lb/LBAdaptiveSOM.cpp new file mode 100644 index 0000000..ce06433 --- /dev/null +++ b/package_bgs/lb/LBAdaptiveSOM.cpp @@ -0,0 +1,109 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "LBAdaptiveSOM.h" + +LBAdaptiveSOM::LBAdaptiveSOM() : firstTime(true), showOutput(true), + sensitivity(75), trainingSensitivity(245), learningRate(62), trainingLearningRate(255), trainingSteps(55) +{ + std::cout << "LBAdaptiveSOM()" << std::endl; +} + +LBAdaptiveSOM::~LBAdaptiveSOM() +{ + delete m_pBGModel; + std::cout << "~LBAdaptiveSOM()" << std::endl; +} + +void LBAdaptiveSOM::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + IplImage *frame = new IplImage(img_input); + + if(firstTime) + { + saveConfig(); + + int w = cvGetSize(frame).width; + int h = cvGetSize(frame).height; + + m_pBGModel = new BGModelSom(w,h); + m_pBGModel->InitModel(frame); + } + + m_pBGModel->setBGModelParameter(0,sensitivity); + m_pBGModel->setBGModelParameter(1,trainingSensitivity); + m_pBGModel->setBGModelParameter(2,learningRate); + m_pBGModel->setBGModelParameter(3,trainingLearningRate); + m_pBGModel->setBGModelParameter(5,trainingSteps); + + m_pBGModel->UpdateModel(frame); + + img_foreground = cv::Mat(m_pBGModel->GetFG()); + img_background = cv::Mat(m_pBGModel->GetBG()); + + if(showOutput) + { + cv::imshow("SOM Mask", img_foreground); + cv::imshow("SOM Model", img_background); + } + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + delete frame; + + firstTime = false; +} + +//void LBAdaptiveSOM::finish(void) +//{ +// delete m_pBGModel; +//} + +void LBAdaptiveSOM::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/LBAdaptiveSOM.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "sensitivity", sensitivity); + cvWriteInt(fs, "trainingSensitivity", trainingSensitivity); + cvWriteInt(fs, "learningRate", learningRate); + cvWriteInt(fs, "trainingLearningRate", trainingLearningRate); + cvWriteInt(fs, "trainingSteps", trainingSteps); + + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void LBAdaptiveSOM::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/LBAdaptiveSOM.xml", 0, CV_STORAGE_READ); + + sensitivity = cvReadIntByName(fs, 0, "sensitivity", 75); + trainingSensitivity = cvReadIntByName(fs, 0, "trainingSensitivity", 245); + learningRate = cvReadIntByName(fs, 0, "learningRate", 62); + trainingLearningRate = cvReadIntByName(fs, 0, "trainingLearningRate", 255); + trainingSteps = cvReadIntByName(fs, 0, "trainingSteps", 55); + + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/lb/LBAdaptiveSOM.h b/package_bgs/lb/LBAdaptiveSOM.h new file mode 100644 index 0000000..6e001df --- /dev/null +++ b/package_bgs/lb/LBAdaptiveSOM.h @@ -0,0 +1,56 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "BGModelSom.h" + +#include "../IBGS.h" + +using namespace lb_library; +using namespace lb_library::AdaptiveSOM; + +class LBAdaptiveSOM : public IBGS +{ +private: + bool firstTime; + bool showOutput; + + BGModel* m_pBGModel; + int sensitivity; + int trainingSensitivity; + int learningRate; + int trainingLearningRate; + int trainingSteps; + + cv::Mat img_foreground; + cv::Mat img_background; + +public: + LBAdaptiveSOM(); + ~LBAdaptiveSOM(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + //void finish(void); + +private: + void saveConfig(); + void loadConfig(); +}; \ No newline at end of file diff --git a/package_bgs/lb/LBFuzzyAdaptiveSOM.cpp b/package_bgs/lb/LBFuzzyAdaptiveSOM.cpp new file mode 100644 index 0000000..4ef8560 --- /dev/null +++ b/package_bgs/lb/LBFuzzyAdaptiveSOM.cpp @@ -0,0 +1,109 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "LBFuzzyAdaptiveSOM.h" + +LBFuzzyAdaptiveSOM::LBFuzzyAdaptiveSOM() : firstTime(true), showOutput(true), + sensitivity(90), trainingSensitivity(240), learningRate(38), trainingLearningRate(255), trainingSteps(81) +{ + std::cout << "LBFuzzyAdaptiveSOM()" << std::endl; +} + +LBFuzzyAdaptiveSOM::~LBFuzzyAdaptiveSOM() +{ + delete m_pBGModel; + std::cout << "~LBFuzzyAdaptiveSOM()" << std::endl; +} + +void LBFuzzyAdaptiveSOM::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + IplImage *frame = new IplImage(img_input); + + if(firstTime) + { + saveConfig(); + + int w = cvGetSize(frame).width; + int h = cvGetSize(frame).height; + + m_pBGModel = new BGModelFuzzySom(w,h); + m_pBGModel->InitModel(frame); + } + + m_pBGModel->setBGModelParameter(0,sensitivity); + m_pBGModel->setBGModelParameter(1,trainingSensitivity); + m_pBGModel->setBGModelParameter(2,learningRate); + m_pBGModel->setBGModelParameter(3,trainingLearningRate); + m_pBGModel->setBGModelParameter(5,trainingSteps); + + m_pBGModel->UpdateModel(frame); + + img_foreground = cv::Mat(m_pBGModel->GetFG()); + img_background = cv::Mat(m_pBGModel->GetBG()); + + if(showOutput) + { + cv::imshow("FSOM Mask", img_foreground); + cv::imshow("FSOM Model", img_background); + } + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + delete frame; + + firstTime = false; +} + +//void LBFuzzyAdaptiveSOM::finish(void) +//{ +// //delete m_pBGModel; +//} + +void LBFuzzyAdaptiveSOM::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/LBFuzzyAdaptiveSOM.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "sensitivity", sensitivity); + cvWriteInt(fs, "trainingSensitivity", trainingSensitivity); + cvWriteInt(fs, "learningRate", learningRate); + cvWriteInt(fs, "trainingLearningRate", trainingLearningRate); + cvWriteInt(fs, "trainingSteps", trainingSteps); + + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void LBFuzzyAdaptiveSOM::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/LBFuzzyAdaptiveSOM.xml", 0, CV_STORAGE_READ); + + sensitivity = cvReadIntByName(fs, 0, "sensitivity", 90); + trainingSensitivity = cvReadIntByName(fs, 0, "trainingSensitivity", 240); + learningRate = cvReadIntByName(fs, 0, "learningRate", 38); + trainingLearningRate = cvReadIntByName(fs, 0, "trainingLearningRate", 255); + trainingSteps = cvReadIntByName(fs, 0, "trainingSteps", 81); + + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/lb/LBFuzzyAdaptiveSOM.h b/package_bgs/lb/LBFuzzyAdaptiveSOM.h new file mode 100644 index 0000000..76dec2f --- /dev/null +++ b/package_bgs/lb/LBFuzzyAdaptiveSOM.h @@ -0,0 +1,56 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "BGModelFuzzySom.h" + +#include "../IBGS.h" + +using namespace lb_library; +using namespace lb_library::FuzzyAdaptiveSOM; + +class LBFuzzyAdaptiveSOM : public IBGS +{ +private: + bool firstTime; + bool showOutput; + + BGModel* m_pBGModel; + int sensitivity; + int trainingSensitivity; + int learningRate; + int trainingLearningRate; + int trainingSteps; + + cv::Mat img_foreground; + cv::Mat img_background; + +public: + LBFuzzyAdaptiveSOM(); + ~LBFuzzyAdaptiveSOM(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + //void finish(void); + +private: + void saveConfig(); + void loadConfig(); +}; \ No newline at end of file diff --git a/package_bgs/lb/LBFuzzyGaussian.cpp b/package_bgs/lb/LBFuzzyGaussian.cpp new file mode 100644 index 0000000..dc257bf --- /dev/null +++ b/package_bgs/lb/LBFuzzyGaussian.cpp @@ -0,0 +1,105 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "LBFuzzyGaussian.h" + +LBFuzzyGaussian::LBFuzzyGaussian() : firstTime(true), showOutput(true), sensitivity(72), bgThreshold(162), learningRate(49), noiseVariance(195) +{ + std::cout << "LBFuzzyGaussian()" << std::endl; +} + +LBFuzzyGaussian::~LBFuzzyGaussian() +{ + delete m_pBGModel; + std::cout << "~LBFuzzyGaussian()" << std::endl; +} + +void LBFuzzyGaussian::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + IplImage *frame = new IplImage(img_input); + + if(firstTime) + { + saveConfig(); + + int w = cvGetSize(frame).width; + int h = cvGetSize(frame).height; + + m_pBGModel = new BGModelFuzzyGauss(w,h); + m_pBGModel->InitModel(frame); + } + + m_pBGModel->setBGModelParameter(0,sensitivity); + m_pBGModel->setBGModelParameter(1,bgThreshold); + m_pBGModel->setBGModelParameter(2,learningRate); + m_pBGModel->setBGModelParameter(3,noiseVariance); + + m_pBGModel->UpdateModel(frame); + + img_foreground = cv::Mat(m_pBGModel->GetFG()); + img_background = cv::Mat(m_pBGModel->GetBG()); + + if(showOutput) + { + cv::imshow("FG Mask", img_foreground); + cv::imshow("FG Model", img_background); + } + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + delete frame; + + firstTime = false; +} + +//void LBFuzzyGaussian::finish(void) +//{ +// delete m_pBGModel; +//} + +void LBFuzzyGaussian::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/LBFuzzyGaussian.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "sensitivity", sensitivity); + cvWriteInt(fs, "bgThreshold", bgThreshold); + cvWriteInt(fs, "learningRate", learningRate); + cvWriteInt(fs, "noiseVariance", noiseVariance); + + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void LBFuzzyGaussian::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/LBFuzzyGaussian.xml", 0, CV_STORAGE_READ); + + sensitivity = cvReadIntByName(fs, 0, "sensitivity", 72); + bgThreshold = cvReadIntByName(fs, 0, "bgThreshold", 162); + learningRate = cvReadIntByName(fs, 0, "learningRate", 49); + noiseVariance = cvReadIntByName(fs, 0, "noiseVariance", 195); + + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/lb/LBFuzzyGaussian.h b/package_bgs/lb/LBFuzzyGaussian.h new file mode 100644 index 0000000..408c4a5 --- /dev/null +++ b/package_bgs/lb/LBFuzzyGaussian.h @@ -0,0 +1,55 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "BGModelFuzzyGauss.h" + +#include "../IBGS.h" + +using namespace lb_library; +using namespace lb_library::FuzzyGaussian; + +class LBFuzzyGaussian : public IBGS +{ +private: + bool firstTime; + bool showOutput; + + BGModel* m_pBGModel; + int sensitivity; + int bgThreshold; + int learningRate; + int noiseVariance; + + cv::Mat img_foreground; + cv::Mat img_background; + +public: + LBFuzzyGaussian(); + ~LBFuzzyGaussian(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + //void finish(void); + +private: + void saveConfig(); + void loadConfig(); +}; \ No newline at end of file diff --git a/package_bgs/lb/LBMixtureOfGaussians.cpp b/package_bgs/lb/LBMixtureOfGaussians.cpp new file mode 100644 index 0000000..8d235c5 --- /dev/null +++ b/package_bgs/lb/LBMixtureOfGaussians.cpp @@ -0,0 +1,105 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "LBMixtureOfGaussians.h" + +LBMixtureOfGaussians::LBMixtureOfGaussians() : firstTime(true), showOutput(true), sensitivity(81), bgThreshold(83), learningRate(59), noiseVariance(206) +{ + std::cout << "LBMixtureOfGaussians()" << std::endl; +} + +LBMixtureOfGaussians::~LBMixtureOfGaussians() +{ + delete m_pBGModel; + std::cout << "~LBMixtureOfGaussians()" << std::endl; +} + +void LBMixtureOfGaussians::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + IplImage *frame = new IplImage(img_input); + + if(firstTime) + { + saveConfig(); + + int w = cvGetSize(frame).width; + int h = cvGetSize(frame).height; + + m_pBGModel = new BGModelMog(w,h); + m_pBGModel->InitModel(frame); + } + + m_pBGModel->setBGModelParameter(0,sensitivity); + m_pBGModel->setBGModelParameter(1,bgThreshold); + m_pBGModel->setBGModelParameter(2,learningRate); + m_pBGModel->setBGModelParameter(3,noiseVariance); + + m_pBGModel->UpdateModel(frame); + + img_foreground = cv::Mat(m_pBGModel->GetFG()); + img_background = cv::Mat(m_pBGModel->GetBG()); + + if(showOutput) + { + cv::imshow("MOG Mask", img_foreground); + cv::imshow("MOG Model", img_background); + } + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + delete frame; + + firstTime = false; +} + +//void LBMixtureOfGaussians::finish(void) +//{ +// delete m_pBGModel; +//} + +void LBMixtureOfGaussians::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/LBMixtureOfGaussians.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "sensitivity", sensitivity); + cvWriteInt(fs, "bgThreshold", bgThreshold); + cvWriteInt(fs, "learningRate", learningRate); + cvWriteInt(fs, "noiseVariance", noiseVariance); + + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void LBMixtureOfGaussians::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/LBMixtureOfGaussians.xml", 0, CV_STORAGE_READ); + + sensitivity = cvReadIntByName(fs, 0, "sensitivity", 81); + bgThreshold = cvReadIntByName(fs, 0, "bgThreshold", 83); + learningRate = cvReadIntByName(fs, 0, "learningRate", 59); + noiseVariance = cvReadIntByName(fs, 0, "noiseVariance", 206); + + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/lb/LBMixtureOfGaussians.h b/package_bgs/lb/LBMixtureOfGaussians.h new file mode 100644 index 0000000..71ab5f0 --- /dev/null +++ b/package_bgs/lb/LBMixtureOfGaussians.h @@ -0,0 +1,55 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "BGModelMog.h" + +#include "../IBGS.h" + +using namespace lb_library; +using namespace lb_library::MixtureOfGaussians; + +class LBMixtureOfGaussians : public IBGS +{ +private: + bool firstTime; + bool showOutput; + + BGModel* m_pBGModel; + int sensitivity; + int bgThreshold; + int learningRate; + int noiseVariance; + + cv::Mat img_foreground; + cv::Mat img_background; + +public: + LBMixtureOfGaussians(); + ~LBMixtureOfGaussians(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + //void finish(void); + +private: + void saveConfig(); + void loadConfig(); +}; \ No newline at end of file diff --git a/package_bgs/lb/LBSimpleGaussian.cpp b/package_bgs/lb/LBSimpleGaussian.cpp new file mode 100644 index 0000000..f0ce6fc --- /dev/null +++ b/package_bgs/lb/LBSimpleGaussian.cpp @@ -0,0 +1,100 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "LBSimpleGaussian.h" + +LBSimpleGaussian::LBSimpleGaussian() : firstTime(true), showOutput(true), sensitivity(66), noiseVariance(162), learningRate(18) +{ + std::cout << "LBSimpleGaussian()" << std::endl; +} + +LBSimpleGaussian::~LBSimpleGaussian() +{ + delete m_pBGModel; + std::cout << "~LBSimpleGaussian()" << std::endl; +} + +void LBSimpleGaussian::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + IplImage *frame = new IplImage(img_input); + + if(firstTime) + { + saveConfig(); + + int w = cvGetSize(frame).width; + int h = cvGetSize(frame).height; + + m_pBGModel = new BGModelGauss(w,h); + m_pBGModel->InitModel(frame); + } + + m_pBGModel->setBGModelParameter(0,sensitivity); + m_pBGModel->setBGModelParameter(1,noiseVariance); + m_pBGModel->setBGModelParameter(2,learningRate); + + m_pBGModel->UpdateModel(frame); + + img_foreground = cv::Mat(m_pBGModel->GetFG()); + img_background = cv::Mat(m_pBGModel->GetBG()); + + if(showOutput) + { + cv::imshow("SG Mask", img_foreground); + cv::imshow("SG Model", img_background); + } + + img_foreground.copyTo(img_output); + img_background.copyTo(img_bgmodel); + + delete frame; + + firstTime = false; +} + +//void LBSimpleGaussian::finish(void) +//{ +// delete m_pBGModel; +//} + +void LBSimpleGaussian::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/LBSimpleGaussian.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "sensitivity", sensitivity); + cvWriteInt(fs, "noiseVariance", noiseVariance); + cvWriteInt(fs, "learningRate", learningRate); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void LBSimpleGaussian::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/LBSimpleGaussian.xml", 0, CV_STORAGE_READ); + + sensitivity = cvReadIntByName(fs, 0, "sensitivity", 66); + noiseVariance = cvReadIntByName(fs, 0, "noiseVariance", 162); + learningRate = cvReadIntByName(fs, 0, "learningRate", 18); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/lb/LBSimpleGaussian.h b/package_bgs/lb/LBSimpleGaussian.h new file mode 100644 index 0000000..ea8317c --- /dev/null +++ b/package_bgs/lb/LBSimpleGaussian.h @@ -0,0 +1,54 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "BGModelGauss.h" + +#include "../IBGS.h" + +using namespace lb_library; +using namespace lb_library::SimpleGaussian; + +class LBSimpleGaussian : public IBGS +{ +private: + bool firstTime; + bool showOutput; + + BGModel* m_pBGModel; + int sensitivity; + int noiseVariance; + int learningRate; + + cv::Mat img_foreground; + cv::Mat img_background; + +public: + LBSimpleGaussian(); + ~LBSimpleGaussian(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + //void finish(void); + +private: + void saveConfig(); + void loadConfig(); +}; \ No newline at end of file diff --git a/package_bgs/lb/Types.h b/package_bgs/lb/Types.h new file mode 100644 index 0000000..5b1fd5b --- /dev/null +++ b/package_bgs/lb/Types.h @@ -0,0 +1,99 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/* Scene 1.0.1 -- Background subtraction and object tracking for complex environments +Types.h + +Copyright (C) 2011 Laurence Bender <lbender@untref.edu.ar> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef TYPES_H +#define TYPES_H + +#include <cv.h> + +namespace lb_library +{ + template<class T> class Image + { + private: + IplImage* imgp; + + public: + Image(IplImage* img=0) {imgp=img;} + ~Image(){imgp=0;} + + void operator=(IplImage* img) {imgp=img;} + + inline T* operator[](const int rowIndx) + { + return ((T *)(imgp->imageData + rowIndx*imgp->widthStep)); + } + }; + + typedef struct{ + unsigned char b,g,r; + } RgbPixel; + + typedef struct{ + unsigned char Blue,Green,Red; + } BYTERGB; + + typedef struct{ + unsigned int Blue,Green,Red; + } INTRGB; + + typedef struct{ + float b,g,r; + }RgbPixelFloat; + + typedef struct{ + double Blue,Green,Red; + } DBLRGB; + + typedef Image<RgbPixel> RgbImage; + typedef Image<RgbPixelFloat> RgbImageFloat; + typedef Image<unsigned char> BwImage; + typedef Image<float> BwImageFloat; + + /* + IplImage* img = cvCreateImage(cvSize(640,480), IPL_DEPTH_32F, 3); + RgbImageFloat imgA(img); + for(int i = 0; i < m_height; i++) + for(int j = 0; j < m_width; j++) + imgA[i][j].b = 111; + imgA[i][j].g = 111; + imgA[i][j].r = 111; + */ +} + +//--------------------------------------------- + +#endif diff --git a/package_bgs/my/MyBGS.cpp b/package_bgs/my/MyBGS.cpp new file mode 100644 index 0000000..07b51cd --- /dev/null +++ b/package_bgs/my/MyBGS.cpp @@ -0,0 +1,26 @@ +#include "MyBGS.h" + +MyBGS::MyBGS(){} +MyBGS::~MyBGS(){} + +void MyBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + if(img_previous.empty()) + img_input.copyTo(img_previous); + + cv::Mat img_foreground; + cv::absdiff(img_previous, img_input, img_foreground); + + if(img_foreground.channels() == 3) + cv::cvtColor(img_foreground, img_foreground, CV_BGR2GRAY); + + cv::threshold(img_foreground, img_foreground, 15, 255, cv::THRESH_BINARY); + + img_foreground.copyTo(img_output); + img_previous.copyTo(img_bgmodel); + + img_input.copyTo(img_previous); +} diff --git a/package_bgs/my/MyBGS.h b/package_bgs/my/MyBGS.h new file mode 100644 index 0000000..daba730 --- /dev/null +++ b/package_bgs/my/MyBGS.h @@ -0,0 +1,22 @@ +#pragma once + +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" + +class MyBGS : public IBGS +{ +private: + cv::Mat img_previous; + +public: + MyBGS(); + ~MyBGS(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(){} + void loadConfig(){} +}; \ No newline at end of file diff --git a/package_bgs/pt/PBAS.cpp b/package_bgs/pt/PBAS.cpp new file mode 100644 index 0000000..3f74b82 --- /dev/null +++ b/package_bgs/pt/PBAS.cpp @@ -0,0 +1,586 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "PBAS.h" + +PBAS::PBAS(void) : N(20), R_lower(18), Raute_min(2), T_lower(2), T_upper(200), R_scale(5), R_incdec(0.05), T_dec(0.05), T_inc(1) +{ + std::cout << "PBAS()" << std::endl; + + //feature vector + alpha = 7.0; + beta = 1.0; + formerMeanNorm = 0; + width = 0; + + //result image + foregroundValue = 255; + backgroundValue = 0; + + //length of random array + countOfRandomNumb = 1000; + + //the T(x_i) value needs initiation + T_init = R_lower; + + //check if something is moving in the picture + isMove = false; + + //for init, count number of runs + runs = 0; + newInitialization(); +} + +void PBAS::newInitialization() +{ + if(!randomN.empty()) + randomN.clear(); + + if(!randomX.empty()) + randomX.clear(); + + if(!randomY.empty()) + randomY.clear(); + + if(!randomMinDist.empty()) + randomMinDist.clear(); + + if(!randomT.empty()) + randomT.clear(); + + if(!randomTN.empty()) + randomTN.clear(); + + for(int l = 0; l < countOfRandomNumb; l++) + { + randomN.push_back((int)randomGenerator.uniform((int)0,(int)N)); + randomX.push_back((int)randomGenerator.uniform(-1, +2)); + randomY.push_back((int)randomGenerator.uniform(-1, +2)); + randomMinDist.push_back((int)randomGenerator.uniform((int)0, (int)N)); + randomT.push_back((int)randomGenerator.uniform((int)0, (int)T_upper)); + randomTN.push_back((int)randomGenerator.uniform((int)0, (int)T_upper)); + } +} + +PBAS::~PBAS(void) +{ + std::cout << "~PBAS()" << std::endl; + + randomN.clear(); + randomX.clear(); + randomY.clear(); + randomMinDist.clear(); + randomT.clear(); + randomTN.clear(); + + for(int k = 0; k < backgroundModel.size(); ++k) + { + if(chans == 1) + { + backgroundModel.at(k).at(0).release(); + backgroundModel.at(k).at(1).release(); + } + else + { + backgroundModel.at(k).at(0).release(); + backgroundModel.at(k).at(1).release(); + backgroundModel.at(k).at(2).release(); + + backgroundModel.at(k).at(3).release(); + backgroundModel.at(k).at(4).release(); + backgroundModel.at(k).at(5).release(); + } + } + + backgroundModel.clear(); + meanMinDist.release(); + + actualR.release(); + actualT.release(); + + sobelX.release(); + sobelY.release(); +} + +bool PBAS::process(cv::Mat* input, cv::Mat* output) +{ + if(width != input->cols) + { + width = input->cols; + chans = input->channels(); + height = input->rows; + + if(input->rows < 1 || input->cols < 1) + { + std::cout << "Error: Occurrence of to small (or empty?) image size in PBAS. STOPPING " << std::endl; + return false; + } + } + + //iniate the background model + init(input); + + resultMap = new cv::Mat(input->rows,input->cols,CV_8UC1); + + //calculate features + calculateFeatures(¤tFeatures, input); + + //set sumMagnitude to zero at beginning and then sum up in the loop + sumMagnitude = 0; + long glCounterFore = 0; + isMove = false; + + //Here starts the whole processing of each pixel of the image + // for each pixel + for (int j=0; j< resultMap->rows; ++j) + { + resultMap_Pt = resultMap->ptr<uchar>(j); + currentFeaturesM_Pt.clear(); + currentFeaturesC_Pt.clear(); + std::vector<float*> fT; + std::vector<uchar*> uT; + B_Mag_Pts.clear(); + B_Col_Pts.clear(); + + for(int z = 0; z < chans; ++z) + { + currentFeaturesM_Pt.push_back(currentFeatures.at(z).ptr<float>(j)); + currentFeaturesC_Pt.push_back(currentFeatures.at(z + chans).ptr<uchar>(j)); + + B_Mag_Pts.push_back(fT); + + B_Col_Pts.push_back(uT); + } + + meanMinDist_Pt = meanMinDist.ptr<float>(j); + actualR_Pt = actualR.ptr<float>(j); + actualT_Pt = actualT.ptr<float>(j); + + for(int k = 0; k < runs; ++k) + { + for(int z = 0; z < chans; ++z) + { + B_Mag_Pts.at(z).push_back(backgroundModel.at(k).at(z).ptr<float>(j)); + B_Col_Pts.at(z).push_back(backgroundModel.at(k).at(z+chans).ptr<uchar>(j)); + } + } + + for(int i = 0; i < resultMap->cols; ++i) + { + //Compare each pixel to in the worst runtime-case each background model + int count = 0; + int index = 0; + + double norm = 0.0; + double dist = 0.0; + double minDist = 1000.0; + int entry = randomGenerator.uniform(3, countOfRandomNumb-4); + + do + { + if(chans == 3) + { + norm = sqrt( + (((double)B_Mag_Pts.at(0).at(index)[i] - ((double)*currentFeaturesM_Pt.at(0)))*((double)B_Mag_Pts.at(0).at(index)[i] - ((double)*currentFeaturesM_Pt.at(0))))+ + (((double)B_Mag_Pts.at(1).at(index)[i] - ((double)*currentFeaturesM_Pt.at(1)))*((double)B_Mag_Pts.at(1).at(index)[i] - ((double)*currentFeaturesM_Pt.at(1))))+ + (((double)B_Mag_Pts.at(2).at(index)[i] - ((double)*currentFeaturesM_Pt.at(2)))*((double)B_Mag_Pts.at(2).at(index)[i] - ((double)*currentFeaturesM_Pt.at(2)))) + ); + + dist = sqrt( + (((double)B_Col_Pts.at(0).at(index)[i] - ((double)*currentFeaturesC_Pt.at(0)))*((double)B_Col_Pts.at(0).at(index)[i] - ((double)*currentFeaturesC_Pt.at(0))))+ + (((double)B_Col_Pts.at(1).at(index)[i] - ((double)*currentFeaturesC_Pt.at(1)))*((double)B_Col_Pts.at(1).at(index)[i] - ((double)*currentFeaturesC_Pt.at(1))))+ + (((double)B_Col_Pts.at(2).at(index)[i] - ((double)*currentFeaturesC_Pt.at(2)))*((double)B_Col_Pts.at(2).at(index)[i] - ((double)*currentFeaturesC_Pt.at(2)))) + ); + } + else + { + norm = abs((((double)B_Mag_Pts.at(0).at(index)[i] - + ((double)*currentFeaturesM_Pt.at(0)))*((double)B_Mag_Pts.at(0).at(index)[i] - ((double)*currentFeaturesM_Pt.at(0))))); + + dist = abs((((double)B_Col_Pts.at(0).at(index)[i] - + ((double)*currentFeaturesC_Pt.at(0)))*((double)B_Col_Pts.at(0).at(index)[i] - ((double)*currentFeaturesC_Pt.at(0)))) + ); + } + dist = ((double)alpha*(norm/formerMeanMag) + beta*dist); + + if((dist < *actualR_Pt)) + { + ++count; + if(minDist > dist) + minDist = dist; + } + else + { + sumMagnitude += (double)(norm); + ++glCounterFore; + } + ++index; + } + while((count< Raute_min) && (index < runs)); + + + //############################################# + //update backgroundmodel + // is BACKGROUND + if(count >= Raute_min) + { + *resultMap_Pt = 0; + double ratio = std::ceil((double)T_upper/(double)(*actualT_Pt)); + //in the first run every distance is zero, because there is no background model + //in the secont run, we have already one image as background model, hence a + // reasonable minDist could be found -> because of the partly 1/run changing in the running average, we set in the first try meanMinDist to the actual minDist value + if(runs < N && runs > 2) + { + *meanMinDist_Pt = ((((float)(runs-1)) * (*meanMinDist_Pt)) + (float)minDist) / ((float)runs); + } + else if(runs < N && runs == 2) + { + *meanMinDist_Pt = (float)minDist; + } + + //1. update model + if(runs == N) + { + //Update current pixel + //check if random numer is smaller than ratio + if(randomT.at(entry) < ratio) + { + // replace randomly chosen sample + int rand = randomN.at(entry+1); //randomGenerator.uniform((int)0,(int)N-1); + for(int z = 0; z < chans; ++z) + { + B_Mag_Pts.at(z).at(rand)[i] = (float)*currentFeaturesM_Pt.at(z); + B_Col_Pts.at(z).at(rand)[i] = (uchar)*currentFeaturesC_Pt.at(z); + + } + + *meanMinDist_Pt = ((((float)(N-1)) * (*meanMinDist_Pt)) + (float)minDist) / ((float)N); + } + + //Update neighboring pixel model + if(randomTN.at(entry) < ratio) + { + //choose neighboring pixel randomly + int xNeigh = randomX.at(entry)+i; + int yNeigh = randomY.at(entry)+j; + checkValid(&xNeigh, &yNeigh); + + // replace randomly chosen sample + int rand = randomN.at(entry-1); + for(int z = 0; z < chans; ++z) + { + (backgroundModel.at(rand)).at(z).at<float>(yNeigh,xNeigh) = currentFeatures.at(z).at<float>(yNeigh,xNeigh); + (backgroundModel.at(rand)).at(z + chans).at<uchar>(yNeigh,xNeigh) = currentFeatures.at(z+chans).at<uchar>(yNeigh,xNeigh); + } + } + } + } + else + { + // store pixel as foreground + *resultMap_Pt = 255; + + //there is some movement + isMove = true; + } + + //#######################//#######################//#######################//####################### + //control loops + //#######################//#######################//#######################//####################### + //update R + decisionThresholdRegulator(actualR_Pt,meanMinDist_Pt); + + //update T + learningRateRegulator(actualT_Pt, meanMinDist_Pt,resultMap_Pt); + + //#######################//#######################//#######################//####################### + //#######################//#######################//#######################//####################### + + //jump to next pixel + ++resultMap_Pt; + for(int z = 0; z < chans; ++z) + { + ++currentFeaturesM_Pt.at(z); + ++currentFeaturesC_Pt.at(z); + } + + ++meanMinDist_Pt; + ++actualR_Pt; + ++actualT_Pt; + } + } + + resultMap->copyTo(*output); + + //if there is no foreground -> no magnitudes fount + //-> initiate some low value to prevent diving through zero + double meanMag = sumMagnitude/(double)(glCounterFore + 1); //height*width); + + if(meanMag > 20) + formerMeanMag = meanMag; + else + formerMeanMag = 20; + + delete resultMap; + + for(int z = 0; z < chans; ++z) + { + currentFeatures.at(z+chans).release(); + currentFeatures.at(z).release(); + } + + return true; +} + +void PBAS::decisionThresholdRegulator(float* pt, float* meanDist) +{ + //update R + double tempR = *pt; + double newThresh = (*meanDist)*R_scale; + + if( tempR < newThresh) + { + tempR += tempR * R_incdec; + } + else + { + tempR -= tempR * R_incdec; + } + + if(tempR >= R_lower) + *pt = (float)tempR; + else + *pt = (float)R_lower; +} + +void PBAS::learningRateRegulator(float* pt, float* meanDist,uchar* isFore) +{ + //time update + double tempT = *pt; + + if((int)*isFore < 128) + { + tempT -= T_inc/(*meanDist+1.0); + } + else + { + tempT += T_dec/(*meanDist+1.0); + } + + if(tempT > T_lower && tempT < T_upper) + *pt = (float)tempT; +} + +void PBAS::checkValid(int *x, int *y) +{ + if(*x < 0) + { + *x = 0; + } + else if(*x >= width) + { + *x = width -1; + } + + if(*y < 0) + { + *y = 0; + } + else if(*y >= height) + { + *y = height - 1; + } +} + +void PBAS::init(cv::Mat* input) +{ + if(runs < N) + { + std::vector<cv::Mat> init; + calculateFeatures(&init, input); + backgroundModel.push_back(init); + + if(chans == 1) + { + init.at(0).release(); + init.at(1).release(); + } + else + { + init.at(0).release(); + init.at(1).release(); + init.at(2).release(); + init.at(3).release(); + init.at(4).release(); + init.at(5).release(); + } + + init.clear(); + + if(runs == 0) + { + meanMinDist.create(input->size(), CV_32FC1); + meanMinDist.zeros(input->rows, input->cols, CV_32FC1); + + actualR.create(input->rows, input->cols, CV_32FC1); + actualT.create(input->rows, input->cols, CV_32FC1); + + float* ptRs, *ptTs; //, *ptM; + for(int rows = 0; rows < actualR.rows; ++rows) + { + ptRs = actualR.ptr<float>(rows); + ptTs = actualT.ptr<float>(rows); + + for(int cols = 0; cols < actualR.cols; ++cols) + { + ptRs[cols] = (float)R_lower; + ptTs[cols] = (float)T_init; + } + } + } + + ++runs; + } +} + +void PBAS::calculateFeatures(std::vector<cv::Mat>* feature, cv::Mat* inputImage) +{ + if(!feature->empty()) + feature->clear(); + + cv::Mat mag[3], dir; + + if(inputImage->channels() == 3) + { + std::vector<cv::Mat> rgbChannels(3); + cv::split(*inputImage, rgbChannels); + + for(int l = 0; l < 3; ++l) + { + cv::Sobel(rgbChannels.at(l),sobelX,CV_32F,1,0, 3, 1, 0.0); + cv::Sobel(rgbChannels.at(l),sobelY,CV_32F,0,1, 3, 1, 0.0); + + // Compute the L2 norm and direction of the gradient + cv::cartToPolar(sobelX,sobelY,mag[l],dir, true); + feature->push_back(mag[l]); + sobelX.release(); + sobelY.release(); + } + + feature->push_back(rgbChannels.at(0)); + feature->push_back(rgbChannels.at(1)); + feature->push_back(rgbChannels.at(2)); + rgbChannels.at(0).release(); + rgbChannels.at(1).release(); + rgbChannels.at(2).release(); + } + else + { + cv::Sobel(*inputImage,sobelX,CV_32F,1,0, 3, 1, 0.0); + cv::Sobel(*inputImage,sobelY,CV_32F,0,1, 3, 1, 0.0); + + // Compute the L2 norm and direction of the gradient + cv::cartToPolar(sobelX,sobelY,mag[0],dir, true); + feature->push_back(mag[0]); + + cv::Mat temp; + inputImage->copyTo(temp); + feature->push_back(temp); + temp.release(); + } + + mag[0].release(); + mag[1].release(); + mag[2].release(); + dir.release(); +} + +void PBAS::setN(int temp) +{ + N = temp; + newInitialization(); +} + +void PBAS::setRaute_min(int temp) +{ + Raute_min = temp; +} + +void PBAS::setR_lower(double temp) +{ + R_lower = temp; +} + +void PBAS::setR_incdec(double temp) +{ + R_incdec = temp; +} + +void PBAS::setR_scale(double temp) +{ + R_scale = temp; +} + +void PBAS::setT_init(double temp) +{ + T_init = temp; +} + +void PBAS::setT_lower(double temp) +{ + T_lower = temp; +} + +void PBAS::setT_upper(double temp) +{ + T_upper = temp; + newInitialization(); +} + +void PBAS::setT_dec(double temp) +{ + T_dec = temp; +} + +void PBAS::setT_inc(double temp) +{ + T_inc = temp; +} + +void PBAS::setAlpha(double temp) +{ + alpha = temp; +} + +void PBAS::setBeta(double temp) +{ + beta = temp; +} + +bool PBAS::isMovement() +{ + return isMove; +} + +//cv::Mat* PBAS::getR1_xi() +//{ +// return &actualR; +//} +// +//cv::Mat* PBAS::getT_xi() +//{ +// return &actualT; +//} diff --git a/package_bgs/pt/PBAS.h b/package_bgs/pt/PBAS.h new file mode 100644 index 0000000..917c525 --- /dev/null +++ b/package_bgs/pt/PBAS.h @@ -0,0 +1,207 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +//Implementation of the PBAS from: +// +//M. Hofmann, P. Tiefenbacher, G. Rigoll +//"Background Segmentation with Feedback: The Pixel-Based Adaptive Segmenter", +//in proc of IEEE Workshop on Change Detection, 2012 +// +//Note: some changes, to improve the speed and memory requirements, were achieved in comparison to the +//described PBAS algorithm in the paper above. +// +//Example usage: +// //Somewhere during initalization: +// #include "PBAS.h" +// #include <opencv2/opencv.hpp> +// PBAS pbas; +// +// //you might want to change some parameters of the PBAS here... +// .... +// +// //repeat for each frame +// //make gaussian blur for reducing image noise +//cv::Mat bluredImage; +//cv::Mat pbastResult; +//cv::GaussianBlur(singleFrame, bluredImage, cv::Size(5,5), 1.5); +// +// //process image and receive segmentation in pbasResult +//pbas.process(&bluredImage, &pbasResult); +// +// //make medianBlur on the result to reduce "salt and pepper noise" +// //of the per pixel wise segmentation +//cv::medianBlur(pbasResult, pbasResult, 5); +// +// +// +//Author: P.Tiefenbacher, https://sites.google.com/site/pbassegmenter/ +//Technische Universit�t M�nchen, Germany +//Date: 22-May-2012, Version:0.1 +/////////// + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#pragma once +class PBAS +{ +public: + PBAS(void); + ~PBAS(void); + bool process(cv::Mat* input, cv::Mat* output); + + void setN(int); + void setRaute_min(int); + void setR_lower(double); + void setR_incdec(double); + void setR_scale(double); + void setT_init(double); + void setT_lower(double); + void setT_upper(double); + void setT_dec(double); + void setT_inc(double); + void setAlpha(double); + void setBeta(double); + + bool isMovement(); + + +private: + void calculateFeatures(std::vector<cv::Mat>* feature, cv::Mat* inputImage); + void checkValid(int *x, int *y); + void decisionThresholdRegulator(float* pt, float* meanDistArr); + void learningRateRegulator(float* pt, float* meanDist,uchar* isFore); + void init(cv::Mat*); + void newInitialization(); + + cv::Mat meanMinDist; + float* meanMinDist_Pt; + + + + int width, height; + int chans; + + //balance of feature pixel value to conture value + double alpha, beta; + //################################################################################## + + double formerMeanNorm; + + //define value of foreground/background pixels + int foregroundValue, backgroundValue; + + //################################################################################## + //random number parameters + + //random number generator + cv::RNG randomGenerator; + + //length of random array initialization + long countOfRandomNumb; + + //pre - initialize the randomNumbers for better performance + std::vector<int> randomN, randomMinDist, randomX, randomY, randomT, randomTN; + + //################################################################################### + + //check if something is moving + bool isMove; + + //for init, count number of runs + int runs; + + + cv::Mat* resultMap; + std::vector<cv::Mat> currentFeatures; + + std::vector<float*> currentFeaturesM_Pt; + std::vector<uchar*> currentFeaturesC_Pt; + uchar* resultMap_Pt; + + std::vector<std::vector<float*>>B_Mag_Pts; + std::vector<std::vector<uchar*>>B_Col_Pts; + + double sumMagnitude; + double formerMeanMag; + float formerDistanceBack; + + //#################################################################################### + //N - Number: Defining the size of the background-history-model + // number of samples per pixel + //size of background history B(x_i) + int N; + // background model + std::vector<std::vector<cv::Mat>> backgroundModel; + //#################################################################################### + //#################################################################################### + //R-Threshhold - Variables + //minimal Threshold for foreground and initial value of R(x_i) + // radius of the sphere -> lower border boundary + double R_lower; + + //factor which defines new threshold of R(x_i) together with meanMinDist(x_i) + // scale for the sphere threshhold to define pixel-based Thresholds + double R_scale; + + //decreasing / increasing factor of R(x_i) + // increasing/decreasing factor for the r-Threshold based on the result of rTreshScale * meanMinDistBackground + double R_incdec; + + cv::Mat actualR; + float* actualR_Pt; //new pixel-based r-threshhold -> pointer to arrays + //##################################################################################### + //#################################################################################### + //counter for minimal distance to background + // Defining the number of background-model-images, which have a lowerDIstance to the current Image than defined by the R-Thresholds, that are necessary + // to decide that this pixel is background + int Raute_min; + //##################################################################################### + //#################################################################################### + //initial value of inverse update factor T(x_i) + // Initialize the background-model update rate + double T_init; + + //increasing Factor of the update rate 1/T(x_i) + // scale that defines the increasing of the update rate of the background model, if the current pixel is background + //--> more frequently updates if pixel is background because, there shouln't be any change + double T_inc; + + //upper boundary of T(x_i) + // defining an upper value, that nrSubsampling can achieve, thus it doesn't reach to an infinite value, where actually no update is possible + // at all + double T_upper; + + //lower boundary of T(x_i) + // defining a minimum value for nrSubsampling --> base value 2.0 + double T_lower; + + //decreasing factor of the update rate 1/T(x_i) + // opposite scale to increasingRateScale, for decreasing the update rate of the background model, if the current pixel is foreground + //--> Thesis: Our Foreground is a real moving object -> thus the background-model is good, so don't update it + double T_dec; + + //holds update rate of current pixel + cv::Mat actualT; + float* actualT_Pt; + + //##################################################################################### + + + cv::Mat sobelX, sobelY; +}; + diff --git a/package_bgs/pt/PixelBasedAdaptiveSegmenter.cpp b/package_bgs/pt/PixelBasedAdaptiveSegmenter.cpp new file mode 100644 index 0000000..10c8e8e --- /dev/null +++ b/package_bgs/pt/PixelBasedAdaptiveSegmenter.cpp @@ -0,0 +1,124 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "PixelBasedAdaptiveSegmenter.h" + +PixelBasedAdaptiveSegmenter::PixelBasedAdaptiveSegmenter() : firstTime(true), showOutput(true), enableInputBlur(true), enableOutputBlur(true), +alpha(7.0), beta(1.0), N(20), Raute_min(2), R_incdec(0.05), R_lower(18), +R_scale(5), T_dec(0.05), T_inc(1), T_init(18), T_lower(2), T_upper(200) +{ + std::cout << "PixelBasedAdaptiveSegmenter()" << std::endl; +} + +PixelBasedAdaptiveSegmenter::~PixelBasedAdaptiveSegmenter() +{ + std::cout << "~PixelBasedAdaptiveSegmenter()" << std::endl; +} + +void PixelBasedAdaptiveSegmenter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + { + pbas.setAlpha(alpha); + pbas.setBeta(beta); + pbas.setN(N); + pbas.setRaute_min(Raute_min); + pbas.setR_incdec(R_incdec); + pbas.setR_lower(R_lower); + pbas.setR_scale(R_scale); + pbas.setT_dec(T_dec); + pbas.setT_inc(T_inc); + pbas.setT_init(T_init); + pbas.setT_lower(T_lower); + pbas.setT_upper(T_upper); + + saveConfig(); + } + + cv::Mat img_input_new; + if(enableInputBlur) + cv::GaussianBlur(img_input, img_input_new, cv::Size(5,5), 1.5); + else + img_input.copyTo(img_input_new); + + cv::Mat img_foreground; + pbas.process(&img_input_new, &img_foreground); + + if(enableOutputBlur) + cv::medianBlur(img_foreground, img_foreground, 5); + + if(showOutput) + cv::imshow("PBAS", img_foreground); + + img_foreground.copyTo(img_output); + + firstTime = false; +} + +void PixelBasedAdaptiveSegmenter::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/PixelBasedAdaptiveSegmenter.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "enableInputBlur", enableInputBlur); + cvWriteInt(fs, "enableOutputBlur", enableOutputBlur); + + cvWriteReal(fs, "alpha", alpha); + cvWriteReal(fs, "beta", beta); + cvWriteInt(fs, "N", N); + cvWriteInt(fs, "Raute_min", Raute_min); + cvWriteReal(fs, "R_incdec", R_incdec); + cvWriteInt(fs, "R_lower", R_lower); + cvWriteInt(fs, "R_scale", R_scale); + cvWriteReal(fs, "T_dec", T_dec); + cvWriteInt(fs, "T_inc", T_inc); + cvWriteInt(fs, "T_init", T_init); + cvWriteInt(fs, "T_lower", T_lower); + cvWriteInt(fs, "T_upper", T_upper); + + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void PixelBasedAdaptiveSegmenter::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/PixelBasedAdaptiveSegmenter.xml", 0, CV_STORAGE_READ); + + enableInputBlur = cvReadIntByName(fs, 0, "enableInputBlur", true); + enableOutputBlur = cvReadIntByName(fs, 0, "enableOutputBlur", true); + + alpha = cvReadRealByName(fs, 0, "alpha", 7.0); + beta = cvReadRealByName(fs, 0, "beta", 1.0); + N = cvReadIntByName(fs, 0, "N", 20); + Raute_min = cvReadIntByName(fs, 0, "Raute_min", 2); + R_incdec = cvReadRealByName(fs, 0, "R_incdec", 0.05); + R_lower = cvReadIntByName(fs, 0, "R_lower", 18); + R_scale = cvReadIntByName(fs, 0, "R_scale", 5); + T_dec = cvReadRealByName(fs, 0, "T_dec", 0.05); + T_inc = cvReadIntByName(fs, 0, "T_inc", 1); + T_init = cvReadIntByName(fs, 0, "T_init", 18); + T_lower = cvReadIntByName(fs, 0, "T_lower", 2); + T_upper = cvReadIntByName(fs, 0, "T_upper", 200); + + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/pt/PixelBasedAdaptiveSegmenter.h b/package_bgs/pt/PixelBasedAdaptiveSegmenter.h new file mode 100644 index 0000000..35409b5 --- /dev/null +++ b/package_bgs/pt/PixelBasedAdaptiveSegmenter.h @@ -0,0 +1,58 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "PBAS.h" +#include "../IBGS.h" + +class PixelBasedAdaptiveSegmenter : public IBGS +{ +private: + PBAS pbas; + + bool firstTime; + bool showOutput; + bool enableInputBlur; + bool enableOutputBlur; + + float alpha; + float beta; + int N; + int Raute_min; + float R_incdec; + int R_lower; + int R_scale; + float T_dec; + int T_inc; + int T_init; + int T_lower; + int T_upper; + +public: + PixelBasedAdaptiveSegmenter(); + ~PixelBasedAdaptiveSegmenter(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; \ No newline at end of file diff --git a/package_bgs/sjn/SJN_MultiCueBGS.cpp b/package_bgs/sjn/SJN_MultiCueBGS.cpp new file mode 100644 index 0000000..55a7937 --- /dev/null +++ b/package_bgs/sjn/SJN_MultiCueBGS.cpp @@ -0,0 +1,2062 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +//------------------------------------------------------------------------------------------------------------------------------------// +// A BGS Method Using Multiple Color, Texture, Appearance Cues in the Scene // +// // +// - Paper: A New Framework for Background Subtraction Using Multiple Cues (ACCV2012) // +// - Code by: SeungJon Noh // +//------------------------------------------------------------------------------------------------------------------------------------// +//#include "StdAfx.h" +#include "SJN_MultiCueBGS.h" +SJN_MultiCueBGS::SJN_MultiCueBGS() : firstTime(true), showOutput(true) +{ + //---------------------------------- + // User adjustable parameters + //---------------------------------- + g_iTrainingPeriod = 20; //the training period (The parameter t in the paper) + g_iT_ModelThreshold = 1; //the threshold for texture-model based BGS. (The parameter tau_T in the paper) + g_iC_ModelThreshold = 10; //the threshold for appearance based verification. (The parameter tau_A in the paper) + + g_fLearningRate = 0.05; //the learning rate for background models. (The parameter alpha in the paper) + + g_nTextureTrainVolRange = 15; //the codebook size factor for texture models. (The parameter k in the paper) + g_nColorTrainVolRange = 20; //the codebook size factor for color models. (The parameter eta_1 in the paper) + + g_bAbsorptionEnable = TRUE; //If TRUE, cache-book is also modeled for ghost region removal. + g_iAbsortionPeriod = 200; //the period to absorb static ghost regions + + g_iRWidth = 160, g_iRHeight = 120; //Frames are precessed after reduced in this size . + + //------------------------------------ + // For codebook maintenance + //------------------------------------ + g_iBackClearPeriod = 300; //the period to clear background models + g_iCacheClearPeriod = 30; //the period to clear cache-book models + + //------------------------------------ + // Initialization of other parameters + //------------------------------------ + g_nNeighborNum = 6, g_nRadius = 2; + g_fConfidenceThre = g_iT_ModelThreshold/(float)g_nNeighborNum; //the final decision threshold + + g_iFrameCount = 0; + g_bForegroundMapEnable = FALSE; //TRUE only when BGS is successful + g_bModelMemAllocated = FALSE; //To handle memory.. + g_bNonModelMemAllocated = FALSE; //To handle memory.. +} + +SJN_MultiCueBGS::~SJN_MultiCueBGS(void){ + Destroy(); +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the main function to background modeling and subtraction // // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel){ + + if (img_input.empty()) + return; + + loadConfig(); + + if (firstTime) + saveConfig(); + + //--STep1: Background Modeling--// + IplImage* frame = &IplImage(img_input); + IplImage* result_image = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3); + cvSetZero(result_image); + + if(g_iFrameCount <= g_iTrainingPeriod){ + BackgroundModeling_Par(frame); + g_iFrameCount++; + } + + //--Step2: Background Subtraction--// + else{ + g_bForegroundMapEnable = FALSE; + + ForegroundExtraction(frame); + UpdateModel_Par(); + + //Get BGS Results + GetForegroundMap(result_image, NULL); + } + + cv::Mat temp(result_image,TRUE); + temp.copyTo(img_output); + + cvReleaseImage(&result_image); + + if (showOutput) + { + cv::imshow("MultiCueBGS FG", img_output); + } + + firstTime = false; +} + +void SJN_MultiCueBGS::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/MultiCueBGS.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void SJN_MultiCueBGS::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/MultiCueBGS.xml", 0, CV_STORAGE_READ); + + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the system initialization function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::Initialize(IplImage* frame) +{ + int i,j; + + g_iHeight = frame->height; + g_iWidth = frame->width; + + Destroy(); + + //-------------------------------------------------------- + // memory initialization + //-------------------------------------------------------- + g_ResizedFrame = cvCreateImage(cvSize(g_iRWidth, g_iRHeight), IPL_DEPTH_8U, 3); + + g_aGaussFilteredFrame = (uchar***)malloc(sizeof(uchar**)*g_iRHeight); + for(i=0;i<g_iRHeight;i++){ + g_aGaussFilteredFrame[i] = (uchar**)malloc(sizeof(uchar*)*g_iRWidth); + for(j=0;j<g_iRWidth;j++) g_aGaussFilteredFrame[i][j] = (uchar*)malloc(sizeof(uchar)*3); + } + + g_aXYZFrame = (uchar***)malloc(sizeof(uchar**)*g_iRHeight); + for(i=0;i<g_iRHeight;i++){ + g_aXYZFrame[i] = (uchar**)malloc(sizeof(uchar*)*g_iRWidth); + for(j=0;j<g_iRWidth;j++) g_aXYZFrame[i][j] = (uchar*)malloc(sizeof(uchar)*3); + } + + g_aLandmarkArray = (uchar**)malloc(sizeof(uchar*)*g_iRHeight); + for(i=0;i<g_iRHeight;i++) g_aLandmarkArray[i] = (uchar*)malloc(sizeof(uchar)*g_iRWidth); + + g_aResizedForeMap = (uchar**)malloc(sizeof(uchar*)*g_iRHeight); + for(i=0;i<g_iRHeight;i++) g_aResizedForeMap[i] = (uchar*)malloc(sizeof(uchar)*g_iRWidth); + + g_aForegroundMap = (uchar**)malloc(sizeof(uchar*)*g_iHeight); + for(i=0;i<g_iHeight;i++) g_aForegroundMap[i] = (uchar*)malloc(sizeof(uchar)*g_iWidth); + + g_aUpdateMap = (BOOL**)malloc(sizeof(BOOL*)*g_iRHeight); + for(i=0;i<g_iRHeight;i++) g_aUpdateMap[i] = (BOOL*)malloc(sizeof(BOOL)*g_iRWidth); + + //Bound Box Related.. + int iElementNum = 300; + g_BoundBoxInfo = (BoundingBoxInfo*)malloc(sizeof(BoundingBoxInfo)); + g_BoundBoxInfo->m_iArraySize = iElementNum; + g_BoundBoxInfo->m_iBoundBoxNum = iElementNum; + + g_BoundBoxInfo->m_aLeft = (short*)malloc( sizeof(short) * iElementNum ); g_BoundBoxInfo->m_aRight = (short*)malloc( sizeof(short) * iElementNum ); + g_BoundBoxInfo->m_aBottom = (short*)malloc( sizeof(short) * iElementNum ); g_BoundBoxInfo->m_aUpper = (short*)malloc( sizeof(short) * iElementNum ); + + g_BoundBoxInfo->m_aRLeft = (short*)malloc( sizeof(short) * iElementNum ); g_BoundBoxInfo->m_aRRight = (short*)malloc( sizeof(short) * iElementNum ); + g_BoundBoxInfo->m_aRBottom = (short*)malloc( sizeof(short) * iElementNum ); g_BoundBoxInfo->m_aRUpper = (short*)malloc( sizeof(short) * iElementNum ); + + g_BoundBoxInfo->m_ValidBox = (BOOL*)malloc( sizeof(BOOL) * iElementNum ); + + //-------------------------------------------------------- + // texture model related + //-------------------------------------------------------- + T_AllocateTextureModelRelatedMemory(); + + //-------------------------------------------------------- + // color moddel related + //-------------------------------------------------------- + C_AllocateColorModelRelatedMemory(); + + g_bModelMemAllocated = TRUE; + g_bNonModelMemAllocated = TRUE; + +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the function to release allocated memories // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::Destroy() +{ + if(g_bModelMemAllocated==FALSE && g_bNonModelMemAllocated==FALSE) return; + + int i,j; + short nNeighborNum = g_nNeighborNum; + + if(g_bModelMemAllocated==TRUE){ + T_ReleaseTextureModelRelatedMemory(); + C_ReleaseColorModelRelatedMemory(); + + g_bModelMemAllocated = FALSE; + } + + if(g_bNonModelMemAllocated==TRUE){ + + cvReleaseImage(&g_ResizedFrame); + + for(i=0;i<g_iRHeight;i++){ + for(j=0;j<g_iRWidth;j++) free(g_aGaussFilteredFrame[i][j]); + free(g_aGaussFilteredFrame[i]); + } + free(g_aGaussFilteredFrame); + + for(i=0;i<g_iRHeight;i++){ + for(j=0;j<g_iRWidth;j++) free(g_aXYZFrame[i][j]); + free(g_aXYZFrame[i]); + } + free(g_aXYZFrame); + + for(i=0;i<g_iRHeight;i++) free(g_aLandmarkArray[i]); + free(g_aLandmarkArray); + + for(i=0;i<g_iRHeight;i++) free(g_aResizedForeMap[i]); + free(g_aResizedForeMap); + + for(i=0;i<g_iHeight;i++) free(g_aForegroundMap[i]); + free(g_aForegroundMap); + + for(i=0;i<g_iRHeight;i++) free(g_aUpdateMap[i]); + free(g_aUpdateMap); + + free(g_BoundBoxInfo->m_aLeft); free(g_BoundBoxInfo->m_aRight); free(g_BoundBoxInfo->m_aBottom); free(g_BoundBoxInfo->m_aUpper); + free(g_BoundBoxInfo->m_aRLeft); free(g_BoundBoxInfo->m_aRRight); free(g_BoundBoxInfo->m_aRBottom); free(g_BoundBoxInfo->m_aRUpper); + free(g_BoundBoxInfo->m_ValidBox); + free(g_BoundBoxInfo); + + g_bNonModelMemAllocated = FALSE; + } +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the preprocessing function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::PreProcessing(IplImage* frame){ + + //image resize + ReduceImageSize(frame, g_ResizedFrame); + + //Gaussian filtering + GaussianFiltering(g_ResizedFrame, g_aGaussFilteredFrame); + + //color space conversion + BGR2HSVxyz_Par(g_aGaussFilteredFrame,g_aXYZFrame); +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the background modeling function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::BackgroundModeling_Par(IplImage* frame){ + + //initialization + if(g_iFrameCount == 0) Initialize(frame); + + //Step1: pre-processing + PreProcessing(frame); + + int iH_Start = g_nRadius, iH_end = g_iRHeight-g_nRadius; + int iW_Start = g_nRadius, iW_end = g_iRWidth-g_nRadius; + + float fLearningRate = g_fLearningRate * 4; + + //Step2: background modeling + for(int i=iH_Start; i<iH_end; i++){ + for(int j=iW_Start;j<iW_end;j++){ + point center; + center.m_nX = j; + center.m_nY = i; + + T_ModelConstruction(g_nTextureTrainVolRange,fLearningRate,g_aXYZFrame,center,g_aNeighborDirection[i][j],g_TextureModel[i][j]); + C_CodebookConstruction(g_aXYZFrame[i][j], j, i, g_nColorTrainVolRange, fLearningRate, g_ColorModel[i][j]); + } + } + + //Step3: Clear non-essential codewords + if(g_iFrameCount==g_iTrainingPeriod){ + for(int i=0; i<g_iRHeight; i++){ + for(int j=0;j<g_iRWidth;j++){ + T_ClearNonEssentialEntries(g_iTrainingPeriod,g_TextureModel[i][j]); + + C_ClearNonEssentialEntries(g_iTrainingPeriod,g_ColorModel[i][j]); + } + } + g_iFrameCount++; + } +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the background subtraction function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::ForegroundExtraction(IplImage* frame){ + + //Step1:pre-processing + PreProcessing(frame); + + //Step3: texture-model based process + T_GetConfidenceMap_Par(g_aXYZFrame,g_aTextureConfMap,g_aNeighborDirection,g_TextureModel); + + //Step2: color-model based verification + CreateLandmarkArray_Par(g_fConfidenceThre,g_nColorTrainVolRange,g_aTextureConfMap,g_nNeighborNum,g_aXYZFrame, g_aNeighborDirection, + g_TextureModel,g_ColorModel,g_aLandmarkArray); + + //Step3: verification procedures + PostProcessing(frame); + +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the post-processing function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::PostProcessing(IplImage* frame){ + + //Step1: morphological operation + MorphologicalOpearions(g_aLandmarkArray,g_aResizedForeMap,0.5,5,g_iRWidth,g_iRHeight); + g_bForegroundMapEnable = TRUE; + + //Step2: labeling + int** aLabelTable = (int**)malloc(sizeof(int*)*g_iRHeight); + for(int i=0;i<g_iRHeight;i++) aLabelTable[i] = (int*)malloc(sizeof(int)*g_iRWidth); + + int iLabelCount; + Labeling(g_aResizedForeMap,&iLabelCount,aLabelTable); + + //Step3: getting bounding boxes for each candidate fore-blob + SetBoundingBox(iLabelCount, aLabelTable); + + //Step4: size and appearance based verification + BoundBoxVerification(frame,g_aResizedForeMap,g_BoundBoxInfo); + + //Step5: ��ȿ�� Foreground Region�鸸�� ��� �������� ���� + RemovingInvalidForeRegions(g_aResizedForeMap,g_BoundBoxInfo); + + for(int i=0;i<g_iRHeight;i++) free(aLabelTable[i]); + free(aLabelTable); +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the background-model update function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::UpdateModel_Par(){ + short nNeighborNum = g_nNeighborNum; + + //Step1: update map construction + for(int i=0;i<g_iRHeight;i++){ + for(int j=0;j<g_iRWidth;j++){ + g_aUpdateMap[i][j] = TRUE; + } + } + + for(int k=0;k<g_BoundBoxInfo->m_iBoundBoxNum;k++){ + if(g_BoundBoxInfo->m_ValidBox[k]==TRUE){ + for(int i=g_BoundBoxInfo->m_aRUpper[k]; i<=g_BoundBoxInfo->m_aRBottom[k]; i++){ + for(int j=g_BoundBoxInfo->m_aRLeft[k]; j<=g_BoundBoxInfo->m_aRRight[k]; j++){ + g_aUpdateMap[i][j] = FALSE; + } + } + } + } + + //Step2: update + int iH_Start = g_nRadius, iH_End = g_iRHeight-g_nRadius; + int iW_Start = g_nRadius, iW_End = g_iRWidth-g_nRadius; + + float fLearningRate = (float)g_fLearningRate; + + for(int i=iH_Start; i<iH_End; i++){ + for(int j=iW_Start;j<iW_End;j++){ + + point center; + + center.m_nX = j; + center.m_nY = i; + + if(g_aUpdateMap[i][j]==TRUE){ + //model update + T_ModelConstruction(g_nTextureTrainVolRange,fLearningRate,g_aXYZFrame,center,g_aNeighborDirection[i][j],g_TextureModel[i][j]); + C_CodebookConstruction(g_aXYZFrame[i][j],j,i,g_nColorTrainVolRange,fLearningRate,g_ColorModel[i][j]); + + //clearing non-essential codewords + T_ClearNonEssentialEntries(g_iBackClearPeriod,g_TextureModel[i][j]); + C_ClearNonEssentialEntries(g_iBackClearPeriod,g_ColorModel[i][j]); + + } + else { + if(g_bAbsorptionEnable==TRUE){ + //model update + T_ModelConstruction(g_nTextureTrainVolRange,fLearningRate,g_aXYZFrame,center,g_aNeighborDirection[i][j],g_TCacheBook[i][j]); + C_CodebookConstruction(g_aXYZFrame[i][j],j,i,g_nColorTrainVolRange,fLearningRate,g_CCacheBook[i][j]); + + //clearing non-essential codewords + T_Absorption(g_iAbsortionPeriod,center,g_aTContinuousCnt,g_aTReferredIndex,g_TextureModel[i][j],g_TCacheBook[i][j]); + C_Absorption(g_iAbsortionPeriod,center,g_aCContinuousCnt,g_aCReferredIndex,g_ColorModel[i][j],g_CCacheBook[i][j]); + + } + } + + //clearing non-essential codewords for cache-books + if(g_bAbsorptionEnable==TRUE){ + T_ClearNonEssentialEntriesForCachebook(g_aLandmarkArray[i][j],g_aTReferredIndex[i][j],10,g_TCacheBook[i][j]); + C_ClearNonEssentialEntriesForCachebook(g_aLandmarkArray[i][j],g_aCReferredIndex[i][j],10,g_CCacheBook[i][j]); + } + } + } + +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the color based verification function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::CreateLandmarkArray_Par(float fConfThre, short nTrainVolRange, float**aConfMap, int iNehborNum, uchar*** aXYZ, + point*** aNeiDir, TextureModel**** TModel, ColorModel*** CModel, uchar**aLandmarkArr){ + + int iBound_w = g_iRWidth-g_nRadius; + int iBound_h = g_iRHeight-g_nRadius; + + for(int i=0; i<g_iRHeight; i++){ + for(int j=0;j<g_iRWidth;j++){ + + if(i<g_nRadius || i>=iBound_h || j<g_nRadius || j>=iBound_w) { + aLandmarkArr[i][j] = 0; + continue; + } + + double tmp = aConfMap[i][j]; + + if(tmp > fConfThre) aLandmarkArr[i][j] = 255; + else{ + aLandmarkArr[i][j] = 0; + //Calculating texture amount in the background + double dBackAmt, dCnt; + dBackAmt = dCnt = 0; + + for(int m=0; m<iNehborNum; m++){ + for(int n=0;n<TModel[i][j][m]->m_iNumEntries;n++){ + dBackAmt += TModel[i][j][m]->m_Codewords[n]->m_fMean; + dCnt++; + } + } + dBackAmt /= dCnt; + + //Calculating texture amount in the input image + double dTemp, dInputAmt = 0; + for(int m=0; m<iNehborNum; m++){ + dTemp = aXYZ[i][j][2] - aXYZ[ aNeiDir[i][j][m].m_nY ][ aNeiDir[i][j][m].m_nX ][2]; + + if(dTemp>=0) dInputAmt += dTemp; + else dInputAmt -= dTemp; + + } + + //If there are only few textures in both background and input image + if(dBackAmt < 50 && dInputAmt <50){ + //Conduct color codebook matching + BOOL bMatched = FALSE; + for(int m=0;m<CModel[i][j]->m_iNumEntries;m++){ + + int iMatchedCount = 0; + for(int n=0;n<3;n++){ + double dLowThre = CModel[i][j]->m_Codewords[m]->m_dMean[n] - nTrainVolRange - 10; + double dHighThre = CModel[i][j]->m_Codewords[m]->m_dMean[n] + nTrainVolRange + 10; + + if(dLowThre <= aXYZ[i][j][n] && aXYZ[i][j][n] <= dHighThre) iMatchedCount++; + } + + if(iMatchedCount==3) { + bMatched = TRUE; + break; + } + + } + if(bMatched==TRUE) aLandmarkArr[i][j] = 125; + else aLandmarkArr[i][j] = 255; + + } + + } + } + } +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the Gaussian filtering function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::GaussianFiltering(IplImage* frame, uchar*** aFilteredFrame){ + + double dSigma = 0.7; + + if(dSigma==0){ + for(int i=0; i<g_iRHeight; i++){ + for(int j=0; j<g_iRWidth; j++){ + aFilteredFrame[i][j][0] = frame->imageData[i*frame->widthStep + j*3]; + aFilteredFrame[i][j][1] = frame->imageData[i*frame->widthStep + j*3 + 1]; + aFilteredFrame[i][j][2] = frame->imageData[i*frame->widthStep + j*3 + 2]; + } + } + } + + else{ + cv::Mat temp_img(frame,TRUE); + cv::GaussianBlur(temp_img, temp_img, cv::Size(7,7), dSigma); + + //Store results into aFilteredFrame[][][] + IplImage* img = &IplImage(temp_img); + int iWidthStep = img->widthStep; + + for(int i=0; i<g_iRHeight; i++){ + for(int j=0; j<g_iRWidth; j++){ + aFilteredFrame[i][j][0] = img->imageData[i*img->widthStep + j*3]; + aFilteredFrame[i][j][1] = img->imageData[i*img->widthStep + j*3 + 1]; + aFilteredFrame[i][j][2] = img->imageData[i*img->widthStep + j*3 + 2]; + } + } + + } + + +} + +//------------------------------------------------------------------------------------------------------------------------------------// +// the image resize function // +//------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::ReduceImageSize(IplImage* SrcImage, IplImage* DstImage){ + + int iChannel = 3; + + double dResizeFactor_w = (double)g_iWidth/(double)g_iRWidth; + double dResizeFactor_h = (double)g_iHeight/(double)g_iRHeight; + + + for(int i=0;i<g_iRHeight;i++){ + for(int j=0;j<g_iRWidth;j++){ + int iSrcY = (int)(i*dResizeFactor_h); + int iSrcX = (int)(j*dResizeFactor_w); + + for(int k=0;k<iChannel;k++) DstImage->imageData[i*DstImage->widthStep + j*3 +k] + = SrcImage->imageData[iSrcY*SrcImage->widthStep + iSrcX*3 + k]; + } + } + +} + +//------------------------------------------------------------------------------------------------------------------------------------// +// the color space conversion function // +//------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::BGR2HSVxyz_Par(uchar*** aBGR, uchar*** aXYZ){ + + double dH_ratio = (2*PI)/360; + + for(int i=0; i<g_iRHeight; i++){ + + double dR,dG,dB; + double dMax, dMin; + + double dH,dS, dV; + + for(int j=0;j<g_iRWidth;j++){ + + dB = (double)( aBGR[i][j][0] )/255; + dG = (double)( aBGR[i][j][1] )/255; + dR = (double)( aBGR[i][j][2] )/255; + + + //Find max, min + dMin = MIN3(dR,dG,dB); + dMax = MAX3(dR,dG,dB); + + + //Get V + dV = dMax; + + //Get S, H + if(dV==0) dS = dH = 0; + else{ + + //S value + dS = (dMax-dMin)/dMax; + + if(dS == 0) dH =0; + else{ + //H value + if(dMax == dR) { + dH = 60*(dG - dB)/dS; + if(dH < 0) dH = 360 + dH; + } + else if(dMax == dG) dH = 120 + 60*(dB - dR)/dS; + else dH = 240 + 60*(dR - dG)/dS; + } + } + dH = dH * dH_ratio; + + aXYZ[i][j][0] = (uchar)( (dV * dS * cos(dH) * 127.5) + 127.5 ); //X --> 0~255 + aXYZ[i][j][1] = (uchar)( (dV * dS * sin(dH) * 127.5) + 127.5 ); //Y --> 0~255 + aXYZ[i][j][2] = (uchar)( dV * 255 ); //Z --> 0~255 + + } + } +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the function to get enlarged confidence map // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::GetEnlargedMap(float** aOriginMap, float** aEnlargedMap){ + int i,j; + + short nSrcX; + short nSrcY; + + double dEWweight,dNSweight; + double dEWtop, dEWbottom; + + double dNW; //north-west + double dNE; //north-east + double dSW; //south-west + double dSE; //south-east + + double dScaleFactor_w = ( (double)g_iWidth ) / ( (double)g_iRWidth ); + double dScaleFactor_h = ( (double)g_iHeight ) / ( (double)g_iRHeight ); + + for(i=0;i<g_iHeight;i++){ + for(j=0;j<g_iWidth;j++){ + //backward mapping + nSrcY = (int)( i/dScaleFactor_h ); + nSrcX = (int)( j/dScaleFactor_w ); + + if( nSrcY == (g_iRHeight-1) ) nSrcY -= 1; + if( nSrcX == (g_iRWidth-1) ) nSrcX -= 1; + + dEWweight = i/dScaleFactor_h - nSrcY; + dNSweight = j/dScaleFactor_w - nSrcX; + + dNW = (double)aOriginMap[nSrcY][nSrcX]; + dNE = (double)aOriginMap[nSrcY][nSrcX+1]; + dSW = (double)aOriginMap[nSrcY+1][nSrcX]; + dSE = (double)aOriginMap[nSrcY+1][nSrcX+1]; + + // interpolation + dEWtop = dNW + dEWweight * (dNE - dNW); + dEWbottom = dSW + dEWweight * (dSE - dSW); + + aEnlargedMap[i][j] = (float)( dEWtop + dNSweight * (dEWbottom - dEWtop) ); + } + } +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the morphological operation function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::MorphologicalOpearions(uchar** aInput, uchar** aOutput, double dThresholdRatio, int iMaskSize, int iWidth, int iHeight){ + + int iOffset = (int)(iMaskSize/2); + + int iBound_w = iWidth-iOffset; + int iBound_h = iHeight-iOffset; + + uchar** aTemp = (uchar**)malloc(sizeof(uchar*)*iHeight); + for(int i=0;i<iHeight;i++){ + aTemp[i] = (uchar*)malloc(sizeof(uchar)*iWidth); + } + + for(int i=0;i<iHeight;i++){ + for(int j=0;j<iWidth;j++){ + aTemp[i][j] = aInput[i][j]; + } + } + + int iThreshold = (int)(iMaskSize*iMaskSize*dThresholdRatio); + for(int i=0;i<iHeight;i++){ + for(int j=0;j<iWidth;j++){ + + if(i<iOffset || i>=iBound_h || j<iOffset || j>=iBound_w){ + aOutput[i][j] = 0; + continue; + } + + int iCnt = 0; + for(int m=-iOffset;m<=iOffset;m++){ + for(int n=-iOffset;n<=iOffset;n++){ + if(aTemp[i+m][j+n]==255) iCnt++; + } + } + + if(iCnt >= iThreshold) aOutput[i][j] = 255; + else aOutput[i][j] = 0; + } + } + + + for(int i=0;i<iHeight;i++){ + free(aTemp[i]); + } + free(aTemp); + +} +//-----------------------------------------------------------------------------------------------------------------------------------------// +// 2-raster scan pass based labeling function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::Labeling(uchar** aBinaryArray,int* pLabelCount, int** aLabelTable){ + int x,y,i; // pass 1,2 + int cnt=0; // pass 1 + int label=0; // pass 2 + + int iSize = g_iRWidth * g_iRHeight; + int iTableSize = iSize/2; + + // initialize , table1 table1 + int* aPass1 = (int*)malloc(iSize * sizeof(int)); + int* aTable1 = (int*)malloc(iSize/2 * sizeof(int)); + int* aTable2 = (int*)malloc(iSize/2 * sizeof(int)); + + memset(aPass1, 0, (iSize)* sizeof(int)); + for (y=1; y < (g_iRHeight); y++){ + for (x = 1; x < (g_iRWidth); x++){ + aLabelTable[y][x] = 0; + } + } + + for(i=0; i < iTableSize; i++){ + aTable1[i] = i; + } + memset(aTable2, 0, iTableSize * sizeof(int)); + + // pass 1 + for (y=1; y < (g_iRHeight); y++){ + for (x = 1; x < (g_iRWidth); x++){ + + if (aBinaryArray[y][x] == 255){ // fore ground?? + int up, le; + + up = aPass1[ (y-1)*(g_iRWidth) + (x ) ]; // up index + le = aPass1[ (y )*(g_iRWidth) + (x-1) ]; // left index + + // case + if( up == 0 && le == 0){ + ++cnt; + aPass1[ y * g_iRWidth + x ] = cnt; + + }else if( up != 0 && le != 0){ + if ( up > le){ + aPass1[ y *g_iRWidth + x ] = le; + aTable1[up] = aTable1[le]; // update table1 table1 + }else{ + aPass1[ y * g_iRWidth + x ] = up; + aTable1[le] = aTable1[up]; // update table1 table1 + } + }else{ + aPass1[ y * g_iRWidth + x ] = up + le; + } + + } + + } + } + + // pass 2 + for (y=1; y < (g_iRHeight); y++){ + for (x = 1; x < (g_iRWidth); x++){ + + if (aPass1[ y * g_iRWidth + x]){ + int v = aTable1[aPass1[ y * g_iRWidth + x]]; + + if ( aTable2[v] == 0){ + ++label; + aTable2[v] = label; + } + + aLabelTable[y][x] = aTable2[v]; + } + } + } + + *pLabelCount = label; + + free(aPass1); + free(aTable1); + free(aTable2); +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the function to set bounding boxes for each candidate foreground regions // // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::SetBoundingBox(int iLabelCount, int** aLabelTable){ + int iBoundBoxIndex; + + g_BoundBoxInfo->m_iBoundBoxNum = iLabelCount; + + for (int i=0; i<g_BoundBoxInfo->m_iBoundBoxNum; i++ ){ + g_BoundBoxInfo->m_aRLeft[i] = 9999; //left + g_BoundBoxInfo->m_aRUpper[i] = 9999; //top + g_BoundBoxInfo->m_aRRight[i] = 0; //right + g_BoundBoxInfo->m_aRBottom[i] = 0; //bottom + } + + //Step1: Set tight bounding boxes + for(int i=1;i<g_iRHeight;i++){ + for(int j=1;j<g_iRWidth;j++){ + + if( (aLabelTable[i][j]==0) ) continue; + + iBoundBoxIndex = aLabelTable[i][j]-1; + + if( g_BoundBoxInfo->m_aRLeft[ iBoundBoxIndex ] > j ) g_BoundBoxInfo->m_aRLeft[ iBoundBoxIndex ] = j; //left + if( g_BoundBoxInfo->m_aRUpper[ iBoundBoxIndex ] > i ) g_BoundBoxInfo->m_aRUpper[ iBoundBoxIndex ] = i; //top + if( g_BoundBoxInfo->m_aRRight[ iBoundBoxIndex ] < j ) g_BoundBoxInfo->m_aRRight[ iBoundBoxIndex ] = j; //right + if( g_BoundBoxInfo->m_aRBottom[ iBoundBoxIndex ] < i ) g_BoundBoxInfo->m_aRBottom[ iBoundBoxIndex ] = i; //bottom + + } + } + + //Step2: Add margins. + int iBoundary_w = (int)(g_iRWidth / 80), iBoundary_h = (int)(g_iRHeight / 60); + + for( int i=0; i<g_BoundBoxInfo->m_iBoundBoxNum; i++ ){ + + g_BoundBoxInfo->m_aRLeft[i] -= iBoundary_w; + if(g_BoundBoxInfo->m_aRLeft[i] < g_nRadius) g_BoundBoxInfo->m_aRLeft[i] = g_nRadius; //left + + g_BoundBoxInfo->m_aRRight[i] += iBoundary_w; + if(g_BoundBoxInfo->m_aRRight[i] >= g_iRWidth-g_nRadius) g_BoundBoxInfo->m_aRRight[i] = g_iRWidth-g_nRadius-1; //Right + + g_BoundBoxInfo->m_aRUpper[i] -= iBoundary_h; + if(g_BoundBoxInfo->m_aRUpper[i] < g_nRadius) g_BoundBoxInfo->m_aRUpper[i] = g_nRadius; //Top + + g_BoundBoxInfo->m_aRBottom[i] += iBoundary_h; + if(g_BoundBoxInfo->m_aRBottom[i] >= g_iRHeight-g_nRadius) g_BoundBoxInfo->m_aRBottom[i] =g_iRHeight-g_nRadius-1; + } + + double dH_ratio = (double)g_iHeight/(double)g_iRHeight; + double dW_ratio = (double)g_iWidth/(double)g_iRWidth; + + for(int i=0;i<g_BoundBoxInfo->m_iBoundBoxNum;i++){ + g_BoundBoxInfo->m_aLeft[i] = (int)(g_BoundBoxInfo->m_aRLeft[i] * dW_ratio); + g_BoundBoxInfo->m_aUpper[i] = (int)(g_BoundBoxInfo->m_aRUpper[i] * dH_ratio); + g_BoundBoxInfo->m_aRight[i] = (int)(g_BoundBoxInfo->m_aRRight[i] * dW_ratio); + g_BoundBoxInfo->m_aBottom[i] = (int)(g_BoundBoxInfo->m_aRBottom[i] * dH_ratio); + } + +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the box verification function // // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::BoundBoxVerification(IplImage* frame, uchar** aResForeMap, BoundingBoxInfo* BoundBoxInfo){ + + //Step1: Verification by the bounding box size + EvaluateBoxSize(BoundBoxInfo); + + //Step2: Verification by checking whether the region is ghost + EvaluateGhostRegion(frame, aResForeMap, BoundBoxInfo); + + //Step3: Counting the # of valid box + g_iForegroundNum = 0; + for( int i=0; i<BoundBoxInfo->m_iBoundBoxNum; i++ ){ + if(BoundBoxInfo->m_ValidBox[i] == TRUE) g_iForegroundNum++; + } +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the size based verification // // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::EvaluateBoxSize(BoundingBoxInfo* BoundBoxInfo){ + + //Set thresholds + int iLowThreshold_w, iHighThreshold_w; + iLowThreshold_w = g_iRWidth / 32; if(iLowThreshold_w<5) iLowThreshold_w = 5; + iHighThreshold_w = g_iRWidth; + + int iLowThreshold_h, iHighThreshold_h; + iLowThreshold_h = g_iRHeight / 24; if(iLowThreshold_h<5) iLowThreshold_h = 5; + iHighThreshold_h = g_iRHeight; + + int iBoxWidth,iBoxHeight; + + //Perform verification. + for( int i=0; i<BoundBoxInfo->m_iBoundBoxNum; i++ ){ + + iBoxWidth = BoundBoxInfo->m_aRRight[i] - BoundBoxInfo->m_aRLeft[i]; + iBoxHeight = BoundBoxInfo->m_aRBottom[i] - BoundBoxInfo->m_aRUpper[i]; + + if(iLowThreshold_w<=iBoxWidth && iBoxWidth<=iHighThreshold_w && iLowThreshold_h<=iBoxHeight && iBoxHeight<= iHighThreshold_h) { + BoundBoxInfo->m_ValidBox[i] = TRUE; + } + else BoundBoxInfo->m_ValidBox[i] = FALSE; + } +} + +//------------------------------------------------------------------------------------------------------------------------------------// +// overlapped region removal // +//------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::EvaluateOverlapRegionSize(BoundingBoxInfo* SrcBoxInfo){ + + BOOL *aValidBoxFlag = new BOOL[SrcBoxInfo->m_iBoundBoxNum]; + for(int i=0;i<SrcBoxInfo->m_iBoundBoxNum;i++) aValidBoxFlag[i] = TRUE; + + int size1, size2; + short *aLeft=SrcBoxInfo->m_aRLeft, *aRight=SrcBoxInfo->m_aRRight; + short *aTop=SrcBoxInfo->m_aRUpper, *aBottom=SrcBoxInfo->m_aRBottom; + + int iThreshold,iCount, iSmall_Idx, iLarge_Idx; + double dThreRatio = 0.7; + + for(int i=0;i<SrcBoxInfo->m_iBoundBoxNum;i++){ + + if(SrcBoxInfo->m_ValidBox[i]==FALSE) { + aValidBoxFlag[i] = FALSE; + continue; + } + + size1 = (aRight[i] - aLeft[i]) * (aBottom[i] - aTop[i]); + + for(int j=i;j<SrcBoxInfo->m_iBoundBoxNum;j++){ + if( (i==j) || (SrcBoxInfo->m_ValidBox[j]==FALSE) ) continue; + + //Setting threshold for checking overlapped region size + size2 = (aRight[j] - aLeft[j]) * (aBottom[j] - aTop[j]); + + if(size1 >= size2) { + iThreshold = (int)( size2 * dThreRatio ); + iSmall_Idx = j; iLarge_Idx = i; + } + else { + iThreshold = (int)( size1 * dThreRatio ); + iSmall_Idx= i; iLarge_Idx = j; + } + + //Calculating overlapped region size + iCount = 0; + for(int m=aLeft[iSmall_Idx]; m<aRight[iSmall_Idx]; m++){ + for(int n=aTop[iSmall_Idx]; n<aBottom[iSmall_Idx]; n++){ + if( aLeft[iLarge_Idx]<=m && m<=aRight[iLarge_Idx] && aTop[iLarge_Idx]<=n && n<=aBottom[iLarge_Idx]) iCount++; + } + } + + //Evaluating overlapped region size + if(iCount > iThreshold) aValidBoxFlag[iSmall_Idx] = FALSE; + } + } + + for(int i=0;i<SrcBoxInfo->m_iBoundBoxNum;i++) SrcBoxInfo->m_ValidBox[i] = aValidBoxFlag[i]; + delete[] aValidBoxFlag; +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// appearance based verification // // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::EvaluateGhostRegion(IplImage* frame, uchar** aResForeMap, BoundingBoxInfo* BoundBoxInfo){ + + double dThreshold = 10; + + BOOL** aUpdateMap = (BOOL**)malloc(sizeof(BOOL*)*g_iRHeight); + for(int i=0;i<g_iRHeight;i++){ + aUpdateMap[i] = (BOOL*)malloc(sizeof(BOOL)*g_iRWidth); + for(int j=0;j<g_iRWidth;j++) aUpdateMap[i][j] = FALSE; + } + + //Step1: Conduct fore-region evaluation to identify ghost regions + + for(int i=0; i<BoundBoxInfo->m_iBoundBoxNum; i++){ + if(BoundBoxInfo->m_ValidBox[i]==TRUE){ + int iWin_w = BoundBoxInfo->m_aRRight[i] - BoundBoxInfo->m_aRLeft[i]; + int iWin_h = BoundBoxInfo->m_aRBottom[i] - BoundBoxInfo->m_aRUpper[i]; + + //Generating edge image from bound-boxed frame region + IplImage* resized_frame = cvCreateImage(cvSize(g_iRWidth,g_iRHeight),IPL_DEPTH_8U,3); + cvResize(frame,resized_frame,CV_INTER_NN); + + cvSetImageROI(resized_frame, cvRect(BoundBoxInfo->m_aRLeft[i], BoundBoxInfo->m_aRUpper[i], iWin_w, iWin_h)); + IplImage* edge_frame = cvCreateImage(cvSize(iWin_w,iWin_h),IPL_DEPTH_8U,1); + + cvCvtColor(resized_frame,edge_frame,CV_BGR2GRAY); + cvResetImageROI(resized_frame); + + cvCanny(edge_frame,edge_frame,100,150); + + //Generating edge image from aResForeMap + IplImage* edge_fore = cvCreateImage(cvSize(iWin_w,iWin_h),IPL_DEPTH_8U,1); + for(int m=BoundBoxInfo->m_aRUpper[i]; m<BoundBoxInfo->m_aRBottom[i]; m++){ + for(int n=BoundBoxInfo->m_aRLeft[i]; n<BoundBoxInfo->m_aRRight[i]; n++){ + edge_fore->imageData[(m-BoundBoxInfo->m_aRUpper[i])*edge_fore->widthStep + (n-BoundBoxInfo->m_aRLeft[i])] = (char)aResForeMap[m][n]; + } + } + cvCanny(edge_fore,edge_fore,100,150); + //Calculating partial undirected Hausdorff distance + double distance = CalculateHausdorffDist(edge_frame,edge_fore); + + //Recording evaluation result + if(distance > dThreshold) { + + for(int m=BoundBoxInfo->m_aRUpper[i]; m<BoundBoxInfo->m_aRBottom[i]; m++){ + for(int n=BoundBoxInfo->m_aRLeft[i]; n<BoundBoxInfo->m_aRRight[i]; n++){ + aUpdateMap[m][n] = TRUE; + } + } + + BoundBoxInfo->m_ValidBox[i]=FALSE; + } + + cvReleaseImage(&resized_frame); + cvReleaseImage(&edge_frame); + cvReleaseImage(&edge_fore); + } + } + + //Step2: Adding information fo ghost region pixels to background model + float fLearningRate = g_fLearningRate; + + for(int i=0;i<g_iRHeight;i++){ + for(int j=0;j<g_iRWidth;j++){ + if(aUpdateMap[i][j]==TRUE){ + point center; + center.m_nX=j; center.m_nY=i; + + T_ModelConstruction(g_nTextureTrainVolRange,fLearningRate,g_aXYZFrame,center,g_aNeighborDirection[i][j],g_TextureModel[i][j]); + C_CodebookConstruction(g_aXYZFrame[i][j],j,i,g_nColorTrainVolRange,fLearningRate,g_ColorModel[i][j]); + + T_ClearNonEssentialEntries(g_iBackClearPeriod,g_TextureModel[i][j]); + C_ClearNonEssentialEntries(g_iBackClearPeriod,g_ColorModel[i][j]); + + } + } + } + + for(int i=0;i<g_iRHeight;i++) free(aUpdateMap[i]); + free(aUpdateMap); +} + + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the function to calculate partial undirected Hausdorff distance(forward distance) // // +//-----------------------------------------------------------------------------------------------------------------------------------------// +double SJN_MultiCueBGS::CalculateHausdorffDist(IplImage* input_image, IplImage* model_image){ + + //Step1: Generating imag vectors + //For reduce errors, points at the image boundary are excluded + vector<point> vInput, vModel; + point temp; + + //input image --> input vector + for(int i=0;i<input_image->height;i++){ + for(int j=0;j<input_image->width;j++){ + + if( (uchar)input_image->imageData[i*input_image->widthStep + j]==0 ) continue; + + temp.m_nX = j; temp.m_nY = i; + vInput.push_back(temp); + } + } + //model image --> model vector + for(int i=0; i<model_image->height; i++){ + for(int j=0; j<model_image->width; j++){ + if( (uchar)model_image->imageData[i*model_image->widthStep + j]==0 ) continue; + + temp.m_nX = j; temp.m_nY = i; + vModel.push_back(temp); + } + } + + if( vInput.size()==0 && vModel.size()!=0 ) return (double)vModel.size(); + else if( vInput.size()!=0 && vModel.size()==0 ) return (double)vInput.size(); + else if( vInput.size()==0 && vModel.size()==0) return 0.0; + + //Step2: Calculating forward distance h(Model,Image) + double dDist, temp1, temp2, dMinDist; + vector<double> vTempDist; + + for( auto iter_m=vModel.begin(); iter_m<vModel.end(); iter_m++ ){ + + dMinDist = 9999999; + for( auto iter_i=vInput.begin(); iter_i<vInput.end(); iter_i++){ + temp1 = (*iter_m).m_nX - (*iter_i).m_nX; + temp2 = (*iter_m).m_nY - (*iter_i).m_nY; + dDist = temp1*temp1 + temp2*temp2; + + if(dDist < dMinDist) dMinDist = dDist; + } + vTempDist.push_back(dMinDist); + } + sort(vTempDist.begin(), vTempDist.end()); //in ascending order + + double dQuantileVal = 0.9, dForwardDistance; + int iDistIndex = (int)(dQuantileVal*vTempDist.size()); if(iDistIndex == vTempDist.size()) iDistIndex -= 1; + + dForwardDistance = sqrt( vTempDist[ iDistIndex ] ); + return dForwardDistance; + +} + + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// function to remove non-valid bounding boxes fore fore-candidates // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::RemovingInvalidForeRegions(uchar** aResForeMap, BoundingBoxInfo* BoundBoxInfo){ + + int iBoxNum = BoundBoxInfo->m_iBoundBoxNum; + + for(int k=0;k<iBoxNum; k++){ + + if(BoundBoxInfo->m_ValidBox[k]==FALSE){ + for(int i=BoundBoxInfo->m_aRUpper[k]; i<BoundBoxInfo->m_aRBottom[k]; i++){ + for(int j=BoundBoxInfo->m_aRLeft[k]; j<BoundBoxInfo->m_aRRight[k]; j++){ + if(aResForeMap[i][j]==255) aResForeMap[i][j] = 0; + } + } + } + + } +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the function returning a foreground binary-map // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::GetForegroundMap(IplImage* return_image, IplImage* input_frame){ + + if(g_bForegroundMapEnable == FALSE) return; + + IplImage* temp_image = cvCreateImage(cvSize(g_iRWidth,g_iRHeight),IPL_DEPTH_8U,3); + + if(input_frame==NULL){ + for(int i=0;i<g_iRHeight;i++){ + for(int j=0;j<g_iRWidth;j++){ + temp_image->imageData[i*temp_image->widthStep + j*3] = (char)g_aResizedForeMap[i][j]; + temp_image->imageData[i*temp_image->widthStep + j*3 + 1] = (char)g_aResizedForeMap[i][j]; + temp_image->imageData[i*temp_image->widthStep + j*3 + 2] = (char)g_aResizedForeMap[i][j]; + } + } + } + + else{ + + cvResize(input_frame,temp_image); + CvScalar MixColor; + MixColor.val[0] = 255; //B + MixColor.val[1] = 0; //G + MixColor.val[2] = 255; //R + + for(int i=0;i<g_iRHeight;i++){ + for(int j=0;j<g_iRWidth;j++){ + + if(g_aResizedForeMap[i][j]==255) { + + uchar B = (uchar)temp_image->imageData[i*temp_image->widthStep + j*3]; + uchar G = (uchar)temp_image->imageData[i*temp_image->widthStep + j*3]; + uchar R = (uchar)temp_image->imageData[i*temp_image->widthStep + j*3]; + + B = (uchar)(B*0.45 + MixColor.val[0]*0.55); + G = (uchar)(G*0.45 + MixColor.val[1]*0.55); + R = (uchar)(R*0.45 + MixColor.val[2]*0.55); + + temp_image->imageData[i*temp_image->widthStep + j*3] = (char)B; + temp_image->imageData[i*temp_image->widthStep + j*3 + 1] = (char)G; + temp_image->imageData[i*temp_image->widthStep + j*3 + 2] = (char)R; + } + } + } + } + + cvResize(temp_image,return_image); + + cvReleaseImage(&temp_image); +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the initialization function for the texture-models // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::T_AllocateTextureModelRelatedMemory(){ + int i,j,k; + + //neighborhood system related + int iMaxNeighborArraySize = 8; + g_aNeighborDirection = (point***)malloc(sizeof(point**)*g_iRHeight); + for(i=0;i<g_iRHeight;i++){ + g_aNeighborDirection[i] = (point**)malloc(sizeof(point*)*g_iRWidth); + for(j=0;j<g_iRWidth;j++){ + g_aNeighborDirection[i][j] = (point*)malloc(sizeof(point)*iMaxNeighborArraySize); + } + } + T_SetNeighborDirection(g_aNeighborDirection); + + //texture-model related + int iElementArraySize = 6; + g_TextureModel = (TextureModel****)malloc(sizeof(TextureModel***)*g_iRHeight); + for(i=0;i<g_iRHeight;i++){ + g_TextureModel[i] = (TextureModel***)malloc(sizeof(TextureModel**)*g_iRWidth); + for(j=0;j<g_iRWidth;j++){ + g_TextureModel[i][j] = (TextureModel**)malloc(sizeof(TextureModel*)*g_nNeighborNum); + for(k=0;k<g_nNeighborNum;k++){ + g_TextureModel[i][j][k] = (TextureModel*)malloc(sizeof(TextureModel)); + g_TextureModel[i][j][k]->m_Codewords = (TextureCodeword**)malloc(sizeof(TextureCodeword*)*iElementArraySize); + g_TextureModel[i][j][k]->m_iElementArraySize = iElementArraySize; + g_TextureModel[i][j][k]->m_iNumEntries = 0; + g_TextureModel[i][j][k]->m_iTotal = 0; + g_TextureModel[i][j][k]->m_bID = 1; + } + } + } + + g_aTextureConfMap = (float**)malloc(sizeof(float*)*g_iRHeight); + for(i=0;i<g_iRHeight;i++) g_aTextureConfMap[i] = (float*)malloc(sizeof(float)*g_iRWidth); + + //cache-book related + if(g_bAbsorptionEnable==TRUE){ + iElementArraySize = iElementArraySize/2; + if(iElementArraySize<3)iElementArraySize = 3; + + g_TCacheBook = (TextureModel****)malloc(sizeof(TextureModel***)*g_iRHeight); + for(i=0;i<g_iRHeight;i++){ + g_TCacheBook[i] = (TextureModel***)malloc(sizeof(TextureModel**)*g_iRWidth); + for(j=0;j<g_iRWidth;j++){ + g_TCacheBook[i][j] = (TextureModel**)malloc(sizeof(TextureModel*)*g_nNeighborNum); + for(k=0;k<g_nNeighborNum;k++){ + g_TCacheBook[i][j][k] = (TextureModel*)malloc(sizeof(TextureModel)); + g_TCacheBook[i][j][k]->m_Codewords = (TextureCodeword**)malloc(sizeof(TextureCodeword*)*iElementArraySize); + g_TCacheBook[i][j][k]->m_iElementArraySize = iElementArraySize; + g_TCacheBook[i][j][k]->m_iNumEntries = 0; + g_TCacheBook[i][j][k]->m_iTotal = 0; + g_TCacheBook[i][j][k]->m_bID = 0; + } + } + } + + g_aTReferredIndex = (short***)malloc(sizeof(short**)*g_iRHeight); + g_aTContinuousCnt = (short***)malloc(sizeof(short**)*g_iRHeight); + for(i=0;i<g_iRHeight;i++){ + g_aTReferredIndex[i] = (short**)malloc(sizeof(short*)*g_iRWidth); + g_aTContinuousCnt[i] = (short**)malloc(sizeof(short*)*g_iRWidth); + for(j=0;j<g_iRWidth;j++) { + g_aTReferredIndex[i][j] = (short*)malloc(sizeof(short)*g_nNeighborNum); + g_aTContinuousCnt[i][j] = (short*)malloc(sizeof(short)*g_nNeighborNum); + for(k=0;k<g_nNeighborNum;k++){ + g_aTReferredIndex[i][j][k] = -1; + g_aTContinuousCnt[i][j][k] = 0; + } + } + } + } +} +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the memory release function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::T_ReleaseTextureModelRelatedMemory(){ + int i,j,k,m; + short nNeighborNum = g_nNeighborNum; + + for(i=0;i<g_iRHeight;i++){ + for(j=0;j<g_iRWidth;j++){ + for(k=0;k<nNeighborNum;k++){ + for(m=0;m<g_TextureModel[i][j][k]->m_iNumEntries;m++) free(g_TextureModel[i][j][k]->m_Codewords[m]); + free(g_TextureModel[i][j][k]->m_Codewords); + free(g_TextureModel[i][j][k]); + } + free(g_TextureModel[i][j]); + }free(g_TextureModel[i]); + } + free(g_TextureModel); + + for(i=0;i<g_iRHeight;i++){ + for(j=0;j<g_iRWidth;j++) free(g_aNeighborDirection[i][j]); + free(g_aNeighborDirection[i]); + } + free(g_aNeighborDirection); + + for(i=0;i<g_iRHeight;i++) free(g_aTextureConfMap[i]); + free(g_aTextureConfMap); + + if(g_bAbsorptionEnable==TRUE){ + for(i=0;i<g_iRHeight;i++){ + for(j=0;j<g_iRWidth;j++){ + for(k=0;k<nNeighborNum;k++){ + for(m=0;m<g_TCacheBook[i][j][k]->m_iNumEntries;m++) free(g_TCacheBook[i][j][k]->m_Codewords[m]); + free(g_TCacheBook[i][j][k]->m_Codewords); + free(g_TCacheBook[i][j][k]); + } + free(g_TCacheBook[i][j]); + }free(g_TCacheBook[i]); + } + free(g_TCacheBook); + + for(i=0;i<g_iRHeight;i++){ + for(j=0;j<g_iRWidth;j++){ + free(g_aTReferredIndex[i][j]); + free(g_aTContinuousCnt[i][j]); + } + free(g_aTReferredIndex[i]); + free(g_aTContinuousCnt[i]); + } + free(g_aTReferredIndex); + free(g_aTContinuousCnt); + + } +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the codebook construction function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::T_ModelConstruction(short nTrainVolRange,float fLearningRate, uchar*** aXYZ,point center, point* aNei, TextureModel** aModel){ + + int i,j; + int iMatchedIndex; + + short nNeighborNum = g_nNeighborNum; + + float fDifference; + float fDiffMean; + + float fNegLearningRate = 1-fLearningRate; + + //for all neighboring pairs + for(i=0;i<nNeighborNum;i++){ + + fDifference = (float)(aXYZ[center.m_nY][center.m_nX][2] - aXYZ[aNei[i].m_nY][aNei[i].m_nX][2]); + + //Step1: matching + iMatchedIndex = -1; + for(j=0;j<aModel[i]->m_iNumEntries;j++){ + if(aModel[i]->m_Codewords[j]->m_fLowThre <= fDifference && fDifference <= aModel[i]->m_Codewords[j]->m_fHighThre){ + iMatchedIndex = j; + break; + } + } + + aModel[i]->m_iTotal++; + //Step2: adding a new element + if(iMatchedIndex == -1){ + //element array�� Ȯ���� �ʿ䰡 ������ Ȯ�� + if(aModel[i]->m_iElementArraySize == aModel[i]->m_iNumEntries){ + aModel[i]->m_iElementArraySize += 5; + TextureCodeword **temp = (TextureCodeword**)malloc(sizeof(TextureCodeword*)*aModel[i]->m_iElementArraySize); + for(j=0;j<aModel[i]->m_iNumEntries;j++){ + temp[j] = aModel[i]->m_Codewords[j]; + aModel[i]->m_Codewords[j] = NULL; + } + free(aModel[i]->m_Codewords); + aModel[i]->m_Codewords = temp; + } + aModel[i]->m_Codewords[aModel[i]->m_iNumEntries] = (TextureCodeword*)malloc(sizeof(TextureCodeword)); + + aModel[i]->m_Codewords[aModel[i]->m_iNumEntries]->m_fMean = fDifference; + aModel[i]->m_Codewords[aModel[i]->m_iNumEntries]->m_fLowThre = aModel[i]->m_Codewords[aModel[i]->m_iNumEntries]->m_fMean - nTrainVolRange; + aModel[i]->m_Codewords[aModel[i]->m_iNumEntries]->m_fHighThre = aModel[i]->m_Codewords[aModel[i]->m_iNumEntries]->m_fMean + nTrainVolRange; + + aModel[i]->m_Codewords[aModel[i]->m_iNumEntries]->m_iT_first_time = aModel[i]->m_iTotal; + aModel[i]->m_Codewords[aModel[i]->m_iNumEntries]->m_iT_last_time = aModel[i]->m_iTotal; + aModel[i]->m_Codewords[aModel[i]->m_iNumEntries]->m_iMNRL = aModel[i]->m_iTotal-1; + aModel[i]->m_iNumEntries ++; + } + + //Step3: update + else{ + fDiffMean = aModel[i]->m_Codewords[iMatchedIndex]->m_fMean; + aModel[i]->m_Codewords[iMatchedIndex]->m_fMean = fLearningRate*fDifference + fNegLearningRate*fDiffMean; + + aModel[i]->m_Codewords[iMatchedIndex]->m_fLowThre = aModel[i]->m_Codewords[iMatchedIndex]->m_fMean - nTrainVolRange; + aModel[i]->m_Codewords[iMatchedIndex]->m_fHighThre = aModel[i]->m_Codewords[iMatchedIndex]->m_fMean + nTrainVolRange; + + aModel[i]->m_Codewords[iMatchedIndex]->m_iT_last_time = aModel[i]->m_iTotal; + } + + //cache-book handling + if(aModel[i]->m_bID==1){ + //1. m_iMNRL update + int negTime; + for(j=0;j<aModel[i]->m_iNumEntries;j++){ + //m_iMNRL update + negTime = aModel[i]->m_iTotal - aModel[i]->m_Codewords[j]->m_iT_last_time + aModel[i]->m_Codewords[j]->m_iT_first_time - 1; + if(aModel[i]->m_Codewords[j]->m_iMNRL < negTime) aModel[i]->m_Codewords[j]->m_iMNRL = negTime; + } + + + //2. g_aTReferredIndex[center.m_nY][center.m_nX][i] update + if(g_bAbsorptionEnable == TRUE) g_aTReferredIndex[center.m_nY][center.m_nX][i] = -1; + } + + else{ + //1. m_iMNRL update + if(iMatchedIndex == -1) aModel[i]->m_Codewords[aModel[i]->m_iNumEntries-1]->m_iMNRL = 0; + + //2. g_aTReferredIndex[center.m_nY][center.m_nX][i] update + if(iMatchedIndex==-1){ + g_aTReferredIndex[center.m_nY][center.m_nX][i] = aModel[i]->m_iNumEntries-1; + g_aTContinuousCnt[center.m_nY][center.m_nX][i] = 1; + } + else{ + if(iMatchedIndex == g_aTReferredIndex[center.m_nY][center.m_nX][i]) g_aTContinuousCnt[center.m_nY][center.m_nX][i]++; + else{ + g_aTReferredIndex[center.m_nY][center.m_nX][i] = iMatchedIndex; + g_aTContinuousCnt[center.m_nY][center.m_nX][i] = 1; + } + } + } + + } + +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// Clear non-essential codewords of the given codebook // // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::T_ClearNonEssentialEntries(short nClearNum, TextureModel** aModel){ + int i,n; + int iStaleThresh = (int)(nClearNum*0.5); + int iKeepCnt; + int* aKeep; + + short nNeighborNum = g_nNeighborNum; + + TextureModel* c; + + for(n=0;n<nNeighborNum;n++){ + c = aModel[n]; + + if(c->m_iTotal < nClearNum) continue; //(being operated only when c[w][h]->m_iTotal == nClearNum) + + //Step1: initialization + aKeep = (int*)malloc(sizeof(int)*c->m_iNumEntries); + + iKeepCnt = 0; + + //Step2: Find non-essential code-words + for(i=0;i<c->m_iNumEntries;i++){ + if(c->m_Codewords[i]->m_iMNRL > iStaleThresh) { + aKeep[i] = 0; //removal candidate + } + else { + aKeep[i] = 1; + iKeepCnt++; + } + } + + //Step3: Perform removal + if(iKeepCnt==0 || iKeepCnt==c->m_iNumEntries){ + for(i=0;i<c->m_iNumEntries;i++){ + c->m_Codewords[i]->m_iT_first_time = 1; + c->m_Codewords[i]->m_iT_last_time = 1; + c->m_Codewords[i]->m_iMNRL = 0; + } + } + + else{ + iKeepCnt = 0; + TextureCodeword** temp = (TextureCodeword**)malloc(sizeof(TextureCodeword*)*c->m_iNumEntries); + + for(i=0;i<c->m_iNumEntries;i++){ + if(aKeep[i] == 1){ + temp[iKeepCnt] = c->m_Codewords[i]; + temp[iKeepCnt]->m_iT_first_time = 1; + temp[iKeepCnt]->m_iT_last_time = 1; + temp[iKeepCnt]->m_iMNRL = 0; + iKeepCnt++; + } + else free(c->m_Codewords[i]); + } + + //ending.. + free(c->m_Codewords); + c->m_Codewords = temp; + c->m_iElementArraySize = c->m_iNumEntries; + c->m_iNumEntries = iKeepCnt; + } + c->m_iTotal=0; + free(aKeep); + + } + +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// Clear non-essential codewords of the given codebook (only for the cache-book) // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::T_ClearNonEssentialEntriesForCachebook(uchar bLandmark, short* nReferredIdxArr, short nClearNum, TextureModel** pCachebook){ + int i,n; + short nNeighborNum = g_nNeighborNum; + + TextureModel* c; + short nReferredIdx; + + for(n=0;n<nNeighborNum;n++){ + + c = pCachebook[n]; + nReferredIdx = nReferredIdxArr[n]; + + //pCachebook->m_iTotal < nClearNum? --> MNRL update + if(c->m_iTotal<nClearNum) { + for(i=0;i<c->m_iNumEntries;i++){ + if(bLandmark == 255 && i == nReferredIdx) c->m_Codewords[i]->m_iMNRL = 0; + else c->m_Codewords[i]->m_iMNRL++; + } + + c->m_iTotal++; + } + + //Perform clearing + else{ + int iStaleThreshold = 5; + + int* aKeep; + short nKeepCnt; + + aKeep = (int*)malloc(sizeof(int)*c->m_iNumEntries); + nKeepCnt = 0; + + for(i=0;i<c->m_iNumEntries;i++){ + if(c->m_Codewords[i]->m_iMNRL<iStaleThreshold){ + aKeep[i] = 1; + nKeepCnt++; + } + else aKeep[i] = 0; + } + + c->m_iElementArraySize = nKeepCnt+2; + if(c->m_iElementArraySize<3) c->m_iElementArraySize = 3; + + TextureCodeword** temp = (TextureCodeword**)malloc(sizeof(TextureCodeword*)*c->m_iElementArraySize); + nKeepCnt = 0; + + for(i=0;i<c->m_iNumEntries;i++){ + if(aKeep[i]==1){ + temp[nKeepCnt] = c->m_Codewords[i]; + temp[nKeepCnt]->m_iMNRL = 0; + nKeepCnt++; + } + else { + free(c->m_Codewords[i]); + } + + } + + //ending.. + free(c->m_Codewords); + c->m_Codewords = temp; + c->m_iNumEntries = nKeepCnt; + c->m_iTotal = 0; + + free(aKeep); + } + } + +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the function to generate texture confidence maps // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::T_GetConfidenceMap_Par(uchar*** aXYZ, float** aTextureMap, point*** aNeiDirArr, TextureModel**** aModel){ + + int iBound_w = g_iRWidth-g_nRadius; + int iBound_h = g_iRHeight-g_nRadius; + + short nNeighborNum = g_nNeighborNum; + float fPadding = 5; + + for(int h=0; h<g_iRHeight; h++){ + for(int w=0;w<g_iRWidth;w++){ + + if(h<g_nRadius || h>=iBound_h || w<g_nRadius || w>=iBound_w){ + aTextureMap[h][w] = 0; + continue; + } + + int nMatchedCount = 0; + float fDiffSum = 0; + float fDifference; + point nei; + + for(int i=0;i<nNeighborNum;i++){ + + nei.m_nX = aNeiDirArr[h][w][i].m_nX; + nei.m_nY = aNeiDirArr[h][w][i].m_nY; + + fDifference = (float)(aXYZ[h][w][2] - aXYZ[nei.m_nY][nei.m_nX][2]); + if(fDifference<0) fDiffSum -= fDifference; + else fDiffSum += fDifference; + + for(int j=0;j<aModel[h][w][i]->m_iNumEntries;j++){ + if(aModel[h][w][i]->m_Codewords[j]->m_fLowThre-fPadding <= fDifference && fDifference <= aModel[h][w][i]->m_Codewords[j]->m_fHighThre+fPadding){ + nMatchedCount++; + break; + } + } + + } + aTextureMap[h][w] = 1 - (float)nMatchedCount/nNeighborNum; + } + } +} +//-----------------------------------------------------------------------------------------------------------------------------------------// +// Absorbing Ghost Non-background Region Update // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::T_Absorption(int iAbsorbCnt, point pos, short*** aContinuCnt, short*** aRefferedIndex, TextureModel** pModel, TextureModel** pCache){ + int i,j,k; + int iLeavingIndex; + + short g_nRadius = 2; + short nNeighborNum = g_nNeighborNum; + + for(i=0;i<nNeighborNum;i++){ + //set iLeavingIndex + if(aContinuCnt[pos.m_nY][pos.m_nX][i]<iAbsorbCnt) continue; + + iLeavingIndex = aRefferedIndex[pos.m_nY][pos.m_nX][i]; + + //array expansion + if(pModel[i]->m_iElementArraySize==pModel[i]->m_iNumEntries){ + pModel[i]->m_iElementArraySize = pModel[i]->m_iElementArraySize+5; + TextureCodeword** temp = (TextureCodeword**)malloc(sizeof(TextureCodeword*)*pModel[i]->m_iElementArraySize); + for(j=0;j<pModel[i]->m_iNumEntries;j++) temp[j] = pModel[i]->m_Codewords[j]; + free(pModel[i]->m_Codewords); + pModel[i]->m_Codewords = temp; + } + + //movement from the cache-book to the codebook + pModel[i]->m_Codewords[pModel[i]->m_iNumEntries] = pCache[i]->m_Codewords[iLeavingIndex]; + + pModel[i]->m_iTotal = pModel[i]->m_iTotal+1; + + pModel[i]->m_Codewords[pModel[i]->m_iNumEntries]->m_iT_first_time = pModel[i]->m_iTotal; + pModel[i]->m_Codewords[pModel[i]->m_iNumEntries]->m_iT_last_time = pModel[i]->m_iTotal; + pModel[i]->m_Codewords[pModel[i]->m_iNumEntries]->m_iMNRL = pModel[i]->m_iTotal-1; + pModel[i]->m_iNumEntries = pModel[i]->m_iNumEntries + 1; + + k=0; + TextureCodeword **temp_Cache = (TextureCodeword**)malloc(sizeof(TextureCodeword*)*pCache[i]->m_iElementArraySize); + for(j=0;j<pCache[i]->m_iNumEntries;j++){ + if(j==iLeavingIndex) continue; + else{ + temp_Cache[k] = pCache[i]->m_Codewords[j]; + k++; + } + } + free(pCache[i]->m_Codewords); + pCache[i]->m_Codewords = temp_Cache; + pCache[i]->m_iNumEntries = k; + } +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the function to set neighborhood system // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::T_SetNeighborDirection(point*** aNeighborPos){ + int i,j,k; + point* aSearchDirection = (point*)malloc(sizeof(point)*g_nNeighborNum); + + aSearchDirection[0].m_nX = -2;//180 degree + aSearchDirection[0].m_nY = 0; + + aSearchDirection[1].m_nX = -1;//123 degree + aSearchDirection[1].m_nY = -2; + + aSearchDirection[2].m_nX = 1;//45 degree + aSearchDirection[2].m_nY = -2; + + aSearchDirection[3].m_nX = 2;//0 degree + aSearchDirection[3].m_nY = 0; + + aSearchDirection[4].m_nX = 1;//-45 degree + aSearchDirection[4].m_nY = 2; + + aSearchDirection[5].m_nX = -1;//-135 degree + aSearchDirection[5].m_nY = 2; + + point temp_pos; + + for(i=0;i<g_iRHeight;i++){ + for(j=0;j<g_iRWidth;j++){ + for(k=0;k<g_nNeighborNum;k++){ + temp_pos.m_nX = j+aSearchDirection[k].m_nX; + temp_pos.m_nY = i+aSearchDirection[k].m_nY; + + if(temp_pos.m_nX<0 || temp_pos.m_nX>=g_iRWidth || temp_pos.m_nY<0 || temp_pos.m_nY>=g_iRHeight) { + aNeighborPos[i][j][k].m_nX = -1; + aNeighborPos[i][j][k].m_nY = -1; + } + + else { + aNeighborPos[i][j][k].m_nX = temp_pos.m_nX; + aNeighborPos[i][j][k].m_nY = temp_pos.m_nY; + } + } + } + } + free(aSearchDirection); +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the color-model initialization function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::C_AllocateColorModelRelatedMemory(){ + int i,j; + + int iElementArraySize = 10; + + //codebook initialization + g_ColorModel = (ColorModel***)malloc(sizeof(ColorModel**)*g_iRHeight); + for(i=0;i<g_iRHeight;i++){ + g_ColorModel[i] = (ColorModel**)malloc(sizeof(ColorModel*)*g_iRWidth); + for(j=0;j<g_iRWidth;j++){ + //initialization of each CodeBookArray. + g_ColorModel[i][j] = (ColorModel*)malloc(sizeof(ColorModel)); + g_ColorModel[i][j]->m_Codewords = (ColorCodeword**)malloc(sizeof(ColorCodeword*)*iElementArraySize); + g_ColorModel[i][j]->m_iNumEntries = 0; + g_ColorModel[i][j]->m_iElementArraySize = iElementArraySize; + g_ColorModel[i][j]->m_iTotal = 0; + g_ColorModel[i][j]->m_bID = 1; + } + } + + //cache-book initialization + if(g_bAbsorptionEnable==TRUE){ + iElementArraySize = 3; + + g_CCacheBook = (ColorModel***)malloc(sizeof(ColorModel**)*g_iRHeight); + for(i=0;i<g_iRHeight;i++){ + g_CCacheBook[i] = (ColorModel**)malloc(sizeof(ColorModel*)*g_iRWidth); + for(j=0;j<g_iRWidth;j++){ + //initialization of each CodeBookArray. + g_CCacheBook[i][j] = (ColorModel*)malloc(sizeof(ColorModel)); + g_CCacheBook[i][j]->m_Codewords = (ColorCodeword**)malloc(sizeof(ColorCodeword*)*iElementArraySize); + g_CCacheBook[i][j]->m_iNumEntries = 0; + g_CCacheBook[i][j]->m_iElementArraySize = iElementArraySize; + g_CCacheBook[i][j]->m_iTotal = 0; + g_CCacheBook[i][j]->m_bID = 0; + } + } + + g_aCReferredIndex = (short**)malloc(sizeof(short*)*g_iRHeight); + g_aCContinuousCnt = (short**)malloc(sizeof(short*)*g_iRHeight); + for(i=0;i<g_iRHeight;i++){ + g_aCReferredIndex[i] = (short*)malloc(sizeof(short)*g_iRWidth); + g_aCContinuousCnt[i] = (short*)malloc(sizeof(short)*g_iRWidth); + for(j=0;j<g_iRWidth;j++){ + g_aCReferredIndex[i][j] = -1; + g_aCContinuousCnt[i][j] = 0; + } + } + } +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the memory release function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::C_ReleaseColorModelRelatedMemory(){ + int i,j,k; + + for(i=0;i<g_iRHeight;i++){ + for(j=0;j<g_iRWidth;j++){ + for(k=0;k<g_ColorModel[i][j]->m_iNumEntries;k++){ + free(g_ColorModel[i][j]->m_Codewords[k]); + } + free(g_ColorModel[i][j]->m_Codewords); + free(g_ColorModel[i][j]); + } + free(g_ColorModel[i]); + } + free(g_ColorModel); + + if(g_bAbsorptionEnable==TRUE){ + for(i=0;i<g_iRHeight;i++){ + for(j=0;j<g_iRWidth;j++){ + for(k=0;k<g_CCacheBook[i][j]->m_iNumEntries;k++){ + free(g_CCacheBook[i][j]->m_Codewords[k]); + } + free(g_CCacheBook[i][j]->m_Codewords); + free(g_CCacheBook[i][j]); + } + free(g_CCacheBook[i]); + } + free(g_CCacheBook); + + for(i=0;i<g_iRHeight;i++){ + free(g_aCReferredIndex[i]); + free(g_aCContinuousCnt[i]); + } + free(g_aCReferredIndex); + free(g_aCContinuousCnt); + } +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the codebook construction function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::C_CodebookConstruction(uchar* aP,int iPosX, int iPosY, short nTrainVolRange, float fLearningRate, ColorModel* pC){ + + //Step1: matching + int i,j; + short nMatchedIndex; + + float fNegLearningRate = 1-fLearningRate; + + nMatchedIndex = -1; + + for(i=0;i<pC->m_iNumEntries;i++){ + + //Checking X + if(pC->m_Codewords[i]->m_dMean[0]-nTrainVolRange <= aP[0] && aP[0] <= pC->m_Codewords[i]->m_dMean[0]+nTrainVolRange){ + //Checking Y + if(pC->m_Codewords[i]->m_dMean[1]-nTrainVolRange <= aP[1] && aP[1] <= pC->m_Codewords[i]->m_dMean[1]+nTrainVolRange){ + //Checking Z + if(pC->m_Codewords[i]->m_dMean[2]-nTrainVolRange <= aP[2] && aP[2] <= pC->m_Codewords[i]->m_dMean[2]+nTrainVolRange){ + nMatchedIndex = i; + break; + } + } + } + } + + pC->m_iTotal = pC->m_iTotal+1; + + //Step2 : adding a new element + if(nMatchedIndex==-1){ + if(pC->m_iElementArraySize == pC->m_iNumEntries){ + pC->m_iElementArraySize = pC->m_iElementArraySize + 5; + ColorCodeword **temp = (ColorCodeword**)malloc(sizeof(ColorCodeword*)*pC->m_iElementArraySize); + for(j=0;j<pC->m_iNumEntries;j++){ + temp[j] = pC->m_Codewords[j]; + pC->m_Codewords[j]= NULL; + } + free(pC->m_Codewords); + pC->m_Codewords = temp; + + } + pC->m_Codewords[pC->m_iNumEntries] = (ColorCodeword*)malloc(sizeof(ColorCodeword)); + + pC->m_Codewords[pC->m_iNumEntries]->m_dMean[0] = aP[0];//X + pC->m_Codewords[pC->m_iNumEntries]->m_dMean[1] = aP[1];//Y + pC->m_Codewords[pC->m_iNumEntries]->m_dMean[2] = aP[2];//Z + + pC->m_Codewords[pC->m_iNumEntries]->m_iT_first_time = pC->m_iTotal; + pC->m_Codewords[pC->m_iNumEntries]->m_iT_last_time = pC->m_iTotal; + pC->m_Codewords[pC->m_iNumEntries]->m_iMNRL = pC->m_iTotal-1; + pC->m_iNumEntries = pC->m_iNumEntries + 1; + } + + //Step3 : update + else{ + //m_dMean update + pC->m_Codewords[nMatchedIndex]->m_dMean[0] = (fLearningRate*aP[0]) + fNegLearningRate*pC->m_Codewords[nMatchedIndex]->m_dMean[0];//X + pC->m_Codewords[nMatchedIndex]->m_dMean[1] = (fLearningRate*aP[1]) + fNegLearningRate*pC->m_Codewords[nMatchedIndex]->m_dMean[1];//Y + pC->m_Codewords[nMatchedIndex]->m_dMean[2] = (fLearningRate*aP[2]) + fNegLearningRate*pC->m_Codewords[nMatchedIndex]->m_dMean[2];//Z + + pC->m_Codewords[nMatchedIndex]->m_iT_last_time = pC->m_iTotal; + } + + //cache-book handling + if(pC->m_bID==1){ + //1. m_iMNRL update + int iNegTime; + for(i=0;i<pC->m_iNumEntries;i++){ + //m_iMNRL update + iNegTime = pC->m_iTotal - pC->m_Codewords[i]->m_iT_last_time + pC->m_Codewords[i]->m_iT_first_time - 1; + if(pC->m_Codewords[i]->m_iMNRL < iNegTime) pC->m_Codewords[i]->m_iMNRL = iNegTime; + } + + //2. g_aCReferredIndex[iPosY][iPosX] update + if(g_bAbsorptionEnable == TRUE) g_aCReferredIndex[iPosY][iPosX] = -1; + } + + else{ + //1. m_iMNRL update: + if(nMatchedIndex == -1) pC->m_Codewords[pC->m_iNumEntries-1]->m_iMNRL = 0; + + //2. g_aCReferredIndex[iPosY][iPosX] update + if(nMatchedIndex==-1){ + g_aCReferredIndex[iPosY][iPosX] = pC->m_iNumEntries-1; + g_aCContinuousCnt[iPosY][iPosX] = 1; + } + else{ + if(nMatchedIndex == g_aCReferredIndex[iPosY][iPosX]) g_aCContinuousCnt[iPosY][iPosX]++; + else{ + g_aCReferredIndex[iPosY][iPosX] = nMatchedIndex; + g_aCContinuousCnt[iPosY][iPosX] = 1; + } + } + } +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// Clear non-essential codewords of the given codebook // // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::C_ClearNonEssentialEntries(short nClearNum, ColorModel* pModel){ + int i; + short nStaleThresh = (int)(nClearNum*0.5); + short nKeepCnt; + int* aKeep; + + ColorModel* pC = pModel; + + if(pC->m_iTotal < nClearNum) return; //(Being operated only when pC->t >= nClearNum) + + //Step1:initialization + aKeep = (int*)malloc(sizeof(int)*pC->m_iNumEntries); + + nKeepCnt = 0; + + //Step2: Find non-essential codewords + for(i=0;i<pC->m_iNumEntries;i++){ + if(pC->m_Codewords[i]->m_iMNRL > nStaleThresh) { + aKeep[i] = 0; //removal + } + else { + aKeep[i] = 1; //keep + nKeepCnt++; + } + } + + //Step3: Perform removal + if(nKeepCnt==0 || nKeepCnt==pC->m_iNumEntries){ + for(i=0;i<pC->m_iNumEntries;i++){ + pC->m_Codewords[i]->m_iT_first_time = 1; + pC->m_Codewords[i]->m_iT_last_time = 1; + pC->m_Codewords[i]->m_iMNRL = 0; + } + } + else{ + nKeepCnt = 0; + ColorCodeword** temp = (ColorCodeword**)malloc(sizeof(ColorCodeword*)*pC->m_iNumEntries); + + for(i=0;i<pC->m_iNumEntries;i++){ + if(aKeep[i] == 1){ + temp[nKeepCnt] = pC->m_Codewords[i]; + temp[nKeepCnt]->m_iT_first_time = 1; + temp[nKeepCnt]->m_iT_last_time = 1; + temp[nKeepCnt]->m_iMNRL = 0; + nKeepCnt++; + } + else free(pC->m_Codewords[i]); + } + + //ending.. + free(pC->m_Codewords); + pC->m_Codewords = temp; + pC->m_iElementArraySize = pC->m_iNumEntries; + pC->m_iNumEntries = nKeepCnt; + } + + pC->m_iTotal=0; + free(aKeep); + +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// Clear non-essential codewords of the given codebook (for cache-book) // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::C_ClearNonEssentialEntriesForCachebook(uchar bLandmark, short nReferredIdx, short nClearNum, ColorModel* pCachebook){ + int i; + + if(pCachebook->m_iTotal<nClearNum) { + for(i=0;i<pCachebook->m_iNumEntries;i++){ + if(bLandmark == 255 && i == nReferredIdx) pCachebook->m_Codewords[i]->m_iMNRL = 0; + else pCachebook->m_Codewords[i]->m_iMNRL++; + } + + pCachebook->m_iTotal++; + } + + else{ + int iStaleThreshold = 5; + + int* aKeep; + short nKeepCnt; + + aKeep = (int*)malloc(sizeof(int)*pCachebook->m_iNumEntries); + nKeepCnt = 0; + + for(i=0;i<pCachebook->m_iNumEntries;i++){ + if(pCachebook->m_Codewords[i]->m_iMNRL<iStaleThreshold){ + aKeep[i] = 1; + nKeepCnt++; + } + else aKeep[i] = 0; + } + + pCachebook->m_iElementArraySize = nKeepCnt+2; + if(pCachebook->m_iElementArraySize<3) pCachebook->m_iElementArraySize = 3; + + ColorCodeword** temp = (ColorCodeword**)malloc(sizeof(ColorCodeword*)*pCachebook->m_iElementArraySize); + nKeepCnt = 0; + + for(i=0;i<pCachebook->m_iNumEntries;i++){ + if(aKeep[i]==1){ + temp[nKeepCnt] = pCachebook->m_Codewords[i]; + temp[nKeepCnt]->m_iMNRL = 0; + nKeepCnt++; + } + else { + free(pCachebook->m_Codewords[i]); + } + + } + + //ending.. + free(pCachebook->m_Codewords); + pCachebook->m_Codewords = temp; + pCachebook->m_iNumEntries = nKeepCnt; + pCachebook->m_iTotal = 0; + + free(aKeep); + } +} + +//-----------------------------------------------------------------------------------------------------------------------------------------// +// the ghost-region absorption function // +//-----------------------------------------------------------------------------------------------------------------------------------------// +void SJN_MultiCueBGS::C_Absorption(int iAbsorbCnt, point pos, short** aContinuCnt, short** aRefferedIndex, ColorModel* pModel, ColorModel* pCache){ + + //set iLeavingIndex + if(aContinuCnt[pos.m_nY][pos.m_nX]<iAbsorbCnt) return; + + int iLeavingIndex = aRefferedIndex[pos.m_nY][pos.m_nX]; + + //array expansion + if(pModel->m_iElementArraySize==pModel->m_iNumEntries){ + pModel->m_iElementArraySize = pModel->m_iElementArraySize+5; + ColorCodeword** temp = (ColorCodeword**)malloc(sizeof(ColorCodeword*)*pModel->m_iElementArraySize); + for(int i=0;i<pModel->m_iNumEntries;i++) temp[i] = pModel->m_Codewords[i]; + free(pModel->m_Codewords); + pModel->m_Codewords = temp; + } + + //movement from the cache-book to the codebook + pModel->m_Codewords[pModel->m_iNumEntries] = pCache->m_Codewords[iLeavingIndex]; + + pModel->m_iTotal = pModel->m_iTotal+1; + + pModel->m_Codewords[pModel->m_iNumEntries]->m_iT_first_time = pModel->m_iTotal; + pModel->m_Codewords[pModel->m_iNumEntries]->m_iT_last_time = pModel->m_iTotal; + pModel->m_Codewords[pModel->m_iNumEntries]->m_iMNRL = pModel->m_iTotal-1; + + pModel->m_iNumEntries = pModel->m_iNumEntries + 1; + + int k=0; + ColorCodeword **pTempCache = (ColorCodeword**)malloc(sizeof(ColorCodeword*)*pCache->m_iElementArraySize); + for(int i=0;i<pCache->m_iNumEntries;i++){ + if(i==iLeavingIndex) continue; + else{ + pTempCache[k] = pCache->m_Codewords[i]; + k++; + } + } + free(pCache->m_Codewords); + pCache->m_Codewords = pTempCache; + pCache->m_iNumEntries = k; +} \ No newline at end of file diff --git a/package_bgs/sjn/SJN_MultiCueBGS.h b/package_bgs/sjn/SJN_MultiCueBGS.h new file mode 100644 index 0000000..1d5dd73 --- /dev/null +++ b/package_bgs/sjn/SJN_MultiCueBGS.h @@ -0,0 +1,243 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#define MIN3(x,y,z) ((y) <= (z) ? ((x) <= (y) ? (x) : (y)) : ((x) <= (z) ? (x) : (z))) +#define MAX3(x,y,z) ((y) >= (z) ? ((x) >= (y) ? (x) : (y)) : ((x) >= (z) ? (x) : (z))) +#define PI 3.14159 + +typedef int BOOL; + +#ifndef FALSE + #define FALSE 0 +#endif + +#ifndef TRUE + #define TRUE 1 +#endif + +#include <malloc.h> +#include "math.h" + +#include <vector> +using std::vector; + +#include <algorithm> +using std::sort; + +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" + +//------------------------------------Structure Lists-------------------------------------// +struct point{ + short m_nX; + short m_nY; +}; + +struct neighbor_pos{ + short m_nX; + short m_nY; +}; +//1) Bounding Box Structure +struct BoundingBoxInfo{ + int m_iBoundBoxNum; //# of bounding boxes for all foreground and false-positive blobs + int m_iArraySize; //the size of the below arrays to store bounding box information + + short *m_aLeft, *m_aRight, *m_aUpper, *m_aBottom; //arrays to store bounding box information for (the original frame size) + short *m_aRLeft, *m_aRRight, *m_aRUpper, *m_aRBottom; //arrays to store bounding box information for (the reduced frame size) + BOOL* m_ValidBox; //If this value is true, the corresponding bounding box is for a foreground blob. + //Else, it is for a false-positive blob +}; + +//2) Texture Model Structure +struct TextureCodeword{ + int m_iMNRL; //the maximum negative run-length + int m_iT_first_time; //the first access time + int m_iT_last_time; //the last access time + + //��� MTLBP�� + float m_fLowThre; //a low threshold for the matching + float m_fHighThre; //a high threshold for the matching + float m_fMean; //mean of the codeword +}; + +struct TextureModel{ + TextureCodeword** m_Codewords; //the texture-codeword Array + + int m_iTotal; //# of learned samples after the last clear process + int m_iElementArraySize; //the array size of m_Codewords + int m_iNumEntries; //# of codewords + + BOOL m_bID; //id=1 --> background model, id=0 --> cachebook +}; + +//3) Color Model Structure +struct ColorCodeword{ + int m_iMNRL; //the maximum negative run-length + int m_iT_first_time; //the first access time + int m_iT_last_time; //the last access time + + double m_dMean[3]; //mean vector of the codeword + +}; + +struct ColorModel{ + ColorCodeword** m_Codewords; //the color-codeword Array + + int m_iTotal; //# of learned samples after the last clear process + int m_iElementArraySize; //the array size of m_Codewords + int m_iNumEntries; //# of codewords + + BOOL m_bID; //id=1 --> background model, id=0 --> cachebookk +}; + + +class SJN_MultiCueBGS : public IBGS +{ +private: + bool firstTime; + bool showOutput; + void saveConfig(); + void loadConfig(); + +public: + SJN_MultiCueBGS(); + ~SJN_MultiCueBGS(void); + +public: + //---------------------------------------------------- + // APIs and User-Adjustable Parameters + //---------------------------------------------------- + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); //the main function to background modeling and subtraction + + void GetForegroundMap(IplImage* return_image, IplImage* input_frame=NULL); //the function returning a foreground binary-map + void Destroy(); //the function to release allocated memories + + int g_iTrainingPeriod; //the training period (The parameter t in the paper) + int g_iT_ModelThreshold; //the threshold for texture-model based BGS. (The parameter tau_T in the paper) + int g_iC_ModelThreshold; //the threshold for appearance based verification. (The parameter tau_A in the paper) + + float g_fLearningRate; //the learning rate for background models. (The parameter alpha in the paper) + + short g_nTextureTrainVolRange; //the codebook size factor for texture models. (The parameter k in the paper) + short g_nColorTrainVolRange; //the codebook size factor for color models. (The parameter eta_1 in the paper) + +public: + //---------------------------------------------------- + // Implemented Function Lists + //---------------------------------------------------- + + //--1) General Functions + void Initialize(IplImage* frame); + + void PreProcessing(IplImage* frame); + void ReduceImageSize(IplImage* SrcImage, IplImage* DstImage); + void GaussianFiltering(IplImage* frame, uchar*** aFilteredFrame); + void BGR2HSVxyz_Par(uchar*** aBGR, uchar*** aXYZ); + + void BackgroundModeling_Par(IplImage* frame); + void ForegroundExtraction(IplImage* frame); + void CreateLandmarkArray_Par(float fConfThre, short nTrainVolRange, float**aConfMap, int iNehborNum, uchar*** aXYZ, + point*** aNeiDir, TextureModel**** TModel, ColorModel*** CModel, uchar**aLandmarkArr); + + void PostProcessing(IplImage* frame); + void MorphologicalOpearions(uchar** aInput, uchar** aOutput, double dThresholdRatio, int iMaskSize, int iWidth, int iHeight); + void Labeling(uchar** aBinaryArray, int* pLabelCount, int** aLabelTable); + void SetBoundingBox(int iLabelCount, int** aLabelTable); + void BoundBoxVerification(IplImage* frame, uchar** aResForeMap, BoundingBoxInfo* BoundBoxInfo); + void EvaluateBoxSize( BoundingBoxInfo* BoundBoxInfo); + void EvaluateOverlapRegionSize(BoundingBoxInfo* SrcBoxInfo); + void EvaluateGhostRegion(IplImage* frame, uchar** aResForeMap, BoundingBoxInfo* BoundBoxInfo); + double CalculateHausdorffDist(IplImage* input_image, IplImage* model_image); + void RemovingInvalidForeRegions(uchar** aResForeMap, BoundingBoxInfo* BoundBoxInfo); + + void UpdateModel_Par(); + void GetEnlargedMap(float** aOriginMap, float** aEnlargedMap); + + //--2) Texture Model Related Functions + void T_AllocateTextureModelRelatedMemory(); + void T_ReleaseTextureModelRelatedMemory(); + void T_SetNeighborDirection(point*** aNeighborPos); + void T_ModelConstruction(short nTrainVolRange,float fLearningRate, uchar*** aXYZ,point center, point* aNei, TextureModel** aModel); + void T_ClearNonEssentialEntries(short nClearNum, TextureModel** aModel); + void T_ClearNonEssentialEntriesForCachebook(uchar bLandmark, short* nReferredIdxArr, short nClearNum, TextureModel** pCachebook); + void T_GetConfidenceMap_Par(uchar*** aXYZ, float** aTextureMap, point*** aNeiDirArr, TextureModel**** aModel); + void T_Absorption(int iAbsorbCnt, point pos, short*** aContinuCnt, short*** aRefferedIndex, TextureModel** pModel, TextureModel** pCache); + + //--3) Color Model Related Functions + void C_AllocateColorModelRelatedMemory(); + void C_ReleaseColorModelRelatedMemory(); + void C_CodebookConstruction(uchar* aP,int iPosX, int iPosY, short nTrainVolRange, float fLearningRate, ColorModel* pC); + void C_ClearNonEssentialEntries(short nClearNum, ColorModel* pModel); + void C_ClearNonEssentialEntriesForCachebook(uchar bLandmark, short nReferredIdx, short nClearNum, ColorModel* pCachebook); + void C_Absorption(int iAbsorbCnt, point pos , short** aContinuCnt, short** aRefferedIndex, ColorModel* pModel, ColorModel* pCache); +public: + //---------------------------------------------------- + // Implemented Variable Lists + //---------------------------------------------------- + + //--1) General Variables + int g_iFrameCount; //the counter of processed frames + + int g_iBackClearPeriod; //the period to clear background models + int g_iCacheClearPeriod; //the period to clear cache-book models + + int g_iAbsortionPeriod; //the period to absorb static ghost regions + BOOL g_bAbsorptionEnable; //If True, procedures for ghost region absorption are activated. + + BOOL g_bModelMemAllocated; //To handle memory.. + BOOL g_bNonModelMemAllocated; //To handle memory.. + + float g_fConfidenceThre; //the final decision threshold + + int g_iWidth, g_iHeight; //width and height of input frames + int g_iRWidth, g_iRHeight; //width and height of reduced frames (For efficiency, the reduced size of frames are processed) + int g_iForegroundNum; //# of detected foreground regions + BOOL g_bForegroundMapEnable; //TRUE only when BGS is successful + + IplImage* g_ResizedFrame; //reduced size of frame (For efficiency, the reduced size of frames are processed) + uchar*** g_aGaussFilteredFrame; + uchar*** g_aXYZFrame; + uchar** g_aLandmarkArray; //the landmark map + uchar** g_aResizedForeMap; //the resized foreground map + uchar** g_aForegroundMap; //the final foreground map + BOOL** g_aUpdateMap; //the location map of update candidate pixels + + BoundingBoxInfo* g_BoundBoxInfo; //the array of bounding boxes of each foreground blob + + //--2) Texture Model Related + TextureModel**** g_TextureModel; //the texture background model + TextureModel**** g_TCacheBook; //the texture cache-book + short*** g_aTReferredIndex; //To handle cache-book + short*** g_aTContinuousCnt; //To handle cache-book + point*** g_aNeighborDirection; + float**g_aTextureConfMap; //the texture confidence map + + short g_nNeighborNum; //# of neighborhoods + short g_nRadius; + short g_nBoundarySize; + + //--3) Texture Model Related + ColorModel*** g_ColorModel; //the color background model + ColorModel*** g_CCacheBook; //the color cache-book + short** g_aCReferredIndex; //To handle cache-book + short** g_aCContinuousCnt; //To handle cache-book +}; + + diff --git a/package_bgs/tb/FuzzyChoquetIntegral.cpp b/package_bgs/tb/FuzzyChoquetIntegral.cpp new file mode 100644 index 0000000..7d0bf90 --- /dev/null +++ b/package_bgs/tb/FuzzyChoquetIntegral.cpp @@ -0,0 +1,204 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "FuzzyChoquetIntegral.h" + +FuzzyChoquetIntegral::FuzzyChoquetIntegral() : firstTime(true), frameNumber(0), showOutput(true), + framesToLearn(10), alphaLearn(0.1), alphaUpdate(0.01), colorSpace(1), option(2), smooth(true), threshold(0.67) +{ + std::cout << "FuzzyChoquetIntegral()" << std::endl; +} + +FuzzyChoquetIntegral::~FuzzyChoquetIntegral() +{ + std::cout << "~FuzzyChoquetIntegral()" << std::endl; +} + +void FuzzyChoquetIntegral::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + cv::Mat img_input_f3(img_input.size(), CV_32F); + img_input.convertTo(img_input_f3, CV_32F, 1./255.); + + loadConfig(); + + if(firstTime) + { + std::cout << "FuzzyChoquetIntegral parameters:" << std::endl; + + std::string colorSpaceName = ""; + switch(colorSpace) + { + case 1: colorSpaceName = "RGB"; break; + case 2: colorSpaceName = "OHTA"; break; + case 3: colorSpaceName = "HSV"; break; + case 4: colorSpaceName = "YCrCb"; break; + } + std::cout << "Color space: " << colorSpaceName << std::endl; + + if(option == 1) + std::cout << "Fuzzing by 3 color components" << std::endl; + if(option == 2) + std::cout << "Fuzzing by 2 color components + 1 texture component" << std::endl; + + saveConfig(); + } + + if(frameNumber <= framesToLearn) + { + if(frameNumber == 0) + std::cout << "FuzzyChoquetIntegral initializing background model by adaptive learning..." << std::endl; + + if(img_background_f3.empty()) + img_input_f3.copyTo(img_background_f3); + else + img_background_f3 = alphaLearn*img_input_f3 + (1-alphaLearn)*img_background_f3; + + if(showOutput) + cv::imshow("CI BG Model", img_background_f3); + } + else + { + cv::Mat img_input_f1; + cv::cvtColor(img_input_f3, img_input_f1, CV_BGR2GRAY); + + cv::Mat img_background_f1; + cv::cvtColor(img_background_f3, img_background_f1, CV_BGR2GRAY); + + IplImage* input_f3 = new IplImage(img_input_f3); + IplImage* input_f1 = new IplImage(img_input_f1); + IplImage* background_f3 = new IplImage(img_background_f3); + IplImage* background_f1 = new IplImage(img_background_f1); + + IplImage* lbp_input_f1 = cvCreateImage(cvSize(input_f1->width, input_f1->height), IPL_DEPTH_32F, 1); + cvFillImage(lbp_input_f1, 0.0); + fu.LBP(input_f1, lbp_input_f1); + + IplImage* lbp_background_f1 = cvCreateImage(cvSize(background_f1->width, background_f1->height), IPL_DEPTH_32F , 1); + cvFillImage(lbp_background_f1, 0.0); + fu.LBP(background_f1, lbp_background_f1); + + IplImage* sim_texture_f1 = cvCreateImage(cvSize(input_f1->width, input_f1->height), IPL_DEPTH_32F, 1); + fu.SimilarityDegreesImage(lbp_input_f1, lbp_background_f1, sim_texture_f1, 1, colorSpace); + + IplImage* sim_color_f3 = cvCreateImage(cvSize(input_f3->width, input_f3->height), IPL_DEPTH_32F, 3); + fu.SimilarityDegreesImage(input_f3, background_f3, sim_color_f3, 3, colorSpace); + + float* measureG = (float*) malloc(3*(sizeof(float))); + IplImage* integral_choquet_f1 = cvCreateImage(cvSize(input_f1->width, input_f1->height), IPL_DEPTH_32F, 1); + + // 3 color components + if(option == 1) + { + fu.FuzzyMeasureG(0.4, 0.3, 0.3, measureG); + fu.getFuzzyIntegralChoquet(sim_texture_f1, sim_color_f3, option, measureG, integral_choquet_f1); + } + + // 2 color components + 1 texture component + if(option == 2) + { + fu.FuzzyMeasureG(0.6, 0.3, 0.1, measureG); + fu.getFuzzyIntegralChoquet(sim_texture_f1, sim_color_f3, option, measureG, integral_choquet_f1); + } + + free(measureG); + cv::Mat img_integral_choquet_f1(integral_choquet_f1); + + if(smooth) + cv::medianBlur(img_integral_choquet_f1, img_integral_choquet_f1, 3); + + cv::Mat img_foreground_f1(img_input.size(), CV_32F); + cv::threshold(img_integral_choquet_f1, img_foreground_f1, threshold, 255, cv::THRESH_BINARY_INV); + + cv::Mat img_foreground_u1(img_input.size(), CV_8U); + double minVal = 0., maxVal = 1.; + img_foreground_f1.convertTo(img_foreground_u1, CV_8U, 255.0/(maxVal - minVal), -minVal); + img_foreground_u1.copyTo(img_output); + + cv::Mat img_background_u3(img_input.size(), CV_8U); + //double minVal = 0., maxVal = 1.; + img_background_f3.convertTo(img_background_u3, CV_8U, 255.0/(maxVal - minVal), -minVal); + img_background_u3.copyTo(img_bgmodel); + + if(showOutput) + { + cvShowImage("CI LBP Input", lbp_input_f1); + cvShowImage("CI LBP Background", lbp_background_f1); + cvShowImage("CI Prob FG Mask", integral_choquet_f1); + + cv::imshow("CI BG Model", img_background_f3); + cv::imshow("CI FG Mask", img_foreground_u1); + } + + if(frameNumber == (framesToLearn + 1)) + std::cout << "FuzzyChoquetIntegral updating background model by adaptive-selective learning..." << std::endl; + + IplImage* updated_background_f3 = cvCreateImage(cvSize(input_f1->width, input_f1->height), IPL_DEPTH_32F, 3); + cvFillImage(updated_background_f3, 0.0); + fu.AdaptativeSelectiveBackgroundModelUpdate(input_f3, background_f3, updated_background_f3, integral_choquet_f1, threshold, alphaUpdate); + cv::Mat img_updated_background_f3(updated_background_f3); + img_updated_background_f3.copyTo(img_background_f3); + + cvReleaseImage(&lbp_input_f1); + cvReleaseImage(&lbp_background_f1); + cvReleaseImage(&sim_texture_f1); + cvReleaseImage(&sim_color_f3); + cvReleaseImage(&integral_choquet_f1); + cvReleaseImage(&updated_background_f3); + + delete background_f1; + delete background_f3; + delete input_f1; + delete input_f3; + } + + firstTime = false; + frameNumber++; +} + +void FuzzyChoquetIntegral::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/FuzzyChoquetIntegral.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "showOutput", showOutput); + cvWriteInt(fs, "framesToLearn", framesToLearn); + cvWriteReal(fs, "alphaLearn", alphaLearn); + cvWriteReal(fs, "alphaUpdate", alphaUpdate); + cvWriteInt(fs, "colorSpace", colorSpace); + cvWriteInt(fs, "option", option); + cvWriteInt(fs, "smooth", smooth); + cvWriteReal(fs, "threshold", threshold); + + cvReleaseFileStorage(&fs); +} + +void FuzzyChoquetIntegral::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/FuzzyChoquetIntegral.xml", 0, CV_STORAGE_READ); + + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + framesToLearn = cvReadIntByName(fs, 0, "framesToLearn", 10); + alphaLearn = cvReadRealByName(fs, 0, "alphaLearn", 0.1); + alphaUpdate = cvReadRealByName(fs, 0, "alphaUpdate", 0.01); + colorSpace = cvReadIntByName(fs, 0, "colorSpace", 1); + option = cvReadIntByName(fs, 0, "option", 2); + smooth = cvReadIntByName(fs, 0, "smooth", true); + threshold = cvReadRealByName(fs, 0, "threshold", 0.67); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/tb/FuzzyChoquetIntegral.h b/package_bgs/tb/FuzzyChoquetIntegral.h new file mode 100644 index 0000000..a52a52d --- /dev/null +++ b/package_bgs/tb/FuzzyChoquetIntegral.h @@ -0,0 +1,55 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" + +#include "FuzzyUtils.h" + +class FuzzyChoquetIntegral : public IBGS +{ +private: + bool firstTime; + long frameNumber; + bool showOutput; + + int framesToLearn; + double alphaLearn; + double alphaUpdate; + int colorSpace; + int option; + bool smooth; + double threshold; + + FuzzyUtils fu; + cv::Mat img_background_f3; + +public: + FuzzyChoquetIntegral(); + ~FuzzyChoquetIntegral(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/tb/FuzzySugenoIntegral.cpp b/package_bgs/tb/FuzzySugenoIntegral.cpp new file mode 100644 index 0000000..34b1c02 --- /dev/null +++ b/package_bgs/tb/FuzzySugenoIntegral.cpp @@ -0,0 +1,204 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "FuzzySugenoIntegral.h" + +FuzzySugenoIntegral::FuzzySugenoIntegral() : firstTime(true), frameNumber(0), showOutput(true), + framesToLearn(10), alphaLearn(0.1), alphaUpdate(0.01), colorSpace(1), option(2), smooth(true), threshold(0.67) +{ + std::cout << "FuzzySugenoIntegral()" << std::endl; +} + +FuzzySugenoIntegral::~FuzzySugenoIntegral() +{ + std::cout << "~FuzzySugenoIntegral()" << std::endl; +} + +void FuzzySugenoIntegral::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + cv::Mat img_input_f3(img_input.size(), CV_32F); + img_input.convertTo(img_input_f3, CV_32F, 1./255.); + + loadConfig(); + + if(firstTime) + { + std::cout << "FuzzySugenoIntegral parameters:" << std::endl; + + std::string colorSpaceName = ""; + switch(colorSpace) + { + case 1: colorSpaceName = "RGB"; break; + case 2: colorSpaceName = "OHTA"; break; + case 3: colorSpaceName = "HSV"; break; + case 4: colorSpaceName = "YCrCb"; break; + } + std::cout << "Color space: " << colorSpaceName << std::endl; + + if(option == 1) + std::cout << "Fuzzing by 3 color components" << std::endl; + if(option == 2) + std::cout << "Fuzzing by 2 color components + 1 texture component" << std::endl; + + saveConfig(); + } + + if(frameNumber <= framesToLearn) + { + if(frameNumber == 0) + std::cout << "FuzzySugenoIntegral initializing background model by adaptive learning..." << std::endl; + + if(img_background_f3.empty()) + img_input_f3.copyTo(img_background_f3); + else + img_background_f3 = alphaLearn*img_input_f3 + (1-alphaLearn)*img_background_f3; + + if(showOutput) + cv::imshow("SI BG Model", img_background_f3); + } + else + { + cv::Mat img_input_f1; + cv::cvtColor(img_input_f3, img_input_f1, CV_BGR2GRAY); + + cv::Mat img_background_f1; + cv::cvtColor(img_background_f3, img_background_f1, CV_BGR2GRAY); + + IplImage* input_f3 = new IplImage(img_input_f3); + IplImage* input_f1 = new IplImage(img_input_f1); + IplImage* background_f3 = new IplImage(img_background_f3); + IplImage* background_f1 = new IplImage(img_background_f1); + + IplImage* lbp_input_f1 = cvCreateImage(cvSize(input_f1->width, input_f1->height), IPL_DEPTH_32F, 1); + cvFillImage(lbp_input_f1, 0.0); + fu.LBP(input_f1, lbp_input_f1); + + IplImage* lbp_background_f1 = cvCreateImage(cvSize(background_f1->width, background_f1->height), IPL_DEPTH_32F , 1); + cvFillImage(lbp_background_f1, 0.0); + fu.LBP(background_f1, lbp_background_f1); + + IplImage* sim_texture_f1 = cvCreateImage(cvSize(input_f1->width, input_f1->height), IPL_DEPTH_32F, 1); + fu.SimilarityDegreesImage(lbp_input_f1, lbp_background_f1, sim_texture_f1, 1, colorSpace); + + IplImage* sim_color_f3 = cvCreateImage(cvSize(input_f3->width, input_f3->height), IPL_DEPTH_32F, 3); + fu.SimilarityDegreesImage(input_f3, background_f3, sim_color_f3, 3, colorSpace); + + float* measureG = (float*) malloc(3*(sizeof(float))); + IplImage* integral_sugeno_f1 = cvCreateImage(cvSize(input_f1->width, input_f1->height), IPL_DEPTH_32F, 1); + + // 3 color components + if(option == 1) + { + fu.FuzzyMeasureG(0.4, 0.3, 0.3, measureG); + fu.getFuzzyIntegralSugeno(sim_texture_f1, sim_color_f3, option, measureG, integral_sugeno_f1); + } + + // 2 color components + 1 texture component + if(option == 2) + { + fu.FuzzyMeasureG(0.6, 0.3, 0.1, measureG); + fu.getFuzzyIntegralSugeno(sim_texture_f1, sim_color_f3, option, measureG, integral_sugeno_f1); + } + + free(measureG); + cv::Mat img_integral_sugeno_f1(integral_sugeno_f1); + + if(smooth) + cv::medianBlur(img_integral_sugeno_f1, img_integral_sugeno_f1, 3); + + cv::Mat img_foreground_f1(img_input.size(), CV_32F); + cv::threshold(img_integral_sugeno_f1, img_foreground_f1, threshold, 255, cv::THRESH_BINARY_INV); + + cv::Mat img_foreground_u1(img_input.size(), CV_8U); + double minVal = 0., maxVal = 1.; + img_foreground_f1.convertTo(img_foreground_u1, CV_8U, 255.0/(maxVal - minVal), -minVal); + img_foreground_u1.copyTo(img_output); + + cv::Mat img_background_u3(img_input.size(), CV_8U); + //double minVal = 0., maxVal = 1.; + img_background_f3.convertTo(img_background_u3, CV_8U, 255.0/(maxVal - minVal), -minVal); + img_background_u3.copyTo(img_bgmodel); + + if(showOutput) + { + cvShowImage("SI LBP Input", lbp_input_f1); + cvShowImage("SI LBP Background", lbp_background_f1); + cvShowImage("SI Prob FG Mask", integral_sugeno_f1); + + cv::imshow("SI BG Model", img_background_f3); + cv::imshow("SI FG Mask", img_foreground_u1); + } + + if(frameNumber == (framesToLearn + 1)) + std::cout << "FuzzySugenoIntegral updating background model by adaptive-selective learning..." << std::endl; + + IplImage* updated_background_f3 = cvCreateImage(cvSize(input_f1->width, input_f1->height), IPL_DEPTH_32F, 3); + cvFillImage(updated_background_f3, 0.0); + fu.AdaptativeSelectiveBackgroundModelUpdate(input_f3, background_f3, updated_background_f3, integral_sugeno_f1, threshold, alphaUpdate); + cv::Mat img_updated_background_f3(updated_background_f3); + img_updated_background_f3.copyTo(img_background_f3); + + cvReleaseImage(&lbp_input_f1); + cvReleaseImage(&lbp_background_f1); + cvReleaseImage(&sim_texture_f1); + cvReleaseImage(&sim_color_f3); + cvReleaseImage(&integral_sugeno_f1); + cvReleaseImage(&updated_background_f3); + + delete background_f1; + delete background_f3; + delete input_f1; + delete input_f3; + } + + firstTime = false; + frameNumber++; +} + +void FuzzySugenoIntegral::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/FuzzySugenoIntegral.xml", 0, CV_STORAGE_WRITE); + + cvWriteInt(fs, "showOutput", showOutput); + cvWriteInt(fs, "framesToLearn", framesToLearn); + cvWriteReal(fs, "alphaLearn", alphaLearn); + cvWriteReal(fs, "alphaUpdate", alphaUpdate); + cvWriteInt(fs, "colorSpace", colorSpace); + cvWriteInt(fs, "option", option); + cvWriteInt(fs, "smooth", smooth); + cvWriteReal(fs, "threshold", threshold); + + cvReleaseFileStorage(&fs); +} + +void FuzzySugenoIntegral::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/FuzzySugenoIntegral.xml", 0, CV_STORAGE_READ); + + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + framesToLearn = cvReadIntByName(fs, 0, "framesToLearn", 10); + alphaLearn = cvReadRealByName(fs, 0, "alphaLearn", 0.1); + alphaUpdate = cvReadRealByName(fs, 0, "alphaUpdate", 0.01); + colorSpace = cvReadIntByName(fs, 0, "colorSpace", 1); + option = cvReadIntByName(fs, 0, "option", 2); + smooth = cvReadIntByName(fs, 0, "smooth", true); + threshold = cvReadRealByName(fs, 0, "threshold", 0.67); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/tb/FuzzySugenoIntegral.h b/package_bgs/tb/FuzzySugenoIntegral.h new file mode 100644 index 0000000..1144559 --- /dev/null +++ b/package_bgs/tb/FuzzySugenoIntegral.h @@ -0,0 +1,55 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" + +#include "FuzzyUtils.h" + +class FuzzySugenoIntegral : public IBGS +{ +private: + bool firstTime; + long long frameNumber; + bool showOutput; + + int framesToLearn; + double alphaLearn; + double alphaUpdate; + int colorSpace; + int option; + bool smooth; + double threshold; + + FuzzyUtils fu; + cv::Mat img_background_f3; + +public: + FuzzySugenoIntegral(); + ~FuzzySugenoIntegral(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/tb/FuzzyUtils.cpp b/package_bgs/tb/FuzzyUtils.cpp new file mode 100644 index 0000000..84d5a50 --- /dev/null +++ b/package_bgs/tb/FuzzyUtils.cpp @@ -0,0 +1,511 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "FuzzyUtils.h" + +FuzzyUtils::FuzzyUtils(void){} + +FuzzyUtils::~FuzzyUtils(void){} + +void FuzzyUtils::LBP(IplImage* InputImage, IplImage* LBPimage) +{ + PixelUtils p; + + float* neighberPixel = (float*) malloc(9*sizeof(float)); + float* BinaryValue = (float*) malloc(9*sizeof(float)); + float* CarreExp = (float*) malloc(9*sizeof(float)); + float* valLBP = (float*) malloc(1*sizeof(float)); + + *valLBP = 0; + + int x = 0, y = 0; + + // on implemente les 8 valeurs puissance de 2 qui correspondent aux 8 elem. d'image voisins au elem. d'image central + *(CarreExp+0)=1.0; + *(CarreExp+1)=2.0; + *(CarreExp+2)=4.0; + *(CarreExp+3)=8.0; + *(CarreExp+4)=0.0; + *(CarreExp+5)=16.0; + *(CarreExp+6)=32.0; + *(CarreExp+7)=64.0; + *(CarreExp+8)=128.0; + + //le calcule de LBP + //pour les 4 coins + /* 1.*/ + if(x==0 && y==0) + { + p.getNeighberhoodGrayPixel(InputImage, x,y,neighberPixel); + getBinValue(neighberPixel,BinaryValue,4,0); + *valLBP=*valLBP+((*(BinaryValue+1))*(*(CarreExp+1))+(*(BinaryValue+2))*(*(CarreExp+2))+(*(BinaryValue+3))*(*(CarreExp+3)))/255.0; + p.PutGrayPixel(LBPimage,x,y,*valLBP); + } + + /* 2.*/ + if(x==0 && y==InputImage->width) + { + *valLBP=0; + p.getNeighberhoodGrayPixel(InputImage, x,y,neighberPixel); + getBinValue(neighberPixel,BinaryValue,4,1); + *valLBP=*valLBP+((*(BinaryValue))*(*(CarreExp))+(*(BinaryValue+2))*(*(CarreExp+2))+(*(BinaryValue+3))*(*(CarreExp+3)))/255.0; + p.PutGrayPixel(LBPimage,x,y,*valLBP); + } + + /* 3.*/ + if(x==InputImage->height && y==0) + { + *valLBP=0; + p.getNeighberhoodGrayPixel(InputImage, x,y,neighberPixel); + getBinValue(neighberPixel,BinaryValue,4,2); + *valLBP=*valLBP+((*(BinaryValue))*(*(CarreExp))+(*(BinaryValue+1))*(*(CarreExp+1))+(*(BinaryValue+3))*(*(CarreExp+3)))/255.0; + p.PutGrayPixel(LBPimage,x,y,*valLBP); + } + + /* 4.*/ + if(x==InputImage->height && y==InputImage->width) + { + *valLBP=0; + p.getNeighberhoodGrayPixel(InputImage, x,y,neighberPixel); + getBinValue(neighberPixel,BinaryValue,4,3); + *valLBP=*valLBP+((*(BinaryValue))*(*(CarreExp))+(*(BinaryValue+1))*(*(CarreExp+1))+(*(BinaryValue+2))*(*(CarreExp+2)))/255.0; + p.PutGrayPixel(LBPimage,x,y,*valLBP); + } + + //le calcul de LBP pour la premi�re ligne : L(0) + if(x==0 && (y!=0 && y!=InputImage->width)) + { + for(int y = 1; y < InputImage->width-1; y++) + { + p.getNeighberhoodGrayPixel(InputImage, x,y,neighberPixel); + getBinValue(neighberPixel,BinaryValue,6,4); + *valLBP=0; + *valLBP=*valLBP+((*(BinaryValue))*(*(CarreExp))+(*(BinaryValue+1))*(*(CarreExp+1))+(*(BinaryValue+2))*(*(CarreExp+2))+(*(BinaryValue+3))*(*(CarreExp+3))+(*(BinaryValue+5))*(*(CarreExp+5)))/255.0; + p.PutGrayPixel(LBPimage,x,y,*valLBP); + } + } + + //le calcul de LBP pour la derni�re colonne : C(w) + if((x!=0 && x!=InputImage->height) && y==InputImage->width) + { + for(int x = 1; x < InputImage->height-1; x++) + { + p.getNeighberhoodGrayPixel(InputImage, x,y,neighberPixel); + getBinValue(neighberPixel,BinaryValue,6,4); + *valLBP=0; + *valLBP=*valLBP+((*(BinaryValue))*(*(CarreExp))+(*(BinaryValue+1))*(*(CarreExp+1))+(*(BinaryValue+2))*(*(CarreExp+2))+(*(BinaryValue+3))*(*(CarreExp+3))+(*(BinaryValue+5))*(*(CarreExp+5)))/255.0; + p.PutGrayPixel(LBPimage,x,y,*valLBP); + } + } + + //le calcul de LBP pour la derni�re ligne : L(h) + if(x==InputImage->height && (y!=0 && y!=InputImage->width)) + { + for(int y = 1; y < InputImage->width-1; y++) + { + p.getNeighberhoodGrayPixel(InputImage, x,y,neighberPixel); + getBinValue(neighberPixel,BinaryValue,6,1); + *valLBP=0; + *valLBP=*valLBP+((*(BinaryValue))*(*(CarreExp))+(*(BinaryValue+2))*(*(CarreExp+2))+(*(BinaryValue+3))*(*(CarreExp+3))+(*(BinaryValue+4))*(*(CarreExp+4))+(*(BinaryValue+5))*(*(CarreExp+5)))/255.0; + p.PutGrayPixel(LBPimage,x,y,*valLBP); + } + } + + //le calcul de LBP pour la premi�re colonne : C(0) + if((x!=0 && x!=InputImage->height) && y==0) + { + for(int x = 1; x <InputImage->height-1; x++) + { + p.getNeighberhoodGrayPixel(InputImage, x,y,neighberPixel); + getBinValue(neighberPixel,BinaryValue,6,2); + *valLBP=0; + *valLBP=*valLBP+((*(BinaryValue))*(*(CarreExp+5))+(*(BinaryValue+1))*(*(CarreExp+6))+(*(BinaryValue+3))*(*(CarreExp+3))+(*(BinaryValue+4))*(*(CarreExp))+(*(BinaryValue+5))*(*(CarreExp+1)))/255.0; + p.PutGrayPixel(LBPimage,x,y,*valLBP); + } + } + + //pour le reste des elements d'image + for(int y = 1; y < InputImage->height-1; y++) + { + for(int x = 1; x < InputImage->width-1; x++) + { + p.getNeighberhoodGrayPixel(InputImage, x,y,neighberPixel); + getBinValue(neighberPixel,BinaryValue,9,4); + //le calcul de la valeur du LBP pour chaque elem. d'im. + *valLBP=0; + for(int l = 0; l < 9; l++) + *valLBP = *valLBP + ((*(BinaryValue+l)) * (*(CarreExp+l))) / 255.0; + //printf("\nvalLBP(%d,%d)=%f",x,y,*valLBP); + p.PutGrayPixel(LBPimage,x,y,*valLBP); + } + } + + free(neighberPixel); + free(BinaryValue); + free(CarreExp); + free(valLBP); +} + +void FuzzyUtils::getBinValue(float* neighberGrayPixel, float* BinaryValue, int m, int n) +{ + // la comparaison entre la valeur d'elem d'image central et les valeurs des elem. d'im. voisins + // m = le numero des elements (4, 6 ou 9); + // n = la position de l'element central; + + int h = 0; + for(int k = 0; k < m; k++) + { + if(*(neighberGrayPixel+k) >= *(neighberGrayPixel+n)) + { + *(BinaryValue+h)=1; + h++; + } + else + { + *(BinaryValue+h)=0; + h++; + } + } +} + +void FuzzyUtils::SimilarityDegreesImage(IplImage* CurrentImage, IplImage* BGImage, IplImage* DeltaImage, int n, int color_space) +{ + PixelUtils p; + int i, j; + + if(n == 1) + { + float* CurrentGrayPixel = (float*) malloc (1*(sizeof(float))); + float* BGGrayPixel = (float*) malloc (1*(sizeof(float))); + float* DeltaGrayPixel = (float*) malloc (1*(sizeof(float))); + + for(i = 0; i < CurrentImage->width; i++) + { + for(j = 0; j < CurrentImage->height; j++) + { + p.GetGrayPixel(CurrentImage,i,j,CurrentGrayPixel); + p.GetGrayPixel(BGImage,i,j,BGGrayPixel); + RatioPixels(CurrentGrayPixel,BGGrayPixel,DeltaGrayPixel,1); + p.PutGrayPixel(DeltaImage,i,j,*DeltaGrayPixel); + } + } + + free(CurrentGrayPixel); + free(BGGrayPixel); + free(DeltaGrayPixel); + } + + if(n != 1) + { + IplImage* ConvertedCurrentImage = cvCreateImage(cvSize(CurrentImage->width, CurrentImage->height), IPL_DEPTH_32F, 3); + IplImage* ConvertedBGImage = cvCreateImage(cvSize(CurrentImage->width, CurrentImage->height), IPL_DEPTH_32F, 3); + + float* ConvertedCurrentPixel = (float*) malloc(3*(sizeof(float))); + float* ConvertedBGPixel = (float*) malloc(3*(sizeof(float))); + float* DeltaConvertedPixel = (float*) malloc(3*(sizeof(float))); + + p.ColorConversion(CurrentImage,ConvertedCurrentImage,color_space); + p.ColorConversion(BGImage,ConvertedBGImage,color_space); + + for(i = 0; i < CurrentImage->width; i++) + { + for(j = 0; j < CurrentImage->height; j++) + { + p.GetPixel(ConvertedCurrentImage,i,j,ConvertedCurrentPixel); + p.GetPixel(ConvertedBGImage,i,j,ConvertedBGPixel); + RatioPixels(ConvertedCurrentPixel,ConvertedBGPixel,DeltaConvertedPixel,3); + p.PutPixel(DeltaImage,i,j,DeltaConvertedPixel); + } + } + + free(ConvertedCurrentPixel); + free(ConvertedBGPixel); + free(DeltaConvertedPixel); + + cvReleaseImage(&ConvertedCurrentImage); + cvReleaseImage(&ConvertedBGImage); + } +} + +void FuzzyUtils::RatioPixels(float* CurrentPixel, float* BGPixel, float* DeltaPixel, int n) +{ + if(n == 1) + { + if(*CurrentPixel < *BGPixel) + *DeltaPixel = *CurrentPixel / *BGPixel; + + if(*CurrentPixel > *BGPixel) + *DeltaPixel = *BGPixel / *CurrentPixel; + + if(*CurrentPixel == *BGPixel) + *DeltaPixel = 1.0; + } + + if(n == 3) + for(int i = 0; i < 3; i++) + { + if(*(CurrentPixel+i) < *(BGPixel+i)) + *(DeltaPixel+i) = *(CurrentPixel+i) / *(BGPixel+i); + + if(*(CurrentPixel+i) > *(BGPixel+i)) + *(DeltaPixel+i) = *(BGPixel+i) / *(CurrentPixel+i); + + if(*(CurrentPixel+i) == *(BGPixel+i)) + *(DeltaPixel+i) = 1.0; + } +} + +void FuzzyUtils::getFuzzyIntegralSugeno(IplImage* H, IplImage* Delta, int n, float *MeasureG, IplImage* OutputImage) +{ + // MeasureG : est un vecteur contenant 3 mesure g (g1,g2,g3) tel que : g1+g2+g3=1 + // n : =2 cad aggreger les 2 images "H" et "Delta" + // =1 cad aggreger uniquement les valeurs des composantes couleurs de l'image "Delta" + + PixelUtils p; + + float* HTexturePixel = (float*) malloc(1*sizeof(float)); + float* DeltaOhtaPixel = (float*) malloc(3*(sizeof(float))); + int *Indice = (int*) malloc(3*(sizeof(int))); + float *HI = (float*) malloc(3*(sizeof(float))); + float *Integral = (float*) malloc(3*(sizeof(float))); + float* X = (float*) malloc(1*sizeof(float)); + float* XiXj = (float*) malloc(1*sizeof(float)); + float IntegralFlou; + + *Indice = 0; + *(Indice+1) = 1; + *(Indice+2) = 2; + *X = 1.0; + + for(int i = 0; i < H->width; i++) + { + for(int j = 0; j < H->height; j++) + { + p.GetGrayPixel(H,i,j,HTexturePixel); + p.GetPixel(Delta,i,j,DeltaOhtaPixel); + + *(HI+0) = *(HTexturePixel+0); + *(HI+1) = *(DeltaOhtaPixel+0); + *(HI+2) = *(DeltaOhtaPixel+1); + + Trier(HI,3,Indice); + + *XiXj = *(MeasureG + (*(Indice+1))) + (*(MeasureG + (*(Indice+2)))); + + *(Integral+0) = min((HI + (*(Indice+0))), X); + *(Integral+1) = min((HI + (*(Indice+1))), XiXj); + *(Integral+2) = min((HI + (*(Indice+2))), ((MeasureG+(*(Indice+2))))); + + IntegralFlou = max(Integral,3); + p.PutGrayPixel(OutputImage,i,j,IntegralFlou); + } + } + + free(HTexturePixel); + free(DeltaOhtaPixel); + free(Indice); + free(HI); + free(X); + free(XiXj); + free(Integral); +} + +void FuzzyUtils::getFuzzyIntegralChoquet(IplImage* H, IplImage* Delta, int n, float *MeasureG, IplImage* OutputImage) +{ + // MeasureG : est un vecteur contenant 3 mesure g (g1,g2,g3) tel que : g1+g2+g3=1 + // n : =2 cad aggreger les 2 images "H" et "Delta" + // =1 cad aggreger uniquement les valeurs des composantes couleurs de l'image "Delta" + + PixelUtils p; + + float* HTexturePixel = (float*) malloc(1*sizeof(float)); + float* DeltaOhtaPixel = (float*) malloc(3*(sizeof(float))); + int *Indice = (int*) malloc(3*(sizeof(int))); + float *HI = (float*) malloc(3*(sizeof(float))); + float *Integral = (float*) malloc(3*(sizeof(float))); + float* X = (float*) malloc(1*sizeof(float)); + float* XiXj = (float*) malloc(1*sizeof(float)); + float* IntegralFlou1 = (float*) malloc(1*sizeof(float)); + float IntegralFlou; + + *Indice = 0; + *(Indice+1) = 1; + *(Indice+2) = 2; + *X = 1.0; + + for(int i = 0; i < Delta->width; i++) + { + for(int j = 0; j < Delta->height; j++) + { + if(n == 2) + { + p.GetGrayPixel(H,i,j,HTexturePixel); + p.GetPixel(Delta,i,j,DeltaOhtaPixel); + + *(HI+0) = *(HTexturePixel+0); + *(HI+1) = *(DeltaOhtaPixel+0); + *(HI+2) = *(DeltaOhtaPixel+1); + } + + if(n==1) + { + //remplir HI par les valeurs des 3 composantes couleurs uniquement + p.GetPixel(Delta,i,j,DeltaOhtaPixel); + + *(HI+0) = *(DeltaOhtaPixel+0); + //*(HI+0) = *(DeltaOhtaPixel+2); + *(HI+1) = *(DeltaOhtaPixel+1); + *(HI+2) = *(DeltaOhtaPixel+2); + } + + Trier(HI,3,Indice); + *XiXj = *(MeasureG + (*(Indice+1))) + (*(MeasureG + (*(Indice+2)))); + + *(Integral+0) = *(HI+(*(Indice+0)))* (*X-*XiXj); + *(Integral+1) = *(HI+(*(Indice+1)))* (*XiXj-*(MeasureG+(*(Indice+2)))); + *(Integral+2) = *(HI+(*(Indice+2)))* (*(MeasureG+(*(Indice+2)))); + + IntegralFlou = *(Integral+0) + *(Integral+1) + *(Integral+2); + p.PutGrayPixel(OutputImage,i,j,IntegralFlou); + } + } + + free(HTexturePixel); + free(DeltaOhtaPixel); + free(Indice); + free(HI); + free(X); + free(XiXj); + free(Integral); +} + +void FuzzyUtils::FuzzyMeasureG(float g1, float g2, float g3, float *G) +{ + *(G+0) = g1; + *(G+1) = g2; + *(G+2) = g3; +} + +void FuzzyUtils::Trier(float* g,int n,int* index) +{ + // Cette fonction trie un vecteur g par ordre croissant et + // sort egalement l'indice des elements selon le trie dans le vecteur "index" suppos� initialis� par des valeurs de 1 a n + + float t; + int r,a,b; + + for(a = 1; a <= n; a++) + { + for(b = n-1; b >= a; b--) + if(*(g + b-1) < (*(g + b))) + { + // ordre croissant des �lements + t = *(g + b-1); + *(g + b-1) = *(g + b); + *(g + b) = t; + + // ordre des indices des �lements du vecteur g + r = *(index + b-1); + *(index + b-1) = *(index + b); + *(index + b) = r; + } + } +} + +float FuzzyUtils::min(float *a,float *b) +{ + float min = 0; + + if(*a >= (*b)) + min = *b; + else + min = *a; + + return min; +} + +float FuzzyUtils::max(float* g , int n) +{ + float max = 0; + + for(int i = 0; i < n; i++) + { + if(*(g+i) >= max) + max = *(g+i); + } + + return max; +} + +void FuzzyUtils::gDeDeux(float* a, float* b, float* lambda) +{ + float* c = (float*) malloc(1*sizeof(float)); + *c = *a + (*b) + (*lambda) * (*a) * (*b); +} + +void FuzzyUtils::getLambda(float* g) +{ + float a,b; + float* lambda = (float*) malloc(1*sizeof(float)); + + a = (*(g+0) * (*(g+1)) + (*(g+1)) * (*(g+2)) + (*(g+0)) * (*(g+2))); + *lambda = -(*(g+0) * (*(g+1)) + (*(g+1)) * (*(g+2)) + (*(g+0)) * (*(g+2))) / (*(g+0) * (*(g+1)) * (*(g+2))); + b = (*(g+0) * (*(g+1)) * (*(g+2))); + + //printf("\na:%f",a); + //printf("\nb:%f",b); + //printf("\nlambda:%f", *lambda); + + free(lambda); +} + +void FuzzyUtils::AdaptativeSelectiveBackgroundModelUpdate(IplImage* CurrentImage, IplImage* BGImage, IplImage* OutputImage, IplImage* Integral, float seuil, float alpha) +{ + PixelUtils p; + + float beta = 0.0; + float* CurentImagePixel = (float*) malloc(3*sizeof(float)); + float* BGImagePixel = (float*) malloc(3*sizeof(float)); + float* OutputImagePixel = (float*) malloc(3*sizeof(float)); + float* IntegralImagePixel = (float*) malloc(1*sizeof(float)); + float *Maximum = (float*) malloc(1*sizeof(float)); + float *Minimum = (float*) malloc(1*sizeof(float)); + + p.ForegroundMaximum(Integral, Maximum, 1); + p.ForegroundMinimum(Integral, Minimum, 1); + + for(int i = 0; i < CurrentImage->width; i++) + { + for(int j = 0; j < CurrentImage->height; j++) + { + p.GetPixel(CurrentImage, i, j, CurentImagePixel); + p.GetPixel(BGImage, i, j, BGImagePixel); + p.GetGrayPixel(Integral, i, j, IntegralImagePixel); + + beta = 1 - ((*IntegralImagePixel) - ((*Minimum / (*Minimum - *Maximum)) * (*IntegralImagePixel) - (*Minimum * (*Maximum) / (*Minimum - *Maximum)))); + + for(int k = 0; k < 3; k++) + *(OutputImagePixel + k) = beta * (*(BGImagePixel + k)) + (1 - beta) * (alpha * (*(CurentImagePixel+k)) + (1-alpha) * (*(BGImagePixel+k))); + + p.PutPixel(OutputImage, i, j, OutputImagePixel); + } + } + + free(CurentImagePixel); + free(BGImagePixel); + free(OutputImagePixel); + free(IntegralImagePixel); +} diff --git a/package_bgs/tb/FuzzyUtils.h b/package_bgs/tb/FuzzyUtils.h new file mode 100644 index 0000000..43fc9ad --- /dev/null +++ b/package_bgs/tb/FuzzyUtils.h @@ -0,0 +1,54 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once +/* +Code provided by Thierry BOUWMANS + +Maitre de Conf�rences +Laboratoire MIA +Universit� de La Rochelle +17000 La Rochelle +France +tbouwman@univ-lr.fr + +http://sites.google.com/site/thierrybouwmans/ +*/ +#include "PixelUtils.h" + +class FuzzyUtils +{ +public: + FuzzyUtils(void); + ~FuzzyUtils(void); + + void LBP(IplImage* InputImage, IplImage* LBP); + void getBinValue(float* neighberGrayPixel, float* BinaryValue, int m, int n); + + void SimilarityDegreesImage(IplImage* CurrentImage, IplImage* BGImage, IplImage* DeltaImage, int n, int color_space); + void RatioPixels(float* CurrentPixel, float* BGPixel, float* DeltaPixel, int n); + + void getFuzzyIntegralSugeno(IplImage* H, IplImage* Delta, int n, float *MeasureG, IplImage* OutputImage); + void getFuzzyIntegralChoquet(IplImage* H, IplImage* Delta, int n, float *MeasureG, IplImage* OutputImage); + void FuzzyMeasureG(float g1, float g2, float g3, float *G); + void Trier(float* g, int n, int* index); + float min(float *a, float *b); + float max(float *g, int n); + void gDeDeux(float* a, float* b, float* lambda); + void getLambda(float* g); + + void AdaptativeSelectiveBackgroundModelUpdate(IplImage* CurrentImage, IplImage* BGImage, IplImage* OutputImage, IplImage* Integral, float seuil, float alpha); +}; diff --git a/package_bgs/tb/MRF.cpp b/package_bgs/tb/MRF.cpp new file mode 100644 index 0000000..1dbc69e --- /dev/null +++ b/package_bgs/tb/MRF.cpp @@ -0,0 +1,339 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "MRF.h" + +using namespace Algorithms::BackgroundSubtraction; + +//init the basic MRF +MRF::MRF() +{ + in_image = out_image = 0; + width = height = 0; + + ////////////////////////////////////////////////////////////////////////// + no_regions = 2; + beta = 2.8;// 0.9; + t = 10;//0.05 + + ////////////////////////////////////////////////////////////////////////// + K = 0; + E = E_old = 0; + + ////////////////////////////////////////////////////////////////////////// + T0 = 4; + c = 0.98; + T = 0; + + ////////////////////////////////////////////////////////////////////////// + alpha = 0.1; + + ////////////////////////////////////////////////////////////////////////// + classes = 0; + in_image_data = 0; + local_evidence = 0; +} + +/************************************************************************/ +/* the Markov Random Field with time constraints for T2FGMM */ +/************************************************************************/ + +MRF_TC::MRF_TC() +{ + beta_time = 0.9; +} + +MRF_TC::~MRF_TC() +{ + delete []classes; + delete []old_labeling; + delete []in_image_data; + delete []local_evidence; +} + +double MRF_TC::TimeEnergy2(int i, int j, int label) +{ + double energy = 0.0; + + if(old_labeling[i][j] == (label*255)) + energy -= beta_time; + else + energy += beta_time; + + if(i != height-1) // south + { + if(label*255 == old_labeling[i+1][j]) + energy -= beta_time; + else + energy += beta_time; + + if((j != width-1) && (label*255 == old_labeling[i+1][j+1])) + energy -= beta_time; + else + energy += beta_time; + + if((j != 0) && (label*255 == old_labeling[i+1][j-1])) + energy -= beta_time; + else + energy += beta_time; + } + + if(j != width-1) // east + { + if(label*255 == old_labeling[i][j+1]) + energy -= beta_time; + else + energy += beta_time; + } + + if(i != 0) // nord + { + if(label*255 == old_labeling[i-1][j]) + energy -= beta_time; + else + energy += beta_time; + + if((j != width-1) && (label*255 == old_labeling[i-1][j+1])) + energy -= beta_time; + else + energy += beta_time; + + if((j != 0) && (label*255 == old_labeling[i-1][j-1])) + energy -= beta_time; + else + energy += beta_time; + } + + if(j != 0) // west + { + if(label*255 == old_labeling[i][j-1]) + energy -= beta_time; + else + energy += beta_time; + } + + return energy; +} + +double MRF_TC::Doubleton2(int i, int j, int label) +{ + double energy = 0.0; + + if(i != height-1) // south + { + if(label == classes[i+1][j]) + energy -= beta; + else + energy += beta; + + if((j != width-1) && (label == classes[i+1][j+1])) + energy -= beta; + else + energy += beta; + + if((j != 0) && (label == classes[i+1][j-1])) + energy -= beta; + else + energy += beta; + } + + if(j != width-1) // east + { + if(label == classes[i][j+1]) + energy -= beta; + else + energy += beta; + } + + if(i != 0) // nord + { + if(label == classes[i-1][j]) + energy -= beta; + else + energy += beta; + + if((j != width-1) && (label == classes[i-1][j+1])) + energy -= beta; + else + energy += beta; + + if((j != 0) && (label == classes[i-1][j-1])) + energy -= beta; + else + energy += beta; + } + + if(j != 0) // west + { + if(label == classes[i][j-1]) + energy -= beta; + else + energy += beta; + } + + return energy; +} + +void MRF_TC::OnIterationOver2(void) +{ + CreateOutput2(); + //cout<<"\rI="<<K<<", "; +} + +void MRF_TC::Build_Classes_OldLabeling_InImage_LocalEnergy() +{ + int i; + classes = new int* [height]; + old_labeling = new int *[height]; + in_image_data = new int* [height]; + local_evidence = new float* [height]; + + for(i = 0; i < height; ++i) + { + classes[i] = new int[width]; + old_labeling[i] = new int[width]; + in_image_data[i] = new int[width]; + local_evidence[i] = new float[width*2]; + } +} + +void MRF_TC::InitEvidence2(GMM *gmm, HMM *hmm, IplImage *labeling) +{ + int i, j; + + background = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); + cvCopyImage(background2,background.Ptr()); + + unsigned char *in_data = (unsigned char *)(in_image->imageData); + unsigned char *labeling_data = (unsigned char *)(labeling->imageData); + + for(i = 0; i < height; ++i) + { + for(j = 0; j < width; ++j) + { + in_image_data[i][j] = in_data[(i*in_image->widthStep)+j]; + old_labeling[i][j] = labeling_data[i*width+j]; + + if(in_image_data[i][j] == 255) + classes[i][j] = 1; + else + classes[i][j] = 0; + } + + float variance; + float muR; + float muG; + float muB; + + float pixel; + + int modes = 3; + float mu; + + for(i = 0; i < height; ++i) + { + for(j = 0; j < width; ++j) + { + variance = gmm[(i*width+j) * modes+0].variance; + muR = gmm[(i*width+j) * modes+0].muR; + muG = gmm[(i*width+j) * modes+0].muG; + muB = gmm[(i*width+j) * modes+0].muB; + + mu = (muR + muG + muB)/3; + + pixel = (background(i,j,0) + background(i,j,1) + background(i,j,2))/3; + + if(variance == 0) variance = 1; + + local_evidence[i][j*2+0] = pow((pixel-mu),2)/2/variance; + + if(pixel >= mu) + local_evidence[i][j*2+1] = pow((pixel - mu - 2.5*sqrt(variance)),2)/2/variance; + else + local_evidence[i][j*2+1] = pow((pixel - mu + 2.5*sqrt(variance)),2)/2/variance; + } + } + } +} + +void MRF_TC::CreateOutput2() +{ + int i, j; + unsigned char *out_data; + + out_data = (unsigned char *) out_image->imageData; + + // create output image + for (i = 0; i < height; ++i) + for(j = 0; j < width; ++j) + out_data[(i*width) + j] = (unsigned char)((classes[i][j])*255); +} + +//calculate the whole energy +double MRF_TC::CalculateEnergy2() +{ + double sum = 0.0; + int i, j, k; + // !FAIL! + for(i = 0; i < height; ++i) + { + for(j = 0; j < width; ++j) + { + k = classes[i][j]; + sum = sum + local_evidence[i][j*2+k] + Doubleton2(i,j,k) + TimeEnergy2(i, j, k);//min the value + } + } + //sum = 0.1; + return sum; +} + +// local energy +double MRF_TC::LocalEnergy2(int i, int j, int label) +{ + return local_evidence[i][j*2+label] + Doubleton2(i,j,label) + TimeEnergy2(i,j,label); +} + +void MRF_TC::ICM2() +{ + int i, j; + int r; + //double summa_deltaE = 0; + double localenergy0 = 0, localenergy1 = 0; + + K = 0; + //E_old = CalculateEnergy2(); + + do + { + for(i = 0; i < height; ++i) + for(j = 0; j < width; ++j) + { + localenergy0 = LocalEnergy2(i,j,0); + localenergy1 = LocalEnergy2(i,j,1); + + if(localenergy0 < localenergy1) + classes[i][j] = 0; + else + classes[i][j] = 1; + } + + //E = CalculateEnergy2(); + //summa_deltaE = fabs(E_old-E); + //E_old = E; + ++K; + OnIterationOver2(); + }while(K < 2); +} diff --git a/package_bgs/tb/MRF.h b/package_bgs/tb/MRF.h new file mode 100644 index 0000000..457bbbc --- /dev/null +++ b/package_bgs/tb/MRF.h @@ -0,0 +1,107 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#ifndef MRF_H +#define MRF_H + +#include "T2FMRF.h" + +namespace Algorithms +{ + namespace BackgroundSubtraction + { + // base class + class MRF + { + public: + IplImage *in_image, *out_image; + //image's width and height + int width, height; + + public: + MRF(); + + protected: + + ////////////////////////////////////////////////////////////////////////// + //the number of labeling + int no_regions; + //potential of Space Constraint + double beta; + //terminal condition when (deltaE < t) + double t; + + ////////////////////////////////////////////////////////////////////////// + //for gibbs + double T0; + //current temperature + double T; + double c; + + ////////////////////////////////////////////////////////////////////////// + // alpha value for MMD + double alpha; + + ////////////////////////////////////////////////////////////////////////// + //current global energy + double E; + //old global energy + double E_old; + //number of iteration + int K; + + ////////////////////////////////////////////////////////////////////////// + //labeling image + int **classes; + //input image + int **in_image_data; + //evidence + float ** local_evidence; + }; + + /************************************************************************/ + /* the Markov Random Field with time constraints for T2FGMM */ + /************************************************************************/ + class MRF_TC: public MRF + { + private: + double beta_time; + + public: + IplImage *background2; + RgbImage background; + int **old_labeling; + + public: + MRF_TC(); + ~MRF_TC(); + double TimeEnergy2(int i, int j, int label); + void OnIterationOver2(void); + void Build_Classes_OldLabeling_InImage_LocalEnergy(); + void InitEvidence2(GMM *gmm, HMM *hmm, IplImage *labeling); + void CreateOutput2(); + double CalculateEnergy2(); + double LocalEnergy2(int i, int j, int label); + double Doubleton2(int i, int j, int label); + + void Gibbs2(); + void ICM2(); + void Metropolis2(bool mmd); + }; + }; +}; + +#endif \ No newline at end of file diff --git a/package_bgs/tb/PerformanceUtils.cpp b/package_bgs/tb/PerformanceUtils.cpp new file mode 100644 index 0000000..30f89b7 --- /dev/null +++ b/package_bgs/tb/PerformanceUtils.cpp @@ -0,0 +1,521 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "PerformanceUtils.h" + +PerformanceUtils::PerformanceUtils(void){} + +PerformanceUtils::~PerformanceUtils(void){} + +float PerformanceUtils::NrPixels(IplImage *image) +{ + return (float) (image->width * image->height); +} + +float PerformanceUtils::NrAllDetectedPixNotNULL(IplImage *image, IplImage *ground_truth) +{ + //Nombre de tous les pixels non nuls dans Groundthruth et dans image + float Union12 = 0.0; + + unsigned char *pixelGT = (unsigned char*) malloc(1*sizeof(unsigned char)); + unsigned char *pixelI = (unsigned char*) malloc(1*sizeof(unsigned char)); + + PixelUtils p; + + for(int y = 0; y < image->height; y++) + { + for(int x = 0; x < image->width; x++) + { + p.GetGrayPixel(ground_truth,x,y,pixelGT); + p.GetGrayPixel(image,x,y,pixelI); + + if((pixelGT[0] != 0) || (pixelI[0] != 0)) + Union12++; + } + } + + free(pixelGT); + free(pixelI); + + return Union12; +} + +float PerformanceUtils::NrTruePositives(IplImage *image, IplImage *ground_truth, bool debug) +{ + float nTP = 0.0; + + unsigned char *pixelGT = (unsigned char*) malloc(1*sizeof(unsigned char)); + unsigned char *pixelI = (unsigned char*) malloc(1*sizeof(unsigned char)); + + IplImage *TPimage = 0; + + if(debug) + { + TPimage = cvCreateImage(cvSize(image->width,image->height),image->depth,image->nChannels); + cvFillImage(TPimage,0.0); + } + + PixelUtils p; + + for(int y = 0; y < image->height; y++) + { + for(int x = 0; x < image->width; x++) + { + p.GetGrayPixel(ground_truth,x,y,pixelGT); + p.GetGrayPixel(image,x,y,pixelI); + + if((pixelGT[0] != 0) && (pixelI[0] != 0)) + { + if(debug) + p.PutGrayPixel(TPimage,x,y,*pixelI); + + nTP++; + } + } + } + + if(debug) + { + cvNamedWindow("TPImage", 0); + cvShowImage("TPImage", TPimage); + //std::cout << "True Positives: " << nTP << std::endl; + //<< " press ENTER to continue" << std::endl; + //cvWaitKey(0); + cvReleaseImage(&TPimage); + } + + free(pixelGT); + free(pixelI); + + return nTP; +} + +float PerformanceUtils::NrTrueNegatives(IplImage* image, IplImage* ground_truth, bool debug) +{ + float nTN = 0.0; + + unsigned char *pixelGT = (unsigned char *)malloc(1*sizeof(unsigned char)); + unsigned char *pixelI = (unsigned char *)malloc(1*sizeof(unsigned char)); + + IplImage *TNimage = 0; + + if(debug) + { + TNimage = cvCreateImage(cvSize(image->width,image->height),image->depth,image->nChannels); + cvFillImage(TNimage, 0.0); + } + + PixelUtils p; + + for(int y = 0; y < image->height; y++) + { + for(int x = 0; x < image->width; x++) + { + p.GetGrayPixel(ground_truth,x,y,pixelGT); + p.GetGrayPixel(image,x,y,pixelI); + + if((pixelGT[0] == 0) && (pixelI[0] == 0.0)) + { + *pixelI = 255; + + if(debug) + p.PutGrayPixel(TNimage,x,y,*pixelI); + + nTN++; + } + } + } + + if(debug) + { + cvNamedWindow("TNImage", 0); + cvShowImage("TNImage", TNimage); + //std::cout << "True Negatives: " << nTN << std::endl; + //<< " press ENTER to continue" << std::endl; + //cvWaitKey(0); + cvReleaseImage(&TNimage); + } + + free(pixelGT); + free(pixelI); + + return nTN; +} + +float PerformanceUtils::NrFalsePositives(IplImage *image, IplImage *ground_truth,bool debug) +{ + float nFP = 0.0; + + unsigned char *pixelGT = (unsigned char*) malloc(1*sizeof(unsigned char)); + unsigned char *pixelI = (unsigned char*) malloc(1*sizeof(unsigned char)); + + IplImage *FPimage = 0; + + if(debug) + { + FPimage = cvCreateImage(cvSize(image->width,image->height),image->depth,image->nChannels); + cvFillImage(FPimage, 0.0); + } + + PixelUtils p; + + for(int y = 0; y < image->height; y++) + { + for(int x = 0; x < image->width; x++) + { + p.GetGrayPixel(ground_truth,x,y,pixelGT); + p.GetGrayPixel(image,x,y,pixelI); + + if((pixelGT[0] == 0) && (pixelI[0] != 0)) + { + if(debug) + p.PutGrayPixel(FPimage,x,y,*pixelI); + + nFP++; + } + } + } + + if(debug) + { + cvNamedWindow("FPImage", 0); + cvShowImage("FPImage", FPimage); + //std::cout << "False Positives: " << nFP << std::endl; + //<< " press ENTER to continue" << std::endl; + //cvWaitKey(0); + cvReleaseImage(&FPimage); + } + + free(pixelGT); + free(pixelI); + + return nFP; +} + +float PerformanceUtils::NrFalseNegatives(IplImage * image, IplImage *ground_truth, bool debug) +{ + float nFN = 0.0; + + unsigned char *pixelGT = (unsigned char*) malloc(1*sizeof(unsigned char)); + unsigned char *pixelI = (unsigned char*) malloc(1*sizeof(unsigned char)); + + IplImage *FNimage = 0; + + if(debug) + { + FNimage = cvCreateImage(cvSize(image->width,image->height),image->depth,image->nChannels); + cvFillImage(FNimage, 0.0); + } + + PixelUtils p; + + for(int y = 0; y < image->height; y++) + { + for(int x = 0; x < image->width; x++) + { + p.GetGrayPixel(ground_truth,x,y,pixelGT); + p.GetGrayPixel(image,x,y,pixelI); + + if((pixelGT[0] != 0) && (pixelI[0] == 0)) + { + if(debug) + p.PutGrayPixel(FNimage,x,y,*pixelGT); + + nFN++; + } + } + } + + if(debug) + { + cvNamedWindow("FNImage", 0); + cvShowImage("FNImage", FNimage); + //std::cout << "False Negatives: " << nFN << std::endl; + //<< " press ENTER to continue" << std::endl; + //cvWaitKey(0); + cvReleaseImage(&FNimage); + } + + free(pixelGT); + free(pixelI); + + return nFN; +} + +float PerformanceUtils::SimilarityMeasure(IplImage *image, IplImage *ground_truth, bool debug) +{ + cv::Mat img_input(image,true); + cv::Mat img_ref(ground_truth,true); + + int rn = cv::countNonZero(img_ref); + cv::Mat i; + cv::Mat u; + + if(rn > 0) + { + i = img_input & img_ref; + u = img_input | img_ref; + } + else + { + i = (~img_input) & (~img_ref); + u = (~img_input) | (~img_ref); + } + + int in = cv::countNonZero(i); + int un = cv::countNonZero(u); + + double s = (((double)in) / ((double)un)); + + if(debug) + { + cv::imshow("A^B", i); + cv::imshow("AvB", u); + + //std::cout << "Similarity Measure: " << s << std::endl; + + //<< " press ENTER to continue" << std::endl; + //cv::waitKey(0); + } + + return s; +} + +void PerformanceUtils::ImageROC(IplImage *image, IplImage* ground_truth, bool saveResults, char* filename) +{ + unsigned char *pixelGT = (unsigned char*) malloc(1*sizeof(unsigned char)); + unsigned char *pixelI = (unsigned char*) malloc(1*sizeof(unsigned char)); + + IplImage *ROCimage = cvCreateImage(cvSize(image->width,image->height),image->depth,image->nChannels); + cvFillImage(ROCimage, 0.0); + + PixelUtils p; + + for(int y = 0; y < image->height; y++) + { + for(int x = 0; x < image->width; x++) + { + p.GetGrayPixel(ground_truth,x,y,pixelGT); + p.GetGrayPixel(image,x,y,pixelI); + + if((pixelGT[0] != 0) && (pixelI[0] != 0)) // TP + { + *pixelI = 30; + p.PutGrayPixel(ROCimage,x,y,*pixelI); + } + + if((pixelGT[0] == 0) && (pixelI[0] == 0.0)) // TN + { + *pixelI = 0; + p.PutGrayPixel(ROCimage,x,y,*pixelI); + } + + if((pixelGT[0] == 0) && (pixelI[0] != 0)) // FP + { + *pixelI = 255; + p.PutGrayPixel(ROCimage,x,y,*pixelI); + } + + if((pixelGT[0] != 0) && (pixelI[0] == 0)) // FN + { + *pixelI = 100; + p.PutGrayPixel(ROCimage,x,y,*pixelI); + } + } + } + + cvNamedWindow("ROC image", 0); + cvShowImage("ROC image", ROCimage); + + if(saveResults) + { + unsigned char *pixelOI = (unsigned char*) malloc(1*sizeof(unsigned char)); + unsigned char *pixelROC = (unsigned char*) malloc(1*sizeof(unsigned char)); + + float** freq; + float nTP = 0.0; + float nTN = 0.0; + float nFP = 0.0; + float nFN = 0.0; + + freq = (float**) malloc(256*(sizeof(float*))); + for(int i = 0; i < 256; i++) + freq[i] = (float*) malloc(7 * (sizeof(float))); + + for(int i = 0; i < 256; i++) + for(int j = 0; j < 6; j++) + freq[i][j] = 0.0; + + for(int y = 0; y < image->height; y++) + { + for(int x = 0; x < image->width; x++) + { + for(int i = 0; i < 256; i++) + { + p.GetGrayPixel(image,x,y,pixelOI); + p.GetGrayPixel(ROCimage,x,y,pixelROC); + + if((pixelOI[0] == i) && (pixelROC[0] == 30.0)) // TP + { + nTP++; + freq[i][0] = nTP; + break; + } + + if((pixelOI[0] == i) && (pixelROC[0] == 0.0)) // TN + { + nTN++; + freq[i][1] = nTN; + break; + } + + if((pixelOI[0] == i) && (pixelROC[0] == 255.0)) // FP + { + nFP++; + freq[i][2] = nFP; + break; + } + + if((pixelOI[0] == i) && (pixelROC[0] == 100)) // FN + { + nFN++; + freq[i][3] = nFN; + break; + } + } + } + } + + //freq[i][0] = TP + //freq[i][1] = TN + //freq[i][2] = FP + //freq[i][3] = FN + //freq[i][4] = FNR + //freq[i][5] = FPR + + std::ofstream f(filename); + + if(!f.is_open()) + std::cout << "Failed to open file " << filename << " for writing!" << std::endl; + else + { + f << " I TP TN FP FN FPR FNR DR \n" << std::endl; + + for(int i = 0; i < 256; i++) + { + //printf("%4d - TP:%5.0f, TN:%5.0f, FP:%5.0f, FN:%5.0f,", i, freq[i][0], freq[i][1], freq[i][2], freq[i][3]); + + if((freq[i][3] + freq[i][0] != 0.0) && (freq[i][2] + freq[i][1] != 0.0)) + { + freq[i][4] = freq[i][3] / (freq[i][3] + freq[i][0]); // FNR = FN / (TP + FN); + freq[i][5] = freq[i][2] / (freq[i][2] + freq[i][1]); // FPR = FP / (FP + TN); + freq[i][6] = freq[i][0] / (freq[i][0] + freq[i][3]); // DR = TP / (TP+FN); + + //printf(" FPR:%1.5f, FNR:%1.5f, D:%1.5f\n", freq[i][5], freq[i][4], freq[i][6]); + ////fprintf(f," %4d %1.6f %1.6f\n",i,freq[i][5],freq[i][4]); + ////fprintf(f," %1.6f %1.6f\n",freq[i][5],freq[i][4]); + char line[255]; + sprintf(line,"%3d %6.0f %6.0f %6.0f %6.0f %1.6f %1.6f %1.6f\n", + i, freq[i][0], freq[i][1], freq[i][2], freq[i][3], freq[i][5], freq[i][4], freq[i][6]); + f << line; + } + //else + //printf("\n"); + } + + std::cout << "Results saved in " << filename << std::endl; + f.close(); + } + + free(freq); + free(pixelOI); + free(pixelROC); + } + + //std::cout << "press ENTER to continue" << std::endl; + //cvWaitKey(0); + cvReleaseImage(&ROCimage); + + free(pixelGT); + free(pixelI); +} + +void PerformanceUtils::PerformanceEvaluation(IplImage *image, IplImage *ground_truth, bool saveResults, char* filename, bool debug) +{ + float N = 0; + N = NrPixels(image); + + float U = 0; + U = NrAllDetectedPixNotNULL(image, ground_truth); + + float TP = 0; + TP = NrTruePositives(image, ground_truth, debug); + + float TN = 0; + TN = NrTrueNegatives(image, ground_truth, debug); + + float FP = 0; + FP = NrFalsePositives(image, ground_truth, debug); + + float FN = 0; + FN = NrFalseNegatives(image, ground_truth, debug); + + float DetectionRate = TP / (TP + FN); + float Precision = TP / (TP + FP); + float Fmeasure = (2 * DetectionRate * Precision) / (DetectionRate + Precision); + + float Accuracy = (TN + TP) / N; + float FalseNegativeRate = FN / (TP + FN); + + float FalsePositiveRate = FP / (FP + TN); + float TruePositiveRate = TP / (TP + FN); + + float SM = 0; + SM = SimilarityMeasure(image, ground_truth, debug); + + std::stringstream sstm; + sstm << "N = " << N << std::endl; + sstm << "U = " << U << std::endl; + sstm << "TP = " << TP << std::endl; + sstm << "TN = " << TN << std::endl; + sstm << "FP = " << FP << std::endl; + sstm << "FN = " << FN << std::endl; + sstm << "DetectionRate = " << DetectionRate << std::endl; + sstm << "Precision = " << Precision << std::endl; + sstm << "Fmeasure = " << Fmeasure << std::endl; + sstm << "Accuracy = " << Accuracy << std::endl; + sstm << "FalseNegativeRate = " << FalseNegativeRate << std::endl; + sstm << "FalsePositiveRate = " << FalsePositiveRate << std::endl; + sstm << "TruePositiveRate = " << TruePositiveRate << std::endl; + sstm << "SimilarityMeasure = " << SM << std::endl; + + std::string results = sstm.str(); + std::cout << results; + + if(saveResults) + { + std::ofstream f(filename); + + if(!f.is_open()) + std::cout << "Failed to open file " << filename << " for writing!" << std::endl; + else + { + f << results; + std::cout << "Results saved in " << filename << std::endl; + f.close(); + } + } +} \ No newline at end of file diff --git a/package_bgs/tb/PerformanceUtils.h b/package_bgs/tb/PerformanceUtils.h new file mode 100644 index 0000000..c608264 --- /dev/null +++ b/package_bgs/tb/PerformanceUtils.h @@ -0,0 +1,54 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once +/* +Code provided by Thierry BOUWMANS + +Maitre de Conf�rences +Laboratoire MIA +Universit� de La Rochelle +17000 La Rochelle +France +tbouwman@univ-lr.fr + +http://sites.google.com/site/thierrybouwmans/ +*/ +#include <stdio.h> +#include <fstream> +#include <cv.h> +#include <highgui.h> + +#include "PixelUtils.h" + +class PerformanceUtils +{ +public: + PerformanceUtils(void); + ~PerformanceUtils(void); + + float NrPixels(IplImage *image); + float NrAllDetectedPixNotNULL(IplImage *image, IplImage *ground_truth); + float NrTruePositives(IplImage *image, IplImage *ground_truth, bool debug = false); + float NrTrueNegatives(IplImage *image, IplImage *ground_truth, bool debug = false); + float NrFalsePositives(IplImage *image, IplImage *ground_truth, bool debug = false); + float NrFalseNegatives(IplImage *image, IplImage *ground_truth, bool debug = false); + float SimilarityMeasure(IplImage *image, IplImage *ground_truth, bool debug = false); + + void ImageROC(IplImage *image, IplImage* ground_truth, bool saveResults = false, char* filename = ""); + void PerformanceEvaluation(IplImage *image, IplImage *ground_truth, bool saveResults = false, char* filename = "", bool debug = false); +}; + diff --git a/package_bgs/tb/PixelUtils.cpp b/package_bgs/tb/PixelUtils.cpp new file mode 100644 index 0000000..bc61cc5 --- /dev/null +++ b/package_bgs/tb/PixelUtils.cpp @@ -0,0 +1,351 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "PixelUtils.h" + +PixelUtils::PixelUtils(void){} +PixelUtils::~PixelUtils(void){} + +void PixelUtils::ColorConversion(IplImage* RGBImage, IplImage* ConvertedImage, int color_space) +{ + // Space Color RGB - Nothing to do! + if(color_space == 1) + cvCopyImage(RGBImage, ConvertedImage); + + // Space Color Ohta + if(color_space == 2) + cvttoOTHA(RGBImage, ConvertedImage); + + // Space Color HSV - V Intensity - (H,S) Chromaticity + if(color_space == 3) + cvCvtColor(RGBImage, ConvertedImage, CV_BGR2HSV); + + // Space Color YCrCb - Y Intensity - (Cr,Cb) Chromaticity + if(color_space == 4) + cvCvtColor(RGBImage,ConvertedImage,CV_BGR2YCrCb); +} + +void PixelUtils::cvttoOTHA(IplImage* RGBImage, IplImage* OthaImage) +{ + float* OhtaPixel = (float*) malloc(3*(sizeof(float))); + float* RGBPixel = (float*) malloc(3*(sizeof(float))); + + for(int i = 0; i < RGBImage->width; i++) + { + for(int j = 0;j < RGBImage->height; j++) + { + GetPixel(RGBImage, i, j, RGBPixel); + + // I1 = (R + G + B) / 3 + *OhtaPixel = (*(RGBPixel) + (*(RGBPixel + 1)) + (*(RGBPixel + 2))) / 3.0; + + // I2 = (R - B) / 2 + *(OhtaPixel+1) = (*RGBPixel - (*(RGBPixel + 2))) / 2.0; + + // I3 = (2G - R - B) / 4 + *(OhtaPixel+2) = (2 * (*(RGBPixel + 1)) - (*RGBPixel) - (*(RGBPixel + 2))) / 4.0; + + PutPixel(OthaImage, i, j, OhtaPixel); + } + } + + free(OhtaPixel); + free(RGBPixel); +} + +void PixelUtils::PostProcessing(IplImage *InputImage) +{ + IplImage *ResultImage = cvCreateImage(cvSize(InputImage->width, InputImage->height), IPL_DEPTH_32F, 3); + + cvErode(InputImage, ResultImage, NULL, 1); + cvDilate(ResultImage, InputImage, NULL, 0); + + cvReleaseImage(&ResultImage); +} + +void PixelUtils::GetPixel(IplImage *image, int m, int n, unsigned char *pixelcourant) +{ + for(int k = 0; k < 3; k++) + pixelcourant[k] = ((unsigned char*)(image->imageData + image->widthStep*n))[m*3 + k]; +} + +void PixelUtils::GetGrayPixel(IplImage *image, int m, int n, unsigned char *pixelcourant) +{ + *pixelcourant = ((unsigned char*)(image->imageData + image->widthStep*n))[m]; +} + +void PixelUtils::PutPixel(IplImage *image,int p,int q,unsigned char *pixelcourant) +{ + for(int r = 0; r < 3; r++) + ((unsigned char*)(image->imageData + image->widthStep*q))[p*3 + r] = pixelcourant[r]; +} + +void PixelUtils::PutGrayPixel(IplImage *image, int p, int q, unsigned char pixelcourant) +{ + ((unsigned char*)(image->imageData + image->widthStep*q))[p] = pixelcourant; +} + +void PixelUtils::GetPixel(IplImage *image, int m, int n, float *pixelcourant) +{ + for(int k = 0; k < 3; k++) + pixelcourant[k] = ((float*)(image->imageData + image->widthStep*n))[m*3 + k]; +} + +void PixelUtils::GetGrayPixel(IplImage *image, int m, int n, float *pixelcourant) +{ + *pixelcourant = ((float*)(image->imageData + image->widthStep*n))[m]; +} + +void PixelUtils::PutPixel(IplImage *image, int p, int q, float *pixelcourant) +{ + for(int r = 0; r < 3; r++) + ((float*)(image->imageData + image->widthStep*q))[p*3 + r] = pixelcourant[r]; +} + +void PixelUtils::PutGrayPixel(IplImage *image,int p,int q,float pixelcourant) +{ + ((float*)(image->imageData + image->widthStep*q))[p] = pixelcourant; +} + +void PixelUtils::getNeighberhoodGrayPixel(IplImage* InputImage, int x, int y, float* neighberPixel) +{ + int i,j,k; + + float* pixelCourant = (float*) malloc(1*(sizeof(float))); + + //le calcul de voisinage pour les 4 coins; + /* 1.*/ + if(x==0 && y==0) + { + k = 0; + for(i = x; i < x+2; i++) + for(j = y; j < y+2; j++) + { + GetGrayPixel(InputImage,i,j,pixelCourant); + *(neighberPixel+k) = *pixelCourant; + k++; + } + } + + /* 2.*/ + if(x==0 && y==InputImage->width) + { + k = 0; + for(i = x; i < x+2; i++) + for(j = y-1; j < y+1; j++) + { + GetGrayPixel(InputImage,i,j,pixelCourant); + *(neighberPixel+k) = *pixelCourant; + k++; + } + } + + /* 3.*/ + if(x==InputImage->height && y==0) + { + k = 0; + for(i = x-1; i < x+1; i++) + for(j = y; j < y+2; j++) + { + GetGrayPixel(InputImage,i,j,pixelCourant); + *(neighberPixel+k) = *pixelCourant; + k++; + } + } + + /* 4.*/ + if(x==InputImage->height && y==InputImage->width) + { + k = 0; + for(i = x-1; i <x+1; i++) + for(j = y-1; j < y+1; j++) + { + GetGrayPixel(InputImage,i,j,pixelCourant); + *(neighberPixel+k) = *pixelCourant; + k++; + } + } + + // Voisinage de la premiere ligne : L(0) + if(x==0 && (y!=0 && y!=InputImage->width)) + { + k = 0; + for(i = x+1; i >= x; i--) + for(j = y-1; j < y+2; j++) + { + GetGrayPixel(InputImage,i,j,pixelCourant); + *(neighberPixel+k) = *pixelCourant; + k++; + } + } + + // Voisinage de la derni�re colonne : C(w) + if((x!=0 && x!=InputImage->height) && y==InputImage->width) + { + k = 0; + for(i = x+1; i > x-2; i--) + for(j = y-1; j < y+1; j++) + { + GetGrayPixel(InputImage,i,j,pixelCourant); + *(neighberPixel+k) = *pixelCourant; + k++; + } + } + + // Voisinage de la derni�re ligne : L(h) + if(x==InputImage->height && (y!=0 && y!=InputImage->width)) + { + k = 0; + for(i = x; i > x-2; i--) + for(j = y-1; j < y+2; j++) + { + GetGrayPixel(InputImage,i,j,pixelCourant); + *(neighberPixel+k) = *pixelCourant; + k++; + } + } + + // Voisinage de la premiere colonne : C(0) + if((x!=0 && x!=InputImage->height) && y==0) + { + k = 0; + for(i = x-1; i < x+2; i++) + for(j = y; j < y+2; j++) + { + GetGrayPixel(InputImage,i,j,pixelCourant); + *(neighberPixel+k) = *pixelCourant; + k++; + } + } + + //le calcul du voisinage pour le reste des elementes d'image + if((x!=0 && x!=InputImage->height)&&(y!=0 && y!=InputImage->width)) + { + k = 0; + for(i = x+1;i > x-2; i--) + for(j = y-1; j < y+2; j++) + { + GetGrayPixel(InputImage,i,j,pixelCourant); + *(neighberPixel+k) = *pixelCourant; + k++; + } + } + + free(pixelCourant); +} + +void PixelUtils::ForegroundMinimum(IplImage *Foreground, float *Minimum, int n) +{ + int i,j,k; + float *pixelcourant; + + pixelcourant = (float *) malloc(n*sizeof(float)); + + for(k = 0; k < n; k++) + *(Minimum + k) = 255; + + for(i = 0; i < Foreground->width; i++) + for(j = 0; j < Foreground->height; j++) + { + if(n == 3) + { + GetPixel(Foreground,i,j,pixelcourant); + + for(k = 0; k < n; k++) + if(*(pixelcourant + k) < *(Minimum + k)) + *(Minimum + k) = *(pixelcourant + k); + } + + if(n==1) + { + GetGrayPixel(Foreground,i,j,pixelcourant); + + if(*pixelcourant < *Minimum) + *Minimum = *pixelcourant; + } + } + + free(pixelcourant); +} + +void PixelUtils::ForegroundMaximum(IplImage *Foreground, float *Maximum, int n) +{ + int i,j,k; + float *pixelcourant; + + pixelcourant = (float *) malloc(n*sizeof(float)); + + for(k = 0; k < n; k++) + *(Maximum + k) = 0; + + for(i = 0; i < Foreground->width; i++) + for(j = 0; j < Foreground->height; j++) + { + if(n == 3) + { + GetPixel(Foreground,i,j,pixelcourant); + + for(k = 0; k < n; k++) + if(*(pixelcourant + k) > *(Maximum + k)) + *(Maximum + k) = *(pixelcourant + k); + } + + if(n == 1) + { + GetGrayPixel(Foreground,i,j,pixelcourant); + + if(*pixelcourant > *Maximum) + *Maximum = *pixelcourant; + } + } + + free(pixelcourant); +} + +void PixelUtils::ComplementaryAlphaImageCreation(IplImage *AlphaImage, IplImage *ComplementaryAlphaImage, int n) +{ + int i,j,k; + float *pixelcourant, *pixelcourant1; + + pixelcourant = (float *) malloc(n * sizeof(float)); + pixelcourant1 = (float *) malloc(n * sizeof(float)); + + for(i = 0; i < AlphaImage->width; i++) + for(j = 0; j < AlphaImage->height; j++) + { + if(n == 1) + { + GetGrayPixel(AlphaImage,i,j,pixelcourant); + *pixelcourant1 = 1 - *(pixelcourant); + PutGrayPixel(ComplementaryAlphaImage,i,j,*pixelcourant1); + } + + if(n == 3) + { + GetPixel(AlphaImage,i,j,pixelcourant); + for(k = 0; k < 3; k++) + { + *pixelcourant1 = 1.0 - *(pixelcourant); + *(pixelcourant1+1) = 1.0 - *(pixelcourant+1); + *(pixelcourant1+2) = 1.0 - *(pixelcourant+2); + } + PutPixel(ComplementaryAlphaImage,i,j,pixelcourant1); + } + } + + free(pixelcourant); + free(pixelcourant1); +} diff --git a/package_bgs/tb/PixelUtils.h b/package_bgs/tb/PixelUtils.h new file mode 100644 index 0000000..efbfdd9 --- /dev/null +++ b/package_bgs/tb/PixelUtils.h @@ -0,0 +1,61 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once +/* +Code provided by Thierry BOUWMANS + +Maitre de Conf�rences +Laboratoire MIA +Universit� de La Rochelle +17000 La Rochelle +France +tbouwman@univ-lr.fr + +http://sites.google.com/site/thierrybouwmans/ +*/ +#include <stdio.h> +#include <cv.h> +#include <highgui.h> + +class PixelUtils +{ +public: + PixelUtils(void); + ~PixelUtils(void); + + void ColorConversion(IplImage* RGBImage, IplImage* ConvertedImage, int color_space); + void cvttoOTHA(IplImage* RGBImage, IplImage* OthaImage); + + void PostProcessing(IplImage *InputImage); + + void GetPixel(IplImage *image, int m, int n, unsigned char *pixelcourant); + void GetGrayPixel(IplImage *image, int m, int n, unsigned char *pixelcourant); + + void PutPixel(IplImage *image, int p, int q, unsigned char *pixelcourant); + void PutGrayPixel(IplImage *image, int p, int q, unsigned char pixelcourant); + + void GetPixel(IplImage *image, int m, int n, float *pixelcourant); + void GetGrayPixel(IplImage *image, int m, int n, float *pixelcourant); + + void PutPixel(IplImage *image, int p, int q, float *pixelcourant); + void PutGrayPixel(IplImage *image, int p, int q, float pixelcourant); + + void getNeighberhoodGrayPixel(IplImage* InputImage, int x, int y, float* neighberPixel); + void ForegroundMaximum(IplImage *Foreground, float *Maximum, int n); + void ForegroundMinimum(IplImage *Foreground, float *Minimum, int n); + void ComplementaryAlphaImageCreation(IplImage *AlphaImage, IplImage *ComplementaryAlphaImage, int n); +}; \ No newline at end of file diff --git a/package_bgs/tb/T2FGMM.cpp b/package_bgs/tb/T2FGMM.cpp new file mode 100644 index 0000000..70d5749 --- /dev/null +++ b/package_bgs/tb/T2FGMM.cpp @@ -0,0 +1,337 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* T2FGMM.cpp +* +* Purpose: Implementation of the T2 Fuzzy Gaussian Mixture Models (T2GMMs) +* "Modeling of Dynamic Backgrounds by Type-2 Fuzzy Gaussians Mixture Models" +* Author: Fida El Baf, Thierry Bouwmans, September 2008. + +******************************************************************************/ + +#include "T2FGMM.h" + +using namespace Algorithms::BackgroundSubtraction; + +int compareT2FGMM(const void* _gmm1, const void* _gmm2) +{ + GMM gmm1 = *(GMM*)_gmm1; + GMM gmm2 = *(GMM*)_gmm2; + + if(gmm1.significants < gmm2.significants) + return 1; + else if(gmm1.significants == gmm2.significants) + return 0; + else + return -1; +} + +T2FGMM::T2FGMM() +{ + m_modes = NULL; +} + +T2FGMM::~T2FGMM() +{ + if(m_modes != NULL) + delete[] m_modes; +} + +void T2FGMM::Initalize(const BgsParams& param) +{ + m_params = (T2FGMMParams&) param; + + // Tbf - the threshold + m_bg_threshold = 0.75f; // 1-cf from the paper + + // Tgenerate - the threshold + m_variance = 36.0f; // sigma for the new mode + + // GMM for each pixel + m_modes = new GMM[m_params.Size()*m_params.MaxModes()]; + + // used modes per pixel + m_modes_per_pixel = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 1); + + m_background = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 3); + + // Factor control for the T2FGMM-UM [0,3] + //km = (float) 1.5; + km = (float) m_params.KM(); + + // Factor control for the T2FGMM-UV [0.3,1] + //kv = (float) 0.6; + kv = (float) m_params.KV(); +} + +RgbImage* T2FGMM::Background() +{ + return &m_background; +} + +void T2FGMM::InitModel(const RgbImage& data) +{ + m_modes_per_pixel.Clear(); + + for(unsigned int i = 0; i < m_params.Size()*m_params.MaxModes(); ++i) + { + m_modes[i].weight = 0; + m_modes[i].variance = 0; + m_modes[i].muR = 0; + m_modes[i].muG = 0; + m_modes[i].muB = 0; + m_modes[i].significants = 0; + } +} + +void T2FGMM::Update(int frame_num, const RgbImage& data, const BwImage& update_mask) +{ + // it doesn't make sense to have conditional updates in the GMM framework +} + +void T2FGMM::SubtractPixel(long posPixel, const RgbPixel& pixel, unsigned char& numModes, + unsigned char& low_threshold, unsigned char& high_threshold) +{ + // calculate distances to the modes (+ sort???) + // here we need to go in descending order!!! + long pos; + bool bFitsPDF = false; + bool bBackgroundLow = false; + bool bBackgroundHigh = false; + + float fOneMinAlpha = 1 - m_params.Alpha(); + float totalWeight = 0.0f; + + // calculate number of Gaussians to include in the background model + int backgroundGaussians = 0; + double sum = 0.0; + for(int i = 0; i < numModes; ++i) + { + if(sum < m_bg_threshold) + { + backgroundGaussians++; + sum += m_modes[posPixel+i].weight; + } + else + break; + } + + // update all distributions and check for match with current pixel + for(int iModes = 0; iModes < numModes; iModes++) + { + pos = posPixel + iModes; + float weight = m_modes[pos].weight; + + // fit not found yet + if (!bFitsPDF) + { + //check if it belongs to some of the modes + //calculate distance + float var = m_modes[pos].variance; + float muR = m_modes[pos].muR; + float muG = m_modes[pos].muG; + float muB = m_modes[pos].muB; + + //float km = 2; + //float kv = 0.9; + + float dR = fabs(muR - pixel(0)); + float dG = fabs(muG - pixel(1)); + float dB = fabs(muB - pixel(2)); + + // calculate the squared distance + float HR; + float HG; + float HB; + + // T2FGMM-UM + if(m_params.Type() == TYPE_T2FGMM_UM) + { + if((pixel(0)<muR-km*var)|| (pixel(0)>muR+km*var)) + HR=2*km*dR/var; + else + HR=dR*dR/(2*var*var)+km*dR/var+km*km/2; + + if((pixel(1)<muG-km*var)|| (pixel(1)>muG+km*var)) + HG=2*km*dG/var; + else + HG=dG*dG/(2*var*var)+km*dG/var+km*km/2; + + if((pixel(2)<muB-km*var)|| (pixel(2)>muB+km*var)) + HB=2*km*dB/var; + else + HB=dB*dB/(2*var*var)+km*dB/var+km*km/2; + } + + // T2FGMM-UV + if(m_params.Type() == TYPE_T2FGMM_UV) + { + HR = (1/(kv*kv)-kv*kv) * (pixel(0)-muR) * (pixel(0)-muR)/(2*var); + HG = (1/(kv*kv)-kv*kv) * (pixel(1)-muG) * (pixel(1)-muG)/(2*var); + HB = (1/(kv*kv)-kv*kv) * (pixel(2)-muB) * (pixel(2)-muB)/(2*var); + } + + // calculate the squared distance + float dist = (HR*HR + HG*HG + HB*HB); + + if(dist < m_params.HighThreshold()*var && iModes < backgroundGaussians) + bBackgroundHigh = true; + + // a match occurs when the pixel is within sqrt(fTg) standard deviations of the distribution + if(dist < m_params.LowThreshold()*var) + { + bFitsPDF = true; + + // check if this Gaussian is part of the background model + if(iModes < backgroundGaussians) + bBackgroundLow = true; + + //update distribution + float k = m_params.Alpha() / weight; + weight = fOneMinAlpha*weight + m_params.Alpha(); + m_modes[pos].weight = weight; + m_modes[pos].muR = muR - k*(dR); + m_modes[pos].muG = muG - k*(dG); + m_modes[pos].muB = muB - k*(dB); + + //limit the variance + float sigmanew = var + k*(dist-var); + m_modes[pos].variance = sigmanew < 4 ? 4 : sigmanew > 5*m_variance ? 5*m_variance : sigmanew; + m_modes[pos].significants = m_modes[pos].weight / sqrt(m_modes[pos].variance); + } + else + { + weight = fOneMinAlpha*weight; + if(weight < 0.0) + { + weight=0.0; + numModes--; + } + + m_modes[pos].weight = weight; + m_modes[pos].significants = m_modes[pos].weight / sqrt(m_modes[pos].variance); + } + } + else + { + weight = fOneMinAlpha*weight; + if(weight < 0.0) + { + weight=0.0; + numModes--; + } + m_modes[pos].weight = weight; + m_modes[pos].significants = m_modes[pos].weight / sqrt(m_modes[pos].variance); + } + + totalWeight += weight; + } + + // renormalize weights so they add to one + double invTotalWeight = 1.0 / totalWeight; + for(int iLocal = 0; iLocal < numModes; iLocal++) + { + m_modes[posPixel + iLocal].weight *= (float)invTotalWeight; + m_modes[posPixel + iLocal].significants = m_modes[posPixel + iLocal].weight + / sqrt(m_modes[posPixel + iLocal].variance); + } + + // Sort significance values so they are in desending order. + qsort(&m_modes[posPixel], numModes, sizeof(GMM), compareT2FGMM); + + // make new mode if needed and exit + if(!bFitsPDF) + { + if(numModes < m_params.MaxModes()) + numModes++; + //else + // the weakest mode will be replaced + + pos = posPixel + numModes-1; + + m_modes[pos].muR = pixel.ch[0]; + m_modes[pos].muG = pixel.ch[1]; + m_modes[pos].muB = pixel.ch[2]; + m_modes[pos].variance = m_variance; + m_modes[pos].significants = 0; // will be set below + + if (numModes == 1) + m_modes[pos].weight = 1; + else + m_modes[pos].weight = m_params.Alpha(); + + //renormalize weights + int iLocal; + float sum = 0.0; + for(iLocal = 0; iLocal < numModes; iLocal++) + sum += m_modes[posPixel+ iLocal].weight; + + double invSum = 1.0/sum; + for(iLocal = 0; iLocal < numModes; iLocal++) + { + m_modes[posPixel + iLocal].weight *= (float)invSum; + m_modes[posPixel + iLocal].significants = m_modes[posPixel + iLocal].weight / sqrt(m_modes[posPixel + iLocal].variance); + } + } + + // Sort significance values so they are in desending order. + qsort(&(m_modes[posPixel]), numModes, sizeof(GMM), compareT2FGMM); + + if(bBackgroundLow) + low_threshold = BACKGROUND; + else + low_threshold = FOREGROUND; + + if(bBackgroundHigh) + high_threshold = BACKGROUND; + else + high_threshold = FOREGROUND; +} + +/////////////////////////////////////////////////////////////////////////////// +//Input: +// data - a pointer to the data of a RGB image of the same size +//Output: +// output - a pointer to the data of a gray value image of the same size +// (the memory should already be reserved) +// values: 255-foreground, 125-shadow, 0-background +/////////////////////////////////////////////////////////////////////////////// +void T2FGMM::Subtract(int frame_num, const RgbImage& data, BwImage& low_threshold_mask, BwImage& high_threshold_mask) +{ + unsigned char low_threshold, high_threshold; + long posPixel; + + // update each pixel of the image + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + // update model + background subtract + posPixel = (r*m_params.Width() + c) * m_params.MaxModes(); + + SubtractPixel(posPixel, data(r,c), m_modes_per_pixel(r,c), low_threshold, high_threshold); + + low_threshold_mask(r,c) = low_threshold; + high_threshold_mask(r,c) = high_threshold; + + m_background(r,c,0) = (unsigned char) m_modes[posPixel].muR; + m_background(r,c,1) = (unsigned char) m_modes[posPixel].muG; + m_background(r,c,2) = (unsigned char) m_modes[posPixel].muB; + } + } +} diff --git a/package_bgs/tb/T2FGMM.h b/package_bgs/tb/T2FGMM.h new file mode 100644 index 0000000..a698e5a --- /dev/null +++ b/package_bgs/tb/T2FGMM.h @@ -0,0 +1,135 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* T2FGMM.h +* +* Purpose: Implementation of the T2 Fuzzy Gaussian Mixture Models (T2GMMs) +* "Modeling of Dynamic Backgrounds by Type-2 Fuzzy Gaussians Mixture Models" +* Author: Fida El Baf, Thierry Bouwmans, September 2008 +* +* This code is based on code by Z. Zivkovic's written for his enhanced GMM +* background subtraction algorithm: +* +* Zivkovic's code can be obtained at: www.zoranz.net +******************************************************************************/ + +#ifndef T2F_GMM_ +#define T2F_GMM_ + +#include "../dp/Bgs.h" +#include "../dp/GrimsonGMM.h" + +namespace Algorithms +{ + namespace BackgroundSubtraction + { + const int TYPE_T2FGMM_UM = 0; + const int TYPE_T2FGMM_UV = 1; + + // --- User adjustable parameters used by the T2F GMM BGS algorithm --- + class T2FGMMParams : public BgsParams + { + public: + float &LowThreshold() { return m_low_threshold; } + float &HighThreshold() { return m_high_threshold; } + + float &Alpha() { return m_alpha; } + int &MaxModes() { return m_max_modes; } + int &Type() { return m_type; } + float &KM() { return m_km; } + float &KV() { return m_kv; } + + private: + // Threshold on the squared dist. to decide when a sample is close to an existing + // components. If it is not close to any a new component will be generated. + // Smaller threshold values lead to more generated components and higher threshold values + // lead to a small number of components but they can grow too large. + // + // It is usual easiest to think of these thresholds as being the number of variances away + // from the mean of a pixel before it is considered to be from the foreground. + float m_low_threshold; + float m_high_threshold; + + // alpha - speed of update - if the time interval you want to average over is T + // set alpha=1/T. + float m_alpha; + + // Maximum number of modes (Gaussian components) that will be used per pixel + int m_max_modes; + + // T2FGMM_UM / T2FGMM_UV + int m_type; + + // Factor control for the T2FGMM-UM + float m_km; + + // Factor control for the T2FGMM-UV + float m_kv; + }; + + // --- T2FGMM BGS algorithm --- + class T2FGMM : public Bgs + { + public: + T2FGMM(); + ~T2FGMM(); + + void Initalize(const BgsParams& param); + + void InitModel(const RgbImage& data); + void Subtract(int frame_num, const RgbImage& data, BwImage& low_threshold_mask, BwImage& high_threshold_mask); + void Update(int frame_num, const RgbImage& data, const BwImage& update_mask); + + RgbImage* Background(); + + private: + void SubtractPixel(long posPixel, const RgbPixel& pixel, unsigned char& numModes, unsigned char& lowThreshold, unsigned char& highThreshold); + + // User adjustable parameters + T2FGMMParams m_params; + + // Threshold when the component becomes significant enough to be included into + // the background model. It is the TB = 1-cf from the paper. So I use cf=0.1 => TB=0.9 + // For alpha=0.001 it means that the mode should exist for approximately 105 frames before + // it is considered foreground + float m_bg_threshold; //1-cf from the paper + + // Initial variance for the newly generated components. + // It will will influence the speed of adaptation. A good guess should be made. + // A simple way is to estimate the typical standard deviation from the images. + float m_variance; + + // Dynamic array for the mixture of Gaussians + GMM* m_modes; + + // Number of Gaussian components per pixel + BwImage m_modes_per_pixel; + + // Current background model + RgbImage m_background; + + // Factor control for the T2FGMM-UM + float km; + + // Factor control for the T2FGMM-UV + float kv; + }; + }; +}; + +#endif diff --git a/package_bgs/tb/T2FGMM_UM.cpp b/package_bgs/tb/T2FGMM_UM.cpp new file mode 100644 index 0000000..aaf280f --- /dev/null +++ b/package_bgs/tb/T2FGMM_UM.cpp @@ -0,0 +1,111 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "T2FGMM_UM.h" + +T2FGMM_UM::T2FGMM_UM() : firstTime(true), frameNumber(0), showOutput(true), threshold(9.0), alpha(0.01), gaussians(3), km(1.5), kv(0.6) +{ + std::cout << "T2FGMM_UM()" << std::endl; +} + +T2FGMM_UM::~T2FGMM_UM() +{ + std::cout << "~T2FGMM_UM()" << std::endl; +} + +void T2FGMM_UM::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + frame = new IplImage(img_input); + + if(firstTime) + frame_data.ReleaseMemory(false); + frame_data = frame; + + if(firstTime) + { + int width = img_input.size().width; + int height = img_input.size().height; + + lowThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + lowThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + highThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + highThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + params.SetFrameSize(width, height); + params.LowThreshold() = threshold; + params.HighThreshold() = 2*params.LowThreshold(); + params.Alpha() = alpha; + params.MaxModes() = gaussians; + params.Type() = TYPE_T2FGMM_UM; + params.KM() = km; // Factor control for the T2FGMM-UM [0,3] default: 1.5 + params.KV() = kv; // Factor control for the T2FGMM-UV [0.3,1] default: 0.6 + + bgs.Initalize(params); + bgs.InitModel(frame_data); + } + + bgs.Subtract(frameNumber, frame_data, lowThresholdMask, highThresholdMask); + lowThresholdMask.Clear(); + bgs.Update(frameNumber, frame_data, lowThresholdMask); + + cv::Mat foreground(highThresholdMask.Ptr()); + + if(showOutput) + cv::imshow("T2FGMM-UM", foreground); + + foreground.copyTo(img_output); + + delete frame; + firstTime = false; + frameNumber++; +} + +void T2FGMM_UM::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/T2FGMM_UM.xml", 0, CV_STORAGE_WRITE); + + cvWriteReal(fs, "threshold", threshold); + cvWriteReal(fs, "alpha", alpha); + cvWriteReal(fs, "km", km); + cvWriteReal(fs, "kv", kv); + cvWriteInt(fs, "gaussians", gaussians); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void T2FGMM_UM::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/T2FGMM_UM.xml", 0, CV_STORAGE_READ); + + threshold = cvReadRealByName(fs, 0, "threshold", 9.0); + alpha = cvReadRealByName(fs, 0, "alpha", 0.01); + km = cvReadRealByName(fs, 0, "km", 1.5); + kv = cvReadRealByName(fs, 0, "kv", 0.6); + gaussians = cvReadIntByName(fs, 0, "gaussians", 3); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/tb/T2FGMM_UM.h b/package_bgs/tb/T2FGMM_UM.h new file mode 100644 index 0000000..17e06c5 --- /dev/null +++ b/package_bgs/tb/T2FGMM_UM.h @@ -0,0 +1,58 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" +#include "T2FGMM.h" + +using namespace Algorithms::BackgroundSubtraction; + +class T2FGMM_UM : public IBGS +{ +private: + bool firstTime; + long frameNumber; + IplImage* frame; + RgbImage frame_data; + + T2FGMMParams params; + T2FGMM bgs; + BwImage lowThresholdMask; + BwImage highThresholdMask; + + double threshold; + double alpha; + float km; + float kv; + int gaussians; + bool showOutput; + +public: + T2FGMM_UM(); + ~T2FGMM_UM(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/tb/T2FGMM_UV.cpp b/package_bgs/tb/T2FGMM_UV.cpp new file mode 100644 index 0000000..6094fe3 --- /dev/null +++ b/package_bgs/tb/T2FGMM_UV.cpp @@ -0,0 +1,111 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "T2FGMM_UV.h" + +T2FGMM_UV::T2FGMM_UV() : firstTime(true), frameNumber(0), showOutput(true), threshold(9.0), alpha(0.01), gaussians(3), km(1.5), kv(0.6) +{ + std::cout << "T2FGMM_UV()" << std::endl; +} + +T2FGMM_UV::~T2FGMM_UV() +{ + std::cout << "~T2FGMM_UV()" << std::endl; +} + +void T2FGMM_UV::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + frame = new IplImage(img_input); + + if(firstTime) + frame_data.ReleaseMemory(false); + frame_data = frame; + + if(firstTime) + { + int width = img_input.size().width; + int height = img_input.size().height; + + lowThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + lowThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + highThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + highThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + params.SetFrameSize(width, height); + params.LowThreshold() = threshold; + params.HighThreshold() = 2*params.LowThreshold(); + params.Alpha() = alpha; + params.MaxModes() = gaussians; + params.Type() = TYPE_T2FGMM_UV; + params.KM() = km; // Factor control for the T2FGMM-UM [0,3] default: 1.5 + params.KV() = kv; // Factor control for the T2FGMM-UV [0.3,1] default: 0.6 + + bgs.Initalize(params); + bgs.InitModel(frame_data); + } + + bgs.Subtract(frameNumber, frame_data, lowThresholdMask, highThresholdMask); + lowThresholdMask.Clear(); + bgs.Update(frameNumber, frame_data, lowThresholdMask); + + cv::Mat foreground(highThresholdMask.Ptr()); + + if(showOutput) + cv::imshow("T2FGMM-UV", foreground); + + foreground.copyTo(img_output); + + delete frame; + firstTime = false; + frameNumber++; +} + +void T2FGMM_UV::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/T2FGMM_UV.xml", 0, CV_STORAGE_WRITE); + + cvWriteReal(fs, "threshold", threshold); + cvWriteReal(fs, "alpha", alpha); + cvWriteReal(fs, "km", km); + cvWriteReal(fs, "kv", kv); + cvWriteInt(fs, "gaussians", gaussians); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void T2FGMM_UV::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/T2FGMM_UV.xml", 0, CV_STORAGE_READ); + + threshold = cvReadRealByName(fs, 0, "threshold", 9.0); + alpha = cvReadRealByName(fs, 0, "alpha", 0.01); + km = cvReadRealByName(fs, 0, "km", 1.5); + kv = cvReadRealByName(fs, 0, "kv", 0.6); + gaussians = cvReadIntByName(fs, 0, "gaussians", 3); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} \ No newline at end of file diff --git a/package_bgs/tb/T2FGMM_UV.h b/package_bgs/tb/T2FGMM_UV.h new file mode 100644 index 0000000..23c0bf1 --- /dev/null +++ b/package_bgs/tb/T2FGMM_UV.h @@ -0,0 +1,58 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" +#include "T2FGMM.h" + +using namespace Algorithms::BackgroundSubtraction; + +class T2FGMM_UV : public IBGS +{ +private: + bool firstTime; + long frameNumber; + IplImage* frame; + RgbImage frame_data; + + T2FGMMParams params; + T2FGMM bgs; + BwImage lowThresholdMask; + BwImage highThresholdMask; + + double threshold; + double alpha; + float km; + float kv; + int gaussians; + bool showOutput; + +public: + T2FGMM_UV(); + ~T2FGMM_UV(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; + diff --git a/package_bgs/tb/T2FMRF.cpp b/package_bgs/tb/T2FMRF.cpp new file mode 100644 index 0000000..3d486bb --- /dev/null +++ b/package_bgs/tb/T2FMRF.cpp @@ -0,0 +1,432 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* T2FMRF.cpp +* +* Purpose: Implementation of the T2 Fuzzy Gaussian Mixture Models (T2GMMs) +* "Modeling of Dynamic Backgrounds by Type-2 Fuzzy Gaussians Mixture Models" +* Author: Fida El Baf, Thierry Bouwmans, September 2008 +* +* This code is based on code by Z. Zivkovic's written for his enhanced GMM +* background subtraction algorithm: +* +* Zivkovic's code can be obtained at: www.zoranz.net +******************************************************************************/ + +#include "T2FMRF.h" + +using namespace Algorithms::BackgroundSubtraction; + +int compareT2FMRF(const void* _gmm1, const void* _gmm2) +{ + GMM gmm1 = *(GMM*)_gmm1; + GMM gmm2 = *(GMM*)_gmm2; + + if(gmm1.significants < gmm2.significants) + return 1; + else if(gmm1.significants == gmm2.significants) + return 0; + else + return -1; +} + +GMM* T2FMRF::gmm() +{ + return m_modes; +} +HMM* T2FMRF::hmm() +{ + return m_state; +} + +T2FMRF::T2FMRF() +{ + m_modes = NULL; +} + +T2FMRF::~T2FMRF() +{ + if(m_modes != NULL) + delete[] m_modes; +} + +void T2FMRF::Initalize(const BgsParams& param) +{ + m_params = (T2FMRFParams&) param; + + // Tbf - the threshold + m_bg_threshold = 0.75f; // 1-cf from the paper + + // Tgenerate - the threshold + m_variance = 36.0f; // sigma for the new mode + + // GMM for each pixel + m_modes = new GMM[m_params.Size()*m_params.MaxModes()]; + + //HMM for each pixel + m_state = new HMM[m_params.Size()]; + + // used modes per pixel + m_modes_per_pixel = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 1); + + m_background = cvCreateImage(cvSize(m_params.Width(), m_params.Height()), IPL_DEPTH_8U, 3); + + // Factor control for the T2FGMM-UM [0,3] + // km = (float) 2; //1.5; + km = (float) m_params.KM(); + + // Factor control for the T2FGMM-UV [0.3,1] + // kv = (float) 0.9; //0.6; + kv = (float) m_params.KV(); +} + +RgbImage* T2FMRF::Background() +{ + return &m_background; +} + +void T2FMRF::InitModel(const RgbImage& data) +{ + m_modes_per_pixel.Clear(); + + for(unsigned int i = 0; i < m_params.Size()*m_params.MaxModes(); ++i) + { + m_modes[i].weight = 0; + m_modes[i].variance = 0; + m_modes[i].muR = 0; + m_modes[i].muG = 0; + m_modes[i].muB = 0; + m_modes[i].significants = 0; + } + + for (unsigned int j = 0; j < m_params.Size(); ++j) + { + m_state[j].State = background; + m_state[j].Ab2b = 0.7; + m_state[j].Ab2f = 0.3; + m_state[j].Af2b = 0.4; + m_state[j].Af2f = 0.6; + m_state[j].T = 0.7; + } +} + +void T2FMRF::Update(int frame_num, const RgbImage& data, const BwImage& update_mask) +{ + // it doesn't make sense to have conditional updates in the GMM framework +} + +void T2FMRF::SubtractPixel(long posPixel, long posGMode, const RgbPixel& pixel, unsigned char& numModes, + unsigned char& low_threshold, unsigned char& high_threshold) +{ + // calculate distances to the modes (+ sort???) + // here we need to go in descending order!!! + long pos; + bool bFitsPDF = false; + bool bBackgroundLow = false; + bool bBackgroundHigh = false; + + HiddenState CurrentState = m_state[posPixel].State; + float Ab2b = m_state[posPixel].Ab2b; + float Ab2f = m_state[posPixel].Ab2f; + float Af2b = m_state[posPixel].Af2b; + float Af2f = m_state[posPixel].Af2f; + float T = m_state[posPixel].T; + + float fOneMinAlpha = 1 - m_params.Alpha(); + float totalWeight = 0.0f; + + // calculate number of Gaussians to include in the background model + int backgroundGaussians = 0; + double sum = 0.0; + for(int i = 0; i < numModes; ++i) + { + if(sum < m_bg_threshold) + { + backgroundGaussians++; + sum += m_modes[posGMode+i].weight; + } + else + break; + } + + // update all distributions and check for match with current pixel + for (int iModes = 0; iModes < numModes; iModes++) + { + pos = posGMode + iModes; + float weight = m_modes[pos].weight; + + // fit not found yet + if (!bFitsPDF) + { + //check if it belongs to some of the modes + //calculate distance + float var = m_modes[pos].variance; + float muR = m_modes[pos].muR; + float muG = m_modes[pos].muG; + float muB = m_modes[pos].muB; + + //float km = 2; + //float kv = 0.9; + + float dR = fabs(muR - pixel(0)); + float dG = fabs(muG - pixel(1)); + float dB = fabs(muB - pixel(2)); + + // calculate the squared distance + float HR; + float HG; + float HB; + + // T2FMRF-UM + if(m_params.Type() == TYPE_T2FMRF_UM) + { + if((pixel(0) < muR-km*var) || (pixel(0) > muR+km*var)) + HR = 2*km*dR/var; + else + HR = dR*dR/(2*var*var)+km*dR/var+km*km/2; + + if((pixel(1) < muG-km*var) || (pixel(1) > muG+km*var)) + HG = 2*km*dG/var; + else + HG = dG*dG/(2*var*var)+km*dG/var+km*km/2; + + if((pixel(2) < muB-km*var) || (pixel(2) > muB+km*var)) + HB = 2*km*dB/var; + else + HB = dB*dB/(2*var*var)+km*dB/var+km*km/2; + } + + // T2FGMM-UV + if(m_params.Type() == TYPE_T2FMRF_UV) + { + HR = (1/(kv*kv)-kv*kv) * (pixel(0)-muR) * (pixel(0)-muR)/(2*var); + HG = (1/(kv*kv)-kv*kv) * (pixel(1)-muG) * (pixel(1)-muG)/(2*var); + HB = (1/(kv*kv)-kv*kv) * (pixel(2)-muB) * (pixel(2)-muB)/(2*var); + } + + float ro; + if (CurrentState == background) + { + if (Ab2b!=0) ro = (Ab2f/Ab2b); + else ro = 10; + } + else + { + if(Af2b!=0) ro = (Af2f/Af2b); + else ro = 10; + } + + // calculate the squared distance + float dist = (HR*HR + HG*HG + HB*HB); + + if(dist < m_params.HighThreshold()*var && iModes < backgroundGaussians) + bBackgroundHigh = true; + + // a match occurs when the pixel is within sqrt(fTg) standard deviations of the distribution + if(dist < m_params.LowThreshold()*var) + { + bFitsPDF = true; + + // check if this Gaussian is part of the background model + if(iModes < backgroundGaussians) + bBackgroundLow = true; + + //update distribution + float k = m_params.Alpha() / weight; + weight = fOneMinAlpha*weight + m_params.Alpha(); + m_modes[pos].weight = weight; + m_modes[pos].muR = muR - k*(dR); + m_modes[pos].muG = muG - k*(dG); + m_modes[pos].muB = muB - k*(dB); + + //limit the variance + float sigmanew = var + k*(dist-var); + m_modes[pos].variance = sigmanew < 4 ? 4 : sigmanew > 5*m_variance ? 5*m_variance : sigmanew; + m_modes[pos].significants = m_modes[pos].weight / sqrt(m_modes[pos].variance); + } + else + { + weight = fOneMinAlpha*weight; + if (weight < 0.0) + { + weight=0.0; + numModes--; + } + + m_modes[pos].weight = weight; + m_modes[pos].significants = m_modes[pos].weight / sqrt(m_modes[pos].variance); + } + } + else + { + weight = fOneMinAlpha*weight; + if (weight < 0.0) + { + weight=0.0; + numModes--; + } + m_modes[pos].weight = weight; + m_modes[pos].significants = m_modes[pos].weight / sqrt(m_modes[pos].variance); + } + + totalWeight += weight; + } + + // renormalize weights so they add to one + double invTotalWeight = 1.0 / totalWeight; + for (int iLocal = 0; iLocal < numModes; iLocal++) + { + m_modes[posGMode + iLocal].weight *= (float)invTotalWeight; + m_modes[posGMode + iLocal].significants = m_modes[posGMode + iLocal].weight / sqrt(m_modes[posGMode + iLocal].variance); + } + + // Sort significance values so they are in desending order. + qsort(&m_modes[posGMode], numModes, sizeof(GMM), compareT2FMRF); + + // make new mode if needed and exit + if(!bFitsPDF) + { + if(numModes < m_params.MaxModes()) + numModes++; + //else + // the weakest mode will be replaced + + pos = posGMode + numModes-1; + + m_modes[pos].muR = pixel.ch[0]; + m_modes[pos].muG = pixel.ch[1]; + m_modes[pos].muB = pixel.ch[2]; + m_modes[pos].variance = m_variance; + m_modes[pos].significants = 0; // will be set below + + if(numModes == 1) + m_modes[pos].weight = 1; + else + m_modes[pos].weight = m_params.Alpha(); + + //renormalize weights + int iLocal; + float sum = 0.0; + for(iLocal = 0; iLocal < numModes; iLocal++) + sum += m_modes[posGMode+ iLocal].weight; + + double invSum = 1.0/sum; + for(iLocal = 0; iLocal < numModes; iLocal++) + { + m_modes[posGMode + iLocal].weight *= (float)invSum; + m_modes[posGMode + iLocal].significants = m_modes[posPixel + iLocal].weight / sqrt(m_modes[posGMode + iLocal].variance); + } + } + + // Sort significance values so they are in desending order. + qsort(&(m_modes[posGMode]), numModes, sizeof(GMM), compareT2FMRF); + + if(bBackgroundLow) + { + low_threshold = BACKGROUND; + m_state[posPixel].State = background; + + if(CurrentState == background) + { + float b2b = fOneMinAlpha*Ab2b + m_params.Alpha(); + float b2f = fOneMinAlpha*Ab2f; + + float b = b2b + b2f; + m_state[posPixel].Ab2b = b2b/b; + m_state[posPixel].Ab2f = b2f/b; + m_state[posPixel].T = m_state[posPixel].Ab2b; + } + else + { + float f2b = fOneMinAlpha*Af2b + m_params.Alpha(); + float f2f = fOneMinAlpha*Af2f; + + float f = f2b + f2f; + m_state[posPixel].Af2b = f2b/f; + m_state[posPixel].Af2f = f2f/f; + m_state[posPixel].T = m_state[posPixel].Af2b; + } + } + else + { + low_threshold = FOREGROUND; + m_state[posPixel].State = foreground; + + if(CurrentState == background) + { + float b2b = fOneMinAlpha*Ab2b; + float b2f = fOneMinAlpha*Ab2f + m_params.Alpha(); + + float b = b2b + b2f; + m_state[posPixel].Ab2b = b2b/b; + m_state[posPixel].Ab2f = b2f/b; + m_state[posPixel].T = m_state[posPixel].Ab2b; + } + else + { + float f2b = fOneMinAlpha*Af2b; + float f2f = fOneMinAlpha*Af2f + m_params.Alpha(); + + float f = f2b + f2f; + m_state[posPixel].Af2b = f2b/f; + m_state[posPixel].Af2f = f2f/f; + m_state[posPixel].T = m_state[posPixel].Af2b; + } + } + + if(bBackgroundHigh) + high_threshold = BACKGROUND; + else + high_threshold = FOREGROUND; +} + +/////////////////////////////////////////////////////////////////////////////// +//Input: +// data - a pointer to the data of a RGB image of the same size +//Output: +// output - a pointer to the data of a gray value image of the same size +// (the memory should already be reserved) +// values: 255-foreground, 125-shadow, 0-background +/////////////////////////////////////////////////////////////////////////////// +void T2FMRF::Subtract(int frame_num, const RgbImage& data, + BwImage& low_threshold_mask, BwImage& high_threshold_mask) +{ + unsigned char low_threshold, high_threshold; + long posPixel; + long posGMode; + + // update each pixel of the image + for(unsigned int r = 0; r < m_params.Height(); ++r) + { + for(unsigned int c = 0; c < m_params.Width(); ++c) + { + // update model + background subtract + posPixel = r*m_params.Width() + c; + posGMode = (r*m_params.Width() + c) * m_params.MaxModes(); + + SubtractPixel(posPixel, posGMode, data(r,c), m_modes_per_pixel(r,c), low_threshold, high_threshold); + + low_threshold_mask(r,c) = low_threshold; + high_threshold_mask(r,c) = high_threshold; + + m_background(r,c,0) = (unsigned char) m_modes[posGMode].muR; + m_background(r,c,1) = (unsigned char) m_modes[posGMode].muG; + m_background(r,c,2) = (unsigned char) m_modes[posGMode].muB; + } + } +} diff --git a/package_bgs/tb/T2FMRF.h b/package_bgs/tb/T2FMRF.h new file mode 100644 index 0000000..e6fb449 --- /dev/null +++ b/package_bgs/tb/T2FMRF.h @@ -0,0 +1,164 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +/**************************************************************************** +* +* T2FMRF.h +* +* Purpose: Implementation of the T2 Fuzzy Gaussian Mixture Models (T2GMMs) +* "Modeling of Dynamic Backgrounds by Type-2 Fuzzy Gaussians Mixture Models" +* Author: Fida El Baf, Thierry Bouwmans, September 2008 +* +* This code is based on code by Z. Zivkovic's written for his enhanced GMM +* background subtraction algorithm: +* +* Zivkovic's code can be obtained at: www.zoranz.net +******************************************************************************/ + +#ifndef T2F_MRF_ +#define T2F_MRF_ + +#include "../dp/Bgs.h" +#include "../dp/GrimsonGMM.h" + +namespace Algorithms +{ + namespace BackgroundSubtraction + { + const int TYPE_T2FMRF_UM = 0; + const int TYPE_T2FMRF_UV = 1; + + enum HiddenState {background, foreground}; + + typedef struct HMMState + { + float T; + //Hidden State + HiddenState State; + //transition probability + float Ab2b; + float Ab2f; + float Af2f; + float Af2b; + } HMM; + + //typedef struct GMMGaussian + //{ + // float variance; + // float muR; + // float muG; + // float muB; + // float weight; + // float significants; // this is equal to weight / standard deviation and is used to + // // determine which Gaussians should be part of the background model + //} GMM; + + // --- User adjustable parameters used by the T2F GMM BGS algorithm --- + class T2FMRFParams : public BgsParams + { + public: + float &LowThreshold() { return m_low_threshold; } + float &HighThreshold() { return m_high_threshold; } + + float &Alpha() { return m_alpha; } + int &MaxModes() { return m_max_modes; } + int &Type() { return m_type; } + float &KM() { return m_km; } + float &KV() { return m_kv; } + + private: + // Threshold on the squared dist. to decide when a sample is close to an existing + // components. If it is not close to any a new component will be generated. + // Smaller threshold values lead to more generated components and higher threshold values + // lead to a small number of components but they can grow too large. + // + // It is usual easiest to think of these thresholds as being the number of variances away + // from the mean of a pixel before it is considered to be from the foreground. + float m_low_threshold; + float m_high_threshold; + + // alpha - speed of update - if the time interval you want to average over is T + // set alpha=1/T. + float m_alpha; + + // Maximum number of modes (Gaussian components) that will be used per pixel + int m_max_modes; + + // T2FMRF_UM / T2FMRF_UV + int m_type; + + // Factor control for the T2FMRF-UM + float m_km; + + // Factor control for the T2FMRF-UV + float m_kv; + }; + + // --- T2FGMM BGS algorithm --- + class T2FMRF : public Bgs + { + public: + T2FMRF(); + ~T2FMRF(); + + void Initalize(const BgsParams& param); + void InitModel(const RgbImage& data); + void Subtract(int frame_num, const RgbImage& data, BwImage& low_threshold_mask, BwImage& high_threshold_mask); + void Update(int frame_num, const RgbImage& data, const BwImage& update_mask); + + RgbImage* Background(); + + GMM *gmm(void); + HMM *hmm(void); + + private: + void SubtractPixel(long posPixel, long posGMode, const RgbPixel& pixel, unsigned char& numModes, unsigned char& lowThreshold, unsigned char& highThreshold); + + // User adjustable parameters + T2FMRFParams m_params; + + // Threshold when the component becomes significant enough to be included into + // the background model. It is the TB = 1-cf from the paper. So I use cf=0.1 => TB=0.9 + // For alpha=0.001 it means that the mode should exist for approximately 105 frames before + // it is considered foreground + float m_bg_threshold; //1-cf from the paper + + // Initial variance for the newly generated components. + // It will will influence the speed of adaptation. A good guess should be made. + // A simple way is to estimate the typical standard deviation from the images. + float m_variance; + + // Dynamic array for the mixture of Gaussians + GMM* m_modes; + + //Dynamic array for the hidden state + HMM* m_state; + + // Number of Gaussian components per pixel + BwImage m_modes_per_pixel; + + // Current background model + RgbImage m_background; + + // Factor control for the T2FGMM-UM + float km; + // Factor control for the T2FGMM-UV + float kv; + }; + }; +}; + +#endif diff --git a/package_bgs/tb/T2FMRF_UM.cpp b/package_bgs/tb/T2FMRF_UM.cpp new file mode 100644 index 0000000..768db39 --- /dev/null +++ b/package_bgs/tb/T2FMRF_UM.cpp @@ -0,0 +1,140 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "T2FMRF_UM.h" + +T2FMRF_UM::T2FMRF_UM() : firstTime(true), frameNumber(0), showOutput(true), threshold(9.0), alpha(0.01), +gaussians(3), km(2), kv(0.9) +{ + std::cout << "T2FMRF_UM()" << std::endl; +} + +T2FMRF_UM::~T2FMRF_UM() +{ + std::cout << "~T2FMRF_UM()" << std::endl; +} + +void T2FMRF_UM::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + frame = new IplImage(img_input); + + if(firstTime) + frame_data.ReleaseMemory(false); + frame_data = frame; + + if(firstTime) + { + int width = img_input.size().width; + int height = img_input.size().height; + + lowThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + lowThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + highThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + highThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + params.SetFrameSize(width, height); + params.LowThreshold() = threshold; + params.HighThreshold() = 2*params.LowThreshold(); + params.Alpha() = alpha; + params.MaxModes() = gaussians; + params.Type() = TYPE_T2FMRF_UM; + params.KM() = km; // Factor control for the T2FMRF-UM [0,3] default: 2 + params.KV() = kv; // Factor control for the T2FMRF-UV [0.3,1] default: 0.9 + + bgs.Initalize(params); + bgs.InitModel(frame_data); + + old_labeling = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + old = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + + mrf.height = height; + mrf.width = width; + mrf.Build_Classes_OldLabeling_InImage_LocalEnergy(); + + firstTime = false; + } + + bgs.Subtract(frameNumber, frame_data, lowThresholdMask, highThresholdMask); + cvCopyImage(lowThresholdMask.Ptr(), old); + + /************************************************************************/ + /* the code for MRF, it can be noted when using other methods */ + /************************************************************************/ + //the optimization process is done when the foreground detection is stable, + if(frameNumber >= 10) + { + gmm = bgs.gmm(); + hmm = bgs.hmm(); + mrf.background2 = frame_data.Ptr(); + mrf.in_image = lowThresholdMask.Ptr(); + mrf.out_image = lowThresholdMask.Ptr(); + mrf.InitEvidence2(gmm,hmm,old_labeling); + mrf.ICM2(); + cvCopyImage(mrf.out_image, lowThresholdMask.Ptr()); + } + + cvCopyImage(old, old_labeling); + + lowThresholdMask.Clear(); + bgs.Update(frameNumber, frame_data, lowThresholdMask); + + cv::Mat foreground(highThresholdMask.Ptr()); + + if(showOutput) + cv::imshow("T2FMRF-UM", foreground); + + foreground.copyTo(img_output); + + delete frame; + frameNumber++; +} + +void T2FMRF_UM::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/T2FMRF_UM.xml", 0, CV_STORAGE_WRITE); + + cvWriteReal(fs, "threshold", threshold); + cvWriteReal(fs, "alpha", alpha); + cvWriteReal(fs, "km", km); + cvWriteReal(fs, "kv", kv); + cvWriteInt(fs, "gaussians", gaussians); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void T2FMRF_UM::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/T2FMRF_UM.xml", 0, CV_STORAGE_READ); + + threshold = cvReadRealByName(fs, 0, "threshold", 9.0); + alpha = cvReadRealByName(fs, 0, "alpha", 0.01); + km = cvReadRealByName(fs, 0, "km", 2); + kv = cvReadRealByName(fs, 0, "kv", 0.9); + gaussians = cvReadIntByName(fs, 0, "gaussians", 3); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/tb/T2FMRF_UM.h b/package_bgs/tb/T2FMRF_UM.h new file mode 100644 index 0000000..6066834 --- /dev/null +++ b/package_bgs/tb/T2FMRF_UM.h @@ -0,0 +1,64 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" +#include "MRF.h" + +using namespace Algorithms::BackgroundSubtraction; + +class T2FMRF_UM : public IBGS +{ +private: + bool firstTime; + long frameNumber; + IplImage *frame; + RgbImage frame_data; + + IplImage *old_labeling; + IplImage *old; + + T2FMRFParams params; + T2FMRF bgs; + BwImage lowThresholdMask; + BwImage highThresholdMask; + + double threshold; + double alpha; + float km; + float kv; + int gaussians; + bool showOutput; + + MRF_TC mrf; + GMM *gmm; + HMM *hmm; + +public: + T2FMRF_UM(); + ~T2FMRF_UM(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; diff --git a/package_bgs/tb/T2FMRF_UV.cpp b/package_bgs/tb/T2FMRF_UV.cpp new file mode 100644 index 0000000..6b6fcc0 --- /dev/null +++ b/package_bgs/tb/T2FMRF_UV.cpp @@ -0,0 +1,140 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#include "T2FMRF_UV.h" + +T2FMRF_UV::T2FMRF_UV() : firstTime(true), frameNumber(0), showOutput(true), threshold(9.0), alpha(0.01), +gaussians(3), km(2), kv(0.9) +{ + std::cout << "T2FMRF_UV()" << std::endl; +} + +T2FMRF_UV::~T2FMRF_UV() +{ + std::cout << "~T2FMRF_UV()" << std::endl; +} + +void T2FMRF_UV::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) +{ + if(img_input.empty()) + return; + + loadConfig(); + + if(firstTime) + saveConfig(); + + frame = new IplImage(img_input); + + if(firstTime) + frame_data.ReleaseMemory(false); + frame_data = frame; + + if(firstTime) + { + int width = img_input.size().width; + int height = img_input.size().height; + + lowThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + lowThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + highThresholdMask = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + highThresholdMask.Ptr()->origin = IPL_ORIGIN_BL; + + params.SetFrameSize(width, height); + params.LowThreshold() = threshold; + params.HighThreshold() = 2*params.LowThreshold(); + params.Alpha() = alpha; + params.MaxModes() = gaussians; + params.Type() = TYPE_T2FMRF_UV; + params.KM() = km; // Factor control for the T2FMRF-UM [0,3] default: 2 + params.KV() = kv; // Factor control for the T2FMRF-UV [0.3,1] default: 0.9 + + bgs.Initalize(params); + bgs.InitModel(frame_data); + + old_labeling = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + old = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); + + mrf.height = height; + mrf.width = width; + mrf.Build_Classes_OldLabeling_InImage_LocalEnergy(); + + firstTime = false; + } + + bgs.Subtract(frameNumber, frame_data, lowThresholdMask, highThresholdMask); + cvCopyImage(lowThresholdMask.Ptr(), old); + + /************************************************************************/ + /* the code for MRF, it can be noted when using other methods */ + /************************************************************************/ + //the optimization process is done when the foreground detection is stable, + if(frameNumber >= 10) + { + gmm = bgs.gmm(); + hmm = bgs.hmm(); + mrf.background2 = frame_data.Ptr(); + mrf.in_image = lowThresholdMask.Ptr(); + mrf.out_image = lowThresholdMask.Ptr(); + mrf.InitEvidence2(gmm,hmm,old_labeling); + mrf.ICM2(); + cvCopyImage(mrf.out_image, lowThresholdMask.Ptr()); + } + + cvCopyImage(old, old_labeling); + + lowThresholdMask.Clear(); + bgs.Update(frameNumber, frame_data, lowThresholdMask); + + cv::Mat foreground(highThresholdMask.Ptr()); + + if(showOutput) + cv::imshow("T2FMRF-UV", foreground); + + foreground.copyTo(img_output); + + delete frame; + frameNumber++; +} + +void T2FMRF_UV::saveConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/T2FMRF_UV.xml", 0, CV_STORAGE_WRITE); + + cvWriteReal(fs, "threshold", threshold); + cvWriteReal(fs, "alpha", alpha); + cvWriteReal(fs, "km", km); + cvWriteReal(fs, "kv", kv); + cvWriteInt(fs, "gaussians", gaussians); + cvWriteInt(fs, "showOutput", showOutput); + + cvReleaseFileStorage(&fs); +} + +void T2FMRF_UV::loadConfig() +{ + CvFileStorage* fs = cvOpenFileStorage("./config/T2FMRF_UV.xml", 0, CV_STORAGE_READ); + + threshold = cvReadRealByName(fs, 0, "threshold", 9.0); + alpha = cvReadRealByName(fs, 0, "alpha", 0.01); + km = cvReadRealByName(fs, 0, "km", 2); + kv = cvReadRealByName(fs, 0, "kv", 0.9); + gaussians = cvReadIntByName(fs, 0, "gaussians", 3); + showOutput = cvReadIntByName(fs, 0, "showOutput", true); + + cvReleaseFileStorage(&fs); +} diff --git a/package_bgs/tb/T2FMRF_UV.h b/package_bgs/tb/T2FMRF_UV.h new file mode 100644 index 0000000..b8c0ff0 --- /dev/null +++ b/package_bgs/tb/T2FMRF_UV.h @@ -0,0 +1,64 @@ +/* +This file is part of BGSLibrary. + +BGSLibrary is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +BGSLibrary is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <iostream> +#include <cv.h> +#include <highgui.h> + +#include "../IBGS.h" +#include "MRF.h" + +using namespace Algorithms::BackgroundSubtraction; + +class T2FMRF_UV : public IBGS +{ +private: + bool firstTime; + long frameNumber; + IplImage *frame; + RgbImage frame_data; + + IplImage *old_labeling; + IplImage *old; + + T2FMRFParams params; + T2FMRF bgs; + BwImage lowThresholdMask; + BwImage highThresholdMask; + + double threshold; + double alpha; + float km; + float kv; + int gaussians; + bool showOutput; + + MRF_TC mrf; + GMM *gmm; + HMM *hmm; + +public: + T2FMRF_UV(); + ~T2FMRF_UV(); + + void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); + +private: + void saveConfig(); + void loadConfig(); +}; diff --git a/run_camera.sh b/run_camera.sh new file mode 100644 index 0000000..f000519 --- /dev/null +++ b/run_camera.sh @@ -0,0 +1,3 @@ +#!/bin/bash +./build/bgs --use_cam --camera=0 + diff --git a/run_demo.sh b/run_demo.sh new file mode 100644 index 0000000..e734f06 --- /dev/null +++ b/run_demo.sh @@ -0,0 +1,3 @@ +#!/bin/bash +./build/bgs_demo dataset/video.avi + diff --git a/run_video.sh b/run_video.sh new file mode 100644 index 0000000..0ae1bcb --- /dev/null +++ b/run_video.sh @@ -0,0 +1,3 @@ +#!/bin/bash +./build/bgs -uf -fn=dataset/video.avi + diff --git a/vs2010/bgslibrary.sln b/vs2010/bgslibrary.sln new file mode 100644 index 0000000..06187d0 --- /dev/null +++ b/vs2010/bgslibrary.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bgslibrary", "bgslibrary.vcxproj", "{3B6BF763-9CDE-4859-ADD9-8EB7B282659F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3B6BF763-9CDE-4859-ADD9-8EB7B282659F}.Debug|Win32.ActiveCfg = Debug|Win32 + {3B6BF763-9CDE-4859-ADD9-8EB7B282659F}.Debug|Win32.Build.0 = Debug|Win32 + {3B6BF763-9CDE-4859-ADD9-8EB7B282659F}.Release|Win32.ActiveCfg = Release|Win32 + {3B6BF763-9CDE-4859-ADD9-8EB7B282659F}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/vs2010/bgslibrary.suo b/vs2010/bgslibrary.suo new file mode 100644 index 0000000000000000000000000000000000000000..3dc8e43797f0d1ee8f60b5d84b6328c180a83479 GIT binary patch literal 11776 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 MgV7|qf1s5E0LfUny8r+H literal 0 HcmV?d00001 diff --git a/vs2010/bgslibrary.vcxproj b/vs2010/bgslibrary.vcxproj new file mode 100644 index 0000000..5a1b829 --- /dev/null +++ b/vs2010/bgslibrary.vcxproj @@ -0,0 +1,220 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{3B6BF763-9CDE-4859-ADD9-8EB7B282659F}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>bgslibrary</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>..\</OutDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories>C:\OpenCV2.4.5\build\include;C:\OpenCV2.4.5\build\include\opencv;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalDependencies>C:\OpenCV2.4.5\build\x86\vc10\staticlib\*.lib;comctl32.lib;VFW32.lib;%(AdditionalDependencies)</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\Demo.cpp" /> + <ClCompile Include="..\package_analysis\ForegroundMaskAnalysis.cpp" /> + <ClCompile Include="..\package_bgs\AdaptiveBackgroundLearning.cpp" /> + <ClCompile Include="..\package_bgs\ae\KDE.cpp" /> + <ClCompile Include="..\package_bgs\ae\KernelTable.cpp" /> + <ClCompile Include="..\package_bgs\ae\NPBGmodel.cpp" /> + <ClCompile Include="..\package_bgs\ae\NPBGSubtractor.cpp" /> + <ClCompile Include="..\package_bgs\av\TBackground.cpp" /> + <ClCompile Include="..\package_bgs\av\TBackgroundVuMeter.cpp" /> + <ClCompile Include="..\package_bgs\av\VuMeter.cpp" /> + <ClCompile Include="..\package_bgs\dp\AdaptiveMedianBGS.cpp" /> + <ClCompile Include="..\package_bgs\dp\Blob.cpp" /> + <ClCompile Include="..\package_bgs\dp\BlobExtraction.cpp" /> + <ClCompile Include="..\package_bgs\dp\BlobResult.cpp" /> + <ClCompile Include="..\package_bgs\dp\ConnectedComponents.cpp" /> + <ClCompile Include="..\package_bgs\dp\DPAdaptiveMedianBGS.cpp" /> + <ClCompile Include="..\package_bgs\dp\DPEigenbackgroundBGS.cpp" /> + <ClCompile Include="..\package_bgs\dp\DPGrimsonGMMBGS.cpp" /> + <ClCompile Include="..\package_bgs\dp\DPMeanBGS.cpp" /> + <ClCompile Include="..\package_bgs\dp\DPPratiMediodBGS.cpp" /> + <ClCompile Include="..\package_bgs\dp\DPTextureBGS.cpp" /> + <ClCompile Include="..\package_bgs\dp\DPWrenGABGS.cpp" /> + <ClCompile Include="..\package_bgs\dp\DPZivkovicAGMMBGS.cpp" /> + <ClCompile Include="..\package_bgs\dp\Eigenbackground.cpp" /> + <ClCompile Include="..\package_bgs\dp\Error.cpp" /> + <ClCompile Include="..\package_bgs\dp\GrimsonGMM.cpp" /> + <ClCompile Include="..\package_bgs\dp\Image.cpp" /> + <ClCompile Include="..\package_bgs\dp\MeanBGS.cpp" /> + <ClCompile Include="..\package_bgs\dp\PratiMediodBGS.cpp" /> + <ClCompile Include="..\package_bgs\dp\TextureBGS.cpp" /> + <ClCompile Include="..\package_bgs\dp\WrenGA.cpp" /> + <ClCompile Include="..\package_bgs\dp\ZivkovicAGMM.cpp" /> + <ClCompile Include="..\package_bgs\FrameDifferenceBGS.cpp" /> + <ClCompile Include="..\package_bgs\jmo\blob.cpp" /> + <ClCompile Include="..\package_bgs\jmo\BlobExtraction.cpp" /> + <ClCompile Include="..\package_bgs\jmo\BlobResult.cpp" /> + <ClCompile Include="..\package_bgs\jmo\CMultiLayerBGS.cpp" /> + <ClCompile Include="..\package_bgs\jmo\LocalBinaryPattern.cpp" /> + <ClCompile Include="..\package_bgs\jmo\MultiLayerBGS.cpp" /> + <ClCompile Include="..\package_bgs\lb\BGModel.cpp" /> + <ClCompile Include="..\package_bgs\lb\BGModelFuzzyGauss.cpp" /> + <ClCompile Include="..\package_bgs\lb\BGModelFuzzySom.cpp" /> + <ClCompile Include="..\package_bgs\lb\BGModelGauss.cpp" /> + <ClCompile Include="..\package_bgs\lb\BGModelMog.cpp" /> + <ClCompile Include="..\package_bgs\lb\BGModelSom.cpp" /> + <ClCompile Include="..\package_bgs\lb\LBAdaptiveSOM.cpp" /> + <ClCompile Include="..\package_bgs\lb\LBFuzzyAdaptiveSOM.cpp" /> + <ClCompile Include="..\package_bgs\lb\LBFuzzyGaussian.cpp" /> + <ClCompile Include="..\package_bgs\lb\LBMixtureOfGaussians.cpp" /> + <ClCompile Include="..\package_bgs\lb\LBSimpleGaussian.cpp" /> + <ClCompile Include="..\package_bgs\MixtureOfGaussianV1BGS.cpp" /> + <ClCompile Include="..\package_bgs\MixtureOfGaussianV2BGS.cpp" /> + <ClCompile Include="..\package_bgs\StaticFrameDifferenceBGS.cpp" /> + <ClCompile Include="..\package_bgs\tb\FuzzyChoquetIntegral.cpp" /> + <ClCompile Include="..\package_bgs\tb\FuzzySugenoIntegral.cpp" /> + <ClCompile Include="..\package_bgs\tb\FuzzyUtils.cpp" /> + <ClCompile Include="..\package_bgs\tb\PerformanceUtils.cpp" /> + <ClCompile Include="..\package_bgs\tb\PixelUtils.cpp" /> + <ClCompile Include="..\package_bgs\tb\T2FGMM.cpp" /> + <ClCompile Include="..\package_bgs\tb\T2FGMM_UM.cpp" /> + <ClCompile Include="..\package_bgs\tb\T2FGMM_UV.cpp" /> + <ClCompile Include="..\package_bgs\WeightedMovingMeanBGS.cpp" /> + <ClCompile Include="..\package_bgs\WeightedMovingVarianceBGS.cpp" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\package_analysis\ForegroundMaskAnalysis.h" /> + <ClInclude Include="..\package_bgs\AdaptiveBackgroundLearning.h" /> + <ClInclude Include="..\package_bgs\ae\KDE.h" /> + <ClInclude Include="..\package_bgs\ae\KernelTable.h" /> + <ClInclude Include="..\package_bgs\ae\NPBGmodel.h" /> + <ClInclude Include="..\package_bgs\ae\NPBGSubtractor.h" /> + <ClInclude Include="..\package_bgs\av\TBackground.h" /> + <ClInclude Include="..\package_bgs\av\TBackgroundVuMeter.h" /> + <ClInclude Include="..\package_bgs\av\VuMeter.h" /> + <ClInclude Include="..\package_bgs\dp\AdaptiveMedianBGS.h" /> + <ClInclude Include="..\package_bgs\dp\Bgs.h" /> + <ClInclude Include="..\package_bgs\dp\BgsParams.h" /> + <ClInclude Include="..\package_bgs\dp\Blob.h" /> + <ClInclude Include="..\package_bgs\dp\BlobExtraction.h" /> + <ClInclude Include="..\package_bgs\dp\BlobResult.h" /> + <ClInclude Include="..\package_bgs\dp\ConnectedComponents.h" /> + <ClInclude Include="..\package_bgs\dp\DPAdaptiveMedianBGS.h" /> + <ClInclude Include="..\package_bgs\dp\DPEigenbackgroundBGS.h" /> + <ClInclude Include="..\package_bgs\dp\DPGrimsonGMMBGS.h" /> + <ClInclude Include="..\package_bgs\dp\DPMeanBGS.h" /> + <ClInclude Include="..\package_bgs\dp\DPPratiMediodBGS.h" /> + <ClInclude Include="..\package_bgs\dp\DPTextureBGS.h" /> + <ClInclude Include="..\package_bgs\dp\DPWrenGABGS.h" /> + <ClInclude Include="..\package_bgs\dp\DPZivkovicAGMMBGS.h" /> + <ClInclude Include="..\package_bgs\dp\Eigenbackground.h" /> + <ClInclude Include="..\package_bgs\dp\Error.h" /> + <ClInclude Include="..\package_bgs\dp\GrimsonGMM.h" /> + <ClInclude Include="..\package_bgs\dp\Image.h" /> + <ClInclude Include="..\package_bgs\dp\MeanBGS.h" /> + <ClInclude Include="..\package_bgs\dp\PratiMediodBGS.h" /> + <ClInclude Include="..\package_bgs\dp\TextureBGS.h" /> + <ClInclude Include="..\package_bgs\dp\WrenGA.h" /> + <ClInclude Include="..\package_bgs\dp\ZivkovicAGMM.h" /> + <ClInclude Include="..\package_bgs\FrameDifferenceBGS.h" /> + <ClInclude Include="..\package_bgs\IBGS.h" /> + <ClInclude Include="..\package_bgs\jmo\BackgroundSubtractionAPI.h" /> + <ClInclude Include="..\package_bgs\jmo\BGS.h" /> + <ClInclude Include="..\package_bgs\jmo\blob.h" /> + <ClInclude Include="..\package_bgs\jmo\BlobExtraction.h" /> + <ClInclude Include="..\package_bgs\jmo\BlobLibraryConfiguration.h" /> + <ClInclude Include="..\package_bgs\jmo\BlobResult.h" /> + <ClInclude Include="..\package_bgs\jmo\CMultiLayerBGS.h" /> + <ClInclude Include="..\package_bgs\jmo\LocalBinaryPattern.h" /> + <ClInclude Include="..\package_bgs\jmo\MultiLayerBGS.h" /> + <ClInclude Include="..\package_bgs\jmo\OpenCvDataConversion.h" /> + <ClInclude Include="..\package_bgs\lb\BGModel.h" /> + <ClInclude Include="..\package_bgs\lb\BGModelFuzzyGauss.h" /> + <ClInclude Include="..\package_bgs\lb\BGModelFuzzySom.h" /> + <ClInclude Include="..\package_bgs\lb\BGModelGauss.h" /> + <ClInclude Include="..\package_bgs\lb\BGModelMog.h" /> + <ClInclude Include="..\package_bgs\lb\BGModelSom.h" /> + <ClInclude Include="..\package_bgs\lb\LBAdaptiveSOM.h" /> + <ClInclude Include="..\package_bgs\lb\LBFuzzyAdaptiveSOM.h" /> + <ClInclude Include="..\package_bgs\lb\LBFuzzyGaussian.h" /> + <ClInclude Include="..\package_bgs\lb\LBMixtureOfGaussians.h" /> + <ClInclude Include="..\package_bgs\lb\LBSimpleGaussian.h" /> + <ClInclude Include="..\package_bgs\lb\Types.h" /> + <ClInclude Include="..\package_bgs\MixtureOfGaussianV1BGS.h" /> + <ClInclude Include="..\package_bgs\MixtureOfGaussianV2BGS.h" /> + <ClInclude Include="..\package_bgs\StaticFrameDifferenceBGS.h" /> + <ClInclude Include="..\package_bgs\tb\FuzzyChoquetIntegral.h" /> + <ClInclude Include="..\package_bgs\tb\FuzzySugenoIntegral.h" /> + <ClInclude Include="..\package_bgs\tb\FuzzyUtils.h" /> + <ClInclude Include="..\package_bgs\tb\PerformanceUtils.h" /> + <ClInclude Include="..\package_bgs\tb\PixelUtils.h" /> + <ClInclude Include="..\package_bgs\tb\T2FGMM.h" /> + <ClInclude Include="..\package_bgs\tb\T2FGMM_UM.h" /> + <ClInclude Include="..\package_bgs\tb\T2FGMM_UV.h" /> + <ClInclude Include="..\package_bgs\WeightedMovingMeanBGS.h" /> + <ClInclude Include="..\package_bgs\WeightedMovingVarianceBGS.h" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/vs2010/bgslibrary.vcxproj.filters b/vs2010/bgslibrary.vcxproj.filters new file mode 100644 index 0000000..7e5b5bb --- /dev/null +++ b/vs2010/bgslibrary.vcxproj.filters @@ -0,0 +1,444 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + <Filter Include="Header Files\package_analysis"> + <UniqueIdentifier>{c0cc904e-4bfa-4fd6-ae45-1fe712768308}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files\package_bgs"> + <UniqueIdentifier>{7d606ab8-5bf7-4ec2-b897-d15eb1de0263}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files\package_bgs\dp"> + <UniqueIdentifier>{dba27670-a93f-4a25-99e1-948bac19456b}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files\package_bgs\jmo"> + <UniqueIdentifier>{c2f770a4-2284-4a79-a4e3-f4cbf57b3f29}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files\package_bgs\lb"> + <UniqueIdentifier>{6830e1db-4298-4dae-87c8-615340f28f8f}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files\package_bgs\tb"> + <UniqueIdentifier>{781e472a-2256-437a-ae26-8611653f8882}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files\package_bgs\ae"> + <UniqueIdentifier>{ec53c3c1-ec12-4d06-a330-dcc626d220f8}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files\package_bgs\av"> + <UniqueIdentifier>{5c8f2d51-2d62-4d20-a7bb-b18a28688acd}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\Demo.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\package_analysis\ForegroundMaskAnalysis.cpp"> + <Filter>Header Files\package_analysis</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\AdaptiveBackgroundLearning.cpp"> + <Filter>Header Files\package_bgs</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\FrameDifferenceBGS.cpp"> + <Filter>Header Files\package_bgs</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\MixtureOfGaussianV1BGS.cpp"> + <Filter>Header Files\package_bgs</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\MixtureOfGaussianV2BGS.cpp"> + <Filter>Header Files\package_bgs</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\StaticFrameDifferenceBGS.cpp"> + <Filter>Header Files\package_bgs</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\WeightedMovingMeanBGS.cpp"> + <Filter>Header Files\package_bgs</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\WeightedMovingVarianceBGS.cpp"> + <Filter>Header Files\package_bgs</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\jmo\blob.cpp"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\jmo\BlobExtraction.cpp"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\jmo\BlobResult.cpp"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\jmo\CMultiLayerBGS.cpp"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\jmo\LocalBinaryPattern.cpp"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\jmo\MultiLayerBGS.cpp"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\lb\BGModel.cpp"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\lb\BGModelFuzzyGauss.cpp"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\lb\BGModelFuzzySom.cpp"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\lb\BGModelGauss.cpp"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\lb\BGModelMog.cpp"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\lb\BGModelSom.cpp"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\lb\LBAdaptiveSOM.cpp"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\lb\LBFuzzyAdaptiveSOM.cpp"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\lb\LBFuzzyGaussian.cpp"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\lb\LBMixtureOfGaussians.cpp"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\lb\LBSimpleGaussian.cpp"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\tb\FuzzyChoquetIntegral.cpp"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\tb\FuzzySugenoIntegral.cpp"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\tb\FuzzyUtils.cpp"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\tb\PerformanceUtils.cpp"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\tb\PixelUtils.cpp"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\tb\T2FGMM.cpp"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\tb\T2FGMM_UM.cpp"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\tb\T2FGMM_UV.cpp"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\ae\KDE.cpp"> + <Filter>Header Files\package_bgs\ae</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\ae\KernelTable.cpp"> + <Filter>Header Files\package_bgs\ae</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\ae\NPBGmodel.cpp"> + <Filter>Header Files\package_bgs\ae</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\ae\NPBGSubtractor.cpp"> + <Filter>Header Files\package_bgs\ae</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\av\TBackground.cpp"> + <Filter>Header Files\package_bgs\av</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\av\TBackgroundVuMeter.cpp"> + <Filter>Header Files\package_bgs\av</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\av\VuMeter.cpp"> + <Filter>Header Files\package_bgs\av</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\AdaptiveMedianBGS.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\Blob.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\BlobExtraction.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\BlobResult.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\ConnectedComponents.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\DPAdaptiveMedianBGS.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\DPEigenbackgroundBGS.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\DPGrimsonGMMBGS.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\DPMeanBGS.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\DPPratiMediodBGS.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\DPTextureBGS.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\DPWrenGABGS.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\DPZivkovicAGMMBGS.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\Eigenbackground.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\Error.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\GrimsonGMM.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\Image.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\MeanBGS.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\PratiMediodBGS.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\TextureBGS.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\WrenGA.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + <ClCompile Include="..\package_bgs\dp\ZivkovicAGMM.cpp"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\package_analysis\ForegroundMaskAnalysis.h"> + <Filter>Header Files\package_analysis</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\AdaptiveBackgroundLearning.h"> + <Filter>Header Files\package_bgs</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\FrameDifferenceBGS.h"> + <Filter>Header Files\package_bgs</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\IBGS.h"> + <Filter>Header Files\package_bgs</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\MixtureOfGaussianV1BGS.h"> + <Filter>Header Files\package_bgs</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\MixtureOfGaussianV2BGS.h"> + <Filter>Header Files\package_bgs</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\StaticFrameDifferenceBGS.h"> + <Filter>Header Files\package_bgs</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\WeightedMovingMeanBGS.h"> + <Filter>Header Files\package_bgs</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\WeightedMovingVarianceBGS.h"> + <Filter>Header Files\package_bgs</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\jmo\BackgroundSubtractionAPI.h"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\jmo\BGS.h"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\jmo\blob.h"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\jmo\BlobExtraction.h"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\jmo\BlobLibraryConfiguration.h"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\jmo\BlobResult.h"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\jmo\CMultiLayerBGS.h"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\jmo\LocalBinaryPattern.h"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\jmo\MultiLayerBGS.h"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\jmo\OpenCvDataConversion.h"> + <Filter>Header Files\package_bgs\jmo</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\lb\BGModel.h"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\lb\BGModelFuzzyGauss.h"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\lb\BGModelFuzzySom.h"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\lb\BGModelGauss.h"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\lb\BGModelMog.h"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\lb\BGModelSom.h"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\lb\LBAdaptiveSOM.h"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\lb\LBFuzzyAdaptiveSOM.h"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\lb\LBFuzzyGaussian.h"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\lb\LBMixtureOfGaussians.h"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\lb\LBSimpleGaussian.h"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\lb\Types.h"> + <Filter>Header Files\package_bgs\lb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\tb\FuzzyChoquetIntegral.h"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\tb\FuzzySugenoIntegral.h"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\tb\FuzzyUtils.h"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\tb\PerformanceUtils.h"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\tb\PixelUtils.h"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\tb\T2FGMM.h"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\tb\T2FGMM_UM.h"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\tb\T2FGMM_UV.h"> + <Filter>Header Files\package_bgs\tb</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\ae\KDE.h"> + <Filter>Header Files\package_bgs\ae</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\ae\KernelTable.h"> + <Filter>Header Files\package_bgs\ae</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\ae\NPBGmodel.h"> + <Filter>Header Files\package_bgs\ae</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\ae\NPBGSubtractor.h"> + <Filter>Header Files\package_bgs\ae</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\av\TBackground.h"> + <Filter>Header Files\package_bgs\av</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\av\TBackgroundVuMeter.h"> + <Filter>Header Files\package_bgs\av</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\av\VuMeter.h"> + <Filter>Header Files\package_bgs\av</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\AdaptiveMedianBGS.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\Bgs.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\BgsParams.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\Blob.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\BlobExtraction.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\BlobResult.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\ConnectedComponents.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\DPAdaptiveMedianBGS.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\DPEigenbackgroundBGS.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\DPGrimsonGMMBGS.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\DPMeanBGS.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\DPPratiMediodBGS.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\DPTextureBGS.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\DPWrenGABGS.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\DPZivkovicAGMMBGS.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\Eigenbackground.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\Error.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\GrimsonGMM.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\Image.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\MeanBGS.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\PratiMediodBGS.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\TextureBGS.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\WrenGA.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + <ClInclude Include="..\package_bgs\dp\ZivkovicAGMM.h"> + <Filter>Header Files\package_bgs\dp</Filter> + </ClInclude> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/vs2010/bgslibrary.vcxproj.user b/vs2010/bgslibrary.vcxproj.user new file mode 100644 index 0000000..2dd78fa --- /dev/null +++ b/vs2010/bgslibrary.vcxproj.user @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LocalDebuggerWorkingDirectory>../</LocalDebuggerWorkingDirectory> + <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> + <LocalDebuggerCommandArguments>./dataset/video.avi</LocalDebuggerCommandArguments> + </PropertyGroup> +</Project> \ No newline at end of file -- GitLab