diff --git a/CMakeLists.txt b/CMakeLists.txt
index c6de79b2619ae6f76f503597a351f3867f8aec52..17e6dde970ab25cc3df31b770a09c6dc88660085 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -24,7 +24,7 @@ if(UNIX)
   set(CMAKE_MACOSX_RPATH 1)
 endif(UNIX)
 
-# Avoid cmake warnings about changes in behavior of some Mac OS X path 
+# Avoid cmake warnings about changes in behavior of some Mac OS X path
 # variable we don't care about.
 if (POLICY CMP0042)
   cmake_policy(SET CMP0042 NEW)
@@ -97,10 +97,10 @@ if(BGS_PYTHON_SUPPORT)
   #else()
   #  set(Boost_USE_STATIC_LIBS OFF)
   #endif()
-  
+
   #set(Boost_USE_MULTITHREADED ON)
   #set(Boost_USE_STATIC_RUNTIME OFF)
-  
+
   #message(STATUS "SEARCHING FOR BOOST COMPONENT FOR PYTHON ${BGS_PYTHON_VERSION}")
   #if(BGS_PYTHON_VERSION EQUAL 2)
   #  find_package(Boost REQUIRED COMPONENTS python)
@@ -134,7 +134,6 @@ if(BGS_PYTHON_SUPPORT)
   #message(STATUS "    libraries: ${PYTHON_LIBRARIES}")
   message(STATUS "    library: ${PYTHON_LIBRARY}")
   message(STATUS "    include path: ${PYTHON_INCLUDE_DIRS}")
-    
   if(NOT NUMPY_INCLUDE_DIR)
     # message(FATAL_ERROR "You must define NUMPY_INCLUDE_DIR by 'cmake -D NUMPY_INCLUDE_DIR=/python/lib/site-packages/numpy/core/include ..'")
     exec_program ("${PYTHON_EXECUTABLE}"
@@ -236,10 +235,10 @@ if(UNIX AND BGS_PYTHON_SUPPORT)
     OUTPUT_VARIABLE PYTHON_SITE
     OUTPUT_STRIP_TRAILING_WHITESPACE
   )
-  
+
   message(STATUS "")
   message(STATUS "The bgslibrary python package will be installed at: ${PYTHON_SITE}\n")
-  
+
   install(TARGETS bgs_python DESTINATION ${PYTHON_SITE})
   #install(FILES ${mypackage_python_files} DESTINATION ${PYTHON_SITE}/mypackage)
   #install(TARGETS bgs_python DESTINATION ${CMAKE_CURRENT_SOURCE_DIR})
@@ -265,4 +264,4 @@ endif()
 if(WIN32)
   message(STATUS "You might need to add ${CMAKE_CURRENT_BINARY_DIR} to your PATH to be able to run your applications.")
   message(STATUS "> set PATH=%PATH%;${CMAKE_CURRENT_BINARY_DIR}\n")
-endif()
\ No newline at end of file
+endif()
diff --git a/FrameProcessor.cpp b/FrameProcessor.cpp
index 3180589a6cab0d8c29399530a645f6c8d0d30f65..fb9445ce901909dee30c1c49021ea1834f43e531 100644
--- a/FrameProcessor.cpp
+++ b/FrameProcessor.cpp
@@ -65,7 +65,7 @@ namespace bgslibrary
       gmg = new GMG;
 #endif
 
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
     if (enableKNN)
       knn = new KNN;
 #endif
@@ -220,7 +220,7 @@ namespace bgslibrary
       process("GMG", gmg, img_preProcessor, img_gmg);
 #endif
 
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
     if (enableKNN)
       process("KNN", knn, img_preProcessor, img_knn);
 #endif
@@ -345,7 +345,7 @@ namespace bgslibrary
 #if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
       foregroundMaskAnalysis->process(frameNumber, "GMG", img_gmg);
 #endif
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
       foregroundMaskAnalysis->process(frameNumber, "KNN", img_knn);
 #endif
       foregroundMaskAnalysis->process(frameNumber, "DPAdaptiveMedian", img_dpAdaptiveMedian);
