Improved rst parser; fixed bug in hdr_parser; some small fixes in documentation
authorAndrey Kamaev <no@email>
Thu, 7 Jul 2011 14:49:24 +0000 (14:49 +0000)
committerAndrey Kamaev <no@email>
Thu, 7 Jul 2011 14:49:24 +0000 (14:49 +0000)
modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst
modules/java/rst_parser.py
modules/python/src2/hdr_parser.py

index 7f569b1..36ea2e8 100644 (file)
@@ -1197,9 +1197,9 @@ The method executes the SGBM algorithm on a rectified stereo pair. See ``stereo_
 
 stereoCalibrate
 -------------------
-.. ocv:function:: double stereoCalibrate( InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, InputOutputArray cameraMatrix1, InputOutputArray distCoeffs1, InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, Size imageSize, OutputArray R, OutputArray T, OutputArray E, OutputArray F, TermCriteria term_crit = TermCriteria(TermCriteria::COUNT+                         TermCriteria::EPS, 30, 1e-6), int flags=CALIB_FIX_INTRINSIC )
+Calibrates the stereo camera.
 
-    Calibrates the stereo camera.
+.. ocv:function:: double stereoCalibrate( InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, InputOutputArray cameraMatrix1, InputOutputArray distCoeffs1, InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, Size imageSize, OutputArray R, OutputArray T, OutputArray E, OutputArray F, TermCriteria term_crit = TermCriteria(TermCriteria::COUNT+                         TermCriteria::EPS, 30, 1e-6), int flags=CALIB_FIX_INTRINSIC )
 
 .. ocv:pyfunction:: cv2.stereoCalibrate(objectPoints, imagePoints1, imagePoints2, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imageSize[, R[, T[, E[, F[, criteria[, flags]]]]]]) -> retval, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, R, T, E, F
 
@@ -1287,11 +1287,10 @@ Similarly to :ocv:func:`calibrateCamera` , the function minimizes the total re-p
 
 stereoRectify
 -----------------
+Computes rectification transforms for each head of a calibrated stereo camera.
 
 .. ocv:function:: void stereoRectify( InputArray cameraMatrix1, InputArray distCoeffs1, InputArray cameraMatrix2, InputArray distCoeffs2, Size imageSize, InputArray R, InputArray T, OutputArray R1, OutputArray R2, OutputArray P1, OutputArray P2, OutputArray Q, int flags=CALIB_ZERO_DISPARITY, double alpha, Size newImageSize=Size(), Rect* roi1=0, Rect* roi2=0 )
 
-    Computes rectification transforms for each head of a calibrated stereo camera.
-
 .. ocv:cfunction:: void cvStereoRectify( const CvMat* cameraMatrix1, const CvMat* cameraMatrix2, const CvMat* distCoeffs1, const CvMat* distCoeffs2, CvSize imageSize, const CvMat* R, const CvMat* T, CvMat* R1, CvMat* R2, CvMat* P1, CvMat* P2, CvMat* Q=0, int flags=CV_CALIB_ZERO_DISPARITY, double alpha=-1, CvSize newImageSize=cvSize(0, 0), CvRect* roi1=0, CvRect* roi2=0)
 .. ocv:pyoldfunction:: cv.StereoRectify( cameraMatrix1, cameraMatrix2, distCoeffs1, distCoeffs2, imageSize, R, T, R1, R2, P1, P2, Q=None, flags=CV_CALIB_ZERO_DISPARITY, alpha=-1, newImageSize=(0, 0))-> (roi1, roi2)
 
@@ -1374,13 +1373,14 @@ See below the screenshot from the ``stereo_calib.cpp`` sample. Some red horizont
 
 stereoRectifyUncalibrated
 -----------------------------
-.. ocv:function:: bool stereoRectifyUncalibrated( InputArray points1, InputArray points2, InputArray F, Size imgSize, OutputArray H1, OutputArray H2, double threshold=5 )
+Computes a rectification transform for an uncalibrated stereo camera.
 
-    Computes a rectification transform for an uncalibrated stereo camera.
+.. ocv:function:: bool stereoRectifyUncalibrated( InputArray points1, InputArray points2, InputArray F, Size imgSize, OutputArray H1, OutputArray H2, double threshold=5 )
 
 .. ocv:pyfunction:: cv2.stereoRectifyUncalibrated(points1, points2, F, imgSize[, H1[, H2[, threshold]]]) -> retval, H1, H2
 
 .. ocv:cfunction:: void cvStereoRectifyUncalibrated( const CvMat* points1, const CvMat* points2, const CvMat* F, CvSize imageSize, CvMat* H1, CvMat* H2, double threshold=5 )
