diff --git a/modules/calib3d/include/opencv2/calib3d/calib3d.hpp b/modules/calib3d/include/opencv2/calib3d/calib3d.hpp
index 65bdb878b..3fb8868dd 100644
--- a/modules/calib3d/include/opencv2/calib3d/calib3d.hpp
+++ b/modules/calib3d/include/opencv2/calib3d/calib3d.hpp
@@ -678,6 +678,9 @@ CV_EXPORTS_W void triangulatePoints( InputArray projMatr1, InputArray projMatr2,
                                      InputArray projPoints1, InputArray projPoints2,
                                      OutputArray points4D );
 
+CV_EXPORTS_W void correctMatches( InputArray F, InputArray points1, InputArray points2,
+                                  OutputArray newPoints1, OutputArray newPoints2 );
+
 template<> CV_EXPORTS void Ptr<CvStereoBMState>::delete_obj();
 
 /*!
diff --git a/modules/calib3d/src/triangulate.cpp b/modules/calib3d/src/triangulate.cpp
index fd2ef521f..5b07c5124 100644
--- a/modules/calib3d/src/triangulate.cpp
+++ b/modules/calib3d/src/triangulate.cpp
@@ -423,3 +423,18 @@ void cv::triangulatePoints( InputArray _projMatr1, InputArray _projMatr2,
 
     cvTriangulatePoints(&cvMatr1, &cvMatr2, &cvPoints1, &cvPoints2, &cvPoints4D);
 }
+
+void cv::correctMatches( InputArray _F, InputArray _points1, InputArray _points2,
+                         OutputArray _newPoints1, OutputArray _newPoints2 )
+{
+    Mat F = _F.getMat();
+    Mat points1 = _points1.getMat(), points2 = _points2.getMat();
+    CvMat cvPoints1 = points1, cvPoints2 = points2;
+    CvMat cvF = F;
+
+    _newPoints1.create(points1.size(), points1.type());
+    _newPoints2.create(points2.size(), points2.type());
+    CvMat cvNewPoints1 = _newPoints1.getMat(), cvNewPoints2 = _newPoints2.getMat();
+
+    cvCorrectMatches(&cvF, &cvPoints1, &cvPoints2, &cvNewPoints1, &cvNewPoints2);
+}