@@ -513,7 +513,7 @@ namespace bgslibrary
       delete gmg;
 #endif
 
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
     if (enableKNN)
       delete knn;
 #endif
@@ -579,7 +579,7 @@ namespace bgslibrary
 #if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
     cvWriteInt(fs, "enableGMG", enableGMG);
 #endif
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
     cvWriteInt(fs, "enableKNN", enableKNN);
 #endif
 
@@ -645,7 +645,7 @@ namespace bgslibrary
 #if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
     enableGMG = cvReadIntByName(fs, 0, "enableGMG", false);
 #endif
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
     enableKNN = cvReadIntByName(fs, 0, "enableKNN", false);
 #endif
 
diff --git a/FrameProcessor.h b/FrameProcessor.h
index 025984a56c4e422d366edfd9cf76ed42bcbf8f39..7bf688e0ed44c8fc5ec9879d934a270ad1d7c623 100644
--- a/FrameProcessor.h
+++ b/FrameProcessor.h
@@ -75,7 +75,7 @@ namespace bgslibrary
     bool enableGMG;
 #endif
 
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
     cv::Mat img_knn;
     KNN* knn;
     bool enableKNN;
diff --git a/gui_qt/mainwindow.cpp b/gui_qt/mainwindow.cpp
index f0dd60210b9eaefa6876f324085fcea484514d8e..5b1176571afa758eb41bb4fd7cfb9f4a2d3fc060 100644
--- a/gui_qt/mainwindow.cpp
+++ b/gui_qt/mainwindow.cpp
@@ -37,7 +37,7 @@ namespace bgslibrary
 #if CV_MAJOR_VERSION == 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
     map["GMG"] = &createInstance<GMG>; // only for OpenCV >= 2.4.3
 #endif
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
     map["KNN"] = &createInstance<KNN>; // only on OpenCV 3.x
 #endif
     map["DPAdaptiveMedian"] = &createInstance<DPAdaptiveMedian>;
@@ -93,7 +93,7 @@ namespace bgslibrary
 #if CV_MAJOR_VERSION == 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
     stringList.append("GMG"); // only for OpenCV >= 2.4.3
 #endif
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
     stringList.append("KNN"); // only on OpenCV 3.x
 #endif
     stringList.append("DPAdaptiveMedian");
