diff --git a/modules/contrib/include/opencv2/contrib/contrib.hpp b/modules/contrib/include/opencv2/contrib/contrib.hpp
index ca5c3bc76c..ae86bd0428 100644
--- a/modules/contrib/include/opencv2/contrib/contrib.hpp
+++ b/modules/contrib/include/opencv2/contrib/contrib.hpp
@@ -605,6 +605,14 @@ namespace cv
     };
     
     CV_EXPORTS void polyfit(const Mat& srcx, const Mat& srcy, Mat& dst, int order);
+
+	class CV_EXPORTS Directory
+    {
+	    public:
+			static std::vector<std::string> GetListFiles  ( const string& directoryName, bool addPath = true );
+			static std::vector<std::string> GetListFilesR ( const string& directoryName, bool addPath = true );
+			static std::vector<std::string> GetListFolders( const string& directoryName, bool addPath = true );
+    };
 }
 
 #include "opencv2/contrib/retina.hpp"
diff --git a/modules/contrib/src/inputoutput.cpp b/modules/contrib/src/inputoutput.cpp
new file mode 100644
index 0000000000..c17fae7718
--- /dev/null
+++ b/modules/contrib/src/inputoutput.cpp
@@ -0,0 +1,132 @@
+
+#include "opencv2/contrib/contrib.hpp"
+
+#ifdef WIN32
+	#include <windows.h>
+	#include <tchar.h>
+#else
+	#include <direct.h>
+#endif
+
+namespace cv
+{
+	std::vector<std::string> Directory::GetListFiles( const string& directoryName, bool addPath )
+	{
+		std::vector<std::string> list;
+		list.clear();
+		std::string path = directoryName + "/*";
+		#ifdef WIN32
+			WIN32_FIND_DATA FindFileData;
+			HANDLE hFind;
+
+			hFind = FindFirstFile((LPCSTR)path.c_str(), &FindFileData);
+			if (hFind == INVALID_HANDLE_VALUE) 
+			{
+				return list;
+			}
+			else
+			{
+				do
+				{
+					if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_NORMAL  || 
+						FindFileData.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE || 
+						FindFileData.dwFileAttributes == FILE_ATTRIBUTE_HIDDEN  || 
+						FindFileData.dwFileAttributes == FILE_ATTRIBUTE_SYSTEM  || 
+						FindFileData.dwFileAttributes == FILE_ATTRIBUTE_READONLY)
+					{
+						if (addPath)
+							list.push_back(directoryName + "/" + FindFileData.cFileName);
+						else
+							list.push_back(FindFileData.cFileName);
+					}
+				} 
+				while(FindNextFile(hFind, &FindFileData));
+				FindClose(hFind);  
+			}
+		#else
+			DIR *dp;
+			struct dirent *dirp;
+			if((dp  = opendir(directoryName.c_str())) == NULL) 
+			{				
+				return list;
+			}
+
+			while ((dirp = readdir(dp)) != NULL) 
+			{
+				if (dirp->d_type == DT_REG)
+					list.push_back(static_cast<string>(dirp->d_name));
+			}
+			closedir(dp);
+		#endif
+
+		return list;
+	}
+
+	std::vector<std::string> Directory::GetListFolders( const string& directoryName, bool addPath )
+	{
+		std::vector<std::string> list;
+		std::string path = directoryName + "/*";
+		list.clear();
+		#ifdef WIN32
+			WIN32_FIND_DATA FindFileData;
+			HANDLE hFind;
+
+			hFind = FindFirstFile((LPCSTR)path.c_str(), &FindFileData);
+			if (hFind == INVALID_HANDLE_VALUE) 
+			{
+				return list;
+			}
+			else
+			{
+				do
+				{
+					if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && 
+						strcmp(FindFileData.cFileName, ".") != 0 && 
+						strcmp(FindFileData.cFileName, "..") != 0)
+					{
+						if (addPath)
+							list.push_back(directoryName + "/" + FindFileData.cFileName);
+						else
+							list.push_back(FindFileData.cFileName);
+					}
+				} 
+				while(FindNextFile(hFind, &FindFileData));
+				FindClose(hFind);  
+			}
+
+		#else
+			DIR *dp;
+			struct dirent *dirp;
+			if((dp  = opendir(path.c_str())) == NULL) 
+			{				
+				return list;
+			}
+
+			while ((dirp = readdir(dp)) != NULL) 
+			{
+				if (dirp->d_type == DT_DIR)
+					list.push_back(static_cast<string>(dirp->d_name));
+			}
+			closedir(dp);
+		#endif
+
+		return list;
+	}
+
+	std::vector<std::string> Directory::GetListFilesR ( const string& directoryName, bool addPath )
+	{
+		std::vector<std::string> list = Directory::GetListFiles(directoryName, addPath);
+
+		std::vector<std::string> dirs = Directory::GetListFolders(directoryName, addPath);
+
+		std::vector<std::string>::const_iterator it;
+		for (it = dirs.begin(); it != dirs.end(); ++it)
+		{
+			std::vector<std::string> cl = Directory::GetListFiles(*it, addPath);
+			list.insert(list.end(), cl.begin(), cl.end());
+		}
+
+		return list;
+	}
+
+}
\ No newline at end of file