+
 .. ocv:pyoldfunction:: cv.StereoRectifyUncalibrated(points1, points2, F, imageSize, H1, H2, threshold=5)-> None
 
     :param points1: Array of feature points in the first image.
index 3179170..2227f49 100644 (file)
@@ -160,6 +160,8 @@ class RstParser(object):
                 skip_code_lines = True
                 continue
 
+            # todo: parse ".. seealso::" sections
+
             # parse class & struct definitions
             if ll.startswith(".. ocv:class::"):
                 func["class"] = ll[ll.find("::")+2:].strip()
@@ -265,7 +267,7 @@ class RstParser(object):
 
         # don't forget about the last function section in file!!!
         if len(lines) > 1:
-            self.parse_section_safe(module_name, fname, doc, flineno, lines[:len(lines)])
+            self.parse_section_safe(module_name, fname, doc, flineno, lines)
 
     def parse_namespace(self, func, section_name):
         known_namespaces = ["cv", "gpu", "flann"]
@@ -327,7 +329,30 @@ class RstParser(object):
              print "RST parser error: \"%s\" from file: %s (line %s) is already documented in file: %s (line %s)" \
                  % (func["name"], func["file"], func["line"], self.definitions[func["name"]]["file"], self.definitions[func["name"]]["line"])
              return False
-        #todo: validate parameter names
+        return self.validateParams(func)
+
+    def validateParams(self, func):
+        documentedParams = func.get("params",{}).keys()
+        params = []
+               
+        for decl in func.get("decls", []):
+            if len(decl) > 2:
+                args = decl[2][3] # decl[2] -> [ funcname, return_ctype, [modifiers], [args] ]
+                for arg in args:
+                    # arg -> [ ctype, name, def val, [mod], argno ]
+                    if arg[0] != "...":
+                        params.append(arg[1])
+        params = list(set(params))#unique
+
+        # 1. all params are documented
+        for p in params:
+            if p not in documentedParams:
+                print "RST parser warning: parameter \"%s\" of \"%s\" is undocumented. File: %s (line %s)" % (p, func["name"], func["file"], func["line"])
+
+        # 2. only real params are documented
+        for p in documentedParams:
+            if p not in params:
+                print "RST parser warning: unexisting parameter \"%s\" of \"%s\" is documented. File: %s (line %s)" % (p, func["name"], func["file"], func["line"])
         return True
 
     def normalize(self, func):
@@ -444,7 +469,7 @@ if __name__ == "__main__":
     parser = RstParser(hdr_parser.CppHeaderParser())
     
     if module == "all":
-        for m in ["androidcamera", "calib3d", "contrib", "core", "features2d", "flann", "gpu", "haartraining", "highgui", "imgproc", "java", "legacy", "ml", "objdetect", "ocl", "python", "stitching", "traincascade", "ts", "video"]:
+        for m in ["core", "flann", "imgproc", "ml", "highgui", "video", "features2d", "calib3d", "objdetect", "legacy", "contrib", "gpu", "androidcamera", "haartraining", "java", "ocl", "python", "stitching", "traincascade", "ts"]:
             parser.parse(m, os.path.join(rst_parser_dir, "../" + m))
     else:
         parser.parse(module, os.path.join(rst_parser_dir, "../" + module))
index c0bfdaf..df10fd1 100755 (executable)
@@ -294,10 +294,12 @@ class CppHeaderParser(object):
                 if dfpos >= 0:
                     defval = arg[dfpos+1:].strip()
                     arg = arg[:dfpos].strip()
-                pos = arg.rfind(" ")
+                pos = len(arg)-1
+                while pos >= 0 and (arg[pos] == "_" or arg[pos].isalpha() or arg[pos].isdigit()):
+                    pos -= 1
                 if pos >= 0:
                     aname = arg[pos+1:].strip()
-                    atype = arg[:pos].strip()
+                    atype = arg[:pos+1].strip()
                     if aname.endswith("&") or aname.endswith("*") or (aname in ["int", "string", "Mat"]):
                         atype = (atype + " " + aname).strip()
                         aname = "param"