diff --git a/package_bgs/MixtureOfGaussianV2.cpp b/package_bgs/MixtureOfGaussianV2.cpp
index 085b1a9503f9297a9d553b4991ff29443aead97f..7aa1075d936d64f72f53d32bfbab6189850d9179 100644
--- a/package_bgs/MixtureOfGaussianV2.cpp
+++ b/package_bgs/MixtureOfGaussianV2.cpp
@@ -35,7 +35,7 @@ void MixtureOfGaussianV2::process(const cv::Mat &img_input, cv::Mat &img_output,
   init(img_input, img_output, img_bgmodel);
 
   if (firstTime) {
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
     mog = cv::createBackgroundSubtractorMOG2();
 #endif
   }
@@ -60,7 +60,7 @@ void MixtureOfGaussianV2::process(const cv::Mat &img_input, cv::Mat &img_output,
 #if CV_MAJOR_VERSION == 2
   mog(img_input, img_foreground, alpha);
   mog.getBackgroundImage(img_background);
-#elif CV_MAJOR_VERSION == 3
+#elif CV_MAJOR_VERSION >= 3
   mog->apply(img_input, img_foreground, alpha);
   mog->getBackgroundImage(img_background);
 #endif
diff --git a/package_bgs/MixtureOfGaussianV2.h b/package_bgs/MixtureOfGaussianV2.h
index edc8add6c693988fd2bc9c06815b0b6e4d01c9ca..ff4816dd0617fd5c0d095bda08a36df25443f769 100644
--- a/package_bgs/MixtureOfGaussianV2.h
+++ b/package_bgs/MixtureOfGaussianV2.h
@@ -31,7 +31,7 @@ namespace bgslibrary
     private:
 #if CV_MAJOR_VERSION == 2
       cv::BackgroundSubtractorMOG2 mog;
-#elif CV_MAJOR_VERSION == 3
+#elif CV_MAJOR_VERSION >= 3
       cv::Ptr<cv::BackgroundSubtractorMOG2> mog;
 #endif
       double alpha;
diff --git a/wrapper_java/bgslibrary_java_module.cpp b/wrapper_java/bgslibrary_java_module.cpp
index 275847022c81bba9e6ca0e69f731dbadcbc8c07f..2b63e4bb7f32efe0a7b3311320e5955d81733bbf 100644
--- a/wrapper_java/bgslibrary_java_module.cpp
+++ b/wrapper_java/bgslibrary_java_module.cpp
@@ -48,7 +48,7 @@ namespace bgslibrary
     if (alg_name.compare("GMG") == 0)
       return (IBGS *)malloc(sizeof(GMG)); // only for OpenCV >= 2.4.3
 #endif
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
     if (alg_name.compare("KNN") == 0)
       return (IBGS *)malloc(sizeof(KNN)); // only for OpenCV 3.x
 #endif
@@ -145,7 +145,7 @@ namespace bgslibrary
     if (alg_name.compare("GMG") == 0)
       return new (ptrBGS) GMG(); // only for OpenCV >= 2.4.3
 #endif
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
     if (alg_name.compare("KNN") == 0)
       return new (ptrBGS) KNN(); // only on OpenCV 3.x
 #endif
@@ -257,9 +257,9 @@ void computeForegroundMask(const cv::Mat &img_input, cv::Mat &img_output)
       fgmask = cv::Mat::zeros(img_input.size(), CV_8UC1);
     if (bgmodel.empty())
       bgmodel = cv::Mat::zeros(img_input.size(), CV_8UC3);
-    
+
     fgmask.copyTo(img_output);
-    
+
     fgmask.release();
     bgmodel.release();
   }
diff --git a/wrapper_matlab/backgroundSubtractor_wrapper.cpp b/wrapper_matlab/backgroundSubtractor_wrapper.cpp
index 96fb4a6b9d7df57e6e4c938cf2d93f8fd25aa23b..63880e4f4f6fa09292b479ac310602a5131bf9b6 100644
--- a/wrapper_matlab/backgroundSubtractor_wrapper.cpp
+++ b/wrapper_matlab/backgroundSubtractor_wrapper.cpp
@@ -98,7 +98,7 @@ namespace bgslibrary
     if (alg_name.compare("GMG") == 0)
       return (IBGS *)mxCalloc(1, sizeof(GMG)); // only for OpenCV >= 2.4.3
 #endif
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
     if (alg_name.compare("KNN") == 0)
       return (IBGS *)mxCalloc(1, sizeof(KNN)); // only for OpenCV 3.x
 #endif
@@ -195,7 +195,7 @@ namespace bgslibrary
     if (alg_name.compare("GMG") == 0)
       return new (ptrBGS) GMG(); // only for OpenCV >= 2.4.3
 #endif
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
     if (alg_name.compare("KNN") == 0)
       return new (ptrBGS) KNN(); // only on OpenCV 3.x
 #endif
diff --git a/wrapper_python/bgslibrary_module.cpp b/wrapper_python/bgslibrary_module.cpp
index 4c1d0d3335eb6020b2aa6a960b0b4beeb75bfa59..893591ac2eaa695c44f6916480bd2f67b9653f67 100644
--- a/wrapper_python/bgslibrary_module.cpp
+++ b/wrapper_python/bgslibrary_module.cpp
@@ -47,7 +47,7 @@ PYBIND11_MODULE(bgs, m)
 {
 	NDArrayConverter::init_numpy();
 	m.doc() = "python wrapper for bgslibrary using pybind11";
-	
+
 	// Basic test
   m.def("read_image", &read_image, "A function that read an image", py::arg("image"));
   m.def("show_image", &show_image, "A function that show an image", py::arg("image"));
@@ -157,7 +157,7 @@ PYBIND11_MODULE(bgs, m)
 		.def("getBackgroundModel", &KDE::getBackgroundModel)
 		;
 
-#if CV_MAJOR_VERSION == 3
+#if CV_MAJOR_VERSION >= 3
 	py::class_<KNN>(m, "KNN")
     .def(py::init<>())
 		.def("apply", &KNN::apply)