diff --git a/demo2.py b/demo2.py
index 321896c3ae73853ccebfe2e9a32e91c95640166e..befb409a78ea8da3bf8556a78bb427e353bc9dab 100644
--- a/demo2.py
+++ b/demo2.py
@@ -18,6 +18,10 @@ def is_cv2():
 def is_cv3():
   return check_opencv_version("3.")
 
+def is_lower_or_equals_cv347():
+  [major, minor, revision] = str(cv2.__version__).split('.')
+  return int(major) == 3 and int(minor) <= 4 and int(revision) <= 7
+
 def is_cv4():
   return check_opencv_version("4.")
 
@@ -33,11 +37,22 @@ algorithms.append(bgs.WeightedMovingVariance())
 algorithms.append(bgs.AdaptiveBackgroundLearning())
 algorithms.append(bgs.AdaptiveSelectiveBackgroundLearning())
 algorithms.append(bgs.MixtureOfGaussianV2())
+algorithms.append(bgs.PixelBasedAdaptiveSegmenter())
+algorithms.append(bgs.SigmaDelta())
+algorithms.append(bgs.SuBSENSE())
+algorithms.append(bgs.LOBSTER())
+algorithms.append(bgs.PAWCS())
+algorithms.append(bgs.TwoPoints())
+algorithms.append(bgs.ViBe())
+algorithms.append(bgs.CodeBook())
+
 if is_cv2():
   algorithms.append(bgs.MixtureOfGaussianV1()) # if opencv 2.x
   algorithms.append(bgs.GMG()) # if opencv 2.x
+
 if is_cv3():
   algorithms.append(bgs.KNN()) # if opencv 3.x
+
 if is_cv2() or is_cv3():
   algorithms.append(bgs.DPAdaptiveMedian())
   algorithms.append(bgs.DPGrimsonGMM())
@@ -58,20 +73,14 @@ if is_cv2() or is_cv3():
   algorithms.append(bgs.LBMixtureOfGaussians())
   algorithms.append(bgs.LBAdaptiveSOM())
   algorithms.append(bgs.LBFuzzyAdaptiveSOM())
-  algorithms.append(bgs.LBP_MRF())
-  algorithms.append(bgs.MultiLayer())
-  algorithms.append(bgs.PixelBasedAdaptiveSegmenter())
   algorithms.append(bgs.VuMeter())
   algorithms.append(bgs.KDE())
   algorithms.append(bgs.IndependentMultimodal())
   algorithms.append(bgs.MultiCue())
-algorithms.append(bgs.SigmaDelta())
-algorithms.append(bgs.SuBSENSE())
-algorithms.append(bgs.LOBSTER())
-algorithms.append(bgs.PAWCS())
-algorithms.append(bgs.TwoPoints())
-algorithms.append(bgs.ViBe())
-algorithms.append(bgs.CodeBook())
+
+if is_cv2() or is_lower_or_equals_cv347():
+  algorithms.append(bgs.LBP_MRF())
+  algorithms.append(bgs.MultiLayer())
 
 
 # check if we want to use the images
diff --git a/wrapper/python/bgslibrary_module.cpp b/wrapper/python/bgslibrary_module.cpp
index 6bc3757fc3f2284194c09dc0a6eb79236dda7b38..7e996b5e705d827eb56d60128c07ca9346f49e12 100644
--- a/wrapper/python/bgslibrary_module.cpp
+++ b/wrapper/python/bgslibrary_module.cpp
@@ -83,7 +83,7 @@ PYBIND11_MODULE(pybgs, m)
     .def("getBackgroundModel", &MixtureOfGaussianV2::getBackgroundModel)
     ;
 
-#if CV_MAJOR_VERSION == 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
+#if CV_MAJOR_VERSION == 2
   py::class_<MixtureOfGaussianV1>(m, "MixtureOfGaussianV1")
     .def(py::init<>())
     .def("apply", &MixtureOfGaussianV1::apply)
@@ -91,7 +91,7 @@ PYBIND11_MODULE(pybgs, m)
     ;
 #endif
 
-#if CV_MAJOR_VERSION == 2
+#if CV_MAJOR_VERSION == 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
   py::class_<GMG>(m, "GMG")
     .def(py::init<>())
     .def("apply", &GMG::apply)
@@ -107,7 +107,7 @@ PYBIND11_MODULE(pybgs, m)
     ;
 #endif
 
-#if CV_MAJOR_VERSION >= 2 && CV_MAJOR_VERSION <= 3
+#if CV_MAJOR_VERSION == 2 || CV_MAJOR_VERSION == 3
   py::class_<DPAdaptiveMedian>(m, "DPAdaptiveMedian")
     .def(py::init<>())
     .def("apply", &DPAdaptiveMedian::apply)
@@ -222,24 +222,6 @@ PYBIND11_MODULE(pybgs, m)
     .def("getBackgroundModel", &LBFuzzyAdaptiveSOM::getBackgroundModel)
     ;
 
-  py::class_<LBP_MRF>(m, "LBP_MRF")
-    .def(py::init<>())
-    .def("apply", &LBP_MRF::apply)
-    .def("getBackgroundModel", &LBP_MRF::getBackgroundModel)
-    ;
-
-  py::class_<MultiLayer>(m, "MultiLayer")
-    .def(py::init<>())
-    .def("apply", &MultiLayer::apply)
-    .def("getBackgroundModel", &MultiLayer::getBackgroundModel)
-    ;
-
-  py::class_<PixelBasedAdaptiveSegmenter>(m, "PixelBasedAdaptiveSegmenter")
-    .def(py::init<>())
-    .def("apply", &PixelBasedAdaptiveSegmenter::apply)
-    .def("getBackgroundModel", &PixelBasedAdaptiveSegmenter::getBackgroundModel)
-    ;
-
   py::class_<VuMeter>(m, "VuMeter")
     .def(py::init<>())
     .def("apply", &VuMeter::apply)
@@ -265,6 +247,26 @@ PYBIND11_MODULE(pybgs, m)
     ;
 #endif
 
+#if (CV_MAJOR_VERSION == 2) || (CV_MAJOR_VERSION == 3 && CV_MINOR_VERSION <= 4 && CV_VERSION_REVISION <= 7)
+  py::class_<LBP_MRF>(m, "LBP_MRF")
+    .def(py::init<>())
+    .def("apply", &LBP_MRF::apply)
+    .def("getBackgroundModel", &LBP_MRF::getBackgroundModel)
+    ;
+
+  py::class_<MultiLayer>(m, "MultiLayer")
+    .def(py::init<>())
+    .def("apply", &MultiLayer::apply)
+    .def("getBackgroundModel", &MultiLayer::getBackgroundModel)
+    ;
+#endif
+
+  py::class_<PixelBasedAdaptiveSegmenter>(m, "PixelBasedAdaptiveSegmenter")
+    .def(py::init<>())
+    .def("apply", &PixelBasedAdaptiveSegmenter::apply)
+    .def("getBackgroundModel", &PixelBasedAdaptiveSegmenter::getBackgroundModel)
+    ;
+
   py::class_<SigmaDelta>(m, "SigmaDelta")
     .def(py::init<>())
     .def("apply", &SigmaDelta::apply)