merged all the latest changes from 2.4 to trunk
authorVadim Pisarevsky <no@email>
Fri, 13 Apr 2012 21:50:59 +0000 (21:50 +0000)
committerVadim Pisarevsky <no@email>
Fri, 13 Apr 2012 21:50:59 +0000 (21:50 +0000)
416 files changed:
3rdparty/ffmpeg/ffmpeg_version.cmake [new file with mode: 0644]
3rdparty/ffmpeg/ffopencv.c
3rdparty/include/ffmpeg_/libavcodec/avcodec.h
3rdparty/include/ffmpeg_/libavcodec/dxva2.h
3rdparty/include/ffmpeg_/libavcodec/vaapi.h
3rdparty/include/ffmpeg_/libavcodec/vda.h [new file with mode: 0644]
3rdparty/include/ffmpeg_/libavcodec/vdpau.h
3rdparty/include/ffmpeg_/libavcodec/version.h
3rdparty/include/ffmpeg_/libavdevice/avdevice.h
3rdparty/include/ffmpeg_/libavformat/avformat.h
3rdparty/include/ffmpeg_/libavformat/avio.h
3rdparty/include/ffmpeg_/libavformat/version.h
3rdparty/include/ffmpeg_/libavutil/adler32.h
3rdparty/include/ffmpeg_/libavutil/aes.h
3rdparty/include/ffmpeg_/libavutil/attributes.h
3rdparty/include/ffmpeg_/libavutil/audioconvert.h
3rdparty/include/ffmpeg_/libavutil/avstring.h
3rdparty/include/ffmpeg_/libavutil/avutil.h
3rdparty/include/ffmpeg_/libavutil/base64.h
3rdparty/include/ffmpeg_/libavutil/bswap.h
3rdparty/include/ffmpeg_/libavutil/common.h
3rdparty/include/ffmpeg_/libavutil/cpu.h
3rdparty/include/ffmpeg_/libavutil/dict.h
3rdparty/include/ffmpeg_/libavutil/error.h
3rdparty/include/ffmpeg_/libavutil/eval.h
3rdparty/include/ffmpeg_/libavutil/fifo.h
3rdparty/include/ffmpeg_/libavutil/file.h
3rdparty/include/ffmpeg_/libavutil/imgutils.h
3rdparty/include/ffmpeg_/libavutil/intfloat.h [new file with mode: 0644]
3rdparty/include/ffmpeg_/libavutil/intfloat_readwrite.h
3rdparty/include/ffmpeg_/libavutil/log.h
3rdparty/include/ffmpeg_/libavutil/lzo.h
3rdparty/include/ffmpeg_/libavutil/mathematics.h
3rdparty/include/ffmpeg_/libavutil/md5.h
3rdparty/include/ffmpeg_/libavutil/mem.h
3rdparty/include/ffmpeg_/libavutil/opt.h
3rdparty/include/ffmpeg_/libavutil/parseutils.h
3rdparty/include/ffmpeg_/libavutil/pixdesc.h
3rdparty/include/ffmpeg_/libavutil/pixfmt.h
3rdparty/include/ffmpeg_/libavutil/random_seed.h
3rdparty/include/ffmpeg_/libavutil/rational.h
3rdparty/include/ffmpeg_/libavutil/samplefmt.h
3rdparty/include/ffmpeg_/libavutil/sha.h
3rdparty/include/ffmpeg_/libswscale/swscale.h
3rdparty/lib/armeabi-v7a/libnative_camera_r2.2.0.so
3rdparty/lib/armeabi-v7a/libnative_camera_r2.3.3.so
3rdparty/lib/armeabi-v7a/libnative_camera_r3.0.1.so
3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.0.so
3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.3.so
3rdparty/lib/armeabi/libnative_camera_r2.2.0.so
3rdparty/lib/armeabi/libnative_camera_r2.3.3.so
3rdparty/lib/armeabi/libnative_camera_r3.0.1.so
3rdparty/lib/armeabi/libnative_camera_r4.0.0.so
3rdparty/lib/armeabi/libnative_camera_r4.0.3.so
3rdparty/lib/libavcodec.a
3rdparty/lib/libavcodec64.a
3rdparty/lib/libavdevice.a
3rdparty/lib/libavdevice64.a
3rdparty/lib/libavformat.a
3rdparty/lib/libavformat64.a
3rdparty/lib/libavutil.a
3rdparty/lib/libavutil64.a
3rdparty/lib/libswscale.a
3rdparty/lib/libswscale64.a
3rdparty/lib/x86/libnative_camera_r2.3.3.so [new file with mode: 0755]
3rdparty/lib/x86/libnative_camera_r3.0.1.so [new file with mode: 0755]
3rdparty/lib/x86/libnative_camera_r4.0.3.so [new file with mode: 0755]
3rdparty/libjasper/CMakeLists.txt
3rdparty/libtiff/CMakeLists.txt
3rdparty/tbb/CMakeLists.txt
3rdparty/zlib/CMakeLists.txt
CMakeLists.txt
android/android.toolchain.cmake
apps/haartraining/cvboost.cpp
apps/haartraining/cvhaarclassifier.cpp
apps/haartraining/cvhaartraining.cpp
apps/haartraining/cvsamples.cpp
apps/traincascade/imagestorage.cpp
cmake/OpenCVCompilerOptions.cmake
cmake/OpenCVDetectAndroidSDK.cmake
cmake/OpenCVDetectApacheAnt.cmake
cmake/OpenCVDetectCXXCompiler.cmake
cmake/OpenCVDetectPython.cmake
cmake/OpenCVDetectTBB.cmake
cmake/OpenCVFindIPP.cmake
cmake/OpenCVFindOpenEXR.cmake
cmake/OpenCVFindOpenNI.cmake
cmake/OpenCVIOLibs.cmake
cmake/OpenCVModule.cmake
cmake/OpenCVUtils.cmake
cmake/templates/cvconfig.h.cmake
doc/_themes/blue/searchbox.html [new file with mode: 0644]
doc/_themes/blue/static/default.css_t
doc/opencv_cheatsheet.tex
doc/tutorials/introduction/android_binary_package/android_binary_package.rst
doc/tutorials/introduction/linux_install/linux_install.rst
doc/tutorials/introduction/windows_install/windows_install.rst
doc/user_guide/ug_mat.rst
index.rst
ios/cmake/Toolchains/Toolchain-iPhoneOS_Xcode.cmake
ios/cmake/Toolchains/Toolchain-iPhoneSimulator_Xcode.cmake
modules/androidcamera/camera_wrapper/camera_wrapper.cpp
modules/androidcamera/include/camera_properties.h
modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst
modules/calib3d/src/epnp.cpp
modules/calib3d/src/epnp.h
modules/calib3d/test/test_cameracalibration.cpp
modules/contrib/include/opencv2/contrib/hybridtracker.hpp
modules/contrib/src/colormap.cpp
modules/contrib/src/facerec.cpp
modules/contrib/src/hybridtracker.cpp
modules/contrib/src/lda.cpp
modules/contrib/src/spinimages.cpp
modules/core/CMakeLists.txt
modules/core/doc/basic_structures.rst
modules/core/doc/clustering.rst
modules/core/doc/drawing_functions.rst
modules/core/doc/dynamic_structures.rst
modules/core/doc/intro.rst
modules/core/doc/old_basic_structures.rst
modules/core/doc/old_xml_yaml_persistence.rst
modules/core/doc/operations_on_arrays.rst
modules/core/doc/utility_and_system_functions_and_macros.rst
modules/core/doc/xml_yaml_persistence.rst
modules/core/include/opencv2/core/core.hpp
modules/core/include/opencv2/core/devmem2d.hpp
modules/core/include/opencv2/core/mat.hpp
modules/core/include/opencv2/core/operations.hpp
modules/core/perf/perf_convertTo.cpp
modules/core/perf/perf_merge.cpp
modules/core/perf/perf_split.cpp
modules/core/src/algorithm.cpp
modules/core/src/dxt.cpp
modules/core/src/mathfuncs.cpp
modules/core/src/matmul.cpp
modules/core/src/matrix.cpp
modules/core/src/persistence.cpp
modules/core/src/stat.cpp
modules/core/src/system.cpp
modules/core/test/test_arithm.cpp
modules/core/test/test_countnonzero.cpp
modules/core/test/test_eigen.cpp
modules/core/test/test_io.cpp
modules/core/test/test_mat.cpp
modules/core/test/test_math.cpp
modules/core/test/test_operations.cpp
modules/core/test/test_rand.cpp
modules/features2d/doc/common_interfaces_of_feature_detectors.rst
modules/features2d/doc/common_interfaces_of_generic_descriptor_matchers.rst
modules/features2d/doc/feature_detection_and_description.rst
modules/features2d/doc/object_categorization.rst
modules/features2d/include/opencv2/features2d/features2d.hpp
modules/features2d/src/brief.cpp
modules/features2d/src/detectors.cpp
modules/features2d/src/fast.cpp
modules/features2d/src/matchers.cpp
modules/features2d/src/mser.cpp
modules/features2d/src/orb.cpp
modules/features2d/src/stardetector.cpp
modules/features2d/test/test_features2d.cpp
modules/features2d/test/test_mser.cpp
modules/flann/doc/flann_clustering.rst
modules/flann/doc/flann_fast_approximate_nearest_neighbor_search.rst
modules/flann/include/opencv2/flann/flann.hpp
modules/gpu/CMakeLists.txt
modules/gpu/doc/camera_calibration_and_3d_reconstruction.rst
modules/gpu/doc/data_structures.rst
modules/gpu/doc/feature_detection_and_description.rst
modules/gpu/doc/image_filtering.rst
modules/gpu/doc/image_processing.rst
modules/gpu/doc/introduction.rst
modules/gpu/doc/operations_on_matrices.rst
modules/gpu/src/nvidia/NCVBroxOpticalFlow.hpp
modules/gpu/src/nvidia/NCVHaarObjectDetection.hpp
modules/gpu/src/nvidia/core/NCV.hpp
modules/gpu/test/nvidia/TestRectStdDev.h
modules/gpu/test/test_calib3d.cpp
modules/gpu/test/test_video.cpp
modules/gpu/test/utility.cpp
modules/highgui/CMakeLists.txt
modules/highgui/doc/highgui.rst
modules/highgui/doc/qt_new_functions.rst
modules/highgui/doc/reading_and_writing_images_and_video.rst
modules/highgui/doc/user_interface.rst
modules/highgui/include/opencv2/highgui/highgui.hpp
modules/highgui/include/opencv2/highgui/highgui_c.h
modules/highgui/perf/perf_input.cpp [new file with mode: 0644]
modules/highgui/perf/perf_main.cpp [new file with mode: 0644]
modules/highgui/perf/perf_output.cpp [new file with mode: 0644]
modules/highgui/perf/perf_precomp.cpp [new file with mode: 0644]
modules/highgui/perf/perf_precomp.hpp [new file with mode: 0644]
modules/highgui/src/cap.cpp
modules/highgui/src/cap_android.cpp
modules/highgui/src/cap_dshow.cpp
modules/highgui/src/cap_ffmpeg.cpp
modules/highgui/src/cap_ffmpeg_impl.hpp
modules/highgui/src/cap_ffmpeg_impl_v2.hpp
modules/highgui/src/cap_ffmpeg_v2.cpp [deleted file]
modules/highgui/src/cap_openni.cpp
modules/highgui/src/cap_pvapi.cpp
modules/highgui/src/grfmt_png.cpp
modules/highgui/test/test_ffmpeg.cpp
modules/highgui/test/test_framecount.cpp
modules/highgui/test/test_positioning.cpp
modules/highgui/test/test_video_io.cpp
modules/highgui/test/test_video_pos.cpp
modules/imgproc/doc/feature_detection.rst
modules/imgproc/doc/filtering.rst
modules/imgproc/doc/histograms.rst
modules/imgproc/doc/miscellaneous_transformations.rst
modules/imgproc/doc/motion_analysis_and_object_tracking.rst
modules/imgproc/doc/planar_subdivisions.rst
modules/imgproc/doc/structural_analysis_and_shape_descriptors.rst
modules/imgproc/perf/perf_blur.cpp
modules/imgproc/perf/perf_cornerHarris.cpp
modules/imgproc/src/color.cpp
modules/imgproc/src/filter.cpp
modules/imgproc/src/imgwarp.cpp
modules/imgproc/src/morph.cpp
modules/imgproc/src/pyramids.cpp
modules/imgproc/src/templmatch.cpp
modules/imgproc/test/test_color.cpp
modules/imgproc/test/test_cvtyuv.cpp
modules/imgproc/test/test_filter.cpp
modules/imgproc/test/test_moments.cpp
modules/java/android/.project
modules/java/android_test/AndroidManifest.xml
modules/java/android_test/src/org/opencv/test/OpenCVTestCase.java
modules/java/android_test/src/org/opencv/test/OpenCVTestRunner.java
modules/java/android_test/src/org/opencv/test/calib3d/Calib3dTest.java
modules/java/android_test/src/org/opencv/test/core/CoreTest.java
modules/java/android_test/src/org/opencv/test/features2d/BRIEFDescriptorExtractorTest.java
modules/java/android_test/src/org/opencv/test/features2d/BruteForceDescriptorMatcherTest.java
modules/java/android_test/src/org/opencv/test/features2d/BruteForceHammingDescriptorMatcherTest.java
modules/java/android_test/src/org/opencv/test/features2d/BruteForceHammingLUTDescriptorMatcherTest.java
modules/java/android_test/src/org/opencv/test/features2d/BruteForceL1DescriptorMatcherTest.java
modules/java/android_test/src/org/opencv/test/features2d/BruteForceSL2DescriptorMatcherTest.java
modules/java/android_test/src/org/opencv/test/features2d/DENSEFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/DynamicDENSEFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/DynamicFASTFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/DynamicGFTTFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/DynamicHARRISFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/DynamicMSERFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/DynamicORBFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/DynamicSIFTFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/DynamicSIMPLEBLOBFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/DynamicSTARFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/DynamicSURFFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/FASTFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/Features2dTest.java
modules/java/android_test/src/org/opencv/test/features2d/FlannBasedDescriptorMatcherTest.java
modules/java/android_test/src/org/opencv/test/features2d/GFTTFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/GridDENSEFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/GridFASTFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/GridGFTTFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/GridHARRISFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/GridMSERFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/GridORBFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/GridSIFTFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/GridSIMPLEBLOBFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/GridSTARFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/GridSURFFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/HARRISFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/MSERFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/ORBDescriptorExtractorTest.java
modules/java/android_test/src/org/opencv/test/features2d/ORBFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/OpponentBRIEFDescriptorExtractorTest.java
modules/java/android_test/src/org/opencv/test/features2d/OpponentORBDescriptorExtractorTest.java
modules/java/android_test/src/org/opencv/test/features2d/OpponentSIFTDescriptorExtractorTest.java
modules/java/android_test/src/org/opencv/test/features2d/OpponentSURFDescriptorExtractorTest.java
modules/java/android_test/src/org/opencv/test/features2d/PyramidDENSEFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/PyramidFASTFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/PyramidGFTTFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/PyramidHARRISFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/PyramidMSERFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/PyramidORBFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/PyramidSIFTFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/PyramidSIMPLEBLOBFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/PyramidSTARFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/PyramidSURFFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/SIFTDescriptorExtractorTest.java
modules/java/android_test/src/org/opencv/test/features2d/SIFTFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/SIMPLEBLOBFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/STARFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/features2d/SURFDescriptorExtractorTest.java
modules/java/android_test/src/org/opencv/test/features2d/SURFFeatureDetectorTest.java
modules/java/android_test/src/org/opencv/test/highgui/HighguiTest.java
modules/java/android_test/src/org/opencv/test/imgproc/ImgprocTest.java
modules/java/android_test/src/org/opencv/test/imgproc/Subdiv2DTest.java
modules/java/android_test/src/org/opencv/test/ml/CvANN_MLPTest.java
modules/java/android_test/src/org/opencv/test/ml/CvANN_MLP_TrainParamsTest.java
modules/java/android_test/src/org/opencv/test/ml/CvBoostParamsTest.java
modules/java/android_test/src/org/opencv/test/ml/CvBoostTest.java
modules/java/android_test/src/org/opencv/test/ml/CvDTreeParamsTest.java
modules/java/android_test/src/org/opencv/test/ml/CvDTreeTest.java
modules/java/android_test/src/org/opencv/test/ml/CvEMParamsTest.java [deleted file]
modules/java/android_test/src/org/opencv/test/ml/CvEMTest.java [deleted file]
modules/java/android_test/src/org/opencv/test/ml/CvERTreesTest.java
modules/java/android_test/src/org/opencv/test/ml/CvGBTreesParamsTest.java
modules/java/android_test/src/org/opencv/test/ml/CvGBTreesTest.java
modules/java/android_test/src/org/opencv/test/ml/CvKNearestTest.java
modules/java/android_test/src/org/opencv/test/ml/CvNormalBayesClassifierTest.java
modules/java/android_test/src/org/opencv/test/ml/CvParamGridTest.java
modules/java/android_test/src/org/opencv/test/ml/CvRTParamsTest.java
modules/java/android_test/src/org/opencv/test/ml/CvRTreesTest.java
modules/java/android_test/src/org/opencv/test/ml/CvSVMParamsTest.java
modules/java/android_test/src/org/opencv/test/ml/CvSVMTest.java
modules/java/android_test/src/org/opencv/test/objdetect/CascadeClassifierTest.java
modules/java/android_test/src/org/opencv/test/objdetect/ObjdetectTest.java
modules/java/android_test/src/org/opencv/test/utils/ConvertersTest.java
modules/java/android_test/src/org/opencv/test/video/BackgroundSubtractorMOGTest.java
modules/java/android_test/src/org/opencv/test/video/VideoTest.java
modules/java/gen_java.py
modules/java/src/cpp/converters.cpp
modules/java/src/cpp/converters.h
modules/java/src/java/core+MatOfByte.java [new file with mode: 0644]
modules/java/src/java/core+MatOfDMatch.java [new file with mode: 0644]
modules/java/src/java/core+MatOfDouble.java [new file with mode: 0644]
modules/java/src/java/core+MatOfFloat.java [new file with mode: 0644]
modules/java/src/java/core+MatOfInt.java [new file with mode: 0644]
modules/java/src/java/core+MatOfKeyPoint.java [new file with mode: 0644]
modules/java/src/java/core+MatOfPoint.java [new file with mode: 0644]
modules/java/src/java/core+MatOfPoint2f.java [new file with mode: 0644]
modules/java/src/java/core+MatOfPoint3.java [new file with mode: 0644]
modules/java/src/java/core+MatOfPoint3f.java [new file with mode: 0644]
modules/java/src/java/core+MatOfRect.java [new file with mode: 0644]
modules/java/src/java/utils+Converters.java
modules/legacy/CMakeLists.txt
modules/legacy/include/opencv2/legacy/legacy.hpp
modules/legacy/src/calibfilter.cpp
modules/legacy/src/em.cpp [new file with mode: 0644]
modules/legacy/test/test_em.cpp [new file with mode: 0644]
modules/ml/doc/boosting.rst
modules/ml/doc/decision_trees.rst
modules/ml/doc/ertrees.rst
modules/ml/doc/expectation_maximization.rst
modules/ml/doc/gradient_boosted_trees.rst
modules/ml/doc/k_nearest_neighbors.rst
modules/ml/doc/mldata.rst
modules/ml/doc/neural_networks.rst
modules/ml/doc/normal_bayes_classifier.rst
modules/ml/doc/random_trees.rst
modules/ml/doc/statistical_models.rst
modules/ml/doc/support_vector_machines.rst
modules/ml/include/opencv2/ml/ml.hpp
modules/ml/src/data.cpp
modules/ml/src/em.cpp
modules/ml/src/ertrees.cpp
modules/ml/src/rtrees.cpp
modules/ml/test/test_emknearestkmeans.cpp
modules/ml/test/test_mltests2.cpp
modules/ml/test/test_precomp.hpp
modules/nonfree/doc/feature_detection.rst
modules/nonfree/include/opencv2/nonfree/nonfree.hpp
modules/nonfree/src/sift.cpp
modules/nonfree/src/surf.cpp
modules/nonfree/test/test_features2d.cpp
modules/objdetect/CMakeLists.txt
modules/objdetect/doc/cascade_classification.rst
modules/objdetect/doc/latent_svm.rst
modules/objdetect/include/opencv2/objdetect/objdetect.hpp
modules/objdetect/src/haar.cpp
modules/objdetect/src/linemod.cpp
modules/objdetect/src/lsvmparser.cpp
modules/objdetect/src/precomp.hpp
modules/photo/doc/inpainting.rst
modules/python/CMakeLists.txt
modules/python/src2/cv2.cpp
modules/python/src2/cv2.cv.hpp
modules/refman.rst
modules/stitching/doc/matching.rst
modules/stitching/doc/motion_estimation.rst
modules/stitching/include/opencv2/stitching/detail/seam_finders.hpp
modules/ts/CMakeLists.txt
modules/ts/misc/run.py
modules/ts/src/ts_perf.cpp
modules/video/doc/motion_analysis_and_object_tracking.rst
modules/video/perf/perf_main.cpp [new file with mode: 0644]
modules/video/perf/perf_optflowpyrlk.cpp [new file with mode: 0644]
modules/video/perf/perf_precomp.cpp [new file with mode: 0644]
modules/video/perf/perf_precomp.hpp [new file with mode: 0644]
modules/video/src/camshift.cpp
modules/videostab/src/fast_marching.cpp
modules/videostab/src/inpainting.cpp
samples/android/face-detection/src/org/opencv/samples/fd/FdView.java
samples/android/tutorial-0-androidcamera/.project
samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0Base.java
samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0View.java
samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/SampleViewBase.java
samples/android/tutorial-1-addopencv/.project
samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1Java.java
samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1View.java
samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/SampleViewBase.java
samples/android/tutorial-2-opencvcamera/.project
samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2View.java
samples/android/tutorial-3-native/.project
samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3View.java
samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/SampleViewBase.java
samples/android/tutorial-4-mixed/.project
samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4Mixed.java
samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4View.java
samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/SampleViewBase.java
samples/c/CMakeLists.txt
samples/c/contours.c
samples/c/fback_c.c
samples/c/mushroom.cpp
samples/c/tree_engine.cpp
samples/cpp/CMakeLists.txt
samples/cpp/detector_descriptor_matcher_evaluation.cpp
samples/cpp/em.cpp
samples/cpp/hybridtrackingsample.cpp
samples/cpp/opencv_version.cpp [new file with mode: 0644]
samples/cpp/points_classifier.cpp
samples/cpp/select3dobj.cpp
samples/gpu/CMakeLists.txt
samples/gpu/brox_optical_flow.cpp

diff --git a/3rdparty/ffmpeg/ffmpeg_version.cmake b/3rdparty/ffmpeg/ffmpeg_version.cmake
new file mode 100644 (file)
index 0000000..2954d22
--- /dev/null
@@ -0,0 +1,11 @@
+set(NEW_FFMPEG 1)\r
+set(HAVE_FFMPEG_CODEC 1)\r
+set(HAVE_FFMPEG_FORMAT 1)\r
+set(HAVE_FFMPEG_UTIL 1)\r
+set(HAVE_FFMPEG_SWSCALE 1)\r
+set(HAVE_GENTOO_FFMPEG 1)\r
+\r
+set(ALIASOF_libavcodec_VERSION 53.61.100)\r
+set(ALIASOF_libavformat_VERSION 53.32.100)\r
+set(ALIASOF_libavutil_VERSION 51.35.100)\r
+set(ALIASOF_libswscale_VERSION 2.1.100)
\ No newline at end of file
index b412e90..82ac060 100644 (file)
@@ -1 +1 @@
-#include "cap_ffmpeg_impl.hpp"
+#include "cap_ffmpeg_impl_v2.hpp"
index 7c8228f..81849c1 100644 (file)
 #include "libavutil/samplefmt.h"
 #include "libavutil/avutil.h"
 #include "libavutil/cpu.h"
+#include "libavutil/dict.h"
+#include "libavutil/log.h"
+#include "libavutil/pixfmt.h"
+#include "libavutil/rational.h"
 
 #include "libavcodec/version.h"
+/**
+ * @defgroup libavc Encoding/Decoding Library
+ * @{
+ *
+ * @defgroup lavc_decoding Decoding
+ * @{
+ * @}
+ *
+ * @defgroup lavc_encoding Encoding
+ * @{
+ * @}
+ *
+ * @defgroup lavc_codec Codecs
+ * @{
+ * @defgroup lavc_codec_native Native Codecs
+ * @{
+ * @}
+ * @defgroup lavc_codec_wrappers External library wrappers
+ * @{
+ * @}
+ * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge
+ * @{
+ * @}
+ * @}
+ * @defgroup lavc_internal Internal
+ * @{
+ * @}
+ * @}
+ *
+ */
+
 
 /**
  * Identify the syntax and semantics of the bitstream.
@@ -43,7 +78,8 @@
  *
  * If you add a codec ID to this list, add it so that
  * 1. no value of a existing codec ID changes (that would break ABI),
- * 2. it is as close as possible to similar codecs.
+ * 2. Give it a value which when taken as ASCII is recognized uniquely by a human as this specific codec.
+ *    This ensures that 2 forks can independantly add CodecIDs without producing conflicts.
  */
 enum CodecID {
     CODEC_ID_NONE,
@@ -148,7 +184,9 @@ enum CodecID {
     CODEC_ID_TIERTEXSEQVIDEO,
     CODEC_ID_TIFF,
     CODEC_ID_GIF,
+#if LIBAVCODEC_VERSION_MAJOR == 53
     CODEC_ID_FFH264,
+#endif
     CODEC_ID_DXA,
     CODEC_ID_DNXHD,
     CODEC_ID_THP,
@@ -166,8 +204,10 @@ enum CodecID {
     CODEC_ID_INDEO5,
     CODEC_ID_MIMIC,
     CODEC_ID_RL2,
+#if LIBAVCODEC_VERSION_MAJOR == 53
     CODEC_ID_8SVX_EXP,
     CODEC_ID_8SVX_FIB,
+#endif
     CODEC_ID_ESCAPE124,
     CODEC_ID_DIRAC,
     CODEC_ID_BFI,
@@ -204,10 +244,30 @@ enum CodecID {
     CODEC_ID_PRORES,
     CODEC_ID_JV,
     CODEC_ID_DFA,
-    CODEC_ID_8SVX_RAW,
+    CODEC_ID_WMV3IMAGE,
+    CODEC_ID_VC1IMAGE,
+#if LIBAVCODEC_VERSION_MAJOR == 53
+    CODEC_ID_G723_1_DEPRECATED,
+    CODEC_ID_G729_DEPRECATED,
+#endif
+    CODEC_ID_UTVIDEO_DEPRECATED,
+    CODEC_ID_BMV_VIDEO,
+    CODEC_ID_VBLE,
+    CODEC_ID_DXTORY,
+    CODEC_ID_V410,
+    CODEC_ID_XWD,
+    CODEC_ID_Y41P       = MKBETAG('Y','4','1','P'),
+    CODEC_ID_UTVIDEO = 0x800,
+    CODEC_ID_ESCAPE130  = MKBETAG('E','1','3','0'),
+    CODEC_ID_AVRP       = MKBETAG('A','V','R','P'),
+
+    CODEC_ID_G2M        = MKBETAG( 0 ,'G','2','M'),
+    CODEC_ID_V308       = MKBETAG('V','3','0','8'),
+    CODEC_ID_YUV4       = MKBETAG('Y','U','V','4'),
 
     /* various PCM "codecs" */
-    CODEC_ID_PCM_S16LE= 0x10000,
+    CODEC_ID_FIRST_AUDIO = 0x10000,     ///< A dummy id pointing at the start of audio codecs
+    CODEC_ID_PCM_S16LE = 0x10000,
     CODEC_ID_PCM_S16BE,
     CODEC_ID_PCM_U16LE,
     CODEC_ID_PCM_U16BE,
@@ -234,9 +294,10 @@ enum CodecID {
     CODEC_ID_PCM_BLURAY,
     CODEC_ID_PCM_LXF,
     CODEC_ID_S302M,
+    CODEC_ID_PCM_S8_PLANAR,
 
     /* various ADPCM codecs */
-    CODEC_ID_ADPCM_IMA_QT= 0x11000,
+    CODEC_ID_ADPCM_IMA_QT = 0x11000,
     CODEC_ID_ADPCM_IMA_WAV,
     CODEC_ID_ADPCM_IMA_DK3,
     CODEC_ID_ADPCM_IMA_DK4,
@@ -265,23 +326,24 @@ enum CodecID {
     CODEC_ID_ADPCM_EA_MAXIS_XA,
     CODEC_ID_ADPCM_IMA_ISS,
     CODEC_ID_ADPCM_G722,
+    CODEC_ID_ADPCM_IMA_APC,
 
     /* AMR */
-    CODEC_ID_AMR_NB= 0x12000,
+    CODEC_ID_AMR_NB = 0x12000,
     CODEC_ID_AMR_WB,
 
     /* RealAudio codecs*/
-    CODEC_ID_RA_144= 0x13000,
+    CODEC_ID_RA_144 = 0x13000,
     CODEC_ID_RA_288,
 
     /* various DPCM codecs */
-    CODEC_ID_ROQ_DPCM= 0x14000,
+    CODEC_ID_ROQ_DPCM = 0x14000,
     CODEC_ID_INTERPLAY_DPCM,
     CODEC_ID_XAN_DPCM,
     CODEC_ID_SOL_DPCM,
 
     /* audio codecs */
-    CODEC_ID_MP2= 0x15000,
+    CODEC_ID_MP2 = 0x15000,
     CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3
     CODEC_ID_AAC,
     CODEC_ID_AC3,
@@ -293,8 +355,10 @@ enum CodecID {
     CODEC_ID_MACE3,
     CODEC_ID_MACE6,
     CODEC_ID_VMDAUDIO,
+#if LIBAVCODEC_VERSION_MAJOR == 53
     CODEC_ID_SONIC,
     CODEC_ID_SONIC_LS,
+#endif
     CODEC_ID_FLAC,
     CODEC_ID_MP3ADU,
     CODEC_ID_MP3ON4,
@@ -336,9 +400,21 @@ enum CodecID {
     CODEC_ID_AAC_LATM,
     CODEC_ID_QDMC,
     CODEC_ID_CELT,
+#if LIBAVCODEC_VERSION_MAJOR > 53
+    CODEC_ID_G723_1_DEPRECATED,
+    CODEC_ID_G729_DEPRECATED,
+    CODEC_ID_8SVX_EXP,
+    CODEC_ID_8SVX_FIB,
+#endif
+    CODEC_ID_BMV_AUDIO,
+    CODEC_ID_G729 = 0x15800,
+    CODEC_ID_G723_1= 0x15801,
+    CODEC_ID_FFWAVESYNTH = MKBETAG('F','F','W','S'),
+    CODEC_ID_8SVX_RAW   = MKBETAG('8','S','V','X'),
 
     /* subtitle codecs */
-    CODEC_ID_DVD_SUBTITLE= 0x17000,
+    CODEC_ID_FIRST_SUBTITLE = 0x17000,          ///< A dummy ID pointing at the start of subtitle codecs.
+    CODEC_ID_DVD_SUBTITLE = 0x17000,
     CODEC_ID_DVB_SUBTITLE,
     CODEC_ID_TEXT,  ///< raw UTF-8 text
     CODEC_ID_XSUB,
@@ -347,16 +423,22 @@ enum CodecID {
     CODEC_ID_HDMV_PGS_SUBTITLE,
     CODEC_ID_DVB_TELETEXT,
     CODEC_ID_SRT,
-    CODEC_ID_MICRODVD,
+    CODEC_ID_MICRODVD   = MKBETAG('m','D','V','D'),
 
     /* other specific kind of codecs (generally used for attachments) */
-    CODEC_ID_TTF= 0x18000,
+    CODEC_ID_FIRST_UNKNOWN = 0x18000,           ///< A dummy ID pointing at the start of various fake codecs.
+    CODEC_ID_TTF = 0x18000,
+    CODEC_ID_BINTEXT    = MKBETAG('B','T','X','T'),
+    CODEC_ID_XBIN       = MKBETAG('X','B','I','N'),
+    CODEC_ID_IDF        = MKBETAG( 0 ,'I','D','F'),
 
-    CODEC_ID_PROBE= 0x19000, ///< codec_id is not known (like CODEC_ID_NONE) but lavf should attempt to identify it
+    CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like CODEC_ID_NONE) but lavf should attempt to identify it
 
-    CODEC_ID_MPEG2TS= 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS
+    CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS
+                                * stream (only used by libavformat) */
+    CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems
                                 * stream (only used by libavformat) */
-    CODEC_ID_FFMETADATA=0x21000,   ///< Dummy codec for streams containing only metadata information.
+    CODEC_ID_FFMETADATA = 0x21000,   ///< Dummy codec for streams containing only metadata information.
 };
 
 #if FF_API_OLD_SAMPLE_FMT
@@ -419,8 +501,10 @@ enum CodecID {
 #define CH_LAYOUT_STEREO_DOWNMIX AV_CH_LAYOUT_STEREO_DOWNMIX
 #endif
 
+#if FF_API_OLD_DECODE_AUDIO
 /* in bytes */
 #define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
+#endif
 
 /**
  * Required number of additionally allocated bytes at the end of the input bitstream for decoding.
@@ -429,7 +513,7 @@ enum CodecID {
  * Note: If the first 23 bits of the additional bytes are not 0, then damaged
  * MPEG bitstreams could cause overread and segfault.
  */
-#define FF_INPUT_BUFFER_PADDING_SIZE 8
+#define FF_INPUT_BUFFER_PADDING_SIZE 16
 
 /**
  * minimum encoding buffer size
@@ -481,6 +565,7 @@ enum AVColorTransferCharacteristic{
     AVCOL_TRC_UNSPECIFIED=2,
     AVCOL_TRC_GAMMA22    =4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
     AVCOL_TRC_GAMMA28    =5, ///< also ITU-R BT470BG
+    AVCOL_TRC_SMPTE240M  =7,
     AVCOL_TRC_NB           , ///< Not part of ABI
 };
 
@@ -492,6 +577,7 @@ enum AVColorSpace{
     AVCOL_SPC_BT470BG    =5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
     AVCOL_SPC_SMPTE170M  =6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
     AVCOL_SPC_SMPTE240M  =7,
+    AVCOL_SPC_YCGCO      =8,
     AVCOL_SPC_NB           , ///< Not part of ABI
 };
 
@@ -522,7 +608,7 @@ enum AVChromaLocation{
 /**
  * LPC analysis type
  */
-attribute_deprecated enum AVLPCType {
+enum AVLPCType {
     AV_LPC_TYPE_DEFAULT     = -1, ///< use the codec default LPC type
     AV_LPC_TYPE_NONE        =  0, ///< do not use LPC prediction or use all zero coefficients
     AV_LPC_TYPE_FIXED       =  1, ///< fixed LPC coefficients
@@ -564,7 +650,6 @@ typedef struct RcOverride{
 #define CODEC_FLAG_QPEL   0x0010  ///< Use qpel MC.
 #define CODEC_FLAG_GMC    0x0020  ///< Use GMC.
 #define CODEC_FLAG_MV0    0x0040  ///< Always try a MB with MV=<0,0>.
-#define CODEC_FLAG_PART   0x0080  ///< Use data partitioning.
 /**
  * The parent program guarantees that the input for B-frames containing
  * streams is not written to for at least s->max_b_frames+1 frames, if
@@ -573,7 +658,6 @@ typedef struct RcOverride{
 #define CODEC_FLAG_INPUT_PRESERVED 0x0100
 #define CODEC_FLAG_PASS1           0x0200   ///< Use internal 2pass ratecontrol in first pass mode.
 #define CODEC_FLAG_PASS2           0x0400   ///< Use internal 2pass ratecontrol in second pass mode.
-#define CODEC_FLAG_EXTERN_HUFF     0x1000   ///< Use external Huffman table (for MJPEG).
 #define CODEC_FLAG_GRAY            0x2000   ///< Only decode/encode grayscale.
 #define CODEC_FLAG_EMU_EDGE        0x4000   ///< Don't draw edges.
 #define CODEC_FLAG_PSNR            0x8000   ///< error[?] variables will be set during encoding.
@@ -582,25 +666,43 @@ typedef struct RcOverride{
 #define CODEC_FLAG_NORMALIZE_AQP  0x00020000 ///< Normalize adaptive quantization.
 #define CODEC_FLAG_INTERLACED_DCT 0x00040000 ///< Use interlaced DCT.
 #define CODEC_FLAG_LOW_DELAY      0x00080000 ///< Force low delay.
-#define CODEC_FLAG_ALT_SCAN       0x00100000 ///< Use alternate scan.
 #define CODEC_FLAG_GLOBAL_HEADER  0x00400000 ///< Place global headers in extradata instead of every keyframe.
 #define CODEC_FLAG_BITEXACT       0x00800000 ///< Use only bitexact stuff (except (I)DCT).
 /* Fx : Flag for h263+ extra options */
 #define CODEC_FLAG_AC_PRED        0x01000000 ///< H.263 advanced intra coding / MPEG-4 AC prediction
-#define CODEC_FLAG_H263P_UMV      0x02000000 ///< unlimited motion vector
 #define CODEC_FLAG_CBP_RD         0x04000000 ///< Use rate distortion optimization for cbp.
 #define CODEC_FLAG_QP_RD          0x08000000 ///< Use rate distortion optimization for qp selectioon.
-#define CODEC_FLAG_H263P_AIV      0x00000008 ///< H.263 alternative inter VLC
-#define CODEC_FLAG_OBMC           0x00000001 ///< OBMC
 #define CODEC_FLAG_LOOP_FILTER    0x00000800 ///< loop filter
-#define CODEC_FLAG_H263P_SLICE_STRUCT 0x10000000
 #define CODEC_FLAG_INTERLACED_ME  0x20000000 ///< interlaced motion estimation
-#define CODEC_FLAG_SVCD_SCAN_OFFSET 0x40000000 ///< Will reserve space for SVCD scan offset user data.
 #define CODEC_FLAG_CLOSED_GOP     0x80000000
 #define CODEC_FLAG2_FAST          0x00000001 ///< Allow non spec compliant speedup tricks.
 #define CODEC_FLAG2_STRICT_GOP    0x00000002 ///< Strictly enforce GOP size.
 #define CODEC_FLAG2_NO_OUTPUT     0x00000004 ///< Skip bitstream encoding.
 #define CODEC_FLAG2_LOCAL_HEADER  0x00000008 ///< Place global headers at every keyframe instead of in extradata.
+#define CODEC_FLAG2_SKIP_RD       0x00004000 ///< RD optimal MB level residual skipping
+#define CODEC_FLAG2_CHUNKS        0x00008000 ///< Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries.
+#define CODEC_FLAG2_SHOW_ALL      0x00400000 ///< Show all frames before the first keyframe
+/**
+ * @defgroup deprecated_flags Deprecated codec flags
+ * Use corresponding private codec options instead.
+ * @{
+ */
+#if FF_API_MPEGVIDEO_GLOBAL_OPTS
+#define CODEC_FLAG_OBMC           0x00000001 ///< OBMC
+#define CODEC_FLAG_H263P_AIV      0x00000008 ///< H.263 alternative inter VLC
+#define CODEC_FLAG_PART   0x0080  ///< Use data partitioning.
+#define CODEC_FLAG_ALT_SCAN       0x00100000 ///< Use alternate scan.
+#define CODEC_FLAG_H263P_UMV      0x02000000 ///< unlimited motion vector
+#define CODEC_FLAG_H263P_SLICE_STRUCT 0x10000000
+#define CODEC_FLAG_SVCD_SCAN_OFFSET 0x40000000 ///< Will reserve space for SVCD scan offset user data.
+#define CODEC_FLAG2_INTRA_VLC     0x00000800 ///< Use MPEG-2 intra VLC table.
+#define CODEC_FLAG2_DROP_FRAME_TIMECODE 0x00002000 ///< timecode is in drop frame format.
+#define CODEC_FLAG2_NON_LINEAR_QUANT 0x00010000 ///< Use MPEG-2 nonlinear quantizer.
+#endif
+#if FF_API_MJPEG_GLOBAL_OPTS
+#define CODEC_FLAG_EXTERN_HUFF     0x1000   ///< Use external Huffman table (for MJPEG).
+#endif
+#if FF_API_X264_GLOBAL_OPTS
 #define CODEC_FLAG2_BPYRAMID      0x00000010 ///< H.264 allow B-frames to be used as references.
 #define CODEC_FLAG2_WPRED         0x00000020 ///< H.264 weighted biprediction for B-frames
 #define CODEC_FLAG2_MIXED_REFS    0x00000040 ///< H.264 one reference per partition, as opposed to one reference per macroblock
@@ -608,17 +710,20 @@ typedef struct RcOverride{
 #define CODEC_FLAG2_FASTPSKIP     0x00000100 ///< H.264 fast pskip
 #define CODEC_FLAG2_AUD           0x00000200 ///< H.264 access unit delimiters
 #define CODEC_FLAG2_BRDO          0x00000400 ///< B-frame rate-distortion optimization
-#define CODEC_FLAG2_INTRA_VLC     0x00000800 ///< Use MPEG-2 intra VLC table.
-#define CODEC_FLAG2_MEMC_ONLY     0x00001000 ///< Only do ME/MC (I frames -> ref, P frame -> ME+MC).
-#define CODEC_FLAG2_DROP_FRAME_TIMECODE 0x00002000 ///< timecode is in drop frame format.
-#define CODEC_FLAG2_SKIP_RD       0x00004000 ///< RD optimal MB level residual skipping
-#define CODEC_FLAG2_CHUNKS        0x00008000 ///< Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries.
-#define CODEC_FLAG2_NON_LINEAR_QUANT 0x00010000 ///< Use MPEG-2 nonlinear quantizer.
-#define CODEC_FLAG2_BIT_RESERVOIR 0x00020000 ///< Use a bit reservoir when encoding if possible
 #define CODEC_FLAG2_MBTREE        0x00040000 ///< Use macroblock tree ratecontrol (x264 only)
 #define CODEC_FLAG2_PSY           0x00080000 ///< Use psycho visual optimizations.
 #define CODEC_FLAG2_SSIM          0x00100000 ///< Compute SSIM during encoding, error[] values are undefined.
 #define CODEC_FLAG2_INTRA_REFRESH 0x00200000 ///< Use periodic insertion of intra blocks instead of keyframes.
+#endif
+#if FF_API_SNOW_GLOBAL_OPTS
+#define CODEC_FLAG2_MEMC_ONLY     0x00001000 ///< Only do ME/MC (I frames -> ref, P frame -> ME+MC).
+#endif
+#if FF_API_LAME_GLOBAL_OPTS
+#define CODEC_FLAG2_BIT_RESERVOIR 0x00020000 ///< Use a bit reservoir when encoding if possible
+#endif
+/**
+ * @}
+ */
 
 /* Unsupported options :
  *              Syntax Arithmetic coding (SAC)
@@ -634,14 +739,35 @@ typedef struct RcOverride{
  * assume the buffer was allocated by avcodec_default_get_buffer.
  */
 #define CODEC_CAP_DR1             0x0002
+#if FF_API_PARSE_FRAME
 /* If 'parse_only' field is true, then avcodec_parse_frame() can be used. */
 #define CODEC_CAP_PARSE_ONLY      0x0004
+#endif
 #define CODEC_CAP_TRUNCATED       0x0008
 /* Codec can export data for HW decoding (XvMC). */
 #define CODEC_CAP_HWACCEL         0x0010
 /**
- * Codec has a nonzero delay and needs to be fed with NULL at the end to get the delayed data.
- * If this is not set, the codec is guaranteed to never be fed with NULL data.
+ * Encoder or decoder requires flushing with NULL input at the end in order to
+ * give the complete and correct output.
+ *
+ * NOTE: If this flag is not set, the codec is guaranteed to never be fed with
+ *       with NULL data. The user can still send NULL data to the public encode
+ *       or decode function, but libavcodec will not pass it along to the codec
+ *       unless this flag is set.
+ *
+ * Decoders:
+ * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to get the delayed data until the decoder no longer
+ * returns frames.
+ *
+ * Encoders:
+ * The encoder needs to be fed with NULL data at the end of encoding until the
+ * encoder no longer returns data.
+ *
+ * NOTE: For encoders implementing the AVCodec.encode2() function, setting this
+ *       flag also means that the encoder must set the pts and duration for
+ *       each output packet. If this flag is not set, the pts and duration will
+ *       be determined by libavcodec from the input frame.
  */
 #define CODEC_CAP_DELAY           0x0020
 /**
@@ -689,6 +815,18 @@ typedef struct RcOverride{
  */
 #define CODEC_CAP_SLICE_THREADS    0x2000
 /**
+ * Codec supports changed parameters at any point.
+ */
+#define CODEC_CAP_PARAM_CHANGE     0x4000
+/**
+ * Codec supports avctx->thread_count == 0 (auto).
+ */
+#define CODEC_CAP_AUTO_THREADS     0x8000
+/**
+ * Audio encoder supports receiving a different number of samples in each call.
+ */
+#define CODEC_CAP_VARIABLE_FRAME_SIZE 0x10000
+/**
  * Codec is lossless.
  */
 #define CODEC_CAP_LOSSLESS         0x80000000
@@ -746,304 +884,6 @@ typedef struct AVPanScan{
     int16_t position[3][2];
 }AVPanScan;
 
-#define FF_COMMON_FRAME \
-    /**\
-     * pointer to the picture planes.\
-     * This might be different from the first allocated byte\
-     * - encoding: \
-     * - decoding: \
-     */\
-    uint8_t *data[4];\
-    int linesize[4];\
-    /**\
-     * pointer to the first allocated byte of the picture. Can be used in get_buffer/release_buffer.\
-     * This isn't used by libavcodec unless the default get/release_buffer() is used.\
-     * - encoding: \
-     * - decoding: \
-     */\
-    uint8_t *base[4];\
-    /**\
-     * 1 -> keyframe, 0-> not\
-     * - encoding: Set by libavcodec.\
-     * - decoding: Set by libavcodec.\
-     */\
-    int key_frame;\
-\
-    /**\
-     * Picture type of the frame, see ?_TYPE below.\
-     * - encoding: Set by libavcodec. for coded_picture (and set by user for input).\
-     * - decoding: Set by libavcodec.\
-     */\
-    enum AVPictureType pict_type;\
-\
-    /**\
-     * presentation timestamp in time_base units (time when frame should be shown to user)\
-     * If AV_NOPTS_VALUE then frame_rate = 1/time_base will be assumed.\
-     * - encoding: MUST be set by user.\
-     * - decoding: Set by libavcodec.\
-     */\
-    int64_t pts;\
-\
-    /**\
-     * picture number in bitstream order\
-     * - encoding: set by\
-     * - decoding: Set by libavcodec.\
-     */\
-    int coded_picture_number;\
-    /**\
-     * picture number in display order\
-     * - encoding: set by\
-     * - decoding: Set by libavcodec.\
-     */\
-    int display_picture_number;\
-\
-    /**\
-     * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) \
-     * - encoding: Set by libavcodec. for coded_picture (and set by user for input).\
-     * - decoding: Set by libavcodec.\
-     */\
-    int quality; \
-\
-    /**\
-     * buffer age (1->was last buffer and dint change, 2->..., ...).\
-     * Set to INT_MAX if the buffer has not been used yet.\
-     * - encoding: unused\
-     * - decoding: MUST be set by get_buffer().\
-     */\
-    int age;\
-\
-    /**\
-     * is this picture used as reference\
-     * The values for this are the same as the MpegEncContext.picture_structure\
-     * variable, that is 1->top field, 2->bottom field, 3->frame/both fields.\
-     * Set to 4 for delayed, non-reference frames.\
-     * - encoding: unused\
-     * - decoding: Set by libavcodec. (before get_buffer() call)).\
-     */\
-    int reference;\
-\
-    /**\
-     * QP table\
-     * - encoding: unused\
-     * - decoding: Set by libavcodec.\
-     */\
-    int8_t *qscale_table;\
-    /**\
-     * QP store stride\
-     * - encoding: unused\
-     * - decoding: Set by libavcodec.\
-     */\
-    int qstride;\
-\
-    /**\
-     * mbskip_table[mb]>=1 if MB didn't change\
-     * stride= mb_width = (width+15)>>4\
-     * - encoding: unused\
-     * - decoding: Set by libavcodec.\
-     */\
-    uint8_t *mbskip_table;\
-\
-    /**\
-     * motion vector table\
-     * @code\
-     * example:\
-     * int mv_sample_log2= 4 - motion_subsample_log2;\
-     * int mb_width= (width+15)>>4;\
-     * int mv_stride= (mb_width << mv_sample_log2) + 1;\
-     * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y];\
-     * @endcode\
-     * - encoding: Set by user.\
-     * - decoding: Set by libavcodec.\
-     */\
-    int16_t (*motion_val[2])[2];\
-\
-    /**\
-     * macroblock type table\
-     * mb_type_base + mb_width + 2\
-     * - encoding: Set by user.\
-     * - decoding: Set by libavcodec.\
-     */\
-    uint32_t *mb_type;\
-\
-    /**\
-     * log2 of the size of the block which a single vector in motion_val represents: \
-     * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)\
-     * - encoding: unused\
-     * - decoding: Set by libavcodec.\
-     */\
-    uint8_t motion_subsample_log2;\
-\
-    /**\
-     * for some private data of the user\
-     * - encoding: unused\
-     * - decoding: Set by user.\
-     */\
-    void *opaque;\
-\
-    /**\
-     * error\
-     * - encoding: Set by libavcodec. if flags&CODEC_FLAG_PSNR.\
-     * - decoding: unused\
-     */\
-    uint64_t error[4];\
-\
-    /**\
-     * type of the buffer (to keep track of who has to deallocate data[*])\
-     * - encoding: Set by the one who allocates it.\
-     * - decoding: Set by the one who allocates it.\
-     * Note: User allocated (direct rendering) & internal buffers cannot coexist currently.\
-     */\
-    int type;\
-    \
-    /**\
-     * When decoding, this signals how much the picture must be delayed.\
-     * extra_delay = repeat_pict / (2*fps)\
-     * - encoding: unused\
-     * - decoding: Set by libavcodec.\
-     */\
-    int repeat_pict;\
-    \
-    /**\
-     * \
-     */\
-    int qscale_type;\
-    \
-    /**\
-     * The content of the picture is interlaced.\
-     * - encoding: Set by user.\
-     * - decoding: Set by libavcodec. (default 0)\
-     */\
-    int interlaced_frame;\
-    \
-    /**\
-     * If the content is interlaced, is top field displayed first.\
-     * - encoding: Set by user.\
-     * - decoding: Set by libavcodec.\
-     */\
-    int top_field_first;\
-    \
-    /**\
-     * Pan scan.\
-     * - encoding: Set by user.\
-     * - decoding: Set by libavcodec.\
-     */\
-    AVPanScan *pan_scan;\
-    \
-    /**\
-     * Tell user application that palette has changed from previous frame.\
-     * - encoding: ??? (no palette-enabled encoder yet)\
-     * - decoding: Set by libavcodec. (default 0).\
-     */\
-    int palette_has_changed;\
-    \
-    /**\
-     * codec suggestion on buffer type if != 0\
-     * - encoding: unused\
-     * - decoding: Set by libavcodec. (before get_buffer() call)).\
-     */\
-    int buffer_hints;\
-\
-    /**\
-     * DCT coefficients\
-     * - encoding: unused\
-     * - decoding: Set by libavcodec.\
-     */\
-    short *dct_coeff;\
-\
-    /**\
-     * motion reference frame index\
-     * the order in which these are stored can depend on the codec.\
-     * - encoding: Set by user.\
-     * - decoding: Set by libavcodec.\
-     */\
-    int8_t *ref_index[2];\
-\
-    /**\
-     * reordered opaque 64bit (generally an integer or a double precision float\
-     * PTS but can be anything). \
-     * The user sets AVCodecContext.reordered_opaque to represent the input at\
-     * that time,\
-     * the decoder reorders values as needed and sets AVFrame.reordered_opaque\
-     * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque \
-     * @deprecated in favor of pkt_pts\
-     * - encoding: unused\
-     * - decoding: Read by user.\
-     */\
-    int64_t reordered_opaque;\
-\
-    /**\
-     * hardware accelerator private data (FFmpeg allocated)\
-     * - encoding: unused\
-     * - decoding: Set by libavcodec\
-     */\
-    void *hwaccel_picture_private;\
-\
-    /**\
-     * reordered pts from the last AVPacket that has been input into the decoder\
-     * - encoding: unused\
-     * - decoding: Read by user.\
-     */\
-    int64_t pkt_pts;\
-\
-    /**\
-     * dts from the last AVPacket that has been input into the decoder\
-     * - encoding: unused\
-     * - decoding: Read by user.\
-     */\
-    int64_t pkt_dts;\
-\
-    /**\
-     * the AVCodecContext which ff_thread_get_buffer() was last called on\
-     * - encoding: Set by libavcodec.\
-     * - decoding: Set by libavcodec.\
-     */\
-    struct AVCodecContext *owner;\
-\
-    /**\
-     * used by multithreading to store frame-specific info\
-     * - encoding: Set by libavcodec.\
-     * - decoding: Set by libavcodec.\
-     */\
-    void *thread_opaque;\
-\
-    /**\
-     * frame timestamp estimated using various heuristics, in stream time base\
-     * - encoding: unused\
-     * - decoding: set by libavcodec, read by user.\
-     */\
-    int64_t best_effort_timestamp;\
-\
-    /**\
-     * reordered pos from the last AVPacket that has been input into the decoder\
-     * - encoding: unused\
-     * - decoding: Read by user.\
-     */\
-    int64_t pkt_pos;\
-\
-    /**\
-     * reordered sample aspect ratio for the video frame, 0/1 if unknown\unspecified
-     * - encoding: unused\
-     * - decoding: Read by user.\
-     */\
-    AVRational sample_aspect_ratio;\
-\
-    /**\
-     * width and height of the video frame\
-     * - encoding: unused\
-     * - decoding: Read by user.\
-     */\
-    int width, height;\
-\
-    /**\
-     * format of the frame, -1 if unknown or unset\
-     * It should be cast to the corresponding enum (enum PixelFormat\
-     * for video, enum AVSampleFormat for audio)\
-     * - encoding: unused\
-     * - decoding: Read by user.\
-     */\
-    int format;\
-
-
 #define FF_QSCALE_TYPE_MPEG1 0
 #define FF_QSCALE_TYPE_MPEG2 1
 #define FF_QSCALE_TYPE_H264  2
@@ -1072,6 +912,8 @@ typedef struct AVPanScan{
 
 enum AVPacketSideDataType {
     AV_PKT_DATA_PALETTE,
+    AV_PKT_DATA_NEW_EXTRADATA,
+    AV_PKT_DATA_PARAM_CHANGE,
 };
 
 typedef struct AVPacket {
@@ -1094,6 +936,9 @@ typedef struct AVPacket {
     uint8_t *data;
     int   size;
     int   stream_index;
+    /**
+     * A combination of AV_PKT_FLAG values
+     */
     int   flags;
     /**
      * Additional packet data that can be provided by the container.
@@ -1134,32 +979,409 @@ typedef struct AVPacket {
      */
     int64_t convergence_duration;
 } AVPacket;
-#define AV_PKT_FLAG_KEY   0x0001
+#define AV_PKT_FLAG_KEY     0x0001 ///< The packet contains a keyframe
+#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted
+
+/**
+ * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
+ * u32le param_flags
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT)
+ *     s32le channel_count
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT)
+ *     u64le channel_layout
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE)
+ *     s32le sample_rate
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS)
+ *     s32le width
+ *     s32le height
+ */
+
+enum AVSideDataParamChangeFlags {
+    AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT  = 0x0001,
+    AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002,
+    AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE    = 0x0004,
+    AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS     = 0x0008,
+};
 
 /**
  * Audio Video Frame.
- * New fields can be added to the end of FF_COMMON_FRAME with minor version
- * bumps.
- * Removal, reordering and changes to existing fields require a major
- * version bump. No fields should be added into AVFrame before or after
- * FF_COMMON_FRAME!
- * sizeof(AVFrame) must not be used outside libav*.
+ * New fields can be added to the end of AVFRAME with minor version
+ * bumps. Similarly fields that are marked as to be only accessed by
+ * av_opt_ptr() can be reordered. This allows 2 forks to add fields
+ * without breaking compatibility with each other.
+ * Removal, reordering and changes in the remaining cases require
+ * a major version bump.
+ * sizeof(AVFrame) must not be used outside libavcodec.
  */
 typedef struct AVFrame {
-    FF_COMMON_FRAME
+#if FF_API_DATA_POINTERS
+#define AV_NUM_DATA_POINTERS 4
+#else
+#define AV_NUM_DATA_POINTERS 8
+#endif
+    /**
+     * pointer to the picture/channel planes.
+     * This might be different from the first allocated byte
+     * - encoding: Set by user
+     * - decoding: set by AVCodecContext.get_buffer()
+     */
+    uint8_t *data[AV_NUM_DATA_POINTERS];
+
+    /**
+     * Size, in bytes, of the data for each picture/channel plane.
+     *
+     * For audio, only linesize[0] may be set. For planar audio, each channel
+     * plane must be the same size.
+     *
+     * - encoding: Set by user (video only)
+     * - decoding: set by AVCodecContext.get_buffer()
+     */
+    int linesize[AV_NUM_DATA_POINTERS];
+
+    /**
+     * pointer to the first allocated byte of the picture. Can be used in get_buffer/release_buffer.
+     * This isn't used by libavcodec unless the default get/release_buffer() is used.
+     * - encoding:
+     * - decoding:
+     */
+    uint8_t *base[AV_NUM_DATA_POINTERS];
+    /**
+     * 1 -> keyframe, 0-> not
+     * - encoding: Set by libavcodec.
+     * - decoding: Set by libavcodec.
+     */
+    int key_frame;
+
+    /**
+     * Picture type of the frame, see ?_TYPE below.
+     * - encoding: Set by libavcodec. for coded_picture (and set by user for input).
+     * - decoding: Set by libavcodec.
+     */
+    enum AVPictureType pict_type;
+
+    /**
+     * presentation timestamp in time_base units (time when frame should be shown to user)
+     * If AV_NOPTS_VALUE then frame_rate = 1/time_base will be assumed.
+     * - encoding: MUST be set by user.
+     * - decoding: Set by libavcodec.
+     */
+    int64_t pts;
+
+    /**
+     * picture number in bitstream order
+     * - encoding: set by
+     * - decoding: Set by libavcodec.
+     */
+    int coded_picture_number;
+    /**
+     * picture number in display order
+     * - encoding: set by
+     * - decoding: Set by libavcodec.
+     */
+    int display_picture_number;
+
+    /**
+     * quality (between 1 (good) and FF_LAMBDA_MAX (bad))
+     * - encoding: Set by libavcodec. for coded_picture (and set by user for input).
+     * - decoding: Set by libavcodec.
+     */
+    int quality;
+
+#if FF_API_AVFRAME_AGE
+    /**
+     * @deprecated unused
+     */
+    attribute_deprecated int age;
+#endif
+
+    /**
+     * is this picture used as reference
+     * The values for this are the same as the MpegEncContext.picture_structure
+     * variable, that is 1->top field, 2->bottom field, 3->frame/both fields.
+     * Set to 4 for delayed, non-reference frames.
+     * - encoding: unused
+     * - decoding: Set by libavcodec. (before get_buffer() call)).
+     */
+    int reference;
+
+    /**
+     * QP table
+     * - encoding: unused
+     * - decoding: Set by libavcodec.
+     */
+    int8_t *qscale_table;
+    /**
+     * QP store stride
+     * - encoding: unused
+     * - decoding: Set by libavcodec.
+     */
+    int qstride;
+
+    /**
+     * mbskip_table[mb]>=1 if MB didn't change
+     * stride= mb_width = (width+15)>>4
+     * - encoding: unused
+     * - decoding: Set by libavcodec.
+     */
+    uint8_t *mbskip_table;
+
+    /**
+     * motion vector table
+     * @code
+     * example:
+     * int mv_sample_log2= 4 - motion_subsample_log2;
+     * int mb_width= (width+15)>>4;
+     * int mv_stride= (mb_width << mv_sample_log2) + 1;
+     * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y];
+     * @endcode
+     * - encoding: Set by user.
+     * - decoding: Set by libavcodec.
+     */
+    int16_t (*motion_val[2])[2];
+
+    /**
+     * macroblock type table
+     * mb_type_base + mb_width + 2
+     * - encoding: Set by user.
+     * - decoding: Set by libavcodec.
+     */
+    uint32_t *mb_type;
+
+    /**
+     * log2 of the size of the block which a single vector in motion_val represents:
+     * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)
+     * - encoding: unused
+     * - decoding: Set by libavcodec.
+     */
+    uint8_t motion_subsample_log2;
+
+    /**
+     * for some private data of the user
+     * - encoding: unused
+     * - decoding: Set by user.
+     */
+    void *opaque;
+
+    /**
+     * error
+     * - encoding: Set by libavcodec. if flags&CODEC_FLAG_PSNR.
+     * - decoding: unused
+     */
+    uint64_t error[AV_NUM_DATA_POINTERS];
+
+    /**
+     * type of the buffer (to keep track of who has to deallocate data[*])
+     * - encoding: Set by the one who allocates it.
+     * - decoding: Set by the one who allocates it.
+     * Note: User allocated (direct rendering) & internal buffers cannot coexist currently.
+     */
+    int type;
+
+    /**
+     * When decoding, this signals how much the picture must be delayed.
+     * extra_delay = repeat_pict / (2*fps)
+     * - encoding: unused
+     * - decoding: Set by libavcodec.
+     */
+    int repeat_pict;
+
+    /**
+     *
+     */
+    int qscale_type;
+
+    /**
+     * The content of the picture is interlaced.
+     * - encoding: Set by user.
+     * - decoding: Set by libavcodec. (default 0)
+     */
+    int interlaced_frame;
+
+    /**
+     * If the content is interlaced, is top field displayed first.
+     * - encoding: Set by user.
+     * - decoding: Set by libavcodec.
+     */
+    int top_field_first;
+
+    /**
+     * Pan scan.
+     * - encoding: Set by user.
+     * - decoding: Set by libavcodec.
+     */
+    AVPanScan *pan_scan;
+
+    /**
+     * Tell user application that palette has changed from previous frame.
+     * - encoding: ??? (no palette-enabled encoder yet)
+     * - decoding: Set by libavcodec. (default 0).
+     */
+    int palette_has_changed;
+
+    /**
+     * codec suggestion on buffer type if != 0
+     * - encoding: unused
+     * - decoding: Set by libavcodec. (before get_buffer() call)).
+     */
+    int buffer_hints;
+
+    /**
+     * DCT coefficients
+     * - encoding: unused
+     * - decoding: Set by libavcodec.
+     */
+    short *dct_coeff;
+
+    /**
+     * motion reference frame index
+     * the order in which these are stored can depend on the codec.
+     * - encoding: Set by user.
+     * - decoding: Set by libavcodec.
+     */
+    int8_t *ref_index[2];
+
+    /**
+     * reordered opaque 64bit (generally an integer or a double precision float
+     * PTS but can be anything).
+     * The user sets AVCodecContext.reordered_opaque to represent the input at
+     * that time,
+     * the decoder reorders values as needed and sets AVFrame.reordered_opaque
+     * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque
+     * @deprecated in favor of pkt_pts
+     * - encoding: unused
+     * - decoding: Read by user.
+     */
+    int64_t reordered_opaque;
+
+    /**
+     * hardware accelerator private data (FFmpeg-allocated)
+     * - encoding: unused
+     * - decoding: Set by libavcodec
+     */
+    void *hwaccel_picture_private;
+
+    /**
+     * reordered pts from the last AVPacket that has been input into the decoder
+     * - encoding: unused
+     * - decoding: Read by user.
+     */
+    int64_t pkt_pts;
+
+    /**
+     * dts from the last AVPacket that has been input into the decoder
+     * - encoding: unused
+     * - decoding: Read by user.
+     */
+    int64_t pkt_dts;
+
+    /**
+     * the AVCodecContext which ff_thread_get_buffer() was last called on
+     * - encoding: Set by libavcodec.
+     * - decoding: Set by libavcodec.
+     */
+    struct AVCodecContext *owner;
+
+    /**
+     * used by multithreading to store frame-specific info
+     * - encoding: Set by libavcodec.
+     * - decoding: Set by libavcodec.
+     */
+    void *thread_opaque;
+
+    /**
+     * number of audio samples (per channel) described by this frame
+     * - encoding: unused
+     * - decoding: Set by libavcodec
+     */
+    int nb_samples;
+
+    /**
+     * pointers to the data planes/channels.
+     *
+     * For video, this should simply point to data[].
+     *
+     * For planar audio, each channel has a separate data pointer, and
+     * linesize[0] contains the size of each channel buffer.
+     * For packed audio, there is just one data pointer, and linesize[0]
+     * contains the total size of the buffer for all channels.
+     *
+     * Note: Both data and extended_data will always be set by get_buffer(),
+     * but for planar audio with more channels that can fit in data,
+     * extended_data must be used by the decoder in order to access all
+     * channels.
+     *
+     * encoding: unused
+     * decoding: set by AVCodecContext.get_buffer()
+     */
+    uint8_t **extended_data;
+
+    /**
+     * sample aspect ratio for the video frame, 0/1 if unknown\unspecified
+     * - encoding: unused
+     * - decoding: Read by user.
+     */
+    AVRational sample_aspect_ratio;
+
+    /**
+     * width and height of the video frame
+     * - encoding: unused
+     * - decoding: Read by user.
+     */
+    int width, height;
+
+    /**
+     * format of the frame, -1 if unknown or unset
+     * Values correspond to enum PixelFormat for video frames,
+     * enum AVSampleFormat for audio)
+     * - encoding: unused
+     * - decoding: Read by user.
+     */
+    int format;
+
+    /**
+     * frame timestamp estimated using various heuristics, in stream time base
+     * Code outside libavcodec should access this field using:
+     *  av_opt_ptr(avcodec_get_frame_class(), frame, "best_effort_timestamp");
+     * - encoding: unused
+     * - decoding: set by libavcodec, read by user.
+     */
+    int64_t best_effort_timestamp;
+
+    /**
+     * reordered pos from the last AVPacket that has been input into the decoder
+     * Code outside libavcodec should access this field using:
+     *  av_opt_ptr(avcodec_get_frame_class(), frame, "pkt_pos");
+     * - encoding: unused
+     * - decoding: Read by user.
+     */
+    int64_t pkt_pos;
+
 } AVFrame;
 
+struct AVCodecInternal;
+
+enum AVFieldOrder {
+    AV_FIELD_UNKNOWN,
+    AV_FIELD_PROGRESSIVE,
+    AV_FIELD_TT,          //< Top coded_first, top displayed first
+    AV_FIELD_BB,          //< Bottom coded first, bottom displayed first
+    AV_FIELD_TB,          //< Top coded first, bottom displayed first
+    AV_FIELD_BT,          //< Bottom coded first, top displayed first
+};
+
 /**
  * main external API structure.
  * New fields can be added to the end with minor version bumps.
  * Removal, reordering and changes to existing fields require a major
  * version bump.
+ * Please use AVOptions (av_opt* / av_set/get*()) to access these fields from user
+ * applications.
  * sizeof(AVCodecContext) must not be used outside libav*.
  */
 typedef struct AVCodecContext {
     /**
      * information on struct for av_log
-     * - set by avcodec_alloc_context
+     * - set by avcodec_alloc_context3
      */
     const AVClass *av_class;
     /**
@@ -1188,7 +1410,7 @@ typedef struct AVCodecContext {
      * Some codecs need additional format info. It is stored here.
      * If any muxer uses this then ALL demuxers/parsers AND encoders for the
      * specific codec MUST set it correctly otherwise stream copy breaks.
-     * In general use of this field by muxers is not recommanded.
+     * In general use of this field by muxers is not recommended.
      * - encoding: Set by libavcodec.
      * - decoding: Set by libavcodec. (FIXME: Is this OK?)
      */
@@ -1279,7 +1501,7 @@ typedef struct AVCodecContext {
      * @param offset offset into the AVFrame.data from which the slice should be read
      */
     void (*draw_horiz_band)(struct AVCodecContext *s,
-                            const AVFrame *src, int offset[4],
+                            const AVFrame *src, int offset[AV_NUM_DATA_POINTERS],
                             int y, int type, int height);
 
     /* audio only */
@@ -1301,10 +1523,12 @@ typedef struct AVCodecContext {
     int frame_number;   ///< audio or video frame number
 
     /**
-     * Number of frames the decoded output will be delayed relative to
-     * the encoded input.
+     * Encoding: Number of frames delay there will be from the encoder input to
+     *           the decoder output. (we assume the decoder matches the spec)
+     * Decoding: Number of frames delay in addition to what a standard decoder
+     *           as specified in the spec would produce.
      * - encoding: Set by libavcodec.
-     * - decoding: unused
+     * - decoding: Set by libavcodec.
      */
     int delay;
 
@@ -1410,7 +1634,7 @@ typedef struct AVCodecContext {
      * A demuxer should set this to what is stored in the field used to identify the codec.
      * If there are multiple such fields in a container then the demuxer should choose the one
      * which maximizes the information about the used codec.
-     * If the codec tag field in a container is larger then 32 bits then the demuxer should
+     * If the codec tag field in a container is larger than 32 bits then the demuxer should
      * remap the longer ID to 32 bits with a table or other structure. Alternatively a new
      * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated
      * first.
@@ -1483,29 +1707,73 @@ typedef struct AVCodecContext {
      */
     float b_quant_offset;
 
+#if FF_API_ER
     /**
-     * Error recognization; higher values will detect more errors but may
+     * Error recognition; higher values will detect more errors but may
      * misdetect some more or less valid parts as errors.
      * - encoding: unused
      * - decoding: Set by user.
      */
-    int error_recognition;
+    attribute_deprecated int error_recognition;
 #define FF_ER_CAREFUL         1
 #define FF_ER_COMPLIANT       2
 #define FF_ER_AGGRESSIVE      3
 #define FF_ER_VERY_AGGRESSIVE 4
+#define FF_ER_EXPLODE         5
+#endif /* FF_API_ER */
 
     /**
      * Called at the beginning of each frame to get a buffer for it.
-     * If pic.reference is set then the frame will be read later by libavcodec.
-     * avcodec_align_dimensions2() should be used to find the required width and
-     * height, as they normally need to be rounded up to the next multiple of 16.
+     *
+     * The function will set AVFrame.data[], AVFrame.linesize[].
+     * AVFrame.extended_data[] must also be set, but it should be the same as
+     * AVFrame.data[] except for planar audio with more channels than can fit
+     * in AVFrame.data[]. In that case, AVFrame.data[] shall still contain as
+     * many data pointers as it can hold.
+     *
      * if CODEC_CAP_DR1 is not set then get_buffer() must call
      * avcodec_default_get_buffer() instead of providing buffers allocated by
      * some other means.
+     *
+     * AVFrame.data[] should be 32- or 16-byte-aligned unless the CPU doesn't
+     * need it. avcodec_default_get_buffer() aligns the output buffer properly,
+     * but if get_buffer() is overridden then alignment considerations should
+     * be taken into account.
+     *
+     * @see avcodec_default_get_buffer()
+     *
+     * Video:
+     *
+     * If pic.reference is set then the frame will be read later by libavcodec.
+     * avcodec_align_dimensions2() should be used to find the required width and
+     * height, as they normally need to be rounded up to the next multiple of 16.
+     *
      * If frame multithreading is used and thread_safe_callbacks is set,
-     * it may be called from a different thread, but not from more than one at once.
-     * Does not need to be reentrant.
+     * it may be called from a different thread, but not from more than one at
+     * once. Does not need to be reentrant.
+     *
+     * @see release_buffer(), reget_buffer()
+     * @see avcodec_align_dimensions2()
+     *
+     * Audio:
+     *
+     * Decoders request a buffer of a particular size by setting
+     * AVFrame.nb_samples prior to calling get_buffer(). The decoder may,
+     * however, utilize only part of the buffer by setting AVFrame.nb_samples
+     * to a smaller value in the output frame.
+     *
+     * Decoders cannot use the buffer after returning from
+     * avcodec_decode_audio4(), so they will not call release_buffer(), as it
+     * is assumed to be released immediately upon return.
+     *
+     * As a convenience, av_samples_get_buffer_size() and
+     * av_samples_fill_arrays() in libavutil may be used by custom get_buffer()
+     * functions to find the required data size and to fill data pointers and
+     * linesize. In AVFrame.linesize, only linesize[0] may be set for audio
+     * since all planes must be the same size.
+     *
+     * @see av_samples_get_buffer_size(), av_samples_fill_arrays()
+     *
      * - encoding: unused
      * - decoding: Set by libavcodec, user can override.
      */
@@ -1536,9 +1804,15 @@ typedef struct AVCodecContext {
      */
     int block_align;
 
-    int parse_only; /* - decoding only: If true, only parsing is done
-                       (function avcodec_parse_frame()). The frame
-                       data is returned. Only MPEG codecs support this now. */
+#if FF_API_PARSE_FRAME
+    /**
+     * If true, only parsing is done. The frame data is returned.
+     * Only MPEG audio decoders support this now.
+     * - encoding: unused
+     * - decoding: Set by user
+     */
+    attribute_deprecated int parse_only;
+#endif
 
     /**
      * 0-> h263 quant 1-> mpeg quant
@@ -1818,7 +2092,7 @@ typedef struct AVCodecContext {
      * - encoding: Set by libavcodec if flags&CODEC_FLAG_PSNR.
      * - decoding: unused
      */
-    uint64_t error[4];
+    uint64_t error[AV_NUM_DATA_POINTERS];
 
     /**
      * motion estimation comparison function
@@ -1963,17 +2237,21 @@ typedef struct AVCodecContext {
      */
     int color_table_id;
 
+#if FF_API_INTERNAL_CONTEXT
     /**
      * internal_buffer count
      * Don't touch, used by libavcodec default_get_buffer().
+     * @deprecated this field was moved to an internal context
      */
-    int internal_buffer_count;
+    attribute_deprecated int internal_buffer_count;
 
     /**
      * internal_buffers
      * Don't touch, used by libavcodec default_get_buffer().
+     * @deprecated this field was moved to an internal context
      */
-    void *internal_buffer;
+    attribute_deprecated void *internal_buffer;
+#endif
 
     /**
      * Global quality for codecs which cannot change it per frame.
@@ -2279,6 +2557,23 @@ typedef struct AVCodecContext {
 #define FF_PROFILE_VC1_COMPLEX  2
 #define FF_PROFILE_VC1_ADVANCED 3
 
+#define FF_PROFILE_MPEG4_SIMPLE                     0
+#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE            1
+#define FF_PROFILE_MPEG4_CORE                       2
+#define FF_PROFILE_MPEG4_MAIN                       3
+#define FF_PROFILE_MPEG4_N_BIT                      4
+#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE           5
+#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION      6
+#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE     7
+#define FF_PROFILE_MPEG4_HYBRID                     8
+#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME         9
+#define FF_PROFILE_MPEG4_CORE_SCALABLE             10
+#define FF_PROFILE_MPEG4_ADVANCED_CODING           11
+#define FF_PROFILE_MPEG4_ADVANCED_CORE             12
+#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13
+#define FF_PROFILE_MPEG4_SIMPLE_STUDIO             14
+#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE           15
+
     /**
      * level
      * - encoding: Set by user.
@@ -2295,8 +2590,7 @@ typedef struct AVCodecContext {
      int lowres;
 
     /**
-     * Bitstream width / height, may be different from width/height if lowres
-     * or other things are used.
+     * Bitstream width / height, may be different from width/height if lowres enabled.
      * - encoding: unused
      * - decoding: Set by user before init if known. Codec should override / dynamically change if needed.
      */
@@ -2394,19 +2688,23 @@ typedef struct AVCodecContext {
      */
     int brd_scale;
 
+#if FF_API_X264_GLOBAL_OPTS
     /**
      * constant rate factor - quality-based VBR - values ~correspond to qps
      * - encoding: Set by user.
      * - decoding: unused
+     *   @deprecated use 'crf' libx264 private option
      */
-    float crf;
+    attribute_deprecated float crf;
 
     /**
      * constant quantization parameter rate control method
      * - encoding: Set by user.
      * - decoding: unused
+     *   @deprecated use 'cqp' libx264 private option
      */
-    int cqp;
+    attribute_deprecated int cqp;
+#endif
 
     /**
      * minimum GOP size
@@ -2429,12 +2727,14 @@ typedef struct AVCodecContext {
      */
     int chromaoffset;
 
+#if FF_API_X264_GLOBAL_OPTS
     /**
-     * Influences how often B-frames are used.
+     * Influence how often B-frames are used.
      * - encoding: Set by user.
      * - decoding: unused
      */
-    int bframebias;
+    attribute_deprecated int bframebias;
+#endif
 
     /**
      * trellis RD quantization
@@ -2443,12 +2743,13 @@ typedef struct AVCodecContext {
      */
     int trellis;
 
+#if FF_API_X264_GLOBAL_OPTS
     /**
      * Reduce fluctuations in qp (before curve compression).
      * - encoding: Set by user.
      * - decoding: unused
      */
-    float complexityblur;
+    attribute_deprecated float complexityblur;
 
     /**
      * in-loop deblocking filter alphac0 parameter
@@ -2456,7 +2757,7 @@ typedef struct AVCodecContext {
      * - encoding: Set by user.
      * - decoding: unused
      */
-    int deblockalpha;
+    attribute_deprecated int deblockalpha;
 
     /**
      * in-loop deblocking filter beta parameter
@@ -2464,14 +2765,14 @@ typedef struct AVCodecContext {
      * - encoding: Set by user.
      * - decoding: unused
      */
-    int deblockbeta;
+    attribute_deprecated int deblockbeta;
 
     /**
      * macroblock subpartition sizes to consider - p8x8, p4x4, b8x8, i8x8, i4x4
      * - encoding: Set by user.
      * - decoding: unused
      */
-    int partitions;
+    attribute_deprecated int partitions;
 #define X264_PART_I4X4 0x001  /* Analyze i4x4 */
 #define X264_PART_I8X8 0x002  /* Analyze i8x8 (requires 8x8 transform) */
 #define X264_PART_P8X8 0x010  /* Analyze p16x8, p8x16 and p8x8 */
@@ -2483,7 +2784,8 @@ typedef struct AVCodecContext {
      * - encoding: Set by user.
      * - decoding: unused
      */
-    int directpred;
+    attribute_deprecated int directpred;
+#endif
 
     /**
      * Audio cutoff bandwidth (0 means "automatic")
@@ -2508,7 +2810,7 @@ typedef struct AVCodecContext {
     int mv0_threshold;
 
     /**
-     * Adjusts sensitivity of b_frame_strategy 1.
+     * Adjust sensitivity of b_frame_strategy 1.
      * - encoding: Set by user.
      * - decoding: unused
      */
@@ -2571,9 +2873,9 @@ typedef struct AVCodecContext {
 #endif
 
     /**
-     * GOP timecode frame start number, in non drop frame format
-     * - encoding: Set by user.
-     * - decoding: unused
+     * GOP timecode frame start number
+     * - encoding: Set by user, in non drop frame format
+     * - decoding: Set by libavcodec (timecode in the 25 bits format, -1 if unset)
      */
     int64_t timecode_frame_start;
 
@@ -2587,13 +2889,16 @@ typedef struct AVCodecContext {
     int request_channels;
 #endif
 
+#if FF_API_DRC_SCALE
     /**
      * Percentage of dynamic range compression to be applied by the decoder.
      * The default value is 1.0, corresponding to full compression.
      * - encoding: unused
      * - decoding: Set by user.
+     * @deprecated use AC3 decoder private option instead.
      */
-    float drc_scale;
+    attribute_deprecated float drc_scale;
+#endif
 
     /**
      * opaque 64bit number (generally a PTS) that will be reordered and
@@ -2606,7 +2911,6 @@ typedef struct AVCodecContext {
 
     /**
      * Bits per sample/pixel of internal libavcodec pixel/sample format.
-     * This field is applicable only when sample_fmt is AV_SAMPLE_FMT_S32.
      * - encoding: set by user.
      * - decoding: set by libavcodec.
      */
@@ -2617,14 +2921,14 @@ typedef struct AVCodecContext {
      * - encoding: set by user.
      * - decoding: set by user, may be overwritten by libavcodec.
      */
-    int64_t channel_layout;
+    uint64_t channel_layout;
 
     /**
      * Request decoder to use this channel layout if it can (0 for default)
      * - encoding: unused
      * - decoding: Set by user.
      */
-    int64_t request_channel_layout;
+    uint64_t request_channel_layout;
 
     /**
      * Ratecontrol attempt to use, at maximum, <value> of what can be used without an underflow.
@@ -2723,6 +3027,7 @@ typedef struct AVCodecContext {
      */
     int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count);
 
+#if FF_API_X264_GLOBAL_OPTS
     /**
      * explicit P-frame weighted prediction analysis method
      * 0: off
@@ -2731,7 +3036,7 @@ typedef struct AVCodecContext {
      * - encoding: Set by user.
      * - decoding: unused
      */
-    int weighted_p_pred;
+    attribute_deprecated int weighted_p_pred;
 
     /**
      * AQ mode
@@ -2741,7 +3046,7 @@ typedef struct AVCodecContext {
      * - encoding: Set by user
      * - decoding: unused
      */
-    int aq_mode;
+    attribute_deprecated int aq_mode;
 
     /**
      * AQ strength
@@ -2749,7 +3054,7 @@ typedef struct AVCodecContext {
      * - encoding: Set by user
      * - decoding: unused
      */
-    float aq_strength;
+    attribute_deprecated float aq_strength;
 
     /**
      * PSY RD
@@ -2757,7 +3062,7 @@ typedef struct AVCodecContext {
      * - encoding: Set by user
      * - decoding: unused
      */
-    float psy_rd;
+    attribute_deprecated float psy_rd;
 
     /**
      * PSY trellis
@@ -2765,7 +3070,7 @@ typedef struct AVCodecContext {
      * - encoding: Set by user
      * - decoding: unused
      */
-    float psy_trellis;
+    attribute_deprecated float psy_trellis;
 
     /**
      * RC lookahead
@@ -2773,7 +3078,7 @@ typedef struct AVCodecContext {
      * - encoding: Set by user
      * - decoding: unused
      */
-    int rc_lookahead;
+    attribute_deprecated int rc_lookahead;
 
     /**
      * Constant rate factor maximum
@@ -2782,13 +3087,14 @@ typedef struct AVCodecContext {
      * - encoding: Set by user.
      * - decoding: unused
      */
-    float crf_max;
+    attribute_deprecated float crf_max;
+#endif
 
     int log_level_offset;
 
 #if FF_API_FLAC_GLOBAL_OPTS
     /**
-     * Determines which LPC analysis algorithm to use.
+     * Determine which LPC analysis algorithm to use.
      * - encoding: Set by user
      * - decoding: unused
      */
@@ -2816,8 +3122,8 @@ typedef struct AVCodecContext {
      * For SUBTITLE_ASS subtitle type, it should contain the whole ASS
      * [Script Info] and [V4+ Styles] section, plus the [Events] line and
      * the Format line following. It shouldn't include any Dialogue line.
-     * - encoding: Set/allocated/freed by user (before avcodec_open())
-     * - decoding: Set/allocated/freed by libavcodec (by avcodec_open())
+     * - encoding: Set/allocated/freed by user (before avcodec_open2())
+     * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2())
      */
     uint8_t *subtitle_header;
     int subtitle_header_size;
@@ -2831,14 +3137,18 @@ typedef struct AVCodecContext {
      */
     AVPacket *pkt;
 
+#if FF_API_INTERNAL_CONTEXT
     /**
      * Whether this is a copy of the context which had init() called on it.
      * This is used by multithreading - shared tables and picture pointers
      * should be freed from the original context only.
      * - encoding: Set by libavcodec.
      * - decoding: Set by libavcodec.
+     *
+     * @deprecated this field has been moved to an internal context
      */
-    int is_copy;
+    attribute_deprecated int is_copy;
+#endif
 
     /**
      * Which multithreading methods to use.
@@ -2849,8 +3159,8 @@ typedef struct AVCodecContext {
      * - decoding: Set by user, otherwise the default is used.
      */
     int thread_type;
-#define FF_THREAD_FRAME   1 //< Decode more than one frame at once
-#define FF_THREAD_SLICE   2 //< Decode more than one part of a single frame at once
+#define FF_THREAD_FRAME   1 ///< Decode more than one frame at once
+#define FF_THREAD_SLICE   2 ///< Decode more than one part of a single frame at once
 
     /**
      * Which multithreading methods are in use by the codec.
@@ -2893,6 +3203,35 @@ typedef struct AVCodecContext {
     enum AVSampleFormat request_sample_fmt;
 
     /**
+     * Error recognition; may misdetect some more or less valid parts as errors.
+     * - encoding: unused
+     * - decoding: Set by user.
+     */
+    int err_recognition;
+#define AV_EF_CRCCHECK  (1<<0)
+#define AV_EF_BITSTREAM (1<<1)
+#define AV_EF_BUFFER    (1<<2)
+#define AV_EF_EXPLODE   (1<<3)
+
+#define AV_EF_CAREFUL    (1<<16)
+#define AV_EF_COMPLIANT  (1<<17)
+#define AV_EF_AGGRESSIVE (1<<18)
+
+    /**
+     * Private context used for internal data.
+     *
+     * Unlike priv_data, this is not codec-specific. It is used in general
+     * libavcodec functions.
+     */
+    struct AVCodecInternal *internal;
+
+    /** Field order
+     * - encoding: set by libavcodec
+     * - decoding: Set by libavcodec
+     */
+    enum AVFieldOrder field_order;
+
+    /**
      * Current statistics for PTS correction.
      * - decoding: maintained and used by libavcodec, not intended to be used by user apps
      * - encoding: unused
@@ -2902,7 +3241,6 @@ typedef struct AVCodecContext {
     int64_t pts_correction_last_pts;       /// PTS of the last frame
     int64_t pts_correction_last_dts;       /// DTS of the last frame
 
-
 } AVCodecContext;
 
 /**
@@ -2913,6 +3251,8 @@ typedef struct AVProfile {
     const char *name; ///< short name for the profile
 } AVProfile;
 
+typedef struct AVCodecDefault AVCodecDefault;
+
 /**
  * AVCodec.
  */
@@ -2951,7 +3291,7 @@ typedef struct AVCodec {
     const char *long_name;
     const int *supported_samplerates;       ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0
     const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1
-    const int64_t *channel_layouts;         ///< array of support channel layouts, or NULL if unknown. array is terminated by 0
+    const uint64_t *channel_layouts;         ///< array of support channel layouts, or NULL if unknown. array is terminated by 0
     uint8_t max_lowres;                     ///< maximum value for lowres supported by the decoder
     const AVClass *priv_class;              ///< AVClass for the private context
     const AVProfile *profiles;              ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN}
@@ -2975,6 +3315,29 @@ typedef struct AVCodec {
      */
     int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src);
     /** @} */
+
+    /**
+     * Private codec-specific defaults.
+     */
+    const AVCodecDefault *defaults;
+
+    /**
+     * Initialize codec static data, called from avcodec_register().
+     */
+    void (*init_static_data)(struct AVCodec *codec);
+
+    /**
+     * Encode data to an AVPacket.
+     *
+     * @param      avctx          codec context
+     * @param      avpkt          output AVPacket (may contain a user-provided buffer)
+     * @param[in]  frame          AVFrame containing the raw data to be encoded
+     * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a
+     *                            non-empty packet was returned in avpkt.
+     * @return 0 on success, negative error code on failure
+     */
+    int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame,
+                   int *got_packet_ptr);
 } AVCodec;
 
 /**
@@ -3072,10 +3435,12 @@ typedef struct AVHWAccel {
  * the last component is alpha
  */
 typedef struct AVPicture {
-    uint8_t *data[4];
-    int linesize[4];       ///< number of bytes per line
+    uint8_t *data[AV_NUM_DATA_POINTERS];
+    int linesize[AV_NUM_DATA_POINTERS];     ///< number of bytes per line
 } AVPicture;
 
+#define AVPALETTE_SIZE 1024
+#define AVPALETTE_COUNT 256
 #if FF_API_PALETTE_CONTROL
 /**
  * AVPaletteControl
@@ -3085,8 +3450,6 @@ typedef struct AVPicture {
  * @deprecated Use AVPacket to send palette changes instead.
  * This is totally broken.
  */
-#define AVPALETTE_SIZE 1024
-#define AVPALETTE_COUNT 256
 typedef struct AVPaletteControl {
 
     /* Demuxer sets this to 1 to indicate the palette has changed;
@@ -3259,7 +3622,7 @@ typedef struct ReSampleContext ReSampleContext;
  * @param linear           if 1 then the used FIR filter will be linearly interpolated
                            between the 2 closest, if 0 the closest will be used
  * @param cutoff           cutoff frequency, 1.0 corresponds to half the output sampling rate
- * @return allocated ReSampleContext, NULL if error occured
+ * @return allocated ReSampleContext, NULL if error occurred
  */
 ReSampleContext *av_audio_resample_init(int output_channels, int input_channels,
                                         int output_rate, int input_rate,
@@ -3320,7 +3683,7 @@ void av_resample_close(struct AVResampleContext *c);
 /**
  * Allocate memory for a picture.  Call avpicture_free() to free it.
  *
- * \see avpicture_fill()
+ * @see avpicture_fill()
  *
  * @param picture the picture to be filled in
  * @param pix_fmt the format of the picture
@@ -3367,7 +3730,7 @@ int avpicture_fill(AVPicture *picture, uint8_t *ptr,
  * The data is stored compactly, without any gaps for alignment or padding
  * which may be applied by avpicture_fill().
  *
- * \see avpicture_get_size()
+ * @see avpicture_get_size()
  *
  * @param[in] src AVPicture containing image data
  * @param[in] pix_fmt The format in which the picture data is stored.
@@ -3395,6 +3758,12 @@ int avpicture_layout(const AVPicture* src, enum PixelFormat pix_fmt, int width,
 int avpicture_get_size(enum PixelFormat pix_fmt, int width, int height);
 void avcodec_get_chroma_sub_sample(enum PixelFormat pix_fmt, int *h_shift, int *v_shift);
 
+/**
+ * Get the name of a codec.
+ * @return  a static string identifying the codec; never NULL
+ */
+const char *avcodec_get_name(enum CodecID id);
+
 #if FF_API_GET_PIX_FMT_NAME
 /**
  * Return the short name for a pixel format.
@@ -3446,7 +3815,8 @@ size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_ta
  * @param[in] dst_pix_fmt destination pixel format
  * @param[in] src_pix_fmt source pixel format
  * @param[in] has_alpha Whether the source pixel format alpha channel is used.
- * @return Combination of flags informing you what kind of losses will occur.
+ * @return Combination of flags informing you what kind of losses will occur
+ * (maximum loss for an invalid dst_pix_fmt).
  */
 int avcodec_get_pix_fmt_loss(enum PixelFormat dst_pix_fmt, enum PixelFormat src_pix_fmt,
                              int has_alpha);
@@ -3461,9 +3831,11 @@ int avcodec_get_pix_fmt_loss(enum PixelFormat dst_pix_fmt, enum PixelFormat src_
  * The pixel formats from which it chooses one, are determined by the
  * pix_fmt_mask parameter.
  *
+ * Note, only the first 64 pixel formats will fit in pix_fmt_mask.
+ *
  * @code
  * src_pix_fmt = PIX_FMT_YUV420P;
- * pix_fmt_mask = (1 << PIX_FMT_YUV422P) || (1 << PIX_FMT_RGB24);
+ * pix_fmt_mask = (1 << PIX_FMT_YUV422P) | (1 << PIX_FMT_RGB24);
  * dst_pix_fmt = avcodec_find_best_pix_fmt(pix_fmt_mask, src_pix_fmt, alpha, &loss);
  * @endcode
  *
@@ -3476,6 +3848,40 @@ int avcodec_get_pix_fmt_loss(enum PixelFormat dst_pix_fmt, enum PixelFormat src_
 enum PixelFormat avcodec_find_best_pix_fmt(int64_t pix_fmt_mask, enum PixelFormat src_pix_fmt,
                               int has_alpha, int *loss_ptr);
 
+/**
+ * Find the best pixel format to convert to given a certain source pixel
+ * format and a selection of two destination pixel formats. When converting from
+ * one pixel format to another, information loss may occur.  For example, when converting
+ * from RGB24 to GRAY, the color information will be lost. Similarly, other losses occur when
+ * converting from some formats to other formats. avcodec_find_best_pix_fmt2() selects which of
+ * the given pixel formats should be used to suffer the least amount of loss.
+ *
+ * If one of the destination formats is PIX_FMT_NONE the other pixel format (if valid) will be
+ * returned.
+ *
+ * @code
+ * src_pix_fmt = PIX_FMT_YUV420P;
+ * dst_pix_fmt1= PIX_FMT_RGB24;
+ * dst_pix_fmt2= PIX_FMT_GRAY8;
+ * dst_pix_fmt3= PIX_FMT_RGB8;
+ * loss= FF_LOSS_CHROMA; // don't care about chroma loss, so chroma loss will be ignored.
+ * dst_pix_fmt = avcodec_find_best_pix_fmt2(dst_pix_fmt1, dst_pix_fmt2, src_pix_fmt, alpha, &loss);
+ * dst_pix_fmt = avcodec_find_best_pix_fmt2(dst_pix_fmt, dst_pix_fmt3, src_pix_fmt, alpha, &loss);
+ * @endcode
+ *
+ * @param[in] dst_pix_fmt1 One of the two destination pixel formats to choose from
+ * @param[in] dst_pix_fmt2 The other of the two destination pixel formats to choose from
+ * @param[in] src_pix_fmt Source pixel format
+ * @param[in] has_alpha Whether the source pixel format alpha channel is used.
+ * @param[in, out] loss_ptr Combination of loss flags. In: selects which of the losses to ignore, i.e.
+ *                               NULL or value of zero means we care about all losses. Out: the loss
+ *                               that occurs when converting from src to selected dst pixel format.
+ * @return The best pixel format to convert to or -1 if none was found.
+ */
+enum PixelFormat avcodec_find_best_pix_fmt2(enum PixelFormat dst_pix_fmt1, enum PixelFormat dst_pix_fmt2,
+                                            enum PixelFormat src_pix_fmt, int has_alpha, int *loss_ptr);
+
+#if FF_API_GET_ALPHA_INFO
 #define FF_ALPHA_TRANSP       0x0001 /* image has some totally transparent pixels */
 #define FF_ALPHA_SEMI_TRANSP  0x0002 /* image has some transparent pixels */
 
@@ -3483,8 +3889,10 @@ enum PixelFormat avcodec_find_best_pix_fmt(int64_t pix_fmt_mask, enum PixelForma
  * Tell if an image really has transparent alpha values.
  * @return ored mask of FF_ALPHA_xxx constants
  */
+attribute_deprecated
 int img_get_alpha_info(const AVPicture *src,
                        enum PixelFormat pix_fmt, int width, int height);
+#endif
 
 /* deinterlace a picture */
 /* deinterlace - if not supported return -1 */
@@ -3515,21 +3923,22 @@ const char *avcodec_configuration(void);
  */
 const char *avcodec_license(void);
 
+#if FF_API_AVCODEC_INIT
 /**
- * Initialize libavcodec.
- * If called more than once, does nothing.
- *
- * @warning This function must be called before any other libavcodec
- * function.
- *
- * @warning This function is not thread-safe.
+ * @deprecated this function is called automatically from avcodec_register()
+ * and avcodec_register_all(), there is no need to call it manually
  */
+attribute_deprecated
 void avcodec_init(void);
+#endif
 
 /**
  * Register the codec codec and initialize libavcodec.
  *
- * @see avcodec_init(), avcodec_register_all()
+ * @warning either this function or avcodec_register_all() must be called
+ * before any other libavcodec functions.
+ *
+ * @see avcodec_register_all()
  */
 void avcodec_register(AVCodec *codec);
 
@@ -3575,46 +3984,74 @@ void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode);
  */
 const char *av_get_profile_name(const AVCodec *codec, int profile);
 
+#if FF_API_ALLOC_CONTEXT
 /**
  * Set the fields of the given AVCodecContext to default values.
  *
  * @param s The AVCodecContext of which the fields should be set to default values.
+ * @deprecated use avcodec_get_context_defaults3
  */
+attribute_deprecated
 void avcodec_get_context_defaults(AVCodecContext *s);
 
 /** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API!
  *  we WILL change its arguments and name a few times! */
+attribute_deprecated
 void avcodec_get_context_defaults2(AVCodecContext *s, enum AVMediaType);
+#endif
 
-/** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API!
- *  we WILL change its arguments and name a few times! */
+/**
+ * Set the fields of the given AVCodecContext to default values corresponding
+ * to the given codec (defaults may be codec-dependent).
+ *
+ * Do not call this function if a non-NULL codec has been passed
+ * to avcodec_alloc_context3() that allocated this AVCodecContext.
+ * If codec is non-NULL, it is illegal to call avcodec_open2() with a
+ * different codec on this AVCodecContext.
+ */
 int avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec);
 
+#if FF_API_ALLOC_CONTEXT
 /**
  * Allocate an AVCodecContext and set its fields to default values.  The
  * resulting struct can be deallocated by simply calling av_free().
  *
  * @return An AVCodecContext filled with default values or NULL on failure.
  * @see avcodec_get_context_defaults
+ *
+ * @deprecated use avcodec_alloc_context3()
  */
+attribute_deprecated
 AVCodecContext *avcodec_alloc_context(void);
 
 /** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API!
  *  we WILL change its arguments and name a few times! */
+attribute_deprecated
 AVCodecContext *avcodec_alloc_context2(enum AVMediaType);
+#endif
 
-/** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API!
- *  we WILL change its arguments and name a few times! */
+/**
+ * Allocate an AVCodecContext and set its fields to default values.  The
+ * resulting struct can be deallocated by calling avcodec_close() on it followed
+ * by av_free().
+ *
+ * @param codec if non-NULL, allocate private data and initialize defaults
+ *              for the given codec. It is illegal to then call avcodec_open2()
+ *              with a different codec.
+ *
+ * @return An AVCodecContext filled with default values or NULL on failure.
+ * @see avcodec_get_context_defaults
+ */
 AVCodecContext *avcodec_alloc_context3(AVCodec *codec);
 
 /**
  * Copy the settings of the source AVCodecContext into the destination
  * AVCodecContext. The resulting destination codec context will be
- * unopened, i.e. you are required to call avcodec_open() before you
+ * unopened, i.e. you are required to call avcodec_open2() before you
  * can use this AVCodecContext to decode/encode video/audio data.
  *
  * @param dest target codec context, should be initialized with
- *             avcodec_alloc_context(), but otherwise uninitialized
+ *             avcodec_alloc_context3(), but otherwise uninitialized
  * @param src source codec context
  * @return AVERROR() on error (e.g. memory allocation error), 0 on success
  */
@@ -3668,13 +4105,13 @@ void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height);
  * according to avcodec_get_edge_width() before.
  */
 void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
-                               int linesize_align[4]);
+                               int linesize_align[AV_NUM_DATA_POINTERS]);
 
 enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat * fmt);
 
 #if FF_API_THREAD_INIT
 /**
- * @deprecated Set s->thread_count before calling avcodec_open() instead of calling this.
+ * @deprecated Set s->thread_count before calling avcodec_open2() instead of calling this.
  */
 attribute_deprecated
 int avcodec_thread_init(AVCodecContext *s, int thread_count);
@@ -3684,6 +4121,7 @@ int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, v
 int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count);
 //FIXME func typedef
 
+#if FF_API_AVCODEC_OPEN
 /**
  * Initialize the AVCodecContext to use the given AVCodec. Prior to using this
  * function the context has to be allocated.
@@ -3700,7 +4138,7 @@ int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2,
  * if (!codec)
  *     exit(1);
  *
- * context = avcodec_alloc_context();
+ * context = avcodec_alloc_context3(codec);
  *
  * if (avcodec_open(context, codec) < 0)
  *     exit(1);
@@ -3709,11 +4147,58 @@ int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2,
  * @param avctx The context which will be set up to use the given codec.
  * @param codec The codec to use within the context.
  * @return zero on success, a negative value on error
- * @see avcodec_alloc_context, avcodec_find_decoder, avcodec_find_encoder, avcodec_close
+ * @see avcodec_alloc_context3, avcodec_find_decoder, avcodec_find_encoder, avcodec_close
+ *
+ * @deprecated use avcodec_open2
  */
+attribute_deprecated
 int avcodec_open(AVCodecContext *avctx, AVCodec *codec);
+#endif
+
+/**
+ * Initialize the AVCodecContext to use the given AVCodec. Prior to using this
+ * function the context has to be allocated with avcodec_alloc_context3().
+ *
+ * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),
+ * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for
+ * retrieving a codec.
+ *
+ * @warning This function is not thread safe!
+ *
+ * @code
+ * avcodec_register_all();
+ * av_dict_set(&opts, "b", "2.5M", 0);
+ * codec = avcodec_find_decoder(CODEC_ID_H264);
+ * if (!codec)
+ *     exit(1);
+ *
+ * context = avcodec_alloc_context3(codec);
+ *
+ * if (avcodec_open2(context, codec, opts) < 0)
+ *     exit(1);
+ * @endcode
+ *
+ * @param avctx The context to initialize.
+ * @param codec The codec to open this context for. If a non-NULL codec has been
+ *              previously passed to avcodec_alloc_context3() or
+ *              avcodec_get_context_defaults3() for this context, then this
+ *              parameter MUST be either NULL or equal to the previously passed
+ *              codec.
+ * @param options A dictionary filled with AVCodecContext and codec-private options.
+ *                On return this object will be filled with options that were not found.
+ *
+ * @return zero on success, a negative value on error
+ * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(),
+ *      av_dict_set(), av_opt_find().
+ */
+int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options);
 
+#if FF_API_OLD_DECODE_AUDIO
 /**
+ * Wrapper function which calls avcodec_decode_audio4.
+ *
+ * @deprecated Use avcodec_decode_audio4 instead.
+ *
  * Decode the audio frame of size avpkt->size from avpkt->data into samples.
  * Some decoders may support multiple frames in a single AVPacket, such
  * decoders would then just decode the first frame. In this case,
@@ -3733,6 +4218,11 @@ int avcodec_open(AVCodecContext *avctx, AVCodec *codec);
  * @warning The end of the input buffer avpkt->data should be set to 0 to ensure that
  * no overreading happens for damaged MPEG streams.
  *
+ * @warning You must not provide a custom get_buffer() when using
+ * avcodec_decode_audio3().  Doing so will override it with
+ * avcodec_default_get_buffer.  Use avcodec_decode_audio4() instead,
+ * which does allow the application to provide a custom get_buffer().
+ *
  * @note You might have to align the input buffer avpkt->data and output buffer
  * samples. The alignment requirements depend on the CPU: On some CPUs it isn't
  * necessary at all, on others it won't work at all if not aligned and on others
@@ -3742,8 +4232,14 @@ int avcodec_open(AVCodecContext *avctx, AVCodec *codec);
  * samples should be 16 byte aligned unless the CPU doesn't need it
  * (AltiVec and SSE do).
  *
+ * @note Codecs which have the CODEC_CAP_DELAY capability set have a delay
+ * between input and output, these need to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to return the remaining frames.
+ *
  * @param avctx the codec context
  * @param[out] samples the output buffer, sample type in avctx->sample_fmt
+ *                     If the sample format is planar, each channel plane will
+ *                     be the same size, with no padding between channels.
  * @param[in,out] frame_size_ptr the output buffer size in bytes
  * @param[in] avpkt The input AVPacket containing the input buffer.
  *            You can create such packet with av_init_packet() and by then setting
@@ -3752,9 +4248,46 @@ int avcodec_open(AVCodecContext *avctx, AVCodec *codec);
  * @return On error a negative value is returned, otherwise the number of bytes
  * used or zero if no frame data was decompressed (used) from the input AVPacket.
  */
-int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
+attribute_deprecated int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
                          int *frame_size_ptr,
                          AVPacket *avpkt);
+#endif
+
+/**
+ * Decode the audio frame of size avpkt->size from avpkt->data into frame.
+ *
+ * Some decoders may support multiple frames in a single AVPacket. Such
+ * decoders would then just decode the first frame. In this case,
+ * avcodec_decode_audio4 has to be called again with an AVPacket containing
+ * the remaining data in order to decode the second frame, etc...
+ * Even if no frames are returned, the packet needs to be fed to the decoder
+ * with remaining data until it is completely consumed or an error occurs.
+ *
+ * @warning The input buffer, avpkt->data must be FF_INPUT_BUFFER_PADDING_SIZE
+ *          larger than the actual read bytes because some optimized bitstream
+ *          readers read 32 or 64 bits at once and could read over the end.
+ *
+ * @note You might have to align the input buffer. The alignment requirements
+ *       depend on the CPU and the decoder.
+ *
+ * @param      avctx the codec context
+ * @param[out] frame The AVFrame in which to store decoded audio samples.
+ *                   Decoders request a buffer of a particular size by setting
+ *                   AVFrame.nb_samples prior to calling get_buffer(). The
+ *                   decoder may, however, only utilize part of the buffer by
+ *                   setting AVFrame.nb_samples to a smaller value in the
+ *                   output frame.
+ * @param[out] got_frame_ptr Zero if no frame could be decoded, otherwise it is
+ *                           non-zero.
+ * @param[in]  avpkt The input AVPacket containing the input buffer.
+ *                   At least avpkt->data and avpkt->size should be set. Some
+ *                   decoders might also require additional fields to be set.
+ * @return A negative error code is returned if an error occurred during
+ *         decoding, otherwise the number of bytes consumed from the input
+ *         AVPacket is returned.
+ */
+int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame,
+                          int *got_frame_ptr, AVPacket *avpkt);
 
 /**
  * Decode the video frame of size avpkt->size from avpkt->data into picture.
@@ -3775,8 +4308,9 @@ int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
  *
  * In practice, avpkt->data should have 4 byte alignment at minimum.
  *
- * @note Some codecs have a delay between input and output, these need to be
- * fed with avpkt->data=NULL, avpkt->size=0 at the end to return the remaining frames.
+ * @note Codecs which have the CODEC_CAP_DELAY capability set have a delay
+ * between input and output, these need to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to return the remaining frames.
  *
  * @param avctx the codec context
  * @param[out] picture The AVFrame in which the decoded video frame will be stored.
@@ -3798,7 +4332,7 @@ int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
  */
 int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
                          int *got_picture_ptr,
-                         AVPacket *avpkt);
+                         const AVPacket *avpkt);
 
 /**
  * Decode a subtitle message.
@@ -3821,23 +4355,22 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
                             AVPacket *avpkt);
 
 /**
- * Frees all allocated data in the given subtitle struct.
+ * Free all allocated data in the given subtitle struct.
  *
  * @param sub AVSubtitle to free.
  */
 void avsubtitle_free(AVSubtitle *sub);
 
-int avcodec_parse_frame(AVCodecContext *avctx, uint8_t **pdata,
-                        int *data_size_ptr,
-                        uint8_t *buf, int buf_size);
-
+#if FF_API_OLD_ENCODE_AUDIO
 /**
  * Encode an audio frame from samples into buf.
  *
+ * @deprecated Use avcodec_encode_audio2 instead.
+ *
  * @note The output buffer should be at least FF_MIN_BUFFER_SIZE bytes large.
- * However, for PCM audio the user will know how much space is needed
- * because it depends on the value passed in buf_size as described
- * below. In that case a lower value can be used.
+ * However, for codecs with avctx->frame_size equal to 0 (e.g. PCM) the user
+ * will know how much space is needed because it depends on the value passed
+ * in buf_size as described below. In that case a lower value can be used.
  *
  * @param avctx the codec context
  * @param[out] buf the output buffer
@@ -3845,13 +4378,79 @@ int avcodec_parse_frame(AVCodecContext *avctx, uint8_t **pdata,
  * @param[in] samples the input buffer containing the samples
  * The number of samples read from this buffer is frame_size*channels,
  * both of which are defined in avctx.
- * For PCM audio the number of samples read from samples is equal to
- * buf_size * input_sample_size / output_sample_size.
+ * For codecs which have avctx->frame_size equal to 0 (e.g. PCM) the number of
+ * samples read from samples is equal to:
+ * buf_size * 8 / (avctx->channels * av_get_bits_per_sample(avctx->codec_id))
+ * This also implies that av_get_bits_per_sample() must not return 0 for these
+ * codecs.
  * @return On error a negative value is returned, on success zero or the number
  * of bytes used to encode the data read from the input buffer.
  */
-int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size,
-                         const short *samples);
+int attribute_deprecated avcodec_encode_audio(AVCodecContext *avctx,
+                                              uint8_t *buf, int buf_size,
+                                              const short *samples);
+#endif
+
+/**
+ * Encode a frame of audio.
+ *
+ * Takes input samples from frame and writes the next output packet, if
+ * available, to avpkt. The output packet does not necessarily contain data for
+ * the most recent frame, as encoders can delay, split, and combine input frames
+ * internally as needed.
+ *
+ * @param avctx     codec context
+ * @param avpkt     output AVPacket.
+ *                  The user can supply an output buffer by setting
+ *                  avpkt->data and avpkt->size prior to calling the
+ *                  function, but if the size of the user-provided data is not
+ *                  large enough, encoding will fail. All other AVPacket fields
+ *                  will be reset by the encoder using av_init_packet(). If
+ *                  avpkt->data is NULL, the encoder will allocate it.
+ *                  The encoder will set avpkt->size to the size of the
+ *                  output packet.
+ * @param[in] frame AVFrame containing the raw audio data to be encoded.
+ *                  May be NULL when flushing an encoder that has the
+ *                  CODEC_CAP_DELAY capability set.
+ *                  There are 2 codec capabilities that affect the allowed
+ *                  values of frame->nb_samples.
+ *                  If CODEC_CAP_SMALL_LAST_FRAME is set, then only the final
+ *                  frame may be smaller than avctx->frame_size, and all other
+ *                  frames must be equal to avctx->frame_size.
+ *                  If CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame
+ *                  can have any number of samples.
+ *                  If neither is set, frame->nb_samples must be equal to
+ *                  avctx->frame_size for all frames.
+ * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the
+ *                            output packet is non-empty, and to 0 if it is
+ *                            empty. If the function returns an error, the
+ *                            packet can be assumed to be invalid, and the
+ *                            value of got_packet_ptr is undefined and should
+ *                            not be used.
+ * @return          0 on success, negative error code on failure
+ */
+int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt,
+                          const AVFrame *frame, int *got_packet_ptr);
+
+/**
+ * Fill audio frame data and linesize.
+ * AVFrame extended_data channel pointers are allocated if necessary for
+ * planar audio.
+ *
+ * @param frame       the AVFrame
+ *                    frame->nb_samples must be set prior to calling the
+ *                    function. This function fills in frame->data,
+ *                    frame->extended_data, frame->linesize[0].
+ * @param nb_channels channel count
+ * @param sample_fmt  sample format
+ * @param buf         buffer to use for frame data
+ * @param buf_size    size of buffer
+ * @param align       plane size sample alignment
+ * @return            0 on success, negative error code on failure
+ */
+int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels,
+                             enum AVSampleFormat sample_fmt, const uint8_t *buf,
+                             int buf_size, int align);
 
 /**
  * Encode a video frame from pict into buf.
@@ -3870,6 +4469,15 @@ int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size,
 int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,
                             const AVSubtitle *sub);
 
+/**
+ * Close a given AVCodecContext and free all the data associated with it
+ * (but not the AVCodecContext itself).
+ *
+ * Calling this function on an AVCodecContext that hasn't been opened will free
+ * the codec-specific data allocated in avcodec_alloc_context3() /
+ * avcodec_get_context_defaults3() with a non-NULL codec. Subsequent calls will
+ * do nothing.
+ */
 int avcodec_close(AVCodecContext *avctx);
 
 /**
@@ -3964,7 +4572,7 @@ typedef struct AVCodecParserContext {
     int64_t offset;      ///< byte offset from starting packet start
     int64_t cur_frame_end[AV_PARSER_PTS_NB];
 
-    /*!
+    /**
      * Set by parser to 1 for key frames and 0 for non-key frames.
      * It is initialized to -1, so if the parser doesn't set this flag,
      * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames
@@ -4163,6 +4771,15 @@ void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size);
 void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size);
 
 /**
+ * Same behaviour av_fast_malloc but the buffer has additional
+ * FF_INPUT_PADDING_SIZE at the end which will will always be 0.
+ *
+ * In addition the whole buffer will initially and after resizes
+ * be 0-initialized so that no uninitialized data will ever appear.
+ */
+void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size);
+
+/**
  * Copy image src to dst. Wraps av_picture_data_copy() above.
  */
 void av_picture_copy(AVPicture *dst, const AVPicture *src,
@@ -4190,7 +4807,7 @@ int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width,
 unsigned int av_xiphlacing(unsigned char *s, unsigned int v);
 
 /**
- * Logs a generic warning message about a missing feature. This function is
+ * Log a generic warning message about a missing feature. This function is
  * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.)
  * only, and would normally not be used by applications.
  * @param[in] avc a pointer to an arbitrary struct of which the first field is
@@ -4211,7 +4828,7 @@ void av_log_missing_feature(void *avc, const char *feature, int want_sample);
  * a pointer to an AVClass struct
  * @param[in] msg string containing an optional message, or NULL if no message
  */
-void av_log_ask_for_sample(void *avc, const char *msg, ...);
+void av_log_ask_for_sample(void *avc, const char *msg, ...) av_printf_format(2, 3);
 
 /**
  * Register the hardware accelerator hwaccel.
@@ -4251,4 +4868,31 @@ enum AVLockOp {
  */
 int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op));
 
+/**
+ * Get the type of the given codec.
+ */
+enum AVMediaType avcodec_get_type(enum CodecID codec_id);
+
+/**
+ * Get the AVClass for AVCodecContext. It can be used in combination with
+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
+ *
+ * @see av_opt_find().
+ */
+const AVClass *avcodec_get_class(void);
+
+/**
+ * Get the AVClass for AVFrame. It can be used in combination with
+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
+ *
+ * @see av_opt_find().
+ */
+const AVClass *avcodec_get_frame_class(void);
+
+/**
+ * @return a positive value if s is open (i.e. avcodec_open2() was called on it
+ * with no corresponding avcodec_close()), 0 otherwise.
+ */
+int avcodec_is_open(AVCodecContext *s);
+
 #endif /* AVCODEC_AVCODEC_H */
index 5c5fe21..fc99560 100644 (file)
 
 #include <stdint.h>
 
+#include <d3d9.h>
 #include <dxva2api.h>
 
+#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards
+
 /**
  * This structure is used to provides the necessary configurations and data
  * to the DXVA2 FFmpeg HWAccel implementation.
index 07568a4..4c3bb9b 100644 (file)
@@ -27,8 +27,8 @@
 #include <stdint.h>
 
 /**
- * \defgroup VAAPI_Decoding VA API Decoding
- * \ingroup Decoder
+ * @defgroup VAAPI_Decoding VA API Decoding
+ * @ingroup Decoder
  * @{
  */
 
diff --git a/3rdparty/include/ffmpeg_/libavcodec/vda.h b/3rdparty/include/ffmpeg_/libavcodec/vda.h
new file mode 100644 (file)
index 0000000..6e9de9c
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * VDA HW acceleration
+ *
+ * copyright (c) 2011 Sebastien Zwickert
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VDA_H
+#define AVCODEC_VDA_H
+
+#include <pthread.h>
+#include <stdint.h>
+
+// emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes
+// http://openradar.appspot.com/8026390
+#undef __GNUC_STDC_INLINE__
+
+#define Picture QuickdrawPicture
+#include <VideoDecodeAcceleration/VDADecoder.h>
+#undef Picture
+
+/**
+ *  This structure is used to store a decoded frame information and data.
+ */
+typedef struct {
+    /**
+    * The PTS of the frame.
+    *
+    * - encoding: unused
+    * - decoding: Set/Unset by libavcodec.
+    */
+    int64_t             pts;
+
+    /**
+    * The CoreVideo buffer that contains the decoded data.
+    *
+    * - encoding: unused
+    * - decoding: Set/Unset by libavcodec.
+    */
+    CVPixelBufferRef    cv_buffer;
+
+    /**
+    * A pointer to the next frame.
+    *
+    * - encoding: unused
+    * - decoding: Set/Unset by libavcodec.
+    */
+    struct vda_frame    *next_frame;
+} vda_frame;
+
+/**
+ * This structure is used to provide the necessary configurations and data
+ * to the VDA FFmpeg HWAccel implementation.
+ *
+ * The application must make it available as AVCodecContext.hwaccel_context.
+ */
+struct vda_context {
+    /**
+    * VDA decoder object.
+    *
+    * - encoding: unused
+    * - decoding: Set/Unset by libavcodec.
+    */
+    VDADecoder          decoder;
+
+    /**
+    * VDA frames queue ordered by presentation timestamp.
+    *
+    * - encoding: unused
+    * - decoding: Set/Unset by libavcodec.
+    */
+    vda_frame           *queue;
+
+    /**
+    * Mutex for locking queue operations.
+    *
+    * - encoding: unused
+    * - decoding: Set/Unset by libavcodec.
+    */
+    pthread_mutex_t     queue_mutex;
+
+    /**
+    * The frame width.
+    *
+    * - encoding: unused
+    * - decoding: Set/Unset by user.
+    */
+    int                 width;
+
+    /**
+    * The frame height.
+    *
+    * - encoding: unused
+    * - decoding: Set/Unset by user.
+    */
+    int                 height;
+
+    /**
+    * The frame format.
+    *
+    * - encoding: unused
+    * - decoding: Set/Unset by user.
+    */
+    int                 format;
+
+    /**
+    * The pixel format for output image buffers.
+    *
+    * - encoding: unused
+    * - decoding: Set/Unset by user.
+    */
+    OSType              cv_pix_fmt_type;
+
+    /**
+    * The current bitstream buffer.
+    *
+    * - encoding: unused
+    * - decoding: Set/Unset by libavcodec.
+    */
+    uint8_t             *bitstream;
+
+    /**
+    * The current size of the bitstream.
+    *
+    * - encoding: unused
+    * - decoding: Set/Unset by libavcodec.
+    */
+    int                 bitstream_size;
+
+    /**
+    * The reference size used for fast reallocation.
+    *
+    * - encoding: unused
+    * - decoding: Set/Unset by libavcodec.
+    */
+    int                 ref_size;
+};
+
+/** Create the video decoder. */
+int ff_vda_create_decoder(struct vda_context *vda_ctx,
+                          uint8_t *extradata,
+                          int extradata_size);
+
+/** Destroy the video decoder. */
+int ff_vda_destroy_decoder(struct vda_context *vda_ctx);
+
+/** Return the top frame of the queue. */
+vda_frame *ff_vda_queue_pop(struct vda_context *vda_ctx);
+
+/** Release the given frame. */
+void ff_vda_release_vda_frame(vda_frame *frame);
+
+#endif /* AVCODEC_VDA_H */
index 0dc6fb8..f3a5471 100644 (file)
@@ -25,7 +25,7 @@
 #define AVCODEC_VDPAU_H
 
 /**
- * \defgroup Decoder VDPAU Decoder and Renderer
+ * @defgroup Decoder VDPAU Decoder and Renderer
  *
  * VDPAU hardware acceleration has two modules
  * - VDPAU decoding
  * and rendering (API calls) are done as part of the VDPAU
  * presentation (vo_vdpau.c) module.
  *
- * \defgroup  VDPAU_Decoding VDPAU Decoding
- * \ingroup Decoder
+ * @defgroup  VDPAU_Decoding VDPAU Decoding
+ * @ingroup Decoder
  * @{
  */
 
 #include <vdpau/vdpau.h>
 #include <vdpau/vdpau_x11.h>
 
-/** \brief The videoSurface is used for rendering. */
+/** @brief The videoSurface is used for rendering. */
 #define FF_VDPAU_STATE_USED_FOR_RENDER 1
 
 /**
- * \brief The videoSurface is needed for reference/prediction.
+ * @brief The videoSurface is needed for reference/prediction.
  * The codec manipulates this.
  */
 #define FF_VDPAU_STATE_USED_FOR_REFERENCE 2
 
 /**
- * \brief This structure is used as a callback between the FFmpeg
+ * @brief This structure is used as a callback between the FFmpeg
  * decoder (vd_) and presentation (vo_) module.
  * This is used for defining a video frame containing surface,
  * picture parameter, bitstream information etc which are passed
index 100c06d..0a5afef 100644 (file)
@@ -21,8 +21,8 @@
 #define AVCODEC_VERSION_H
 
 #define LIBAVCODEC_VERSION_MAJOR 53
-#define LIBAVCODEC_VERSION_MINOR  7
-#define LIBAVCODEC_VERSION_MICRO  0
+#define LIBAVCODEC_VERSION_MINOR 61
+#define LIBAVCODEC_VERSION_MICRO 100
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                LIBAVCODEC_VERSION_MINOR, \
@@ -51,7 +51,7 @@
 #define FF_API_ANTIALIAS_ALGO   (LIBAVCODEC_VERSION_MAJOR < 54)
 #endif
 #ifndef FF_API_REQUEST_CHANNELS
-#define FF_API_REQUEST_CHANNELS (LIBAVCODEC_VERSION_MAJOR < 54)
+#define FF_API_REQUEST_CHANNELS (LIBAVCODEC_VERSION_MAJOR < 55)
 #endif
 #ifndef FF_API_OPT_H
 #define FF_API_OPT_H            (LIBAVCODEC_VERSION_MAJOR < 54)
 #ifndef FF_API_GET_PIX_FMT_NAME
 #define FF_API_GET_PIX_FMT_NAME (LIBAVCODEC_VERSION_MAJOR < 54)
 #endif
+#ifndef FF_API_ALLOC_CONTEXT
+#define FF_API_ALLOC_CONTEXT    (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_AVCODEC_OPEN
+#define FF_API_AVCODEC_OPEN     (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_DRC_SCALE
+#define FF_API_DRC_SCALE        (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_ER
+#define FF_API_ER               (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_AVCODEC_INIT
+#define FF_API_AVCODEC_INIT     (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_X264_GLOBAL_OPTS
+#define FF_API_X264_GLOBAL_OPTS (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_MPEGVIDEO_GLOBAL_OPTS
+#define FF_API_MPEGVIDEO_GLOBAL_OPTS (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_LAME_GLOBAL_OPTS
+#define FF_API_LAME_GLOBAL_OPTS  (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_SNOW_GLOBAL_OPTS
+#define FF_API_SNOW_GLOBAL_OPTS  (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_MJPEG_GLOBAL_OPTS
+#define FF_API_MJPEG_GLOBAL_OPTS (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_GET_ALPHA_INFO
+#define FF_API_GET_ALPHA_INFO    (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_PARSE_FRAME
+#define FF_API_PARSE_FRAME (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_INTERNAL_CONTEXT
+#define FF_API_INTERNAL_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_TIFFENC_COMPLEVEL
+#define FF_API_TIFFENC_COMPLEVEL (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_DATA_POINTERS
+#define FF_API_DATA_POINTERS (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_OLD_DECODE_AUDIO
+#define FF_API_OLD_DECODE_AUDIO (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_OLD_TIMECODE
+#define FF_API_OLD_TIMECODE (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+
+#ifndef FF_API_AVFRAME_AGE
+#define FF_API_AVFRAME_AGE (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_OLD_ENCODE_AUDIO
+#define FF_API_OLD_ENCODE_AUDIO (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
 
 #endif /* AVCODEC_VERSION_H */
index e49e5b7..5abf9f5 100644 (file)
 #ifndef AVDEVICE_AVDEVICE_H
 #define AVDEVICE_AVDEVICE_H
 
+/**
+ * @file
+ * @ingroup lavd
+ * Main libavdevice API header
+ */
+
+/**
+ * @defgroup lavd Special devices muxing/demuxing library
+ * @{
+ * Libavdevice is a complementary library to @ref libavf "libavformat". It
+ * provides various "special" platform-specific muxers and demuxers, e.g. for
+ * grabbing devices, audio capture and playback etc. As a consequence, the
+ * (de)muxers in libavdevice are of the AVFMT_NOFILE type (they use their own
+ * I/O functions). The filename passed to avformat_open_input() often does not
+ * refer to an actually existing file, but has some special device-specific
+ * meaning - e.g. for the x11grab device it is the display name.
+ *
+ * To use libavdevice, simply call avdevice_register_all() to register all
+ * compiled muxers and demuxers. They all use standard libavformat API.
+ * @}
+ */
+
 #include "libavutil/avutil.h"
 #include "libavformat/avformat.h"
 
 #define LIBAVDEVICE_VERSION_MAJOR 53
-#define LIBAVDEVICE_VERSION_MINOR  1
-#define LIBAVDEVICE_VERSION_MICRO  1
+#define LIBAVDEVICE_VERSION_MINOR  4
+#define LIBAVDEVICE_VERSION_MICRO 100
 
 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
                                                LIBAVDEVICE_VERSION_MINOR, \
                                            LIBAVDEVICE_VERSION_MICRO)
 #define LIBAVDEVICE_BUILD       LIBAVDEVICE_VERSION_INT
 
-#ifndef FF_API_V4L
-#define FF_API_V4L              (LIBAVDEVICE_VERSION_MAJOR < 54)
-#endif
-
 /**
  * Return the LIBAVDEVICE_VERSION_INT constant.
  */
index 3d4e132..1e8a629 100644 (file)
 #ifndef AVFORMAT_AVFORMAT_H
 #define AVFORMAT_AVFORMAT_H
 
-
-/**
- * Return the LIBAVFORMAT_VERSION_INT constant.
- */
-unsigned avformat_version(void);
-
 /**
- * Return the libavformat build-time configuration.
+ * @file
+ * @ingroup libavf
+ * Main libavformat public API header
  */
-const char *avformat_configuration(void);
 
 /**
- * Return the libavformat license.
+ * @defgroup libavf I/O and Muxing/Demuxing Library
+ * @{
+ *
+ * Libavformat (lavf) is a library for dealing with various media container
+ * formats. Its main two purposes are demuxing - i.e. splitting a media file
+ * into component streams, and the reverse process of muxing - writing supplied
+ * data in a specified container format. It also has an @ref lavf_io
+ * "I/O module" which supports a number of protocols for accessing the data (e.g.
+ * file, tcp, http and others). Before using lavf, you need to call
+ * av_register_all() to register all compiled muxers, demuxers and protocols.
+ * Unless you are absolutely sure you won't use libavformat's network
+ * capabilities, you should also call avformat_network_init().
+ *
+ * A supported input format is described by an AVInputFormat struct, conversely
+ * an output format is described by AVOutputFormat. You can iterate over all
+ * registered input/output formats using the av_iformat_next() /
+ * av_oformat_next() functions. The protocols layer is not part of the public
+ * API, so you can only get the names of supported protocols with the
+ * avio_enum_protocols() function.
+ *
+ * Main lavf structure used for both muxing and demuxing is AVFormatContext,
+ * which exports all information about the file being read or written. As with
+ * most Libav structures, its size is not part of public ABI, so it cannot be
+ * allocated on stack or directly with av_malloc(). To create an
+ * AVFormatContext, use avformat_alloc_context() (some functions, like
+ * avformat_open_input() might do that for you).
+ *
+ * Most importantly an AVFormatContext contains:
+ * @li the @ref AVFormatContext.iformat "input" or @ref AVFormatContext.oformat
+ * "output" format. It is either autodetected or set by user for input;
+ * always set by user for output.
+ * @li an @ref AVFormatContext.streams "array" of AVStreams, which describe all
+ * elementary streams stored in the file. AVStreams are typically referred to
+ * using their index in this array.
+ * @li an @ref AVFormatContext.pb "I/O context". It is either opened by lavf or
+ * set by user for input, always set by user for output (unless you are dealing
+ * with an AVFMT_NOFILE format).
+ *
+ * @defgroup lavf_decoding Demuxing
+ * @{
+ * Demuxers read a media file and split it into chunks of data (@em packets). A
+ * @ref AVPacket "packet" contains one or more frames which belong a single
+ * elementary stream. In lavf API this process is represented by the
+ * avformat_open_input() function for opening a file, av_read_frame() for
+ * reading a single packet and finally avformat_close_input(), which does the
+ * cleanup.
+ *
+ * @section lavf_decoding_open Opening a media file
+ * The minimum information required to open a file is its URL or filename, which
+ * is passed to avformat_open_input(), as in the following code:
+ * @code
+ * const char    *url = "in.mp3";
+ * AVFormatContext *s = NULL;
+ * int ret = avformat_open_input(&s, url, NULL, NULL);
+ * if (ret < 0)
+ *     abort();
+ * @endcode
+ * The above code attempts to allocate an AVFormatContext, open the
+ * specified file (autodetecting the format) and read the header, exporting the
+ * information stored there into s. Some formats do not have a header or do not
+ * store enough information there, so it is recommended that you call the
+ * avformat_find_stream_info() function which tries to read and decode a few
+ * frames to find missing information.
+ *
+ * In some cases you might want to preallocate an AVFormatContext yourself with
+ * avformat_alloc_context() and do some tweaking on it before passing it to
+ * avformat_open_input(). One such case is when you want to use custom functions
+ * for reading input data instead of lavf internal I/O layer.
+ * To do that, create your own AVIOContext with avio_alloc_context(), passing
+ * your reading callbacks to it. Then set the @em pb field of your
+ * AVFormatContext to newly created AVIOContext.
+ *
+ * After you have finished reading the file, you must close it with
+ * avformat_close_input(). It will free everything associated with the file.
+ *
+ * @section lavf_decoding_read Reading from an opened file
+ *
+ * @section lavf_decoding_seek Seeking
+ * @}
+ *
+ * @defgroup lavf_encoding Muxing
+ * @{
+ * @}
+ *
+ * @defgroup lavf_io I/O Read/Write
+ * @{
+ * @}
+ *
+ * @defgroup lavf_codec Demuxers
+ * @{
+ * @defgroup lavf_codec_native Native Demuxers
+ * @{
+ * @}
+ * @defgroup lavf_codec_wrappers External library wrappers
+ * @{
+ * @}
+ * @}
+ * @defgroup lavf_protos I/O Protocols
+ * @{
+ * @}
+ * @defgroup lavf_internal Internal
+ * @{
+ * @}
+ * @}
+ *
  */
-const char *avformat_license(void);
 
 #include <time.h>
 #include <stdio.h>  /* FILE */
 #include "libavcodec/avcodec.h"
 #include "libavutil/dict.h"
+#include "libavutil/log.h"
 
 #include "avio.h"
 #include "libavformat/version.h"
@@ -51,10 +150,17 @@ struct AVFormatContext;
 /**
  * @defgroup metadata_api Public Metadata API
  * @{
+ * @ingroup libavf
  * The metadata API allows libavformat to export metadata tags to a client
- * application using a sequence of key/value pairs. Like all strings in FFmpeg,
- * metadata must be stored as UTF-8 encoded Unicode. Note that metadata
+ * application when demuxing. Conversely it allows a client application to
+ * set metadata when muxing.
+ *
+ * Metadata is exported or set as pairs of key/value strings in the 'metadata'
+ * fields of the AVFormatContext, AVStream, AVChapter and AVProgram structs
+ * using the @ref lavu_dict "AVDictionary" API. Like all strings in FFmpeg,
+ * metadata is assumed to be UTF-8 encoded Unicode. Note that metadata
  * exported by demuxers isn't checked to be valid UTF-8 in most cases.
+ *
  * Important concepts to keep in mind:
  * -  Keys are unique; there can never be 2 tags with the same key. This is
  *    also meant semantically, i.e., a demuxer should not knowingly produce
@@ -258,7 +364,7 @@ typedef struct AVFormatParameters {
 #endif
 } AVFormatParameters;
 
-//! Demuxer will use avio_open, no opened file should be provided by the caller.
+/// Demuxer will use avio_open, no opened file should be provided by the caller.
 #define AVFMT_NOFILE        0x0001
 #define AVFMT_NEEDNUMBER    0x0002 /**< Needs '%d' in filename. */
 #define AVFMT_SHOW_IDS      0x0008 /**< Show format stream IDs numbers. */
@@ -273,10 +379,16 @@ typedef struct AVFormatParameters {
 #define AVFMT_NOSTREAMS     0x1000 /**< Format does not require any streams */
 #define AVFMT_NOBINSEARCH   0x2000 /**< Format does not allow to fallback to binary search via read_timestamp */
 #define AVFMT_NOGENSEARCH   0x4000 /**< Format does not allow to fallback to generic search */
-#define AVFMT_TS_NONSTRICT  0x8000 /**< Format does not require strictly
-                                          increasing timestamps, but they must
-                                          still be monotonic */
+#define AVFMT_NO_BYTE_SEEK  0x8000 /**< Format does not allow seeking by bytes */
+#define AVFMT_ALLOW_FLUSH  0x10000 /**< Format allows flushing. If not set, the muxer will not receive a NULL packet in the write_packet function. */
+#define AVFMT_TS_NONSTRICT  0x8000000 /**< Format does not require strictly
+                                           increasing timestamps, but they must
+                                           still be monotonic */
 
+/**
+ * @addtogroup lavf_encoding
+ * @{
+ */
 typedef struct AVOutputFormat {
     const char *name;
     /**
@@ -295,12 +407,19 @@ typedef struct AVOutputFormat {
     enum CodecID audio_codec; /**< default audio codec */
     enum CodecID video_codec; /**< default video codec */
     int (*write_header)(struct AVFormatContext *);
+    /**
+     * Write a packet. If AVFMT_ALLOW_FLUSH is set in flags,
+     * pkt can be NULL in order to flush data buffered in the muxer.
+     * When flushing, return 0 if there still is more data to flush,
+     * or 1 if everything was flushed and there is no more buffered
+     * data.
+     */
     int (*write_packet)(struct AVFormatContext *, AVPacket *pkt);
     int (*write_trailer)(struct AVFormatContext *);
     /**
      * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_RAWPICTURE,
      * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS,
-     * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS
+     * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH
      */
     int flags;
 
@@ -323,10 +442,28 @@ typedef struct AVOutputFormat {
 
     const AVClass *priv_class; ///< AVClass for the private context
 
+    /**
+     * Test if the given codec can be stored in this container.
+     *
+     * @return 1 if the codec is supported, 0 if it is not.
+     *         A negative number if unknown.
+     */
+    int (*query_codec)(enum CodecID id, int std_compliance);
+
+    void (*get_output_timestamp)(struct AVFormatContext *s, int stream,
+                                 int64_t *dts, int64_t *wall);
+
     /* private fields */
     struct AVOutputFormat *next;
 } AVOutputFormat;
+/**
+ * @}
+ */
 
+/**
+ * @addtogroup lavf_decoding
+ * @{
+ */
 typedef struct AVInputFormat {
     /**
      * A comma separated list of short names for the format. New names
@@ -379,7 +516,6 @@ typedef struct AVInputFormat {
      */
     int (*read_close)(struct AVFormatContext *);
 
-#if FF_API_READ_SEEK
     /**
      * Seek to a given timestamp relative to the frames in
      * stream component stream_index.
@@ -388,18 +524,20 @@ typedef struct AVInputFormat {
      *              match is available.
      * @return >= 0 on success (but not necessarily the new offset)
      */
-    attribute_deprecated int (*read_seek)(struct AVFormatContext *,
-                                          int stream_index, int64_t timestamp, int flags);
-#endif
+    int (*read_seek)(struct AVFormatContext *,
+                     int stream_index, int64_t timestamp, int flags);
+
     /**
-     * Gets the next timestamp in stream[stream_index].time_base units.
+     * Get the next timestamp in stream[stream_index].time_base units.
      * @return the timestamp or AV_NOPTS_VALUE if an error occurred
      */
     int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index,
                               int64_t *pos, int64_t pos_limit);
 
     /**
-     * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER.
+     * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,
+     * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
+     * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK.
      */
     int flags;
 
@@ -446,6 +584,9 @@ typedef struct AVInputFormat {
     /* private fields */
     struct AVInputFormat *next;
 } AVInputFormat;
+/**
+ * @}
+ */
 
 enum AVStreamParseType {
     AVSTREAM_PARSE_NONE,
@@ -457,7 +598,12 @@ enum AVStreamParseType {
 
 typedef struct AVIndexEntry {
     int64_t pos;
-    int64_t timestamp;
+    int64_t timestamp;        /**<
+                               * Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are available
+                               * when seeking to this entry. That means preferable PTS on keyframe based formats.
+                               * But demuxers can choose to store a different timestamp, if it is more convenient for the implementation or nothing better
+                               * is known
+                               */
 #define AVINDEX_KEYFRAME 0x0001
     int flags:2;
     int size:30; //Yeah, trying to keep the size of this small to reduce memory requirements (it is 24 vs. 32 bytes due to possible 8-byte alignment).
@@ -503,8 +649,10 @@ typedef struct AVStream {
     AVRational r_frame_rate;
     void *priv_data;
 
+#if FF_API_REORDER_PRIVATE
     /* internal data used in av_find_stream_info() */
     int64_t first_dts;
+#endif
 
     /**
      * encoding: pts generation when outputting stream
@@ -519,20 +667,26 @@ typedef struct AVStream {
      * encoding: set by libavformat in av_write_header
      */
     AVRational time_base;
+#if FF_API_REORDER_PRIVATE
     int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */
+#endif
+#if FF_API_STREAM_COPY
     /* ffmpeg.c private use */
-    int stream_copy; /**< If set, just copy stream. */
+    attribute_deprecated int stream_copy; /**< If set, just copy stream. */
+#endif
     enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed.
 
+#if FF_API_AVSTREAM_QUALITY
     //FIXME move stuff to a flags field?
     /**
      * Quality, as it has been removed from AVCodecContext and put in AVVideoFrame.
      * MN: dunno if that is the right place for it
      */
-    float quality;
+    attribute_deprecated float quality;
+#endif
 
     /**
-     * Decoding: pts of the first frame of the stream, in stream time base.
+     * Decoding: pts of the first frame of the stream in presentation order, in stream time base.
      * Only set this if you are absolutely 100% sure that the value you set
      * it to really is the pts of the first frame.
      * This may be undefined (AV_NOPTS_VALUE).
@@ -548,6 +702,7 @@ typedef struct AVStream {
      */
     int64_t duration;
 
+#if FF_API_REORDER_PRIVATE
     /* av_read_frame() support */
     enum AVStreamParseType need_parsing;
     struct AVCodecParserContext *parser;
@@ -560,14 +715,17 @@ typedef struct AVStream {
                                     support seeking natively. */
     int nb_index_entries;
     unsigned int index_entries_allocated_size;
+#endif
 
     int64_t nb_frames;                 ///< number of frames in this stream if known or 0
 
     int disposition; /**< AV_DISPOSITION_* bit field */
 
+#if FF_API_REORDER_PRIVATE
     AVProbeData probe_data;
 #define MAX_REORDER_DELAY 16
     int64_t pts_buffer[MAX_REORDER_DELAY+1];
+#endif
 
     /**
      * sample aspect ratio (0 if unknown)
@@ -578,6 +736,7 @@ typedef struct AVStream {
 
     AVDictionary *metadata;
 
+#if FF_API_REORDER_PRIVATE
     /* Intended mostly for av_read_frame() support. Not supposed to be used by */
     /* external applications; try to use something else if at all possible.    */
     const uint8_t *cur_ptr;
@@ -603,15 +762,25 @@ typedef struct AVStream {
 
     /**
      * last packet in packet_buffer for this stream when muxing.
-     * used internally, NOT PART OF PUBLIC API, dont read or write from outside of libav*
+     * Used internally, NOT PART OF PUBLIC API, do not read or
+     * write from outside of libav*
      */
     struct AVPacketList *last_in_packet_buffer;
+#endif
 
     /**
      * Average framerate
      */
     AVRational avg_frame_rate;
 
+    /*****************************************************************
+     * All fields below this line are not part of the public API. They
+     * may not be used outside of libavformat and can be changed and
+     * removed at will.
+     * New public fields should be added right above.
+     *****************************************************************
+     */
+
     /**
      * Number of frames that have been demuxed during av_find_stream_info()
      */
@@ -624,16 +793,20 @@ typedef struct AVStream {
      */
     int stream_identifier;
 
+    int64_t interleaver_chunk_size;
+    int64_t interleaver_chunk_duration;
+
     /**
-     * Stream informations used internally by av_find_stream_info()
+     * Stream information used internally by av_find_stream_info()
      */
 #define MAX_STD_TIMEBASES (60*12+5)
     struct {
         int64_t last_dts;
         int64_t duration_gcd;
         int duration_count;
-        double duration_error[MAX_STD_TIMEBASES];
+        double duration_error[2][2][MAX_STD_TIMEBASES];
         int64_t codec_info_duration;
+        int nb_decoded_frames;
     } *info;
 
     /**
@@ -641,6 +814,49 @@ typedef struct AVStream {
      * NOT PART OF PUBLIC API
      */
     int request_probe;
+#if !FF_API_REORDER_PRIVATE
+    const uint8_t *cur_ptr;
+    int cur_len;
+    AVPacket cur_pkt;
+
+    // Timestamp generation support:
+    /**
+     * Timestamp corresponding to the last dts sync point.
+     *
+     * Initialized when AVCodecParserContext.dts_sync_point >= 0 and
+     * a DTS is received from the underlying container. Otherwise set to
+     * AV_NOPTS_VALUE by default.
+     */
+    int64_t reference_dts;
+    int64_t first_dts;
+    int64_t cur_dts;
+    int last_IP_duration;
+    int64_t last_IP_pts;
+
+    /**
+     * Number of packets to buffer for codec probing
+     */
+#define MAX_PROBE_PACKETS 2500
+    int probe_packets;
+
+    /**
+     * last packet in packet_buffer for this stream when muxing.
+     */
+    struct AVPacketList *last_in_packet_buffer;
+    AVProbeData probe_data;
+#define MAX_REORDER_DELAY 16
+    int64_t pts_buffer[MAX_REORDER_DELAY+1];
+    /* av_read_frame() support */
+    enum AVStreamParseType need_parsing;
+    struct AVCodecParserContext *parser;
+
+    AVIndexEntry *index_entries; /**< Only used if the format does not
+                                    support seeking natively. */
+    int nb_index_entries;
+    unsigned int index_entries_allocated_size;
+
+    int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */
+#endif
 } AVStream;
 
 #define AV_PROGRAM_RUNNING 1
@@ -679,22 +895,67 @@ typedef struct AVChapter {
  * New fields can be added to the end with minor version bumps.
  * Removal, reordering and changes to existing fields require a major
  * version bump.
- * sizeof(AVFormatContext) must not be used outside libav*.
+ * sizeof(AVFormatContext) must not be used outside libav*, use
+ * avformat_alloc_context() to create an AVFormatContext.
  */
 typedef struct AVFormatContext {
-    const AVClass *av_class; /**< Set by avformat_alloc_context. */
-    /* Can only be iformat or oformat, not both at the same time. */
+    /**
+     * A class for logging and AVOptions. Set by avformat_alloc_context().
+     * Exports (de)muxer private options if they exist.
+     */
+    const AVClass *av_class;
+
+    /**
+     * Can only be iformat or oformat, not both at the same time.
+     *
+     * decoding: set by avformat_open_input().
+     * encoding: set by the user.
+     */
     struct AVInputFormat *iformat;
     struct AVOutputFormat *oformat;
+
+    /**
+     * Format private data. This is an AVOptions-enabled struct
+     * if and only if iformat/oformat.priv_class is not NULL.
+     */
     void *priv_data;
+
+    /*
+     * I/O context.
+     *
+     * decoding: either set by the user before avformat_open_input() (then
+     * the user must close it manually) or set by avformat_open_input().
+     * encoding: set by the user.
+     *
+     * Do NOT set this field if AVFMT_NOFILE flag is set in
+     * iformat/oformat.flags. In such a case, the (de)muxer will handle
+     * I/O in some other way and this field will be NULL.
+     */
     AVIOContext *pb;
+
+    /**
+     * A list of all streams in the file. New streams are created with
+     * avformat_new_stream().
+     *
+     * decoding: streams are created by libavformat in avformat_open_input().
+     * If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also
+     * appear in av_read_frame().
+     * encoding: streams are created by the user before avformat_write_header().
+     */
     unsigned int nb_streams;
     AVStream **streams;
+
     char filename[1024]; /**< input or output filename */
     /* stream info */
-    int64_t timestamp;
+#if FF_API_TIMESTAMP
+    /**
+     * @deprecated use 'creation_time' metadata tag instead
+     */
+    attribute_deprecated int64_t timestamp;
+#endif
 
     int ctx_flags; /**< Format-specific flags, see AVFMTCTX_xx */
+#if FF_API_REORDER_PRIVATE
     /* private data for pts handling (do not modify directly). */
     /**
      * This buffer is only needed when packets were already buffered but
@@ -702,6 +963,7 @@ typedef struct AVFormatContext {
      * streams.
      */
     struct AVPacketList *packet_buffer;
+#endif
 
     /**
      * Decoding: position of the first frame of the component, in
@@ -713,15 +975,17 @@ typedef struct AVFormatContext {
     /**
      * Decoding: duration of the stream, in AV_TIME_BASE fractional
      * seconds. Only set this value if you know none of the individual stream
-     * durations and also dont set any of them. This is deduced from the
+     * durations and also do not set any of them. This is deduced from the
      * AVStream values if not set.
      */
     int64_t duration;
 
+#if FF_API_FILESIZE
     /**
      * decoding: total file size, 0 if unknown
      */
-    int64_t file_size;
+    attribute_deprecated int64_t file_size;
+#endif
 
     /**
      * Decoding: total stream bitrate in bit/s, 0 if not
@@ -730,23 +994,36 @@ typedef struct AVFormatContext {
      */
     int bit_rate;
 
+#if FF_API_REORDER_PRIVATE
     /* av_read_frame() support */
     AVStream *cur_st;
 
     /* av_seek_frame() support */
     int64_t data_offset; /**< offset of the first packet */
+#endif
 
-    int mux_rate;
+#if FF_API_MUXRATE
+    /**
+     * use mpeg muxer private options instead
+     */
+    attribute_deprecated int mux_rate;
+#endif
     unsigned int packet_size;
-    int preload;
+#if FF_API_PRELOAD
+    attribute_deprecated int preload;
+#endif
     int max_delay;
 
+#if FF_API_LOOP_OUTPUT
 #define AVFMT_NOOUTPUTLOOP -1
 #define AVFMT_INFINITEOUTPUTLOOP 0
     /**
      * number of times to loop output in formats that support it
+     *
+     * @deprecated use the 'loop' private option in the gif muxer.
      */
-    int loop_output;
+    attribute_deprecated int loop_output;
+#endif
 
     int flags;
 #define AVFMT_FLAG_GENPTS       0x0001 ///< Generate missing pts even if it requires parsing future frames.
@@ -759,12 +1036,18 @@ typedef struct AVFormatContext {
 #define AVFMT_FLAG_RTP_HINT     0x0040 ///< Deprecated, use the -movflags rtphint muxer specific AVOption instead
 #endif
 #define AVFMT_FLAG_CUSTOM_IO    0x0080 ///< The caller has supplied a custom AVIOContext, don't avio_close() it.
+#define AVFMT_FLAG_DISCARD_CORRUPT  0x0100 ///< Discard frames marked corrupted
 #define AVFMT_FLAG_MP4A_LATM    0x8000 ///< Enable RTP MP4A-LATM payload
 #define AVFMT_FLAG_SORT_DTS    0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down)
 #define AVFMT_FLAG_PRIV_OPT    0x20000 ///< Enable use of private options by delaying codec open (this could be made default once all code is converted)
 #define AVFMT_FLAG_KEEP_SIDE_DATA 0x40000 ///< Dont merge side data but keep it seperate.
 
-    int loop_input;
+#if FF_API_LOOP_INPUT
+    /**
+     * @deprecated, use the 'loop' img2 demuxer private option.
+     */
+    attribute_deprecated int loop_input;
+#endif
 
     /**
      * decoding: size of data to probe; encoding: unused.
@@ -772,8 +1055,8 @@ typedef struct AVFormatContext {
     unsigned int probesize;
 
     /**
-     * Maximum time (in AV_TIME_BASE units) during which the input should
-     * be analyzed in av_find_stream_info().
+     * decoding: maximum time (in AV_TIME_BASE units) during which the input should
+     * be analyzed in avformat_find_stream_info().
      */
     int max_analyze_duration;
 
@@ -828,6 +1111,7 @@ typedef struct AVFormatContext {
     int debug;
 #define FF_FDEBUG_TS        0x0001
 
+#if FF_API_REORDER_PRIVATE
     /**
      * Raw packets from the demuxer, prior to parsing and decoding.
      * This buffer is used for buffering packets until the codec can
@@ -838,15 +1122,18 @@ typedef struct AVFormatContext {
     struct AVPacketList *raw_packet_buffer_end;
 
     struct AVPacketList *packet_buffer_end;
+#endif
 
     AVDictionary *metadata;
 
+#if FF_API_REORDER_PRIVATE
     /**
      * Remaining size available for raw_packet_buffer, in bytes.
      * NOT PART OF PUBLIC API
      */
 #define RAW_PACKET_BUFFER_SIZE 2500000
     int raw_packet_buffer_remaining_size;
+#endif
 
     /**
      * Start time of the stream in real world time, in microseconds
@@ -863,10 +1150,90 @@ typedef struct AVFormatContext {
     int fps_probe_size;
 
     /**
+     * Error recognition; higher values will detect more errors but may
+     * misdetect some more or less valid parts as errors.
+     * - encoding: unused
+     * - decoding: Set by user.
+     */
+    int error_recognition;
+
+    /**
+     * Custom interrupt callbacks for the I/O layer.
+     *
+     * decoding: set by the user before avformat_open_input().
+     * encoding: set by the user before avformat_write_header()
+     * (mainly useful for AVFMT_NOFILE formats). The callback
+     * should also be passed to avio_open2() if it's used to
+     * open the file.
+     */
+    AVIOInterruptCB interrupt_callback;
+
+    /**
      * Transport stream id.
      * This will be moved into demuxer private options. Thus no API/ABI compatibility
      */
     int ts_id;
+
+    /**
+     * Audio preload in microseconds.
+     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
+     * - encoding: Set by user via AVOptions (NO direct access)
+     * - decoding: unused
+     */
+    int audio_preload;
+
+    /**
+     * Max chunk time in microseconds.
+     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
+     * - encoding: Set by user via AVOptions (NO direct access)
+     * - decoding: unused
+     */
+    int max_chunk_duration;
+
+    /**
+     * Max chunk size in bytes
+     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
+     * - encoding: Set by user via AVOptions (NO direct access)
+     * - decoding: unused
+     */
+    int max_chunk_size;
+
+    /*****************************************************************
+     * All fields below this line are not part of the public API. They
+     * may not be used outside of libavformat and can be changed and
+     * removed at will.
+     * New public fields should be added right above.
+     *****************************************************************
+     */
+#if !FF_API_REORDER_PRIVATE
+    /**
+     * Raw packets from the demuxer, prior to parsing and decoding.
+     * This buffer is used for buffering packets until the codec can
+     * be identified, as parsing cannot be done without knowing the
+     * codec.
+     */
+    struct AVPacketList *raw_packet_buffer;
+    struct AVPacketList *raw_packet_buffer_end;
+    /**
+     * Remaining size available for raw_packet_buffer, in bytes.
+     */
+#define RAW_PACKET_BUFFER_SIZE 2500000
+    int raw_packet_buffer_remaining_size;
+
+    /**
+     * This buffer is only needed when packets were already buffered but
+     * not decoded, for example to get the codec parameters in MPEG
+     * streams.
+     */
+    struct AVPacketList *packet_buffer;
+    struct AVPacketList *packet_buffer_end;
+
+    /* av_read_frame() support */
+    AVStream *cur_st;
+
+    /* av_seek_frame() support */
+    int64_t data_offset; /**< offset of the first packet */
+#endif
 } AVFormatContext;
 
 typedef struct AVPacketList {
@@ -874,103 +1241,122 @@ typedef struct AVPacketList {
     struct AVPacketList *next;
 } AVPacketList;
 
+
 /**
- * If f is NULL, returns the first registered input format,
- * if f is non-NULL, returns the next registered input format after f
- * or NULL if f is the last one.
+ * @defgroup lavf_core Core functions
+ * @ingroup libavf
+ *
+ * Functions for querying libavformat capabilities, allocating core structures,
+ * etc.
+ * @{
  */
-AVInputFormat  *av_iformat_next(AVInputFormat  *f);
 
 /**
- * If f is NULL, returns the first registered output format,
- * if f is non-NULL, returns the next registered output format after f
- * or NULL if f is the last one.
+ * Return the LIBAVFORMAT_VERSION_INT constant.
  */
-AVOutputFormat *av_oformat_next(AVOutputFormat *f);
+unsigned avformat_version(void);
 
-#if FF_API_GUESS_IMG2_CODEC
-attribute_deprecated enum CodecID av_guess_image2_codec(const char *filename);
-#endif
+/**
+ * Return the libavformat build-time configuration.
+ */
+const char *avformat_configuration(void);
 
-/* XXX: Use automatic init with either ELF sections or C file parser */
-/* modules. */
+/**
+ * Return the libavformat license.
+ */
+const char *avformat_license(void);
+
+/**
+ * Initialize libavformat and register all the muxers, demuxers and
+ * protocols. If you do not call this function, then you can select
+ * exactly which formats you want to support.
+ *
+ * @see av_register_input_format()
+ * @see av_register_output_format()
+ * @see av_register_protocol()
+ */
+void av_register_all(void);
 
-/* utils.c */
 void av_register_input_format(AVInputFormat *format);
 void av_register_output_format(AVOutputFormat *format);
 
 /**
- * Return the output format in the list of registered output formats
- * which best matches the provided parameters, or return NULL if
- * there is no match.
+ * Do global initialization of network components. This is optional,
+ * but recommended, since it avoids the overhead of implicitly
+ * doing the setup for each session.
  *
- * @param short_name if non-NULL checks if short_name matches with the
- * names of the registered formats
- * @param filename if non-NULL checks if filename terminates with the
- * extensions of the registered formats
- * @param mime_type if non-NULL checks if mime_type matches with the
- * MIME type of the registered formats
+ * Calling this function will become mandatory if using network
+ * protocols at some major version bump.
  */
-AVOutputFormat *av_guess_format(const char *short_name,
-                                const char *filename,
-                                const char *mime_type);
+int avformat_network_init(void);
 
 /**
- * Guess the codec ID based upon muxer and filename.
+ * Undo the initialization done by avformat_network_init.
  */
-enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
-                            const char *filename, const char *mime_type,
-                            enum AVMediaType type);
+int avformat_network_deinit(void);
 
 /**
- * Send a nice hexadecimal dump of a buffer to the specified file stream.
- *
- * @param f The file stream pointer where the dump should be sent to.
- * @param buf buffer
- * @param size buffer size
- *
- * @see av_hex_dump_log, av_pkt_dump2, av_pkt_dump_log2
+ * If f is NULL, returns the first registered input format,
+ * if f is non-NULL, returns the next registered input format after f
+ * or NULL if f is the last one.
  */
-void av_hex_dump(FILE *f, uint8_t *buf, int size);
+AVInputFormat  *av_iformat_next(AVInputFormat  *f);
 
 /**
- * Send a nice hexadecimal dump of a buffer to the log.
- *
- * @param avcl A pointer to an arbitrary struct of which the first field is a
- * pointer to an AVClass struct.
- * @param level The importance level of the message, lower values signifying
- * higher importance.
- * @param buf buffer
- * @param size buffer size
+ * If f is NULL, returns the first registered output format,
+ * if f is non-NULL, returns the next registered output format after f
+ * or NULL if f is the last one.
+ */
+AVOutputFormat *av_oformat_next(AVOutputFormat *f);
+
+/**
+ * Allocate an AVFormatContext.
+ * avformat_free_context() can be used to free the context and everything
+ * allocated by the framework within it.
+ */
+AVFormatContext *avformat_alloc_context(void);
+
+/**
+ * Free an AVFormatContext and all its streams.
+ * @param s context to free
+ */
+void avformat_free_context(AVFormatContext *s);
+
+/**
+ * Get the AVClass for AVFormatContext. It can be used in combination with
+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
  *
- * @see av_hex_dump, av_pkt_dump2, av_pkt_dump_log2
+ * @see av_opt_find().
  */
-void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size);
+const AVClass *avformat_get_class(void);
 
 /**
- * Send a nice dump of a packet to the specified file stream.
+ * Add a new stream to a media file.
  *
- * @param f The file stream pointer where the dump should be sent to.
- * @param pkt packet to dump
- * @param dump_payload True if the payload must be displayed, too.
- * @param st AVStream that the packet belongs to
+ * When demuxing, it is called by the demuxer in read_header(). If the
+ * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also
+ * be called in read_packet().
+ *
+ * When muxing, should be called by the user before avformat_write_header().
+ *
+ * @param c If non-NULL, the AVCodecContext corresponding to the new stream
+ * will be initialized to use this codec. This is needed for e.g. codec-specific
+ * defaults to be set, so codec should be provided if it is known.
+ *
+ * @return newly created stream or NULL on error.
  */
-void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st);
+AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c);
 
+AVProgram *av_new_program(AVFormatContext *s, int id);
 
 /**
- * Send a nice dump of a packet to the log.
- *
- * @param avcl A pointer to an arbitrary struct of which the first field is a
- * pointer to an AVClass struct.
- * @param level The importance level of the message, lower values signifying
- * higher importance.
- * @param pkt packet to dump
- * @param dump_payload True if the payload must be displayed, too.
- * @param st AVStream that the packet belongs to
+ * @}
  */
-void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
-                      AVStream *st);
+
+
+#if FF_API_GUESS_IMG2_CODEC
+attribute_deprecated enum CodecID av_guess_image2_codec(const char *filename);
+#endif
 
 #if FF_API_PKT_DUMP
 attribute_deprecated void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload);
@@ -978,36 +1364,40 @@ attribute_deprecated void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt,
                                           int dump_payload);
 #endif
 
+
+#if FF_API_ALLOC_OUTPUT_CONTEXT
 /**
- * Initialize libavformat and register all the muxers, demuxers and
- * protocols. If you do not call this function, then you can select
- * exactly which formats you want to support.
- *
- * @see av_register_input_format()
- * @see av_register_output_format()
- * @see av_register_protocol()
+ * @deprecated deprecated in favor of avformat_alloc_output_context2()
  */
-void av_register_all(void);
+attribute_deprecated
+AVFormatContext *avformat_alloc_output_context(const char *format,
+                                               AVOutputFormat *oformat,
+                                               const char *filename);
+#endif
 
 /**
- * Get the CodecID for the given codec tag tag.
- * If no codec id is found returns CODEC_ID_NONE.
+ * Allocate an AVFormatContext for an output format.
+ * avformat_free_context() can be used to free the context and
+ * everything allocated by the framework within it.
  *
- * @param tags list of supported codec_id-codec_tag pairs, as stored
- * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag
+ * @param *ctx is set to the created format context, or to NULL in
+ * case of failure
+ * @param oformat format to use for allocating the context, if NULL
+ * format_name and filename are used instead
+ * @param format_name the name of output format to use for allocating the
+ * context, if NULL filename is used instead
+ * @param filename the name of the filename to use for allocating the
+ * context, may be NULL
+ * @return >= 0 in case of success, a negative AVERROR code in case of
+ * failure
  */
-enum CodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int tag);
+int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat,
+                                   const char *format_name, const char *filename);
 
 /**
- * Get the codec tag for the given codec id id.
- * If no codec tag is found returns 0.
- *
- * @param tags list of supported codec_id-codec_tag pairs, as stored
- * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag
+ * @addtogroup lavf_decoding
+ * @{
  */
-unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum CodecID id);
-
-/* media file input */
 
 /**
  * Find AVInputFormat based on the short name of the input format.
@@ -1116,43 +1506,27 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputForma
 
 int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap);
 
+#if FF_API_FORMAT_PARAMETERS
 /**
- * Allocate an AVFormatContext.
- * avformat_free_context() can be used to free the context and everything
- * allocated by the framework within it.
- */
-AVFormatContext *avformat_alloc_context(void);
-
-#if FF_API_ALLOC_OUTPUT_CONTEXT
-/**
- * @deprecated deprecated in favor of avformat_alloc_output_context2()
+ * Read packets of a media file to get stream information. This
+ * is useful for file formats with no headers such as MPEG. This
+ * function also computes the real framerate in case of MPEG-2 repeat
+ * frame mode.
+ * The logical file position is not changed by this function;
+ * examined packets may be buffered for later processing.
+ *
+ * @param ic media file handle
+ * @return >=0 if OK, AVERROR_xxx on error
+ * @todo Let the user decide somehow what information is needed so that
+ *       we do not waste time getting stuff the user does not need.
+ *
+ * @deprecated use avformat_find_stream_info.
  */
 attribute_deprecated
-AVFormatContext *avformat_alloc_output_context(const char *format,
-                                               AVOutputFormat *oformat,
-                                               const char *filename);
+int av_find_stream_info(AVFormatContext *ic);
 #endif
 
 /**
- * Allocate an AVFormatContext for an output format.
- * avformat_free_context() can be used to free the context and
- * everything allocated by the framework within it.
- *
- * @param *ctx is set to the created format context, or to NULL in
- * case of failure
- * @param oformat format to use for allocating the context, if NULL
- * format_name and filename are used instead
- * @param format_name the name of output format to use for allocating the
- * context, if NULL filename is used instead
- * @param filename the name of the filename to use for allocating the
- * context, may be NULL
- * @return >= 0 in case of success, a negative AVERROR code in case of
- * failure
- */
-int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat,
-                                   const char *format_name, const char *filename);
-
-/**
  * Read packets of a media file to get stream information. This
  * is useful for file formats with no headers such as MPEG. This
  * function also computes the real framerate in case of MPEG-2 repeat
@@ -1161,11 +1535,31 @@ int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oforma
  * examined packets may be buffered for later processing.
  *
  * @param ic media file handle
+ * @param options  If non-NULL, an ic.nb_streams long array of pointers to
+ *                 dictionaries, where i-th member contains options for
+ *                 codec corresponding to i-th stream.
+ *                 On return each dictionary will be filled with options that were not found.
  * @return >=0 if OK, AVERROR_xxx on error
+ *
+ * @note this function isn't guaranteed to open all the codecs, so
+ *       options being non-empty at return is a perfectly normal behavior.
+ *
  * @todo Let the user decide somehow what information is needed so that
  *       we do not waste time getting stuff the user does not need.
  */
-int av_find_stream_info(AVFormatContext *ic);
+int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
+
+/**
+ * Find the programs which belong to a given stream.
+ *
+ * @param ic    media file handle
+ * @param last  the last found program, the search will start after this
+ *              program, or from the beginning if it is NULL
+ * @param s     stream index
+ * @return the next program which belongs to s, NULL if no program is found or
+ *         the last program is not among the programs of ic.
+ */
+AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s);
 
 /**
  * Find the "best" stream in the file.
@@ -1291,25 +1685,37 @@ int av_read_play(AVFormatContext *s);
  */
 int av_read_pause(AVFormatContext *s);
 
+#if FF_API_FORMAT_PARAMETERS
 /**
  * Free a AVFormatContext allocated by av_open_input_stream.
  * @param s context to free
+ * @deprecated use av_close_input_file()
  */
+attribute_deprecated
 void av_close_input_stream(AVFormatContext *s);
+#endif
 
+#if FF_API_CLOSE_INPUT_FILE
 /**
+ * @deprecated use avformat_close_input()
  * Close a media file (but not its codecs).
  *
  * @param s media file handle
  */
+attribute_deprecated
 void av_close_input_file(AVFormatContext *s);
+#endif
 
 /**
- * Free an AVFormatContext and all its streams.
- * @param s context to free
+ * Close an opened input AVFormatContext. Free it and all its contents
+ * and set *s to NULL.
+ */
+void avformat_close_input(AVFormatContext **s);
+/**
+ * @}
  */
-void avformat_free_context(AVFormatContext *s);
 
+#if FF_API_NEW_STREAM
 /**
  * Add a new stream to a media file.
  *
@@ -1320,86 +1726,39 @@ void avformat_free_context(AVFormatContext *s);
  * @param s media file handle
  * @param id file-format-dependent stream ID
  */
+attribute_deprecated
 AVStream *av_new_stream(AVFormatContext *s, int id);
-AVProgram *av_new_program(AVFormatContext *s, int id);
+#endif
 
+#if FF_API_SET_PTS_INFO
 /**
- * Set the pts for a given stream. If the new values would be invalid
- * (<= 0), it leaves the AVStream unchanged.
- *
- * @param s stream
- * @param pts_wrap_bits number of bits effectively used by the pts
- *        (used for wrap control, 33 is the value for MPEG)
- * @param pts_num numerator to convert to seconds (MPEG: 1)
- * @param pts_den denominator to convert to seconds (MPEG: 90000)
+ * @deprecated this function is not supposed to be called outside of lavf
  */
+attribute_deprecated
 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
                      unsigned int pts_num, unsigned int pts_den);
+#endif
 
 #define AVSEEK_FLAG_BACKWARD 1 ///< seek backward
 #define AVSEEK_FLAG_BYTE     2 ///< seeking based on position in bytes
 #define AVSEEK_FLAG_ANY      4 ///< seek to any frame, even non-keyframes
 #define AVSEEK_FLAG_FRAME    8 ///< seeking based on frame number
 
-int av_find_default_stream_index(AVFormatContext *s);
-
-/**
- * Get the index for a specific timestamp.
- * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond
- *                 to the timestamp which is <= the requested one, if backward
- *                 is 0, then it will be >=
- *              if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise
- * @return < 0 if no such timestamp could be found
- */
-int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags);
-
-/**
- * Add an index entry into a sorted list. Update the entry if the list
- * already contains it.
- *
- * @param timestamp timestamp in the time base of the given stream
- */
-int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
-                       int size, int distance, int flags);
-
-/**
- * Perform a binary search using av_index_search_timestamp() and
- * AVInputFormat.read_timestamp().
- * This is not supposed to be called directly by a user application,
- * but by demuxers.
- * @param target_ts target timestamp in the time base of the given stream
- * @param stream_index stream number
- */
+#if FF_API_SEEK_PUBLIC
+attribute_deprecated
 int av_seek_frame_binary(AVFormatContext *s, int stream_index,
                          int64_t target_ts, int flags);
-
-/**
- * Update cur_dts of all streams based on the given timestamp and AVStream.
- *
- * Stream ref_st unchanged, others set cur_dts in their native time base.
- * Only needed for timestamp wrapping or if (dts not set and pts!=dts).
- * @param timestamp new dts expressed in time_base of param ref_st
- * @param ref_st reference stream giving time_base of param timestamp
- */
+attribute_deprecated
 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp);
-
-/**
- * Perform a binary search using read_timestamp().
- * This is not supposed to be called directly by a user application,
- * but by demuxers.
- * @param target_ts target timestamp in the time base of the given stream
- * @param stream_index stream number
- */
+attribute_deprecated
 int64_t av_gen_search(AVFormatContext *s, int stream_index,
                       int64_t target_ts, int64_t pos_min,
                       int64_t pos_max, int64_t pos_limit,
                       int64_t ts_min, int64_t ts_max,
                       int flags, int64_t *ts_ret,
                       int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ));
+#endif
 
-/**
- * media file output
- */
 #if FF_API_FORMAT_PARAMETERS
 /**
  * @deprecated pass the options to avformat_write_header directly.
@@ -1408,31 +1767,9 @@ attribute_deprecated int av_set_parameters(AVFormatContext *s, AVFormatParameter
 #endif
 
 /**
- * Split a URL string into components.
- *
- * The pointers to buffers for storing individual components may be null,
- * in order to ignore that component. Buffers for components not found are
- * set to empty strings. If the port is not found, it is set to a negative
- * value.
- *
- * @param proto the buffer for the protocol
- * @param proto_size the size of the proto buffer
- * @param authorization the buffer for the authorization
- * @param authorization_size the size of the authorization buffer
- * @param hostname the buffer for the host name
- * @param hostname_size the size of the hostname buffer
- * @param port_ptr a pointer to store the port number in
- * @param path the buffer for the path
- * @param path_size the size of the path buffer
- * @param url the URL to split
+ * @addtogroup lavf_encoding
+ * @{
  */
-void av_url_split(char *proto,         int proto_size,
-                  char *authorization, int authorization_size,
-                  char *hostname,      int hostname_size,
-                  int *port_ptr,
-                  char *path,          int path_size,
-                  const char *url);
-
 /**
  * Allocate the stream private data and write the stream header to
  * an output media file.
@@ -1474,8 +1811,12 @@ attribute_deprecated int av_write_header(AVFormatContext *s);
  *
  * @param s media file handle
  * @param pkt The packet, which contains the stream_index, buf/buf_size,
-              dts/pts, ...
- * @return < 0 on error, = 0 if OK, 1 if end of stream wanted
+ *            dts/pts, ...
+ *            This can be NULL (at any time, not just at the end), in
+ *            order to immediately flush data buffered within the muxer,
+ *            for muxers that buffer up data internally before writing it
+ *            to the output.
+ * @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush
  */
 int av_write_frame(AVFormatContext *s, AVPacket *pkt);
 
@@ -1490,9 +1831,18 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt);
  * demuxer level.
  *
  * @param s media file handle
- * @param pkt The packet, which contains the stream_index, buf/buf_size,
-              dts/pts, ...
- * @return < 0 on error, = 0 if OK, 1 if end of stream wanted
+ * @param pkt The packet containing the data to be written. Libavformat takes
+ * ownership of the data and will free it when it sees fit using the packet's
+ * @ref AVPacket.destruct "destruct" field. The caller must not access the data
+ * after this function returns, as it may already be freed.
+ * Packet's @ref AVPacket.stream_index "stream_index" field must be set to the
+ * index of the corresponding stream in @ref AVFormatContext.streams
+ * "s.streams".
+ * It is very strongly recommended that timing information (@ref AVPacket.pts
+ * "pts", @ref AVPacket.dts "dts" @ref AVPacket.duration "duration") is set to
+ * correct values.
+ *
+ * @return 0 on success, a negative AVERROR on error.
  */
 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt);
 
@@ -1525,6 +1875,178 @@ int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
  */
 int av_write_trailer(AVFormatContext *s);
 
+/**
+ * Return the output format in the list of registered output formats
+ * which best matches the provided parameters, or return NULL if
+ * there is no match.
+ *
+ * @param short_name if non-NULL checks if short_name matches with the
+ * names of the registered formats
+ * @param filename if non-NULL checks if filename terminates with the
+ * extensions of the registered formats
+ * @param mime_type if non-NULL checks if mime_type matches with the
+ * MIME type of the registered formats
+ */
+AVOutputFormat *av_guess_format(const char *short_name,
+                                const char *filename,
+                                const char *mime_type);
+
+/**
+ * Guess the codec ID based upon muxer and filename.
+ */
+enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
+                            const char *filename, const char *mime_type,
+                            enum AVMediaType type);
+
+/**
+ * Get timing information for the data currently output.
+ * The exact meaning of "currently output" depends on the format.
+ * It is mostly relevant for devices that have an internal buffer and/or
+ * work in real time.
+ * @param s          media file handle
+ * @param stream     stream in the media file
+ * @param dts[out]   DTS of the last packet output for the stream, in stream
+ *                   time_base units
+ * @param wall[out]  absolute time when that packet whas output,
+ *                   in microsecond
+ * @return  0 if OK, AVERROR(ENOSYS) if the format does not support it
+ * Note: some formats or devices may not allow to measure dts and wall
+ * atomically.
+ */
+int av_get_output_timestamp(struct AVFormatContext *s, int stream,
+                            int64_t *dts, int64_t *wall);
+
+
+/**
+ * @}
+ */
+
+
+/**
+ * @defgroup lavf_misc Utility functions
+ * @ingroup libavf
+ * @{
+ *
+ * Miscelaneous utility functions related to both muxing and demuxing
+ * (or neither).
+ */
+
+/**
+ * Send a nice hexadecimal dump of a buffer to the specified file stream.
+ *
+ * @param f The file stream pointer where the dump should be sent to.
+ * @param buf buffer
+ * @param size buffer size
+ *
+ * @see av_hex_dump_log, av_pkt_dump2, av_pkt_dump_log2
+ */
+void av_hex_dump(FILE *f, uint8_t *buf, int size);
+
+/**
+ * Send a nice hexadecimal dump of a buffer to the log.
+ *
+ * @param avcl A pointer to an arbitrary struct of which the first field is a
+ * pointer to an AVClass struct.
+ * @param level The importance level of the message, lower values signifying
+ * higher importance.
+ * @param buf buffer
+ * @param size buffer size
+ *
+ * @see av_hex_dump, av_pkt_dump2, av_pkt_dump_log2
+ */
+void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size);
+
+/**
+ * Send a nice dump of a packet to the specified file stream.
+ *
+ * @param f The file stream pointer where the dump should be sent to.
+ * @param pkt packet to dump
+ * @param dump_payload True if the payload must be displayed, too.
+ * @param st AVStream that the packet belongs to
+ */
+void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st);
+
+
+/**
+ * Send a nice dump of a packet to the log.
+ *
+ * @param avcl A pointer to an arbitrary struct of which the first field is a
+ * pointer to an AVClass struct.
+ * @param level The importance level of the message, lower values signifying
+ * higher importance.
+ * @param pkt packet to dump
+ * @param dump_payload True if the payload must be displayed, too.
+ * @param st AVStream that the packet belongs to
+ */
+void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
+                      AVStream *st);
+
+/**
+ * Get the CodecID for the given codec tag tag.
+ * If no codec id is found returns CODEC_ID_NONE.
+ *
+ * @param tags list of supported codec_id-codec_tag pairs, as stored
+ * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag
+ */
+enum CodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int tag);
+
+/**
+ * Get the codec tag for the given codec id id.
+ * If no codec tag is found returns 0.
+ *
+ * @param tags list of supported codec_id-codec_tag pairs, as stored
+ * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag
+ */
+unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum CodecID id);
+
+int av_find_default_stream_index(AVFormatContext *s);
+
+/**
+ * Get the index for a specific timestamp.
+ * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond
+ *                 to the timestamp which is <= the requested one, if backward
+ *                 is 0, then it will be >=
+ *              if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise
+ * @return < 0 if no such timestamp could be found
+ */
+int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags);
+
+/**
+ * Add an index entry into a sorted list. Update the entry if the list
+ * already contains it.
+ *
+ * @param timestamp timestamp in the time base of the given stream
+ */
+int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
+                       int size, int distance, int flags);
+
+
+/**
+ * Split a URL string into components.
+ *
+ * The pointers to buffers for storing individual components may be null,
+ * in order to ignore that component. Buffers for components not found are
+ * set to empty strings. If the port is not found, it is set to a negative
+ * value.
+ *
+ * @param proto the buffer for the protocol
+ * @param proto_size the size of the proto buffer
+ * @param authorization the buffer for the authorization
+ * @param authorization_size the size of the authorization buffer
+ * @param hostname the buffer for the host name
+ * @param hostname_size the size of the hostname buffer
+ * @param port_ptr a pointer to store the port number in
+ * @param path the buffer for the path
+ * @param path_size the size of the path buffer
+ * @param url the URL to split
+ */
+void av_url_split(char *proto,         int proto_size,
+                  char *authorization, int authorization_size,
+                  char *hostname,      int hostname_size,
+                  int *port_ptr,
+                  char *path,          int path_size,
+                  const char *url);
+
 #if FF_API_DUMP_FORMAT
 /**
  * @deprecated Deprecated in favor of av_dump_format().
@@ -1615,4 +2137,42 @@ attribute_deprecated int avf_sdp_create(AVFormatContext *ac[], int n_files, char
  */
 int av_match_ext(const char *filename, const char *extensions);
 
+/**
+ * Test if the given container can store a codec.
+ *
+ * @param std_compliance standards compliance level, one of FF_COMPLIANCE_*
+ *
+ * @return 1 if codec with ID codec_id can be stored in ofmt, 0 if it cannot.
+ *         A negative number if this information is not available.
+ */
+int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance);
+
+/**
+ * @defgroup riff_fourcc RIFF FourCCs
+ * @{
+ * Get the tables mapping RIFF FourCCs to libavcodec CodecIDs. The tables are
+ * meant to be passed to av_codec_get_id()/av_codec_get_tag() as in the
+ * following code:
+ * @code
+ * uint32_t tag = MKTAG('H', '2', '6', '4');
+ * const struct AVCodecTag *table[] = { avformat_get_riff_video_tags(), 0 };
+ * enum CodecID id = av_codec_get_id(table, tag);
+ * @endcode
+ */
+/**
+ * @return the table mapping RIFF FourCCs for video to libavcodec CodecID.
+ */
+const struct AVCodecTag *avformat_get_riff_video_tags(void);
+/**
+ * @return the table mapping RIFF FourCCs for audio to CodecID.
+ */
+const struct AVCodecTag *avformat_get_riff_audio_tags(void);
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
 #endif /* AVFORMAT_AVFORMAT_H */
index e838118..a8698a8 100644 (file)
 
 /**
  * @file
+ * @ingroup lavf_io
  * Buffered I/O operations
  */
 
 #include <stdint.h>
 
 #include "libavutil/common.h"
+#include "libavutil/dict.h"
 #include "libavutil/log.h"
 
 #include "libavformat/version.h"
 #define AVIO_SEEKABLE_NORMAL 0x0001 /**< Seeking works like for a local file */
 
 /**
+ * Callback for checking whether to abort blocking functions.
+ * AVERROR_EXIT is returned in this case by the interrupted
+ * function. During blocking operations, callback is called with
+ * opaque as parameter. If the callback returns 1, the
+ * blocking operation will be aborted.
+ *
+ * No members can be added to this struct without a major bump, if
+ * new elements have been added after this struct in AVFormatContext
+ * or AVIOContext.
+ */
+typedef struct {
+    int (*callback)(void*);
+    void *opaque;
+} AVIOInterruptCB;
+
+/**
  * Bytestream IO Context.
  * New fields can be added to the end with minor version bumps.
  * Removal, reordering and changes to existing fields require a major
  *       function pointers specified in avio_alloc_context()
  */
 typedef struct {
+#if !FF_API_OLD_AVIO
+    /**
+     * A class for private options.
+     *
+     * If this AVIOContext is created by avio_open2(), av_class is set and
+     * passes the options down to protocols.
+     *
+     * If this AVIOContext is manually allocated, then av_class may be set by
+     * the caller.
+     *
+     * warning -- this field can be NULL, be sure to not pass this AVIOContext
+     * to any av_opt_* functions in that case.
+     */
+    AVClass *av_class;
+#endif
     unsigned char *buffer;  /**< Start of the buffer. */
     int buffer_size;        /**< Maximum buffer size */
     unsigned char *buf_ptr; /**< Current position in the buffer */
@@ -87,6 +120,12 @@ typedef struct {
      * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
      */
     int seekable;
+
+    /**
+     * max filesize, used to limit allocations
+     * This field is internal to libavformat and access from outside is not allowed.
+     */
+     int64_t maxsize;
 } AVIOContext;
 
 /* unbuffered I/O */
@@ -109,9 +148,11 @@ typedef struct URLContext {
     void *priv_data;
     char *filename; /**< specified URL */
     int is_connected;
+    AVIOInterruptCB interrupt_callback;
 } URLContext;
 
 #define URL_PROTOCOL_FLAG_NESTED_SCHEME 1 /*< The protocol name can be the first part of a nested protocol scheme */
+#define URL_PROTOCOL_FLAG_NETWORK       2 /*< The protocol uses network */
 
 /**
  * @deprecated This struct is to be made private. Use the higher-level
@@ -169,7 +210,7 @@ attribute_deprecated int url_poll(URLPollEntry *poll_table, int n, int timeout);
  * Warning: non-blocking protocols is work-in-progress; this flag may be
  * silently ignored.
  */
-#define URL_FLAG_NONBLOCK 4
+#define URL_FLAG_NONBLOCK 8
 
 typedef int URLInterruptCB(void);
 extern URLInterruptCB *url_interrupt_cb;
@@ -178,6 +219,7 @@ extern URLInterruptCB *url_interrupt_cb;
  * @defgroup old_url_funcs Old url_* functions
  * The following functions are deprecated. Use the buffered API based on #AVIOContext instead.
  * @{
+ * @ingroup lavf_io
  */
 attribute_deprecated int url_open_protocol (URLContext **puc, struct URLProtocol *up,
                                             const char *url, int flags);
@@ -238,6 +280,7 @@ attribute_deprecated AVIOContext *av_alloc_put_byte(
  * @defgroup old_avio_funcs Old put_/get_*() functions
  * The following functions are deprecated. Use the "avio_"-prefixed functions instead.
  * @{
+ * @ingroup lavf_io
  */
 attribute_deprecated int          get_buffer(AVIOContext *s, unsigned char *buf, int size);
 attribute_deprecated int          get_partial_buffer(AVIOContext *s, unsigned char *buf, int size);
@@ -275,6 +318,7 @@ attribute_deprecated int64_t av_url_read_fseek (AVIOContext *h,    int stream_in
  * @defgroup old_url_f_funcs Old url_f* functions
  * The following functions are deprecated, use the "avio_"-prefixed functions instead.
  * @{
+ * @ingroup lavf_io
  */
 attribute_deprecated int url_fopen( AVIOContext **s, const char *url, int flags);
 attribute_deprecated int url_fclose(AVIOContext *s);
@@ -285,11 +329,7 @@ attribute_deprecated int64_t url_fsize(AVIOContext *s);
 #define URL_EOF (-1)
 attribute_deprecated int url_fgetc(AVIOContext *s);
 attribute_deprecated int url_setbufsize(AVIOContext *s, int buf_size);
-#ifdef __GNUC__
-attribute_deprecated int url_fprintf(AVIOContext *s, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
-#else
-attribute_deprecated int url_fprintf(AVIOContext *s, const char *fmt, ...);
-#endif
+attribute_deprecated int url_fprintf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3);
 attribute_deprecated void put_flush_packet(AVIOContext *s);
 attribute_deprecated int url_open_dyn_buf(AVIOContext **s);
 attribute_deprecated int url_open_dyn_packet_buf(AVIOContext **s, int max_packet_size);
@@ -357,13 +397,17 @@ attribute_deprecated int url_exist(const char *url);
  */
 int avio_check(const char *url, int flags);
 
+#if FF_API_OLD_INTERRUPT_CB
 /**
  * The callback is called in blocking functions to test regulary if
  * asynchronous interruption is needed. AVERROR_EXIT is returned
  * in this case by the interrupted function. 'NULL' means no interrupt
  * callback is given.
+ * @deprecated Use interrupt_callback in AVFormatContext/avio_open2
+ *             instead.
  */
-void avio_set_interrupt_cb(int (*interrupt_cb)(void));
+attribute_deprecated void avio_set_interrupt_cb(int (*interrupt_cb)(void));
+#endif
 
 /**
  * Allocate and initialize an AVIOContext for buffered I/O. It must be later
@@ -463,11 +507,7 @@ int64_t avio_size(AVIOContext *s);
 int url_feof(AVIOContext *s);
 
 /** @warning currently size is limited */
-#ifdef __GNUC__
-int avio_printf(AVIOContext *s, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
-#else
-int avio_printf(AVIOContext *s, const char *fmt, ...);
-#endif
+int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3);
 
 void avio_flush(AVIOContext *s);
 
@@ -565,6 +605,26 @@ int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen);
 int avio_open(AVIOContext **s, const char *url, int flags);
 
 /**
+ * Create and initialize a AVIOContext for accessing the
+ * resource indicated by url.
+ * @note When the resource indicated by url has been opened in
+ * read+write mode, the AVIOContext can be used only for writing.
+ *
+ * @param s Used to return the pointer to the created AVIOContext.
+ * In case of failure the pointed to value is set to NULL.
+ * @param flags flags which control how the resource indicated by url
+ * is to be opened
+ * @param int_cb an interrupt callback to be used at the protocols level
+ * @param options  A dictionary filled with protocol-private options. On return
+ * this parameter will be destroyed and replaced with a dict containing options
+ * that were not found. May be NULL.
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code in case of failure
+ */
+int avio_open2(AVIOContext **s, const char *url, int flags,
+               const AVIOInterruptCB *int_cb, AVDictionary **options);
+
+/**
  * Close the resource accessed by the AVIOContext s and free it.
  * This function can only be used if s was opened by avio_open().
  *
@@ -619,13 +679,13 @@ int     avio_pause(AVIOContext *h, int pause);
  *        If stream_index is (-1) the timestamp should be in AV_TIME_BASE
  *        units from the beginning of the presentation.
  *        If a stream_index >= 0 is used and the protocol does not support
- *        seeking based on component streams, the call will fail with ENOTSUP.
+ *        seeking based on component streams, the call will fail.
  * @param timestamp timestamp in AVStream.time_base units
  *        or if there is no stream specified then in AV_TIME_BASE units.
  * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE
  *        and AVSEEK_FLAG_ANY. The protocol may silently ignore
  *        AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will
- *        fail with ENOTSUP if used and not supported.
+ *        fail if used and not supported.
  * @return >= 0 on success
  * @see AVInputFormat::read_seek
  */
index 691f9c0..aa3928f 100644 (file)
 #ifndef AVFORMAT_VERSION_H
 #define AVFORMAT_VERSION_H
 
+/**
+ * @file
+ * @ingroup libavf
+ * Libavformat version macros
+ */
+
 #include "libavutil/avutil.h"
 
 #define LIBAVFORMAT_VERSION_MAJOR 53
-#define LIBAVFORMAT_VERSION_MINOR  4
-#define LIBAVFORMAT_VERSION_MICRO  0
+#define LIBAVFORMAT_VERSION_MINOR 32
+#define LIBAVFORMAT_VERSION_MICRO 100
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                LIBAVFORMAT_VERSION_MINOR, \
@@ -44,9 +50,6 @@
 #ifndef FF_API_OLD_METADATA2
 #define FF_API_OLD_METADATA2           (LIBAVFORMAT_VERSION_MAJOR < 54)
 #endif
-#ifndef FF_API_READ_SEEK
-#define FF_API_READ_SEEK               (LIBAVFORMAT_VERSION_MAJOR < 54)
-#endif
 #ifndef FF_API_OLD_AVIO
 #define FF_API_OLD_AVIO                (LIBAVFORMAT_VERSION_MAJOR < 54)
 #endif
 #ifndef FF_API_FLAG_RTP_HINT
 #define FF_API_FLAG_RTP_HINT           (LIBAVFORMAT_VERSION_MAJOR < 54)
 #endif
+#ifndef FF_API_AVSTREAM_QUALITY
+#define FF_API_AVSTREAM_QUALITY        (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_LOOP_INPUT
+#define FF_API_LOOP_INPUT              (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_LOOP_OUTPUT
+#define FF_API_LOOP_OUTPUT             (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_TIMESTAMP
+#define FF_API_TIMESTAMP               (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_FILESIZE
+#define FF_API_FILESIZE                (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_MUXRATE
+#define FF_API_MUXRATE                 (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_RTSP_URL_OPTIONS
+#define FF_API_RTSP_URL_OPTIONS        (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_NEW_STREAM
+#define FF_API_NEW_STREAM              (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_PRELOAD
+#define FF_API_PRELOAD                 (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_STREAM_COPY
+#define FF_API_STREAM_COPY             (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_SEEK_PUBLIC
+#define FF_API_SEEK_PUBLIC             (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_REORDER_PRIVATE
+#define FF_API_REORDER_PRIVATE         (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_OLD_INTERRUPT_CB
+#define FF_API_OLD_INTERRUPT_CB        (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_SET_PTS_INFO
+#define FF_API_SET_PTS_INFO            (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_CLOSE_INPUT_FILE
+#define FF_API_CLOSE_INPUT_FILE        (LIBAVFORMAT_VERSION_MAJOR < 55)
+#endif
 
 #endif /* AVFORMAT_VERSION_H */
index 0b890bc..e926ef6 100644 (file)
@@ -25,6 +25,7 @@
 #include "attributes.h"
 
 /**
+ * @ingroup lavu_crypto
  * Calculate the Adler32 checksum of a buffer.
  *
  * Passing the return value to a subsequent av_adler32_update() call
index 368f70c..bafa4cc 100644 (file)
 
 #include <stdint.h>
 
+/**
+ * @defgroup lavu_aes AES
+ * @ingroup lavu_crypto
+ * @{
+ */
+
 extern const int av_aes_size;
 
 struct AVAES;
@@ -44,4 +50,8 @@ int av_aes_init(struct AVAES *a, const uint8_t *key, int key_bits, int decrypt);
  */
 void av_aes_crypt(struct AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt);
 
+/**
+ * @}
+ */
+
 #endif /* AVUTIL_AES_H */
index 517b129..0a6fda1 100644 (file)
 #endif
 #endif
 
+#ifndef av_noreturn
+#if AV_GCC_VERSION_AT_LEAST(2,5)
+#    define av_noreturn __attribute__((noreturn))
+#else
+#    define av_noreturn
+#endif
+#endif
+
 #ifndef av_noinline
 #if AV_GCC_VERSION_AT_LEAST(3,1)
 #    define av_noinline __attribute__((noinline))
 #endif
 #endif
 
+/**
+ * Disable warnings about deprecated features
+ * This is useful for sections of code kept for backward compatibility and
+ * scheduled for removal.
+ */
+#ifndef AV_NOWARN_DEPRECATED
+#if AV_GCC_VERSION_AT_LEAST(4,6)
+#    define AV_NOWARN_DEPRECATED(code) \
+        _Pragma("GCC diagnostic push") \
+        _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") \
+        code \
+        _Pragma("GCC diagnostic pop")
+#else
+#    define AV_NOWARN_DEPRECATED(code) code
+#endif
+#endif
+
+
 #ifndef av_unused
 #if defined(__GNUC__)
 #    define av_unused __attribute__((unused))
 
 #ifdef __GNUC__
 #    define av_builtin_constant_p __builtin_constant_p
+#    define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos)))
 #else
 #    define av_builtin_constant_p(x) 0
+#    define av_printf_format(fmtpos, attrpos)
 #endif
 
 #endif /* AVUTIL_ATTRIBUTES_H */
index 134c610..29ec1cb 100644 (file)
  * audio conversion routines
  */
 
-/* Audio channel masks */
+/**
+ * @addtogroup lavu_audio
+ * @{
+ */
+
+/**
+ * @defgroup channel_masks Audio channel masks
+ * @{
+ */
 #define AV_CH_FRONT_LEFT             0x00000001
 #define AV_CH_FRONT_RIGHT            0x00000002
 #define AV_CH_FRONT_CENTER           0x00000004
 #define AV_CH_TOP_BACK_RIGHT         0x00020000
 #define AV_CH_STEREO_LEFT            0x20000000  ///< Stereo downmix.
 #define AV_CH_STEREO_RIGHT           0x40000000  ///< See AV_CH_STEREO_LEFT.
+#define AV_CH_WIDE_LEFT              0x0000000080000000ULL
+#define AV_CH_WIDE_RIGHT             0x0000000100000000ULL
+#define AV_CH_SURROUND_DIRECT_LEFT   0x0000000200000000ULL
+#define AV_CH_SURROUND_DIRECT_RIGHT  0x0000000400000000ULL
 
 /** Channel mask value used for AVCodecContext.request_channel_layout
     to indicate that the user requests the channel order of the decoder output
     to be the native codec channel order. */
-#define AV_CH_LAYOUT_NATIVE          0x8000000000000000LL
+#define AV_CH_LAYOUT_NATIVE          0x8000000000000000ULL
 
-/* Audio channel convenience macros */
+/**
+ * @}
+ * @defgroup channel_mask_c Audio channel convenience macros
+ * @{
+ * */
 #define AV_CH_LAYOUT_MONO              (AV_CH_FRONT_CENTER)
 #define AV_CH_LAYOUT_STEREO            (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT)
+#define AV_CH_LAYOUT_2POINT1           (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY)
 #define AV_CH_LAYOUT_2_1               (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER)
 #define AV_CH_LAYOUT_SURROUND          (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER)
+#define AV_CH_LAYOUT_3POINT1           (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY)
 #define AV_CH_LAYOUT_4POINT0           (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_4POINT1           (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY)
 #define AV_CH_LAYOUT_2_2               (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)
 #define AV_CH_LAYOUT_QUAD              (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
 #define AV_CH_LAYOUT_5POINT0           (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)
 #define AV_CH_LAYOUT_5POINT1           (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY)
 #define AV_CH_LAYOUT_5POINT0_BACK      (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
 #define AV_CH_LAYOUT_5POINT1_BACK      (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_6POINT0           (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT0_FRONT     (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_HEXAGONAL         (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1           (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1_BACK      (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1_FRONT     (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY)
 #define AV_CH_LAYOUT_7POINT0           (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_7POINT0_FRONT     (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
 #define AV_CH_LAYOUT_7POINT1           (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
-#define AV_CH_LAYOUT_7POINT1_WIDE      (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_7POINT1_WIDE      (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_OCTAGONAL         (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT)
 #define AV_CH_LAYOUT_STEREO_DOWNMIX    (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT)
 
 /**
+ * @}
+ */
+
+/**
  * Return a channel layout id that matches name, 0 if no match.
+ * name can be one or several of the following notations,
+ * separated by '+' or '|':
+ * - the name of an usual channel layout (mono, stereo, 4.0, quad, 5.0,
+ *   5.0(side), 5.1, 5.1(side), 7.1, 7.1(wide), downmix);
+ * - the name of a single channel (FL, FR, FC, LFE, BL, BR, FLC, FRC, BC,
+ *   SL, SR, TC, TFL, TFC, TFR, TBL, TBC, TBR, DL, DR);
+ * - a number of channels, in decimal, optionnally followed by 'c', yielding
+ *   the default channel layout for that number of channels (@see
+ *   av_get_default_channel_layout);
+ * - a channel layout mask, in hexadecimal starting with "0x" (see the
+ *   AV_CH_* macros).
+ + Example: "stereo+FC" = "2+FC" = "2c+1c" = "0x7"
  */
-int64_t av_get_channel_layout(const char *name);
+uint64_t av_get_channel_layout(const char *name);
 
 /**
  * Return a description of a channel layout.
@@ -85,11 +128,20 @@ int64_t av_get_channel_layout(const char *name);
  * @param buf put here the string containing the channel layout
  * @param buf_size size in bytes of the buffer
  */
-void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, int64_t channel_layout);
+void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout);
 
 /**
  * Return the number of channels in the channel layout.
  */
-int av_get_channel_layout_nb_channels(int64_t channel_layout);
+int av_get_channel_layout_nb_channels(uint64_t channel_layout);
+
+/**
+ * Return default channel layout for a given number of channels.
+ */
+int64_t av_get_default_channel_layout(int nb_channels);
+
+/**
+ * @}
+ */
 
 #endif /* AVUTIL_AUDIOCONVERT_H */
index 04d1197..f73d6e7 100644 (file)
 #define AVUTIL_AVSTRING_H
 
 #include <stddef.h>
+#include "attributes.h"
+
+/**
+ * @addtogroup lavu_string
+ * @{
+ */
 
 /**
  * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to
@@ -71,7 +77,7 @@ char *av_stristr(const char *haystack, const char *needle);
  * @param size size of destination buffer
  * @return the length of src
  *
- * WARNING: since the return value is the length of src, src absolutely
+ * @warning since the return value is the length of src, src absolutely
  * _must_ be a properly 0-terminated string, otherwise this will read beyond
  * the end of the buffer and possibly crash.
  */
@@ -89,9 +95,9 @@ size_t av_strlcpy(char *dst, const char *src, size_t size);
  * @param size size of destination buffer
  * @return the total length of src and dst
  *
- * WARNING: since the return value use the length of src and dst, these absolutely
- * _must_ be a properly 0-terminated strings, otherwise this will read beyond
- * the end of the buffer and possibly crash.
+ * @warning since the return value use the length of src and dst, these
+ * absolutely _must_ be a properly 0-terminated strings, otherwise this
+ * will read beyond the end of the buffer and possibly crash.
  */
 size_t av_strlcat(char *dst, const char *src, size_t size);
 
@@ -107,7 +113,17 @@ size_t av_strlcat(char *dst, const char *src, size_t size);
  * @return the length of the string that would have been generated
  *  if enough space had been available
  */
-size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...);
+size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4);
+
+/**
+ * Print arguments following specified format into a large enough auto
+ * allocated buffer. It is similar to GNU asprintf().
+ * @param fmt printf-compatible format string, specifying how the
+ *            following parameters are used.
+ * @return the allocated string
+ * @note You have to free the string yourself with av_free().
+ */
+char *av_asprintf(const char *fmt, ...) av_printf_format(1, 2);
 
 /**
  * Convert a number to a av_malloced string.
@@ -130,4 +146,64 @@ char *av_d2str(double d);
  */
 char *av_get_token(const char **buf, const char *term);
 
+/**
+ * Split the string into several tokens which can be accessed by
+ * successive calls to av_strtok().
+ *
+ * A token is defined as a sequence of characters not belonging to the
+ * set specified in delim.
+ *
+ * On the first call to av_strtok(), s should point to the string to
+ * parse, and the value of saveptr is ignored. In subsequent calls, s
+ * should be NULL, and saveptr should be unchanged since the previous
+ * call.
+ *
+ * This function is similar to strtok_r() defined in POSIX.1.
+ *
+ * @param s the string to parse, may be NULL
+ * @param delim 0-terminated list of token delimiters, must be non-NULL
+ * @param saveptr user-provided pointer which points to stored
+ * information necessary for av_strtok() to continue scanning the same
+ * string. saveptr is updated to point to the next character after the
+ * first delimiter found, or to NULL if the string was terminated
+ * @return the found token, or NULL when no token is found
+ */
+char *av_strtok(char *s, const char *delim, char **saveptr);
+
+/**
+ * Locale-independent conversion of ASCII characters to uppercase.
+ */
+static inline int av_toupper(int c)
+{
+    if (c >= 'a' && c <= 'z')
+        c ^= 0x20;
+    return c;
+}
+
+/**
+ * Locale-independent conversion of ASCII characters to lowercase.
+ */
+static inline int av_tolower(int c)
+{
+    if (c >= 'A' && c <= 'Z')
+        c ^= 0x20;
+    return c;
+}
+
+/**
+ * Locale-independent case-insensitive compare.
+ * @note This means only ASCII-range characters are case-insensitive
+ */
+int av_strcasecmp(const char *a, const char *b);
+
+/**
+ * Locale-independent case-insensitive compare.
+ * @note This means only ASCII-range characters are case-insensitive
+ */
+int av_strncasecmp(const char *a, const char *b, size_t n);
+
+/**
+ * @}
+ */
+
 #endif /* AVUTIL_AVSTRING_H */
index 8affad6..99af12d 100644 (file)
  * external API header
  */
 
+/**
+ * @mainpage
+ *
+ * @section libav_intro Introduction
+ *
+ * This document describe the usage of the different libraries
+ * provided by FFmpeg.
+ *
+ * @li @ref libavc "libavcodec" encoding/decoding library
+ * @li @subpage libavfilter graph based frame editing library
+ * @li @ref libavf "libavformat" I/O and muxing/demuxing library
+ * @li @ref lavd "libavdevice" special devices muxing/demuxing library
+ * @li @ref lavu "libavutil" common utility library
+ * @li @subpage libpostproc post processing library
+ * @li @subpage libswscale  color conversion and scaling library
+ *
+ */
+
+/**
+ * @defgroup lavu Common utility functions
+ *
+ * @brief
+ * libavutil contains the code shared across all the other FFmpeg
+ * libraries
+ *
+ * @note In order to use the functions provided by avutil you must include
+ * the specific header.
+ *
+ * @{
+ *
+ * @defgroup lavu_crypto Crypto and Hashing
+ *
+ * @{
+ * @}
+ *
+ * @defgroup lavu_math Maths
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_string String Manipulation
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_mem Memory Management
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_data Data Structures
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_audio Audio related
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_error Error Codes
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_misc Other
+ *
+ * @{
+ *
+ * @defgroup lavu_internal Internal
+ *
+ * Not exported functions, for internal usage only
+ *
+ * @{
+ *
+ * @}
+ */
+
+
+/**
+ * @defgroup preproc_misc Preprocessor String Macros
+ *
+ * String manipulation macros
+ *
+ * @{
+ */
 
 #define AV_STRINGIFY(s)         AV_TOSTRING(s)
 #define AV_TOSTRING(s) #s
 
 #define AV_PRAGMA(s) _Pragma(#s)
 
+/**
+ * @}
+ */
+
+/**
+ * @defgroup version_utils Library Version Macros
+ *
+ * Useful to check and match library version in order to maintain
+ * backward compatibility.
+ *
+ * @{
+ */
+
 #define AV_VERSION_INT(a, b, c) (a<<16 | b<<8 | c)
 #define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c
 #define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
 
+/**
+ * @}
+ *
+ * @defgroup lavu_ver Version and Build diagnostics
+ *
+ * Macros and function useful to check at compiletime and at runtime
+ * which version of libavutil is in use.
+ *
+ * @{
+ */
+
 #define LIBAVUTIL_VERSION_MAJOR 51
-#define LIBAVUTIL_VERSION_MINOR  9
-#define LIBAVUTIL_VERSION_MICRO  1
+#define LIBAVUTIL_VERSION_MINOR 35
+#define LIBAVUTIL_VERSION_MICRO 100
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
                                                LIBAVUTIL_VERSION_MINOR, \
 #define LIBAVUTIL_IDENT         "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION)
 
 /**
+ * @}
+ *
+ * @defgroup depr_guards Deprecation guards
  * Those FF_API_* defines are not part of public API.
  * They may change, break or disappear at any time.
+ *
+ * They are used mostly internally to mark code that will be removed
+ * on the next major version.
+ *
+ * @{
  */
 #ifndef FF_API_OLD_EVAL_NAMES
 #define FF_API_OLD_EVAL_NAMES (LIBAVUTIL_VERSION_MAJOR < 52)
 #ifndef FF_API_FIND_OPT
 #define FF_API_FIND_OPT                 (LIBAVUTIL_VERSION_MAJOR < 52)
 #endif
+#ifndef FF_API_AV_FIFO_PEEK
+#define FF_API_AV_FIFO_PEEK             (LIBAVUTIL_VERSION_MAJOR < 52)
+#endif
+#ifndef FF_API_OLD_AVOPTIONS
+#define FF_API_OLD_AVOPTIONS            (LIBAVUTIL_VERSION_MAJOR < 52)
+#endif
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavu_ver
+ * @{
+ */
 
 /**
  * Return the LIBAVUTIL_VERSION_INT constant.
@@ -82,16 +219,41 @@ const char *avutil_configuration(void);
  */
 const char *avutil_license(void);
 
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavu_media Media Type
+ * @brief Media Type
+ */
+
 enum AVMediaType {
-    AVMEDIA_TYPE_UNKNOWN = -1,
+    AVMEDIA_TYPE_UNKNOWN = -1,  ///< Usually treated as AVMEDIA_TYPE_DATA
     AVMEDIA_TYPE_VIDEO,
     AVMEDIA_TYPE_AUDIO,
-    AVMEDIA_TYPE_DATA,
+    AVMEDIA_TYPE_DATA,          ///< Opaque data information usually continuous
     AVMEDIA_TYPE_SUBTITLE,
-    AVMEDIA_TYPE_ATTACHMENT,
+    AVMEDIA_TYPE_ATTACHMENT,    ///< Opaque data information usually sparse
     AVMEDIA_TYPE_NB
 };
 
+/**
+ * Return a string describing the media_type enum, NULL if media_type
+ * is unknown.
+ */
+const char *av_get_media_type_string(enum AVMediaType media_type);
+
+/**
+ * @defgroup lavu_const Constants
+ * @{
+ *
+ * @defgroup lavu_enc Encoding specific
+ *
+ * @note those definition should move to avcodec
+ * @{
+ */
+
 #define FF_LAMBDA_SHIFT 7
 #define FF_LAMBDA_SCALE (1<<FF_LAMBDA_SHIFT)
 #define FF_QP2LAMBDA 118 ///< factor to convert from H.263 QP to lambda
@@ -99,10 +261,46 @@ enum AVMediaType {
 
 #define FF_QUALITY_SCALE FF_LAMBDA_SCALE //FIXME maybe remove
 
+/**
+ * @}
+ * @defgroup lavu_time Timestamp specific
+ *
+ * FFmpeg internal timebase and timestamp definitions
+ *
+ * @{
+ */
+
+/**
+ * @brief Undefined timestamp value
+ *
+ * Usually reported by demuxer that work on containers that do not provide
+ * either pts or dts.
+ */
+
 #define AV_NOPTS_VALUE          INT64_C(0x8000000000000000)
+
+/**
+ * Internal time base represented as integer
+ */
+
 #define AV_TIME_BASE            1000000
+
+/**
+ * Internal time base represented as fractional value
+ */
+
 #define AV_TIME_BASE_Q          (AVRational){1, AV_TIME_BASE}
 
+/**
+ * @}
+ * @}
+ * @defgroup lavu_picture Image related
+ *
+ * AVPicture types, pixel formats and basic image planes manipulation.
+ *
+ * @{
+ */
+
 enum AVPictureType {
     AV_PICTURE_TYPE_NONE = 0, ///< Undefined
     AV_PICTURE_TYPE_I,     ///< Intra
@@ -123,6 +321,10 @@ enum AVPictureType {
  */
 char av_get_picture_type_char(enum AVPictureType pict_type);
 
+/**
+ * @}
+ */
+
 #include "common.h"
 #include "error.h"
 #include "mathematics.h"
@@ -131,4 +333,17 @@ char av_get_picture_type_char(enum AVPictureType pict_type);
 #include "log.h"
 #include "pixfmt.h"
 
+/**
+ * Return x default pointer in case p is NULL.
+ */
+static inline void *av_x_if_null(const void *p, const void *x)
+{
+    return (void *)(intptr_t)(p ? p : x);
+}
+
+/**
+ * @}
+ * @}
+ */
+
 #endif /* AVUTIL_AVUTIL_H */
index 092980b..b095576 100644 (file)
 #include <stdint.h>
 
 /**
+ * @defgroup lavu_base64 Base64
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+
+/**
  * Decode a base64-encoded string.
  *
  * @param out      buffer for decoded data
@@ -51,4 +58,8 @@ char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size);
  */
 #define AV_BASE64_SIZE(x)  (((x)+2) / 3 * 4 + 1)
 
+ /**
+  * @}
+  */
+
 #endif /* AVUTIL_BASE64_H */
index 303bcf3..06f6548 100644 (file)
@@ -65,29 +65,14 @@ static av_always_inline av_const uint16_t av_bswap16(uint16_t x)
 #ifndef av_bswap32
 static av_always_inline av_const uint32_t av_bswap32(uint32_t x)
 {
-    x= ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF);
-    x= (x>>16) | (x<<16);
-    return x;
+    return AV_BSWAP32C(x);
 }
 #endif
 
 #ifndef av_bswap64
 static inline uint64_t av_const av_bswap64(uint64_t x)
 {
-#if 0
-    x= ((x<< 8)&0xFF00FF00FF00FF00ULL) | ((x>> 8)&0x00FF00FF00FF00FFULL);
-    x= ((x<<16)&0xFFFF0000FFFF0000ULL) | ((x>>16)&0x0000FFFF0000FFFFULL);
-    return (x>>32) | (x<<32);
-#else
-    union {
-        uint64_t ll;
-        uint32_t l[2];
-    } w, r;
-    w.ll = x;
-    r.l[0] = av_bswap32 (w.l[1]);
-    r.l[1] = av_bswap32 (w.l[0]);
-    return r.ll;
-#endif
+    return (uint64_t)av_bswap32(x) << 32 | av_bswap32(x >> 32);
 }
 #endif
 
index 1cd2de2..84290c6 100644 (file)
@@ -220,8 +220,18 @@ static av_always_inline av_const int av_popcount_c(uint32_t x)
     return (x + (x >> 16)) & 0x3F;
 }
 
-#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((d) << 24))
-#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((a) << 24))
+/**
+ * Count number of bits set to one in x
+ * @param x value to count bits of
+ * @return the number of bits set to one in x
+ */
+static av_always_inline av_const int av_popcount64_c(uint64_t x)
+{
+    return av_popcount(x) + av_popcount(x >> 32);
+}
+
+#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))
+#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24))
 
 /**
  * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.
@@ -270,16 +280,16 @@ static av_always_inline av_const int av_popcount_c(uint32_t x)
         }\
     }\
 
-/*!
- * \def PUT_UTF8(val, tmp, PUT_BYTE)
+/**
+ * @def PUT_UTF8(val, tmp, PUT_BYTE)
  * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long).
- * \param val is an input-only argument and should be of type uint32_t. It holds
+ * @param val is an input-only argument and should be of type uint32_t. It holds
  * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If
  * val is given as a function it is executed only once.
- * \param tmp is a temporary variable and should be of type uint8_t. It
+ * @param tmp is a temporary variable and should be of type uint8_t. It
  * represents an intermediate value during conversion that is to be
  * output by PUT_BYTE.
- * \param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
+ * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
  * It could be a function or a statement, and uses tmp as the input byte.
  * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
  * executed up to 4 times for values in the valid UTF-8 range and up to
@@ -306,16 +316,16 @@ static av_always_inline av_const int av_popcount_c(uint32_t x)
         }\
     }
 
-/*!
- * \def PUT_UTF16(val, tmp, PUT_16BIT)
+/**
+ * @def PUT_UTF16(val, tmp, PUT_16BIT)
  * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes).
- * \param val is an input-only argument and should be of type uint32_t. It holds
+ * @param val is an input-only argument and should be of type uint32_t. It holds
  * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If
  * val is given as a function it is executed only once.
- * \param tmp is a temporary variable and should be of type uint16_t. It
+ * @param tmp is a temporary variable and should be of type uint16_t. It
  * represents an intermediate value during conversion that is to be
  * output by PUT_16BIT.
- * \param PUT_16BIT writes the converted UTF-16 data to any proper destination
+ * @param PUT_16BIT writes the converted UTF-16 data to any proper destination
  * in desired endianness. It could be a function or a statement, and uses tmp
  * as the input byte.  For example, PUT_BYTE could be "*output++ = tmp;"
  * PUT_BYTE will be executed 1 or 2 times depending on input character.
@@ -385,3 +395,6 @@ static av_always_inline av_const int av_popcount_c(uint32_t x)
 #ifndef av_popcount
 #   define av_popcount      av_popcount_c
 #endif
+#ifndef av_popcount64
+#   define av_popcount64    av_popcount64_c
+#endif
index da93fb5..5f7eed2 100644 (file)
@@ -38,6 +38,8 @@
 #define AV_CPU_FLAG_SSE4         0x0100 ///< Penryn SSE4.1 functions
 #define AV_CPU_FLAG_SSE42        0x0200 ///< Nehalem SSE4.2 functions
 #define AV_CPU_FLAG_AVX          0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used
+#define AV_CPU_FLAG_XOP          0x0400 ///< Bulldozer XOP functions
+#define AV_CPU_FLAG_FMA4         0x0800 ///< Bulldozer FMA4 functions
 #define AV_CPU_FLAG_IWMMXT       0x0100 ///< XScale IWMMXT
 #define AV_CPU_FLAG_ALTIVEC      0x0001 ///< standard
 
index 0a206a0..2adf28c 100644 (file)
 /**
  * @file
  * Public dictionary API.
+ * @deprecated
+ *  AVDictionary is provided for compatibility with libav. It is both in
+ *  implementation as well as API inefficient. It does not scale and is
+ *  extremely slow with large dictionaries.
+ *  It is recommended that new code uses our tree container from tree.c/h
+ *  where applicable, which uses AVL trees to achieve O(log n) performance.
  */
 
 #ifndef AVUTIL_DICT_H
 #define AVUTIL_DICT_H
 
+/**
+ * @addtogroup lavu_dict AVDictionary
+ * @ingroup lavu_data
+ *
+ * @brief Simple key:value store
+ *
+ * @{
+ * Dictionaries are used for storing key:value pairs. To create
+ * an AVDictionary, simply pass an address of a NULL pointer to
+ * av_dict_set(). NULL can be used as an empty dictionary wherever
+ * a pointer to an AVDictionary is required.
+ * Use av_dict_get() to retrieve an entry or iterate over all
+ * entries and finally av_dict_free() to free the dictionary
+ * and all its contents.
+ *
+ * @code
+ * AVDictionary *d = NULL;                // "create" an empty dictionary
+ * av_dict_set(&d, "foo", "bar", 0);      // add an entry
+ *
+ * char *k = av_strdup("key");            // if your strings are already allocated,
+ * char *v = av_strdup("value");          // you can avoid copying them like this
+ * av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
+ *
+ * AVDictionaryEntry *t = NULL;
+ * while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) {
+ *     <....>                             // iterate over all entries in d
+ * }
+ *
+ * av_dict_free(&d);
+ * @endcode
+ *
+ */
+
 #define AV_DICT_MATCH_CASE      1
 #define AV_DICT_IGNORE_SUFFIX   2
-#define AV_DICT_DONT_STRDUP_KEY 4
-#define AV_DICT_DONT_STRDUP_VAL 8
+#define AV_DICT_DONT_STRDUP_KEY 4   /**< Take ownership of a key that's been
+                                         allocated with av_malloc() and children. */
+#define AV_DICT_DONT_STRDUP_VAL 8   /**< Take ownership of a value that's been
+                                         allocated with av_malloc() and chilren. */
 #define AV_DICT_DONT_OVERWRITE 16   ///< Don't overwrite existing entries.
 #define AV_DICT_APPEND         32   /**< If the entry already exists, append to it.  Note that no
                                       delimiter is added, the strings are simply concatenated. */
@@ -74,8 +115,13 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags
 void av_dict_copy(AVDictionary **dst, AVDictionary *src, int flags);
 
 /**
- * Free all the memory allocated for an AVDictionary struct.
+ * Free all the memory allocated for an AVDictionary struct
+ * and all keys and values.
  */
 void av_dict_free(AVDictionary **m);
 
+/**
+ * @}
+ */
+
 #endif // AVUTIL_DICT_H
index 47d366e..76688c7 100644 (file)
 #include <errno.h>
 #include "avutil.h"
 
+/**
+ * @addtogroup lavu_error
+ *
+ * @{
+ */
+
+
 /* error handling */
 #if EDOM > 0
 #define AVERROR(e) (-(e))   ///< Returns a negative error code from a POSIX error code, to return from library functions.
@@ -38,6 +45,7 @@
 #endif
 
 #define AVERROR_BSF_NOT_FOUND      (-MKTAG(0xF8,'B','S','F')) ///< Bitstream filter not found
+#define AVERROR_BUG                (-MKTAG( 'B','U','G','!')) ///< Internal bug, also see AVERROR_BUG2
 #define AVERROR_DECODER_NOT_FOUND  (-MKTAG(0xF8,'D','E','C')) ///< Decoder not found
 #define AVERROR_DEMUXER_NOT_FOUND  (-MKTAG(0xF8,'D','E','M')) ///< Demuxer not found
 #define AVERROR_ENCODER_NOT_FOUND  (-MKTAG(0xF8,'E','N','C')) ///< Encoder not found
 #define AVERROR_STREAM_NOT_FOUND   (-MKTAG(0xF8,'S','T','R')) ///< Stream not found
 
 /**
+ * This is semantically identical to AVERROR_BUG
+ * it has been introduced in Libav after our AVERROR_BUG and with a modified value.
+ */
+#define AVERROR_BUG2               (-MKTAG( 'B','U','G',' '))
+#define AVERROR_UNKNOWN            (-MKTAG( 'U','N','K','N')) ///< Unknown error, typically from an external library
+
+/**
  * Put a description of the AVERROR code errnum in errbuf.
  * In case of failure the global variable errno is set to indicate the
  * error. Even in case of failure av_strerror() will print a generic
@@ -65,4 +80,8 @@
  */
 int av_strerror(int errnum, char *errbuf, size_t errbuf_size);
 
+/**
+ * @}
+ */
+
 #endif /* AVUTIL_ERROR_H */
index ee378a2..22fa121 100644 (file)
@@ -58,7 +58,7 @@ int av_expr_parse_and_eval(double *res, const char *s,
  * Parse an expression.
  *
  * @param expr a pointer where is put an AVExpr containing the parsed
- * value in case of successfull parsing, or NULL otherwise.
+ * value in case of successful parsing, or NULL otherwise.
  * The pointed to AVExpr must be freed with av_expr_free() by the user
  * when it is not needed anymore.
  * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)"
index 999d0bf..22a9aa5 100644 (file)
@@ -25,6 +25,7 @@
 #define AVUTIL_FIFO_H
 
 #include <stdint.h>
+#include "avutil.h"
 
 typedef struct AVFifoBuffer {
     uint8_t *buffer;
@@ -41,20 +42,20 @@ AVFifoBuffer *av_fifo_alloc(unsigned int size);
 
 /**
  * Free an AVFifoBuffer.
- * @param *f AVFifoBuffer to free
+ * @param f AVFifoBuffer to free
  */
 void av_fifo_free(AVFifoBuffer *f);
 
 /**
  * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied.
- * @param *f AVFifoBuffer to reset
+ * @param f AVFifoBuffer to reset
  */
 void av_fifo_reset(AVFifoBuffer *f);
 
 /**
  * Return the amount of data in bytes in the AVFifoBuffer, that is the
  * amount of data you can read from it.
- * @param *f AVFifoBuffer to read from
+ * @param f AVFifoBuffer to read from
  * @return size
  */
 int av_fifo_size(AVFifoBuffer *f);
@@ -62,27 +63,27 @@ int av_fifo_size(AVFifoBuffer *f);
 /**
  * Return the amount of space in bytes in the AVFifoBuffer, that is the
  * amount of data you can write into it.
- * @param *f AVFifoBuffer to write into
+ * @param f AVFifoBuffer to write into
  * @return size
  */
 int av_fifo_space(AVFifoBuffer *f);
 
 /**
  * Feed data from an AVFifoBuffer to a user-supplied callback.
- * @param *f AVFifoBuffer to read from
+ * @param f AVFifoBuffer to read from
  * @param buf_size number of bytes to read
- * @param *func generic read function
- * @param *dest data destination
+ * @param func generic read function
+ * @param dest data destination
  */
 int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int));
 
 /**
  * Feed data from a user-supplied callback to an AVFifoBuffer.
- * @param *f AVFifoBuffer to write to
- * @param *src data source; non-const since it may be used as a
+ * @param f AVFifoBuffer to write to
+ * @param src data source; non-const since it may be used as a
  * modifiable context by the function defined in func
  * @param size number of bytes to write
- * @param *func generic write function; the first parameter is src,
+ * @param func generic write function; the first parameter is src,
  * the second is dest_buf, the third is dest_buf_size.
  * func must return the number of bytes written to dest_buf, or <= 0 to
  * indicate no more data available to write.
@@ -93,7 +94,9 @@ int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void
 
 /**
  * Resize an AVFifoBuffer.
- * @param *f AVFifoBuffer to resize
+ * In case of reallocation failure, the old FIFO is kept unchanged.
+ *
+ * @param f AVFifoBuffer to resize
  * @param size new AVFifoBuffer size in bytes
  * @return <0 for failure, >=0 otherwise
  */
@@ -101,16 +104,40 @@ int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size);
 
 /**
  * Read and discard the specified amount of data from an AVFifoBuffer.
- * @param *f AVFifoBuffer to read from
+ * @param f AVFifoBuffer to read from
  * @param size amount of data to read in bytes
  */
 void av_fifo_drain(AVFifoBuffer *f, int size);
 
-static inline uint8_t av_fifo_peek(AVFifoBuffer *f, int offs)
+/**
+ * Return a pointer to the data stored in a FIFO buffer at a certain offset.
+ * The FIFO buffer is not modified.
+ *
+ * @param f    AVFifoBuffer to peek at, f must be non-NULL
+ * @param offs an offset in bytes, its absolute value must be less
+ *             than the used buffer size or the returned pointer will
+ *             point outside to the buffer data.
+ *             The used buffer size can be checked with av_fifo_size().
+ */
+static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs)
 {
     uint8_t *ptr = f->rptr + offs;
     if (ptr >= f->end)
-        ptr -= f->end - f->buffer;
-    return *ptr;
+        ptr = f->buffer + (ptr - f->end);
+    else if (ptr < f->buffer)
+        ptr = f->end - (f->buffer - ptr);
+    return ptr;
+}
+
+#if FF_API_AV_FIFO_PEEK
+/**
+ * @deprecated Use av_fifo_peek2() instead.
+ */
+attribute_deprecated
+static inline uint8_t av_fifo_peek(AVFifoBuffer *f, int offs)
+{
+    return *av_fifo_peek2(f, offs);
 }
+#endif
+
 #endif /* AVUTIL_FIFO_H */
index f28627c..f3af9ef 100644 (file)
@@ -49,4 +49,13 @@ int av_file_map(const char *filename, uint8_t **bufptr, size_t *size,
  */
 void av_file_unmap(uint8_t *bufptr, size_t size);
 
+/**
+ * Wrapper to work around the lack of mkstemp() on mingw.
+ * Also, tries to create file in /tmp first, if possible.
+ * *prefix can be a character constant; *filename will be allocated internally.
+ * @return file descriptor of opened file (or -1 on error)
+ * and opened file name in **filename.
+ */
+int av_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx);
+
 #endif /* AVUTIL_FILE_H */
index 12fe1c6..9b53815 100644 (file)
@@ -22,6 +22,9 @@
 /**
  * @file
  * misc image utilities
+ *
+ * @addtogroup lavu_picture
+ * @{
  */
 
 #include "avutil.h"
@@ -106,8 +109,8 @@ void av_image_copy_plane(uint8_t       *dst, int dst_linesize,
 /**
  * Copy image in src_data to dst_data.
  *
- * @param dst_linesize linesizes for the image in dst_data
- * @param src_linesize linesizes for the image in src_data
+ * @param dst_linesizes linesizes for the image in dst_data
+ * @param src_linesizes linesizes for the image in src_data
  */
 void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4],
                    const uint8_t *src_data[4], const int src_linesizes[4],
@@ -127,4 +130,9 @@ int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *lo
 
 int ff_set_systematic_pal2(uint32_t pal[256], enum PixelFormat pix_fmt);
 
+/**
+ * @}
+ */
+
+
 #endif /* AVUTIL_IMGUTILS_H */
diff --git a/3rdparty/include/ffmpeg_/libavutil/intfloat.h b/3rdparty/include/ffmpeg_/libavutil/intfloat.h
new file mode 100644 (file)
index 0000000..9db624a
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2011 Mans Rullgard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_INTFLOAT_H
+#define AVUTIL_INTFLOAT_H
+
+#include <stdint.h>
+#include "attributes.h"
+
+union av_intfloat32 {
+    uint32_t i;
+    float    f;
+};
+
+union av_intfloat64 {
+    uint64_t i;
+    double   f;
+};
+
+/**
+ * Reinterpret a 32-bit integer as a float.
+ */
+static av_always_inline float av_int2float(uint32_t i)
+{
+    union av_intfloat32 v = { .i = i };
+    return v.f;
+}
+
+/**
+ * Reinterpret a float as a 32-bit integer.
+ */
+static av_always_inline uint32_t av_float2int(float f)
+{
+    union av_intfloat32 v = { .f = f };
+    return v.i;
+}
+
+/**
+ * Reinterpret a 64-bit integer as a double.
+ */
+static av_always_inline double av_int2double(uint64_t i)
+{
+    union av_intfloat64 v = { .i = i };
+    return v.f;
+}
+
+/**
+ * Reinterpret a double as a 64-bit integer.
+ */
+static av_always_inline uint64_t av_double2int(double f)
+{
+    union av_intfloat64 v = { .f = f };
+    return v.i;
+}
+
+#endif /* AVUTIL_INTFLOAT_H */
index 1b80fc6..9709f4d 100644 (file)
@@ -30,11 +30,11 @@ typedef struct AVExtFloat  {
     uint8_t mantissa[8];
 } AVExtFloat;
 
-double av_int2dbl(int64_t v) av_const;
-float av_int2flt(int32_t v) av_const;
-double av_ext2dbl(const AVExtFloat ext) av_const;
-int64_t av_dbl2int(double d) av_const;
-int32_t av_flt2int(float d) av_const;
-AVExtFloat av_dbl2ext(double d) av_const;
+attribute_deprecated double av_int2dbl(int64_t v) av_const;
+attribute_deprecated float av_int2flt(int32_t v) av_const;
+attribute_deprecated double av_ext2dbl(const AVExtFloat ext) av_const;
+attribute_deprecated int64_t av_dbl2int(double d) av_const;
+attribute_deprecated int32_t av_flt2int(float d) av_const;
+attribute_deprecated AVExtFloat av_dbl2ext(double d) av_const;
 
 #endif /* AVUTIL_INTFLOAT_READWRITE_H */
index 53c8aa0..02a0e1a 100644 (file)
 
 #include <stdarg.h>
 #include "avutil.h"
+#include "attributes.h"
 
 /**
  * Describe the class of an AVClass context structure. That is an
  * arbitrary struct of which the first field is a pointer to an
  * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.).
  */
-typedef struct {
+typedef struct AVClass {
     /**
      * The name of the class; usually it is the same name as the
      * context structure type to which the AVClass is associated.
@@ -72,11 +73,19 @@ typedef struct {
     int parent_log_context_offset;
 
     /**
-     * A function for extended searching, e.g. in possible
-     * children objects.
+     * Return next AVOptions-enabled child or NULL
      */
-    const struct AVOption* (*opt_find)(void *obj, const char *name, const char *unit,
-                                       int opt_flags, int search_flags);
+    void* (*child_next)(void *obj, void *prev);
+
+    /**
+     * Return an AVClass corresponding to next potential
+     * AVOptions-enabled child.
+     *
+     * The difference between child_next and this is that
+     * child_next iterates over _already existing_ objects, while
+     * child_class_next iterates over _all possible_ children.
+     */
+    const struct AVClass* (*child_class_next)(const struct AVClass *prev);
 } AVClass;
 
 /* av_log API */
@@ -129,11 +138,7 @@ typedef struct {
  * subsequent arguments are converted to output.
  * @see av_vlog
  */
-#ifdef __GNUC__
-void av_log(void *avcl, int level, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 3, 4)));
-#else
-void av_log(void *avcl, int level, const char *fmt, ...);
-#endif
+void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4);
 
 void av_vlog(void *avcl, int level, const char *fmt, va_list);
 int av_log_get_level(void);
@@ -143,6 +148,16 @@ void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl);
 const char* av_default_item_name(void* ctx);
 
 /**
+ * Format a line of log the same way as the default callback.
+ * @param line          buffer to receive the formated line
+ * @param line_size     size of the buffer
+ * @param print_prefix  used to store whether the prefix must be printed;
+ *                      must point to a persistent integer initially set to 1
+ */
+void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl,
+                        char *line, int line_size, int *print_prefix);
+
+/**
  * av_dlog macros
  * Useful to print debug messages that shouldn't get compiled in normally.
  */
index 7fa3bd2..060b5c9 100644 (file)
 #ifndef AVUTIL_LZO_H
 #define AVUTIL_LZO_H
 
+/**
+ * @defgroup lavu_lzo LZO
+ * @ingroup lavu_crypto
+ *
+ * @{
+ */
+
 #include <stdint.h>
 
 /** @name Error flags returned by av_lzo1x_decode
-  * \{ */
-//! end of the input buffer reached before decoding finished
+  * @{ */
+/// end of the input buffer reached before decoding finished
 #define AV_LZO_INPUT_DEPLETED 1
-//! decoded data did not fit into output buffer
+/// decoded data did not fit into output buffer
 #define AV_LZO_OUTPUT_FULL 2
-//! a reference to previously decoded data was wrong
+/// a reference to previously decoded data was wrong
 #define AV_LZO_INVALID_BACKPTR 4
-//! a non-specific error in the compressed bitstream
+/// a non-specific error in the compressed bitstream
 #define AV_LZO_ERROR 8
-/** \} */
+/** @} */
 
 #define AV_LZO_INPUT_PADDING 8
 #define AV_LZO_OUTPUT_PADDING 12
 
 /**
- * \brief Decodes LZO 1x compressed data.
- * \param out output buffer
- * \param outlen size of output buffer, number of bytes left are returned here
- * \param in input buffer
- * \param inlen size of input buffer, number of bytes left are returned here
- * \return 0 on success, otherwise a combination of the error flags above
+ * @brief Decodes LZO 1x compressed data.
+ * @param out output buffer
+ * @param outlen size of output buffer, number of bytes left are returned here
+ * @param in input buffer
+ * @param inlen size of input buffer, number of bytes left are returned here
+ * @return 0 on success, otherwise a combination of the error flags above
  *
  * Make sure all buffers are appropriately padded, in must provide
  * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes.
 int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen);
 
 /**
- * \brief deliberately overlapping memcpy implementation
- * \param dst destination buffer; must be padded with 12 additional bytes
- * \param back how many bytes back we start (the initial size of the overlapping window)
- * \param cnt number of bytes to copy, must be >= 0
+ * @brief deliberately overlapping memcpy implementation
+ * @param dst destination buffer; must be padded with 12 additional bytes
+ * @param back how many bytes back we start (the initial size of the overlapping window), must be > 0
+ * @param cnt number of bytes to copy, must be >= 0
  *
  * cnt > back is valid, this will copy the bytes we just copied,
  * thus creating a repeating pattern with a period length of back.
  */
 void av_memcpy_backptr(uint8_t *dst, int back, int cnt);
 
+/**
+ * @}
+ */
+
 #endif /* AVUTIL_LZO_H */
index 882a516..ad39e26 100644 (file)
 #define INFINITY       (1.0/0.0)
 #endif
 
+/**
+ * @addtogroup lavu_math
+ * @{
+ */
+
+
 enum AVRounding {
     AV_ROUND_ZERO     = 0, ///< Round toward zero.
     AV_ROUND_INF      = 1, ///< Round away from zero.
@@ -109,4 +115,8 @@ int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b);
  */
 int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod);
 
+/**
+ * @}
+ */
+
 #endif /* AVUTIL_MATHEMATICS_H */
index 969202a..1333ab2 100644 (file)
 
 #include <stdint.h>
 
+/**
+ * @defgroup lavu_md5 MD5
+ * @ingroup lavu_crypto
+ * @{
+ */
+
 extern const int av_md5_size;
 
 struct AVMD5;
@@ -32,5 +38,9 @@ void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, const int len);
 void av_md5_final(struct AVMD5 *ctx, uint8_t *dst);
 void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len);
 
+/**
+ * @}
+ */
+
 #endif /* AVUTIL_MD5_H */
 
index 7c30e16..c6c907e 100644 (file)
 #define AVUTIL_MEM_H
 
 #include "attributes.h"
+#include "error.h"
 #include "avutil.h"
 
+/**
+ * @addtogroup lavu_mem
+ * @{
+ */
+
+
 #if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C)
     #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned (n))) v
     #define DECLARE_ASM_CONST(n,t,v)    const t __attribute__ ((aligned (n))) v
@@ -76,10 +83,10 @@ void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1);
  * Allocate or reallocate a block of memory.
  * If ptr is NULL and size > 0, allocate a new block. If
  * size is zero, free the memory block pointed to by ptr.
- * @param size Size in bytes for the memory block to be allocated or
- * reallocated.
  * @param ptr Pointer to a memory block already allocated with
  * av_malloc(z)() or av_realloc() or NULL.
+ * @param size Size in bytes for the memory block to be allocated or
+ * reallocated.
  * @return Pointer to a newly reallocated block or NULL if the block
  * cannot be reallocated or the function is used to free the memory block.
  * @see av_fast_realloc()
@@ -87,6 +94,16 @@ void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1);
 void *av_realloc(void *ptr, size_t size) av_alloc_size(2);
 
 /**
+ * Allocate or reallocate a block of memory.
+ * This function does the same thing as av_realloc, except:
+ * - It takes two arguments and checks the result of the multiplication for
+ *   integer overflow.
+ * - It frees the input block in case of failure, thus avoiding the memory
+ *   leak with the classic "buf = realloc(buf); if (!buf) return -1;".
+ */
+void *av_realloc_f(void *ptr, size_t nelem, size_t elsize);
+
+/**
  * Free a memory block which has been allocated with av_malloc(z)() or
  * av_realloc().
  * @param ptr Pointer to the memory block which should be freed.
@@ -107,6 +124,18 @@ void av_free(void *ptr);
 void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1);
 
 /**
+ * Allocate a block of nmemb * size bytes with alignment suitable for all
+ * memory accesses (including vectors if available on the CPU) and
+ * zero all the bytes of the block.
+ * The allocation will fail if nmemb * size is greater than or equal
+ * to INT_MAX.
+ * @param nmemb
+ * @param size
+ * @return Pointer to the allocated block, NULL if it cannot be allocated.
+ */
+void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib;
+
+/**
  * Duplicate the string s.
  * @param s string to be duplicated
  * @return Pointer to a newly allocated string containing a
@@ -132,4 +161,28 @@ void av_freep(void *ptr);
  */
 void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem);
 
+/**
+ * Multiply two size_t values checking for overflow.
+ * @return  0 if success, AVERROR(EINVAL) if overflow.
+ */
+static inline int av_size_mult(size_t a, size_t b, size_t *r)
+{
+    size_t t = a * b;
+    /* Hack inspired from glibc: only try the division if nelem and elsize
+     * are both greater than sqrt(SIZE_MAX). */
+    if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b)
+        return AVERROR(EINVAL);
+    *r = t;
+    return 0;
+}
+
+/**
+ * Set the maximum size that may me allocated in one block.
+ */
+void av_max_alloc(size_t max);
+
+/**
+ * @}
+ */
+
 #endif /* AVUTIL_MEM_H */
index 68873de..0196056 100644 (file)
 #include "rational.h"
 #include "avutil.h"
 #include "dict.h"
+#include "log.h"
+
+/**
+ * @defgroup avoptions AVOptions
+ * @ingroup lavu_data
+ * @{
+ * AVOptions provide a generic system to declare options on arbitrary structs
+ * ("objects"). An option can have a help text, a type and a range of possible
+ * values. Options may then be enumerated, read and written to.
+ *
+ * @section avoptions_implement Implementing AVOptions
+ * This section describes how to add AVOptions capabilities to a struct.
+ *
+ * All AVOptions-related information is stored in an AVClass. Therefore
+ * the first member of the struct must be a pointer to an AVClass describing it.
+ * The option field of the AVClass must be set to a NULL-terminated static array
+ * of AVOptions. Each AVOption must have a non-empty name, a type, a default
+ * value and for number-type AVOptions also a range of allowed values. It must
+ * also declare an offset in bytes from the start of the struct, where the field
+ * associated with this AVOption is located. Other fields in the AVOption struct
+ * should also be set when applicable, but are not required.
+ *
+ * The following example illustrates an AVOptions-enabled struct:
+ * @code
+ * typedef struct test_struct {
+ *     AVClass *class;
+ *     int      int_opt;
+ *     char    *str_opt;
+ *     uint8_t *bin_opt;
+ *     int      bin_len;
+ * } test_struct;
+ *
+ * static const AVOption options[] = {
+ *   { "test_int", "This is a test option of int type.", offsetof(test_struct, int_opt),
+ *     AV_OPT_TYPE_INT, { -1 }, INT_MIN, INT_MAX },
+ *   { "test_str", "This is a test option of string type.", offsetof(test_struct, str_opt),
+ *     AV_OPT_TYPE_STRING },
+ *   { "test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt),
+ *     AV_OPT_TYPE_BINARY },
+ *   { NULL },
+ * };
+ *
+ * static const AVClass test_class = {
+ *     .class_name = "test class",
+ *     .item_name  = av_default_item_name,
+ *     .option     = options,
+ *     .version    = LIBAVUTIL_VERSION_INT,
+ * };
+ * @endcode
+ *
+ * Next, when allocating your struct, you must ensure that the AVClass pointer
+ * is set to the correct value. Then, av_opt_set_defaults() must be called to
+ * initialize defaults. After that the struct is ready to be used with the
+ * AVOptions API.
+ *
+ * When cleaning up, you may use the av_opt_free() function to automatically
+ * free all the allocated string and binary options.
+ *
+ * Continuing with the above example:
+ *
+ * @code
+ * test_struct *alloc_test_struct(void)
+ * {
+ *     test_struct *ret = av_malloc(sizeof(*ret));
+ *     ret->class = &test_class;
+ *     av_opt_set_defaults(ret);
+ *     return ret;
+ * }
+ * void free_test_struct(test_struct **foo)
+ * {
+ *     av_opt_free(*foo);
+ *     av_freep(foo);
+ * }
+ * @endcode
+ *
+ * @subsection avoptions_implement_nesting Nesting
+ *      It may happen that an AVOptions-enabled struct contains another
+ *      AVOptions-enabled struct as a member (e.g. AVCodecContext in
+ *      libavcodec exports generic options, while its priv_data field exports
+ *      codec-specific options). In such a case, it is possible to set up the
+ *      parent struct to export a child's options. To do that, simply
+ *      implement AVClass.child_next() and AVClass.child_class_next() in the
+ *      parent struct's AVClass.
+ *      Assuming that the test_struct from above now also contains a
+ *      child_struct field:
+ *
+ *      @code
+ *      typedef struct child_struct {
+ *          AVClass *class;
+ *          int flags_opt;
+ *      } child_struct;
+ *      static const AVOption child_opts[] = {
+ *          { "test_flags", "This is a test option of flags type.",
+ *            offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { 0 }, INT_MIN, INT_MAX },
+ *          { NULL },
+ *      };
+ *      static const AVClass child_class = {
+ *          .class_name = "child class",
+ *          .item_name  = av_default_item_name,
+ *          .option     = child_opts,
+ *          .version    = LIBAVUTIL_VERSION_INT,
+ *      };
+ *
+ *      void *child_next(void *obj, void *prev)
+ *      {
+ *          test_struct *t = obj;
+ *          if (!prev && t->child_struct)
+ *              return t->child_struct;
+ *          return NULL
+ *      }
+ *      const AVClass child_class_next(const AVClass *prev)
+ *      {
+ *          return prev ? NULL : &child_class;
+ *      }
+ *      @endcode
+ *      Putting child_next() and child_class_next() as defined above into
+ *      test_class will now make child_struct's options accessible through
+ *      test_struct (again, proper setup as described above needs to be done on
+ *      child_struct right after it is created).
+ *
+ *      From the above example it might not be clear why both child_next()
+ *      and child_class_next() are needed. The distinction is that child_next()
+ *      iterates over actually existing objects, while child_class_next()
+ *      iterates over all possible child classes. E.g. if an AVCodecContext
+ *      was initialized to use a codec which has private options, then its
+ *      child_next() will return AVCodecContext.priv_data and finish
+ *      iterating. OTOH child_class_next() on AVCodecContext.av_class will
+ *      iterate over all available codecs with private options.
+ *
+ * @subsection avoptions_implement_named_constants Named constants
+ *      It is possible to create named constants for options. Simply set the unit
+ *      field of the option the constants should apply to to a string and
+ *      create the constants themselves as options of type AV_OPT_TYPE_CONST
+ *      with their unit field set to the same string.
+ *      Their default_val field should contain the value of the named
+ *      constant.
+ *      For example, to add some named constants for the test_flags option
+ *      above, put the following into the child_opts array:
+ *      @code
+ *      { "test_flags", "This is a test option of flags type.",
+ *        offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { 0 }, INT_MIN, INT_MAX, "test_unit" },
+ *      { "flag1", "This is a flag with value 16", 0, AV_OPT_TYPE_CONST, { 16 }, 0, 0, "test_unit" },
+ *      @endcode
+ *
+ * @section avoptions_use Using AVOptions
+ * This section deals with accessing options in an AVOptions-enabled struct.
+ * Such structs in FFmpeg are e.g. AVCodecContext in libavcodec or
+ * AVFormatContext in libavformat.
+ *
+ * @subsection avoptions_use_examine Examining AVOptions
+ * The basic functions for examining options are av_opt_next(), which iterates
+ * over all options defined for one object, and av_opt_find(), which searches
+ * for an option with the given name.
+ *
+ * The situation is more complicated with nesting. An AVOptions-enabled struct
+ * may have AVOptions-enabled children. Passing the AV_OPT_SEARCH_CHILDREN flag
+ * to av_opt_find() will make the function search children recursively.
+ *
+ * For enumerating there are basically two cases. The first is when you want to
+ * get all options that may potentially exist on the struct and its children
+ * (e.g.  when constructing documentation). In that case you should call
+ * av_opt_child_class_next() recursively on the parent struct's AVClass.  The
+ * second case is when you have an already initialized struct with all its
+ * children and you want to get all options that can be actually written or read
+ * from it. In that case you should call av_opt_child_next() recursively (and
+ * av_opt_next() on each result).
+ *
+ * @subsection avoptions_use_get_set Reading and writing AVOptions
+ * When setting options, you often have a string read directly from the
+ * user. In such a case, simply passing it to av_opt_set() is enough. For
+ * non-string type options, av_opt_set() will parse the string according to the
+ * option type.
+ *
+ * Similarly av_opt_get() will read any option type and convert it to a string
+ * which will be returned. Do not forget that the string is allocated, so you
+ * have to free it with av_free().
+ *
+ * In some cases it may be more convenient to put all options into an
+ * AVDictionary and call av_opt_set_dict() on it. A specific case of this
+ * are the format/codec open functions in lavf/lavc which take a dictionary
+ * filled with option as a parameter. This allows to set some options
+ * that cannot be set otherwise, since e.g. the input file format is not known
+ * before the file is actually opened.
+ */
 
 enum AVOptionType{
-    FF_OPT_TYPE_FLAGS,
+    AV_OPT_TYPE_FLAGS,
+    AV_OPT_TYPE_INT,
+    AV_OPT_TYPE_INT64,
+    AV_OPT_TYPE_DOUBLE,
+    AV_OPT_TYPE_FLOAT,
+    AV_OPT_TYPE_STRING,
+    AV_OPT_TYPE_RATIONAL,
+    AV_OPT_TYPE_BINARY,  ///< offset must point to a pointer immediately followed by an int for the length
+    AV_OPT_TYPE_CONST = 128,
+#if FF_API_OLD_AVOPTIONS
+    FF_OPT_TYPE_FLAGS = 0,
     FF_OPT_TYPE_INT,
     FF_OPT_TYPE_INT64,
     FF_OPT_TYPE_DOUBLE,
@@ -41,6 +235,7 @@ enum AVOptionType{
     FF_OPT_TYPE_RATIONAL,
     FF_OPT_TYPE_BINARY,  ///< offset must point to a pointer immediately followed by an int for the length
     FF_OPT_TYPE_CONST=128,
+#endif
 };
 
 /**
@@ -111,6 +306,7 @@ attribute_deprecated
 const AVOption *av_find_opt(void *obj, const char *name, const char *unit, int mask, int flags);
 #endif
 
+#if FF_API_OLD_AVOPTIONS
 /**
  * Set the field of obj with the given name to value.
  *
@@ -129,25 +325,27 @@ const AVOption *av_find_opt(void *obj, const char *name, const char *unit, int m
  * similarly, '-' unsets a flag.
  * @param[out] o_out if non-NULL put here a pointer to the AVOption
  * found
- * @param alloc when 1 then the old value will be av_freed() and the
- *                     new av_strduped()
- *              when 0 then no av_free() nor av_strdup() will be used
+ * @param alloc this parameter is currently ignored
  * @return 0 if the value has been set, or an AVERROR code in case of
  * error:
- * AVERROR(ENOENT) if no matching option exists
+ * AVERROR_OPTION_NOT_FOUND if no matching option exists
  * AVERROR(ERANGE) if the value is out of range
  * AVERROR(EINVAL) if the value is not valid
+ * @deprecated use av_opt_set()
  */
+attribute_deprecated
 int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out);
 
-const AVOption *av_set_double(void *obj, const char *name, double n);
-const AVOption *av_set_q(void *obj, const char *name, AVRational n);
-const AVOption *av_set_int(void *obj, const char *name, int64_t n);
+attribute_deprecated const AVOption *av_set_double(void *obj, const char *name, double n);
+attribute_deprecated const AVOption *av_set_q(void *obj, const char *name, AVRational n);
+attribute_deprecated const AVOption *av_set_int(void *obj, const char *name, int64_t n);
+
 double av_get_double(void *obj, const char *name, const AVOption **o_out);
 AVRational av_get_q(void *obj, const char *name, const AVOption **o_out);
 int64_t av_get_int(void *obj, const char *name, const AVOption **o_out);
-const char *av_get_string(void *obj, const char *name, const AVOption **o_out, char *buf, int buf_len);
-const AVOption *av_next_option(void *obj, const AVOption *last);
+attribute_deprecated const char *av_get_string(void *obj, const char *name, const AVOption **o_out, char *buf, int buf_len);
+attribute_deprecated const AVOption *av_next_option(void *obj, const AVOption *last);
+#endif
 
 /**
  * Show the obj options.
@@ -160,8 +358,17 @@ const AVOption *av_next_option(void *obj, const AVOption *last);
  */
 int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags);
 
+/**
+ * Set the values of all AVOption fields to their default values.
+ *
+ * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass)
+ */
 void av_opt_set_defaults(void *s);
+
+#if FF_API_OLD_AVOPTIONS
+attribute_deprecated
 void av_opt_set_defaults2(void *s, int mask, int flags);
+#endif
 
 /**
  * Parse the key/value pairs list in opts. For each key/value pair
@@ -214,8 +421,39 @@ int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name)
  */
 int av_opt_set_dict(void *obj, struct AVDictionary **options);
 
+/**
+ * @defgroup opt_eval_funcs Evaluating option strings
+ * @{
+ * This group of functions can be used to evaluate option strings
+ * and get numbers out of them. They do the same thing as av_opt_set(),
+ * except the result is written into the caller-supplied pointer.
+ *
+ * @param obj a struct whose first element is a pointer to AVClass.
+ * @param o an option for which the string is to be evaluated.
+ * @param val string to be evaluated.
+ * @param *_out value of the string will be written here.
+ *
+ * @return 0 on success, a negative number on failure.
+ */
+int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int        *flags_out);
+int av_opt_eval_int   (void *obj, const AVOption *o, const char *val, int        *int_out);
+int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t    *int64_out);
+int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float      *float_out);
+int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double     *double_out);
+int av_opt_eval_q     (void *obj, const AVOption *o, const char *val, AVRational *q_out);
+/**
+ * @}
+ */
+
 #define AV_OPT_SEARCH_CHILDREN   0x0001 /**< Search in possible children of the
                                              given object first. */
+/**
+ *  The obj passed to av_opt_find() is fake -- only a double pointer to AVClass
+ *  instead of a required pointer to a struct containing AVClass. This is
+ *  useful for searching for options without needing to allocate the corresponding
+ *  object.
+ */
+#define AV_OPT_SEARCH_FAKE_OBJ   0x0002
 
 /**
  * Look for an option in an object. Consider only options which
@@ -223,6 +461,8 @@ int av_opt_set_dict(void *obj, struct AVDictionary **options);
  *
  * @param[in] obj A pointer to a struct whose first element is a
  *                pointer to an AVClass.
+ *                Alternatively a double pointer to an AVClass, if
+ *                AV_OPT_SEARCH_FAKE_OBJ search flag is set.
  * @param[in] name The name of the option to look for.
  * @param[in] unit When searching for named constants, name of the unit
  *                 it belongs to.
@@ -240,4 +480,124 @@ int av_opt_set_dict(void *obj, struct AVDictionary **options);
 const AVOption *av_opt_find(void *obj, const char *name, const char *unit,
                             int opt_flags, int search_flags);
 
+/**
+ * Look for an option in an object. Consider only options which
+ * have all the specified flags set.
+ *
+ * @param[in] obj A pointer to a struct whose first element is a
+ *                pointer to an AVClass.
+ *                Alternatively a double pointer to an AVClass, if
+ *                AV_OPT_SEARCH_FAKE_OBJ search flag is set.
+ * @param[in] name The name of the option to look for.
+ * @param[in] unit When searching for named constants, name of the unit
+ *                 it belongs to.
+ * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG).
+ * @param search_flags A combination of AV_OPT_SEARCH_*.
+ * @param[out] target_obj if non-NULL, an object to which the option belongs will be
+ * written here. It may be different from obj if AV_OPT_SEARCH_CHILDREN is present
+ * in search_flags. This parameter is ignored if search_flags contain
+ * AV_OPT_SEARCH_FAKE_OBJ.
+ *
+ * @return A pointer to the option found, or NULL if no option
+ *         was found.
+ */
+const AVOption *av_opt_find2(void *obj, const char *name, const char *unit,
+                             int opt_flags, int search_flags, void **target_obj);
+
+/**
+ * Iterate over all AVOptions belonging to obj.
+ *
+ * @param obj an AVOptions-enabled struct or a double pointer to an
+ *            AVClass describing it.
+ * @param prev result of the previous call to av_opt_next() on this object
+ *             or NULL
+ * @return next AVOption or NULL
+ */
+const AVOption *av_opt_next(void *obj, const AVOption *prev);
+
+/**
+ * Iterate over AVOptions-enabled children of obj.
+ *
+ * @param prev result of a previous call to this function or NULL
+ * @return next AVOptions-enabled child or NULL
+ */
+void *av_opt_child_next(void *obj, void *prev);
+
+/**
+ * Iterate over potential AVOptions-enabled children of parent.
+ *
+ * @param prev result of a previous call to this function or NULL
+ * @return AVClass corresponding to next potential child or NULL
+ */
+const AVClass *av_opt_child_class_next(const AVClass *parent, const AVClass *prev);
+
+/**
+ * @defgroup opt_set_funcs Option setting functions
+ * @{
+ * Those functions set the field of obj with the given name to value.
+ *
+ * @param[in] obj A struct whose first element is a pointer to an AVClass.
+ * @param[in] name the name of the field to set
+ * @param[in] val The value to set. In case of av_opt_set() if the field is not
+ * of a string type, then the given string is parsed.
+ * SI postfixes and some named scalars are supported.
+ * If the field is of a numeric type, it has to be a numeric or named
+ * scalar. Behavior with more than one scalar and +- infix operators
+ * is undefined.
+ * If the field is of a flags type, it has to be a sequence of numeric
+ * scalars or named flags separated by '+' or '-'. Prefixing a flag
+ * with '+' causes it to be set without affecting the other flags;
+ * similarly, '-' unsets a flag.
+ * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN
+ * is passed here, then the option may be set on a child of obj.
+ *
+ * @return 0 if the value has been set, or an AVERROR code in case of
+ * error:
+ * AVERROR_OPTION_NOT_FOUND if no matching option exists
+ * AVERROR(ERANGE) if the value is out of range
+ * AVERROR(EINVAL) if the value is not valid
+ */
+int av_opt_set       (void *obj, const char *name, const char *val, int search_flags);
+int av_opt_set_int   (void *obj, const char *name, int64_t     val, int search_flags);
+int av_opt_set_double(void *obj, const char *name, double      val, int search_flags);
+int av_opt_set_q     (void *obj, const char *name, AVRational  val, int search_flags);
+/**
+ * @}
+ */
+
+/**
+ * @defgroup opt_get_funcs Option getting functions
+ * @{
+ * Those functions get a value of the option with the given name from an object.
+ *
+ * @param[in] obj a struct whose first element is a pointer to an AVClass.
+ * @param[in] name name of the option to get.
+ * @param[in] search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN
+ * is passed here, then the option may be found in a child of obj.
+ * @param[out] out_val value of the option will be written here
+ * @return 0 on success, a negative error code otherwise
+ */
+/**
+ * @note the returned string will av_malloc()ed and must be av_free()ed by the caller
+ */
+int av_opt_get       (void *obj, const char *name, int search_flags, uint8_t   **out_val);
+int av_opt_get_int   (void *obj, const char *name, int search_flags, int64_t    *out_val);
+int av_opt_get_double(void *obj, const char *name, int search_flags, double     *out_val);
+int av_opt_get_q     (void *obj, const char *name, int search_flags, AVRational *out_val);
+/**
+ * @}
+ */
+/**
+ * Gets a pointer to the requested field in a struct.
+ * This function allows accessing a struct even when its fields are moved or
+ * renamed since the application making the access has been compiled,
+ *
+ * @returns a pointer to the field, it can be cast to the correct type and read
+ *          or written to.
+ */
+void *av_opt_ptr(const AVClass *avclass, void *obj, const char *name);
+/**
+ * @}
+ */
+
 #endif /* AVUTIL_OPT_H */
index d31212e..2a74a06 100644 (file)
@@ -19,6 +19,8 @@
 #ifndef AVUTIL_PARSEUTILS_H
 #define AVUTIL_PARSEUTILS_H
 
+#include <time.h>
+
 #include "rational.h"
 
 /**
@@ -73,7 +75,7 @@ int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen,
                    void *log_ctx);
 
 /**
- * Parses timestr and returns in *time a corresponding number of
+ * Parse timestr and return in *time a corresponding number of
  * microseconds.
  *
  * @param timeval puts here the number of microseconds corresponding
@@ -83,7 +85,7 @@ int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen,
  * January, 1970 up to the time of the parsed date.  If timestr cannot
  * be successfully parsed, set *time to INT64_MIN.
 
- * @param datestr a string representing a date or a duration.
+ * @param timestr a string representing a date or a duration.
  * - If a date the syntax is:
  * @code
  * [{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH[:MM[:SS[.m...]]]}|{HH[MM[SS[.m...]]]}}[Z]
@@ -114,4 +116,9 @@ int av_parse_time(int64_t *timeval, const char *timestr, int duration);
  */
 int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info);
 
+/**
+ * Convert the decomposed UTC time in tm to a time_t value.
+ */
+time_t av_timegm(struct tm *tm);
+
 #endif /* AVUTIL_PARSEUTILS_H */
index f0de998..2175246 100644 (file)
@@ -87,6 +87,8 @@ typedef struct AVPixFmtDescriptor{
 #define PIX_FMT_PAL       2 ///< Pixel format has a palette in data[1], values are indexes in this palette.
 #define PIX_FMT_BITSTREAM 4 ///< All values of a component are bit-wise packed end to end.
 #define PIX_FMT_HWACCEL   8 ///< Pixel format is an HW accelerated format.
+#define PIX_FMT_PLANAR   16 ///< At least one pixel component is not in the first data plane
+#define PIX_FMT_RGB      32 ///< The pixel format contains RGB-like data (as opposed to YUV/grayscale)
 
 /**
  * The array of all the pixel format descriptors.
index 0f170d2..f0d9c01 100644 (file)
  * @file
  * pixel format definitions
  *
- * @warning This file has to be considered an internal but installed
- * header, so it should not be directly included in your projects.
  */
 
 #include "libavutil/avconfig.h"
 
 /**
- * Pixel format. Notes:
+ * Pixel format.
  *
+ * @note
  * PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA
  * color is put together as:
  *  (A << 24) | (R << 16) | (G << 8) | B
  * This is stored as BGRA on little-endian CPU architectures and ARGB on
  * big-endian CPUs.
  *
+ * @par
  * When the pixel format is palettized RGB (PIX_FMT_PAL8), the palettized
  * image data is stored in AVFrame.data[0]. The palette is transported in
  * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is
  * This is important as many custom PAL8 video codecs that were designed
  * to run on the IBM VGA graphics adapter use 6-bit palette components.
  *
+ * @par
  * For all the 8bit per pixel formats, an RGB32 palette is in data[1] like
  * for pal8. This palette is filled in automatically by the function
  * allocating the picture.
  *
- * Note, make sure that all newly added big endian formats have pix_fmt&1==1
- *       and that all newly added little endian formats have pix_fmt&1==0
- *       this allows simpler detection of big vs little endian.
+ * @note
+ * make sure that all newly added big endian formats have pix_fmt&1==1
+ * and that all newly added little endian formats have pix_fmt&1==0
+ * this allows simpler detection of big vs little endian.
  */
 enum PixelFormat {
     PIX_FMT_NONE= -1,
@@ -143,17 +145,45 @@ enum PixelFormat {
     PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
     PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
     PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
-    PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
-    PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
-    PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
-    PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
-    PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
-    PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
-
+    PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+    PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+    PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+    PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+    PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+    PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+    PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+    PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+    PIX_FMT_VDA_VLD,    ///< hardware decoding through VDA
+
+#ifdef AV_PIX_FMT_ABI_GIT_MASTER
+    PIX_FMT_RGBA64BE,  ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
+    PIX_FMT_RGBA64LE,  ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
+    PIX_FMT_BGRA64BE,  ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
+    PIX_FMT_BGRA64LE,  ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
+#endif
+    PIX_FMT_GBRP,      ///< planar GBR 4:4:4 24bpp
+    PIX_FMT_GBRP9BE,   ///< planar GBR 4:4:4 27bpp, big endian
+    PIX_FMT_GBRP9LE,   ///< planar GBR 4:4:4 27bpp, little endian
+    PIX_FMT_GBRP10BE,  ///< planar GBR 4:4:4 30bpp, big endian
+    PIX_FMT_GBRP10LE,  ///< planar GBR 4:4:4 30bpp, little endian
+    PIX_FMT_GBRP16BE,  ///< planar GBR 4:4:4 48bpp, big endian
+    PIX_FMT_GBRP16LE,  ///< planar GBR 4:4:4 48bpp, little endian
+
+#ifndef AV_PIX_FMT_ABI_GIT_MASTER
+    PIX_FMT_RGBA64BE=0x123,  ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
+    PIX_FMT_RGBA64LE,  ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
+    PIX_FMT_BGRA64BE,  ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
+    PIX_FMT_BGRA64LE,  ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
+#endif
+    PIX_FMT_0RGB=0x123+4,      ///< packed RGB 8:8:8, 32bpp, 0RGB0RGB...
+    PIX_FMT_RGB0,      ///< packed RGB 8:8:8, 32bpp, RGB0RGB0...
+    PIX_FMT_0BGR,      ///< packed BGR 8:8:8, 32bpp, 0BGR0BGR...
+    PIX_FMT_BGR0,      ///< packed BGR 8:8:8, 32bpp, BGR0BGR0...
     PIX_FMT_NB,        ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
 };
 
 #define PIX_FMT_Y400A PIX_FMT_GRAY8A
+#define PIX_FMT_GBR24P PIX_FMT_GBRP
 
 #if AV_HAVE_BIGENDIAN
 #   define PIX_FMT_NE(be, le) PIX_FMT_##be
@@ -165,6 +195,8 @@ enum PixelFormat {
 #define PIX_FMT_RGB32_1 PIX_FMT_NE(RGBA, ABGR)
 #define PIX_FMT_BGR32   PIX_FMT_NE(ABGR, RGBA)
 #define PIX_FMT_BGR32_1 PIX_FMT_NE(BGRA, ARGB)
+#define PIX_FMT_0RGB32  PIX_FMT_NE(0RGB, BGR0)
+#define PIX_FMT_0BGR32  PIX_FMT_NE(0BGR, RGB0)
 
 #define PIX_FMT_GRAY16 PIX_FMT_NE(GRAY16BE, GRAY16LE)
 #define PIX_FMT_RGB48  PIX_FMT_NE(RGB48BE,  RGB48LE)
@@ -177,6 +209,7 @@ enum PixelFormat {
 #define PIX_FMT_BGR444 PIX_FMT_NE(BGR444BE, BGR444LE)
 
 #define PIX_FMT_YUV420P9  PIX_FMT_NE(YUV420P9BE , YUV420P9LE)
+#define PIX_FMT_YUV422P9  PIX_FMT_NE(YUV422P9BE , YUV422P9LE)
 #define PIX_FMT_YUV444P9  PIX_FMT_NE(YUV444P9BE , YUV444P9LE)
 #define PIX_FMT_YUV420P10 PIX_FMT_NE(YUV420P10BE, YUV420P10LE)
 #define PIX_FMT_YUV422P10 PIX_FMT_NE(YUV422P10BE, YUV422P10LE)
@@ -185,4 +218,10 @@ enum PixelFormat {
 #define PIX_FMT_YUV422P16 PIX_FMT_NE(YUV422P16BE, YUV422P16LE)
 #define PIX_FMT_YUV444P16 PIX_FMT_NE(YUV444P16BE, YUV444P16LE)
 
+#define PIX_FMT_RGBA64 PIX_FMT_NE(RGBA64BE, RGBA64LE)
+#define PIX_FMT_BGRA64 PIX_FMT_NE(BGRA64BE, BGRA64LE)
+#define PIX_FMT_GBRP9     PIX_FMT_NE(GBRP9BE ,    GBRP9LE)
+#define PIX_FMT_GBRP10    PIX_FMT_NE(GBRP10BE,    GBRP10LE)
+#define PIX_FMT_GBRP16    PIX_FMT_NE(GBRP16BE,    GBRP16LE)
+
 #endif /* AVUTIL_PIXFMT_H */
index 7f75063..0462a04 100644 (file)
 #define AVUTIL_RANDOM_SEED_H
 
 #include <stdint.h>
+/**
+ * @addtogroup lavu_crypto
+ * @{
+ */
 
 /**
  * Get a seed to use in conjunction with random functions.
+ * This function tries to provide a good seed at a best effort bases.
+ * Its possible to call this function multiple times if more bits are needed.
+ * It can be quite slow, which is why it should only be used as seed for a faster
+ * PRNG. The quality of the seed depends on the platform.
  */
 uint32_t av_get_random_seed(void);
 
+/**
+ * @}
+ */
+
 #endif /* AVUTIL_RANDOM_SEED_H */
index 789e4ac..8c2bdb5 100644 (file)
 #include "attributes.h"
 
 /**
+ * @addtogroup lavu_math
+ * @{
+ */
+
+/**
  * rational number numerator/denominator
  */
 typedef struct AVRational{
@@ -132,4 +137,8 @@ int av_nearer_q(AVRational q, AVRational q1, AVRational q2);
  */
 int av_find_nearest_q_idx(AVRational q, const AVRational* q_list);
 
+/**
+ * @}
+ */
+
 #endif /* AVUTIL_RATIONAL_H */
index b06755d..855cffd 100644 (file)
@@ -31,6 +31,13 @@ enum AVSampleFormat {
     AV_SAMPLE_FMT_S32,         ///< signed 32 bits
     AV_SAMPLE_FMT_FLT,         ///< float
     AV_SAMPLE_FMT_DBL,         ///< double
+
+    AV_SAMPLE_FMT_U8P,         ///< unsigned 8 bits, planar
+    AV_SAMPLE_FMT_S16P,        ///< signed 16 bits, planar
+    AV_SAMPLE_FMT_S32P,        ///< signed 32 bits, planar
+    AV_SAMPLE_FMT_FLTP,        ///< float, planar
+    AV_SAMPLE_FMT_DBLP,        ///< double, planar
+
     AV_SAMPLE_FMT_NB           ///< Number of sample formats. DO NOT USE if linking dynamically
 };
 
@@ -47,6 +54,14 @@ const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt);
 enum AVSampleFormat av_get_sample_fmt(const char *name);
 
 /**
+ * Return the planar<->packed alternative form of the given sample format, or
+ * AV_SAMPLE_FMT_NONE on error. If the passed sample_fmt is already in the
+ * requested planar/packed format, the format returned is the same as the
+ * input.
+ */
+enum AVSampleFormat av_get_alt_sample_fmt(enum AVSampleFormat sample_fmt, int planar);
+
+/**
  * Generate a string corresponding to the sample format with
  * sample_fmt, or a header if sample_fmt is negative.
  *
@@ -78,48 +93,64 @@ int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt);
 int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt);
 
 /**
- * Fill channel data pointers and linesizes for samples with sample
+ * Check if the sample format is planar.
+ *
+ * @param sample_fmt the sample format to inspect
+ * @return 1 if the sample format is planar, 0 if it is interleaved
+ */
+int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt);
+
+/**
+ * Get the required buffer size for the given audio parameters.
+ *
+ * @param[out] linesize calculated linesize, may be NULL
+ * @param nb_channels   the number of channels
+ * @param nb_samples    the number of samples in a single channel
+ * @param sample_fmt    the sample format
+ * @return              required buffer size, or negative error code on failure
+ */
+int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples,
+                               enum AVSampleFormat sample_fmt, int align);
+
+/**
+ * Fill channel data pointers and linesize for samples with sample
  * format sample_fmt.
  *
  * The pointers array is filled with the pointers to the samples data:
- * for planar, set the start point of each plane's data within the buffer,
+ * for planar, set the start point of each channel's data within the buffer,
  * for packed, set the start point of the entire buffer only.
  *
- * The linesize array is filled with the aligned size of each samples
- * plane, that is linesize[i] will contain the linesize of the plane i,
- * and will be zero for all the unused planes. All linesize values are
- * equal.
+ * The linesize array is filled with the aligned size of each channel's data
+ * buffer for planar layout, or the aligned size of the buffer for all channels
+ * for packed layout.
  *
- * @param pointers array to be filled with the pointer for each plane, may be NULL
- * @param linesizes array to be filled with the linesize, may be NULL
- * @param buf the pointer to a buffer containing the samples
- * @param nb_samples the number of samples in a single channel
- * @param planar 1 if the samples layout is planar, 0 if it is packed
- * @param nb_channels the number of channels
- * @return the total size of the buffer, a negative
- * error code in case of failure
+ * @param[out] audio_data  array to be filled with the pointer for each channel
+ * @param[out] linesize    calculated linesize
+ * @param buf              the pointer to a buffer containing the samples
+ * @param nb_channels      the number of channels
+ * @param nb_samples       the number of samples in a single channel
+ * @param sample_fmt       the sample format
+ * @param align            buffer size alignment (1 = no alignment required)
+ * @return                 0 on success or a negative error code on failure
  */
-int av_samples_fill_arrays(uint8_t *pointers[8], int linesizes[8],
-                           uint8_t *buf, int nb_channels, int nb_samples,
-                           enum AVSampleFormat sample_fmt, int planar, int align);
+int av_samples_fill_arrays(uint8_t **audio_data, int *linesize, uint8_t *buf,
+                           int nb_channels, int nb_samples,
+                           enum AVSampleFormat sample_fmt, int align);
 
 /**
- * Allocate a samples buffer for nb_samples samples, and
- * fill pointers and linesizes accordingly.
- * The allocated samples buffer has to be freed by using
- * av_freep(&pointers[0]).
+ * Allocate a samples buffer for nb_samples samples, and fill data pointers and
+ * linesize accordingly.
+ * The allocated samples buffer can be freed by using av_freep(&audio_data[0])
  *
- * @param nb_channels number of audio channels
- * @param nb_samples number of samples per channel
- * @param planar 1 if the samples layout is planar, 0 if packed,
- * @param align the value to use for buffer size alignment
- * @return the size in bytes required for the samples buffer, a negative
- * error code in case of failure
+ * @param[out] audio_data  array to be filled with the pointer for each channel
+ * @param[out] linesize    aligned size for audio buffer(s)
+ * @param nb_channels      number of audio channels
+ * @param nb_samples       number of samples per channel
+ * @param align            buffer size alignment (1 = no alignment required)
+ * @return                 0 on success or a negative error code on failure
  * @see av_samples_fill_arrays()
  */
-int av_samples_alloc(uint8_t *pointers[8], int linesizes[8],
-                     int nb_channels, int nb_samples,
-                     enum AVSampleFormat sample_fmt, int planar,
-                     int align);
+int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels,
+                     int nb_samples, enum AVSampleFormat sample_fmt, int align);
 
-#endif /* AVCORE_SAMPLEFMT_H */
+#endif /* AVUTIL_SAMPLEFMT_H */
index 543f5a1..d891cae 100644 (file)
 
 #include <stdint.h>
 
+/**
+ * @defgroup lavu_sha SHA
+ * @ingroup lavu_crypto
+ * @{
+ */
+
 extern const int av_sha_size;
 
 struct AVSHA;
@@ -53,4 +59,8 @@ void av_sha_update(struct AVSHA* context, const uint8_t* data, unsigned int len)
  */
 void av_sha_final(struct AVSHA* context, uint8_t *digest);
 
+/**
+ * @}
+ */
+
 #endif /* AVUTIL_SHA_H */
index 0876c91..fa7100c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2001-2003 Michael Niedermayer <michaelni@gmx.at>
+ * Copyright (C) 2001-2011 Michael Niedermayer <michaelni@gmx.at>
  *
  * This file is part of FFmpeg.
  *
  */
 
 #include "libavutil/avutil.h"
+#include "libavutil/log.h"
+#include "libavutil/pixfmt.h"
 
 #define LIBSWSCALE_VERSION_MAJOR 2
-#define LIBSWSCALE_VERSION_MINOR 0
-#define LIBSWSCALE_VERSION_MICRO 0
+#define LIBSWSCALE_VERSION_MINOR 1
+#define LIBSWSCALE_VERSION_MICRO 100
 
 #define LIBSWSCALE_VERSION_INT  AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \
                                                LIBSWSCALE_VERSION_MINOR, \
 #endif
 
 /**
- * Returns the LIBSWSCALE_VERSION_INT constant.
+ * Return the LIBSWSCALE_VERSION_INT constant.
  */
 unsigned swscale_version(void);
 
 /**
- * Returns the libswscale build-time configuration.
+ * Return the libswscale build-time configuration.
  */
 const char *swscale_configuration(void);
 
 /**
- * Returns the libswscale license.
+ * Return the libswscale license.
  */
 const char *swscale_license(void);
 
@@ -125,7 +127,7 @@ const char *swscale_license(void);
 #define SWS_CS_DEFAULT        5
 
 /**
- * Returns a pointer to yuv<->rgb coefficients for the given colorspace
+ * Return a pointer to yuv<->rgb coefficients for the given colorspace
  * suitable for sws_setColorspaceDetails().
  *
  * @param colorspace One of the SWS_CS_* macros. If invalid,
@@ -133,7 +135,6 @@ const char *swscale_license(void);
  */
 const int *sws_getCoefficients(int colorspace);
 
-
 // when used for filters they must have an odd number of elements
 // coeffs cannot be shared between vectors
 typedef struct {
@@ -152,26 +153,26 @@ typedef struct {
 struct SwsContext;
 
 /**
- * Returns a positive value if pix_fmt is a supported input format, 0
+ * Return a positive value if pix_fmt is a supported input format, 0
  * otherwise.
  */
 int sws_isSupportedInput(enum PixelFormat pix_fmt);
 
 /**
- * Returns a positive value if pix_fmt is a supported output format, 0
+ * Return a positive value if pix_fmt is a supported output format, 0
  * otherwise.
  */
 int sws_isSupportedOutput(enum PixelFormat pix_fmt);
 
 /**
- * Allocates an empty SwsContext. This must be filled and passed to
+ * Allocate an empty SwsContext. This must be filled and passed to
  * sws_init_context(). For filling see AVOptions, options.c and
  * sws_setColorspaceDetails().
  */
 struct SwsContext *sws_alloc_context(void);
 
 /**
- * Initializes the swscaler context sws_context.
+ * Initialize the swscaler context sws_context.
  *
  * @return zero or positive value on success, a negative value on
  * error
@@ -179,14 +180,14 @@ struct SwsContext *sws_alloc_context(void);
 int sws_init_context(struct SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter);
 
 /**
- * Frees the swscaler context swsContext.
+ * Free the swscaler context swsContext.
  * If swsContext is NULL, then does nothing.
  */
 void sws_freeContext(struct SwsContext *swsContext);
 
 #if FF_API_SWS_GETCONTEXT
 /**
- * Allocates and returns a SwsContext. You need it to perform
+ * Allocate and return an SwsContext. You need it to perform
  * scaling/conversion operations using sws_scale().
  *
  * @param srcW the width of the source image
@@ -208,7 +209,7 @@ struct SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat
 #endif
 
 /**
- * Scales the image slice in srcSlice and puts the resulting scaled
+ * Scale the image slice in srcSlice and put the resulting scaled
  * slice in the image in dst. A slice is a sequence of consecutive
  * rows in an image.
  *
@@ -216,7 +217,7 @@ struct SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat
  * top-bottom or bottom-top order. If slices are provided in
  * non-sequential order the behavior of the function is undefined.
  *
- * @param context   the scaling context previously created with
+ * @param c         the scaling context previously created with
  *                  sws_getContext()
  * @param srcSlice  the array containing the pointers to the planes of
  *                  the source slice
@@ -233,17 +234,9 @@ struct SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat
  *                  the destination image
  * @return          the height of the output slice
  */
-int sws_scale(struct SwsContext *context, const uint8_t* const srcSlice[], const int srcStride[],
-              int srcSliceY, int srcSliceH, uint8_t* const dst[], const int dstStride[]);
-
-#if LIBSWSCALE_VERSION_MAJOR < 1
-/**
- * @deprecated Use sws_scale() instead.
- */
-int sws_scale_ordered(struct SwsContext *context, const uint8_t* const src[],
-                      int srcStride[], int srcSliceY, int srcSliceH,
-                      uint8_t* dst[], int dstStride[]) attribute_deprecated;
-#endif
+int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],
+              const int srcStride[], int srcSliceY, int srcSliceH,
+              uint8_t *const dst[], const int dstStride[]);
 
 /**
  * @param inv_table the yuv2rgb coefficients, normally ff_yuv2rgb_coeffs[x]
@@ -261,35 +254,35 @@ int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table,
                              int *brightness, int *contrast, int *saturation);
 
 /**
- * Allocates and returns an uninitialized vector with length coefficients.
+ * Allocate and return an uninitialized vector with length coefficients.
  */
 SwsVector *sws_allocVec(int length);
 
 /**
- * Returns a normalized Gaussian curve used to filter stuff
- * quality=3 is high quality, lower is lower quality.
+ * Return a normalized Gaussian curve used to filter stuff
+ * quality = 3 is high quality, lower is lower quality.
  */
 SwsVector *sws_getGaussianVec(double variance, double quality);
 
 /**
- * Allocates and returns a vector with length coefficients, all
+ * Allocate and return a vector with length coefficients, all
  * with the same value c.
  */
 SwsVector *sws_getConstVec(double c, int length);
 
 /**
- * Allocates and returns a vector with just one coefficient, with
+ * Allocate and return a vector with just one coefficient, with
  * value 1.0.
  */
 SwsVector *sws_getIdentityVec(void);
 
 /**
- * Scales all the coefficients of a by the scalar value.
+ * Scale all the coefficients of a by the scalar value.
  */
 void sws_scaleVec(SwsVector *a, double scalar);
 
 /**
- * Scales all the coefficients of a so that their sum equals height.
+ * Scale all the coefficients of a so that their sum equals height.
  */
 void sws_normalizeVec(SwsVector *a, double height);
 void sws_convVec(SwsVector *a, SwsVector *b);
@@ -298,20 +291,13 @@ void sws_subVec(SwsVector *a, SwsVector *b);
 void sws_shiftVec(SwsVector *a, int shift);
 
 /**
- * Allocates and returns a clone of the vector a, that is a vector
+ * Allocate and return a clone of the vector a, that is a vector
  * with the same coefficients as a.
  */
 SwsVector *sws_cloneVec(SwsVector *a);
 
-#if LIBSWSCALE_VERSION_MAJOR < 1
-/**
- * @deprecated Use sws_printVec2() instead.
- */
-attribute_deprecated void sws_printVec(SwsVector *a);
-#endif
-
 /**
- * Prints with av_log() a textual representation of the vector a
+ * Print with av_log() a textual representation of the vector a
  * if log_level <= av_log_level.
  */
 void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level);
@@ -325,8 +311,7 @@ SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur,
 void sws_freeFilter(SwsFilter *filter);
 
 /**
- * Checks if context can be reused, otherwise reallocates a new
- * one.
+ * Check if context can be reused, otherwise reallocate a new one.
  *
  * If context is NULL, just calls sws_getContext() to get a new
  * context. Otherwise, checks if the parameters are the ones already
@@ -344,7 +329,7 @@ struct SwsContext *sws_getCachedContext(struct SwsContext *context,
                                         SwsFilter *dstFilter, const double *param);
 
 /**
- * Converts an 8bit paletted frame into a frame with a color depth of 32-bits.
+ * Convert an 8-bit paletted frame into a frame with a color depth of 32 bits.
  *
  * The output frame will have the same packed format as the palette.
  *
@@ -356,7 +341,7 @@ struct SwsContext *sws_getCachedContext(struct SwsContext *context,
 void sws_convertPalette8ToPacked32(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette);
 
 /**
- * Converts an 8bit paletted frame into a frame with a color depth of 24 bits.
+ * Convert an 8-bit paletted frame into a frame with a color depth of 24 bits.
  *
  * With the palette format "ABCD", the destination frame ends up with the format "ABC".
  *
@@ -367,5 +352,12 @@ void sws_convertPalette8ToPacked32(const uint8_t *src, uint8_t *dst, int num_pix
  */
 void sws_convertPalette8ToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette);
 
+/**
+ * Get the AVClass for swsContext. It can be used in combination with
+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
+ *
+ * @see av_opt_find().
+ */
+const AVClass *sws_get_class(void);
 
 #endif /* SWSCALE_SWSCALE_H */
index 5b4ccf0..34ec871 100755 (executable)
Binary files a/3rdparty/lib/armeabi-v7a/libnative_camera_r2.2.0.so and b/3rdparty/lib/armeabi-v7a/libnative_camera_r2.2.0.so differ
index f9b9f31..a2e8fc0 100644 (file)
Binary files a/3rdparty/lib/armeabi-v7a/libnative_camera_r2.3.3.so and b/3rdparty/lib/armeabi-v7a/libnative_camera_r2.3.3.so differ
index 9c2d21c..f2d1792 100755 (executable)
Binary files a/3rdparty/lib/armeabi-v7a/libnative_camera_r3.0.1.so and b/3rdparty/lib/armeabi-v7a/libnative_camera_r3.0.1.so differ
index 553d8d0..b4d746f 100755 (executable)
Binary files a/3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.0.so and b/3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.0.so differ
index dab685e..bd34dcf 100755 (executable)
Binary files a/3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.3.so and b/3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.3.so differ
index e7dbf7a..b74dd5f 100755 (executable)
Binary files a/3rdparty/lib/armeabi/libnative_camera_r2.2.0.so and b/3rdparty/lib/armeabi/libnative_camera_r2.2.0.so differ
index b2a4b1f..05f51c3 100755 (executable)
Binary files a/3rdparty/lib/armeabi/libnative_camera_r2.3.3.so and b/3rdparty/lib/armeabi/libnative_camera_r2.3.3.so differ
index 93c2241..2c0d054 100755 (executable)
Binary files a/3rdparty/lib/armeabi/libnative_camera_r3.0.1.so and b/3rdparty/lib/armeabi/libnative_camera_r3.0.1.so differ
index e4b0ae4..b0c7e8f 100755 (executable)
Binary files a/3rdparty/lib/armeabi/libnative_camera_r4.0.0.so and b/3rdparty/lib/armeabi/libnative_camera_r4.0.0.so differ
index 1d4f33c..b3d3272 100755 (executable)
Binary files a/3rdparty/lib/armeabi/libnative_camera_r4.0.3.so and b/3rdparty/lib/armeabi/libnative_camera_r4.0.3.so differ
index 5699726..96ff7fb 100644 (file)
Binary files a/3rdparty/lib/libavcodec.a and b/3rdparty/lib/libavcodec.a differ
index 32ce59a..522b75b 100644 (file)
Binary files a/3rdparty/lib/libavcodec64.a and b/3rdparty/lib/libavcodec64.a differ
index 5ab33ab..c074ec6 100644 (file)
Binary files a/3rdparty/lib/libavdevice.a and b/3rdparty/lib/libavdevice.a differ
index d7d658d..bb69ea1 100644 (file)
Binary files a/3rdparty/lib/libavdevice64.a and b/3rdparty/lib/libavdevice64.a differ
index 8b8f98a..9929398 100644 (file)
Binary files a/3rdparty/lib/libavformat.a and b/3rdparty/lib/libavformat.a differ
index ed047c0..d91f58e 100644 (file)
Binary files a/3rdparty/lib/libavformat64.a and b/3rdparty/lib/libavformat64.a differ
index 18815e1..50db5c6 100644 (file)
Binary files a/3rdparty/lib/libavutil.a and b/3rdparty/lib/libavutil.a differ
index eac1d00..64e7bc7 100644 (file)
Binary files a/3rdparty/lib/libavutil64.a and b/3rdparty/lib/libavutil64.a differ
index cb3e777..97dad36 100644 (file)
Binary files a/3rdparty/lib/libswscale.a and b/3rdparty/lib/libswscale.a differ
index 0ff587e..5e3360e 100644 (file)
Binary files a/3rdparty/lib/libswscale64.a and b/3rdparty/lib/libswscale64.a differ
diff --git a/3rdparty/lib/x86/libnative_camera_r2.3.3.so b/3rdparty/lib/x86/libnative_camera_r2.3.3.so
new file mode 100755 (executable)
index 0000000..ce7d4b3
Binary files /dev/null and b/3rdparty/lib/x86/libnative_camera_r2.3.3.so differ
diff --git a/3rdparty/lib/x86/libnative_camera_r3.0.1.so b/3rdparty/lib/x86/libnative_camera_r3.0.1.so
new file mode 100755 (executable)
index 0000000..4f2d439
Binary files /dev/null and b/3rdparty/lib/x86/libnative_camera_r3.0.1.so differ
diff --git a/3rdparty/lib/x86/libnative_camera_r4.0.3.so b/3rdparty/lib/x86/libnative_camera_r4.0.3.so
new file mode 100755 (executable)
index 0000000..28e0f8f
Binary files /dev/null and b/3rdparty/lib/x86/libnative_camera_r4.0.3.so differ
index 9912e3b..61bb6a8 100644 (file)
@@ -22,18 +22,24 @@ file(GLOB lib_ext_hdrs jasper/*.h)
 add_library(${JASPER_LIBRARY} STATIC ${lib_srcs} ${lib_hdrs} ${lib_ext_hdrs})
 
 if(MSVC)
-  string(REPLACE "/W3" "/W0" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
-  string(REPLACE "/W4" "/W0" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+  if(NOT ENABLE_NOISY_WARNINGS)
+    string(REPLACE "/W3" "/W0" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+    string(REPLACE "/W4" "/W0" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+  endif()
   add_definitions(-DJAS_WIN_MSVC_BUILD)
 endif()
 
+if(CMAKE_COMPILER_IS_GNUCXX)
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-uninitialized")
+endif()
+
 if(UNIX)
   if(CMAKE_COMPILER_IS_GNUCXX OR CV_ICC)
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
   endif()
 endif()
 
-if(CMAKE_COMPILER_IS_GNUCXX)
+if(CMAKE_COMPILER_IS_GNUCXX AND NOT ENABLE_NOISY_WARNINGS)
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-implicit-function-declaration -Wno-unused")
 endif()
 
index e184815..881eebd 100644 (file)
@@ -82,8 +82,7 @@ set(lib_srcs
 
 if(UNIX)
   list(APPEND lib_srcs tif_unix.c)
-  if(CMAKE_COMPILER_IS_GNUCXX)
-    #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-strict-aliasing -Wno-int-to-pointer-cast")
+  if(CMAKE_COMPILER_IS_GNUCXX AND NOT ENABLE_NOISY_WARNINGS)
     set_source_files_properties(tif_unix.c PROPERTIES COMPILE_FLAGS "-w")
   endif()
 endif()
@@ -92,7 +91,7 @@ if(WIN32)
   list(APPEND lib_srcs tif_win32.c)
 endif(WIN32)
 
-if(MSVC)
+if(MSVC AND NOT ENABLE_NOISY_WARNINGS)
   string(REPLACE "/W4" "/W0" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
   string(REPLACE "/W4" "/W0" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
 endif()
index 409211a..1b4c7c3 100644 (file)
@@ -119,3 +119,7 @@ endif()
 if(NOT BUILD_SHARED_LIBS)
   install(TARGETS tbb ARCHIVE DESTINATION share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH} COMPONENT main)
 endif()
+
+# get TBB version
+ocv_parse_header("${tbb_src_dir}/include/tbb/tbb_stddef.h" TBB_VERSION_LINES TBB_VERSION_MAJOR TBB_VERSION_MINOR TBB_INTERFACE_VERSION CACHE)
+
index 6de6be1..c298f7d 100644 (file)
@@ -82,7 +82,7 @@ if(UNIX)
   endif()
 endif()
 
-if(MSVC)
+if(MSVC AND NOT ENABLE_NOISY_WARNINGS)
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4013")
 endif()
 
@@ -99,3 +99,6 @@ endif()
 if(NOT BUILD_SHARED_LIBS)
   install(TARGETS ${ZLIB_LIBRARY} ARCHIVE DESTINATION share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH} COMPONENT main)
 endif()
+
+ocv_parse_header2(ZLIB "${CMAKE_CURRENT_SOURCE_DIR}/zlib.h" ZLIB_VERSION PARENT_SCOPE)
+
index 797cc56..c43b07c 100644 (file)
@@ -104,7 +104,7 @@ OCV_OPTION(WITH_CUBLAS         "Include NVidia Cuda Basic Linear Algebra Subprog
 OCV_OPTION(WITH_CUDA           "Include NVidia Cuda Runtime support"         ON   IF (CMAKE_VERSION VERSION_GREATER "2.8" AND NOT ANDROID AND NOT IOS) )
 OCV_OPTION(WITH_CUFFT          "Include NVidia Cuda Fast Fourier Transform (FFT) library support"            ON  IF (CMAKE_VERSION VERSION_GREATER "2.8" AND NOT ANDROID AND NOT IOS) )
 OCV_OPTION(WITH_EIGEN          "Include Eigen2/Eigen3 support"               ON)
-OCV_OPTION(WITH_FFMPEG         "Include FFMPEG support"                      ON   IF (UNIX AND NOT ANDROID AND NOT IOS) )
+OCV_OPTION(WITH_FFMPEG         "Include FFMPEG support"                      ON   IF (NOT ANDROID AND NOT IOS) )
 OCV_OPTION(WITH_GSTREAMER      "Include Gstreamer support"                   ON   IF (UNIX AND NOT APPLE AND NOT ANDROID AND NOT IOS) )
 OCV_OPTION(WITH_GTK            "Include GTK support"                         ON   IF (UNIX AND NOT APPLE AND NOT ANDROID AND NOT IOS) )
 OCV_OPTION(WITH_IPP            "Include Intel IPP support"                   OFF  IF (MSVC OR X86 OR X86_64) )
@@ -167,6 +167,7 @@ OCV_OPTION(ENABLE_SSE3                "Enable SSE3 instructions"
 OCV_OPTION(ENABLE_SSSE3               "Enable SSSE3 instructions"                                OFF  IF (CMAKE_COMPILER_IS_GNUCXX AND (X86 OR X86_64)) )
 OCV_OPTION(ENABLE_SSE41               "Enable SSE4.1 instructions"                               OFF  IF (CV_ICC OR CMAKE_COMPILER_IS_GNUCXX AND (X86 OR X86_64)) )
 OCV_OPTION(ENABLE_SSE42               "Enable SSE4.2 instructions"                               OFF  IF (CMAKE_COMPILER_IS_GNUCXX AND (X86 OR X86_64)) )
+OCV_OPTION(ENABLE_NOISY_WARNINGS      "Show all warnings even if they are too noisy"             OFF )
 OCV_OPTION(OPENCV_WARNINGS_ARE_ERRORS "Treat warnings as errors"                                 OFF )
 
 # uncategorized options
@@ -242,15 +243,6 @@ ocv_include_directories(${OPENCV_CONFIG_FILE_INCLUDE_DIR})
 
 
 # ----------------------------------------------------------------------------
-# Use statically or dynamically linked CRT?
-# Default: dynamic
-# ----------------------------------------------------------------------------
-if(MSVC)
-  include(cmake/OpenCVCRTLinkage.cmake REQUIRED)
-endif(MSVC)
-
-
-# ----------------------------------------------------------------------------
 #  Autodetect if we are in a SVN repository
 # ----------------------------------------------------------------------------
 find_host_program(SVNVERSION_PATH svnversion)
@@ -285,6 +277,15 @@ endif()
 
 
 # ----------------------------------------------------------------------------
+# Use statically or dynamically linked CRT?
+# Default: dynamic
+# ----------------------------------------------------------------------------
+if(MSVC)
+  include(cmake/OpenCVCRTLinkage.cmake REQUIRED)
+endif(MSVC)
+
+
+# ----------------------------------------------------------------------------
 #       CHECK FOR SYSTEM LIBRARIES, OPTIONS, ETC..
 # ----------------------------------------------------------------------------
 if(UNIX)
@@ -381,7 +382,9 @@ if(UNIX)
     endif()
 
     if(HAVE_FFMPEG)
-    CHECK_MODULE(libavformat>=52.111.0 NEW_FFMPEG)
+      if(NOT ALIASOF_libavformat_VERSION VERSION_LESS "52.111.0")
+        set(NEW_FFMPEG ON)
+      endif()
     endif()
 
     if(WITH_1394)
@@ -427,6 +430,42 @@ if(UNIX)
     endif()
 endif()
 
+if(APPLE AND WITH_FFMPEG)
+  set(FFMPEG_DEFAULT_INCLUDE_DIRS "/usr/local/include/" "/usr/include/" "opt/include/")
+
+  find_path(FFMPEG_INCLUDE_DIR "libavformat/avformat.h" PATHS ${FFMPEG_DEFAULT_INCLUDE_DIRS} DOC "The path to FFMPEG headers")
+  if(FFMPEG_INCLUDE_DIR)
+    set(HAVE_GENTOO_FFMPEG 1)
+    set(FFMPEG_LIB_DIR "${FFMPEG_INCLUDE_DIR}/../lib" CACHE PATH "Full path of FFMPEG library directory")
+    if(EXISTS "${FFMPEG_LIB_DIR}/libavcodec.a")
+    set(HAVE_FFMPEG_CODEC 1)
+    set(ALIASOF_libavcodec_VERSION "Unknown")
+    if(EXISTS "${FFMPEG_LIB_DIR}/libavformat.a")
+    set(HAVE_FFMPEG_FORMAT 1)
+    set(ALIASOF_libavformat_VERSION "Unknown")
+    if(EXISTS "${FFMPEG_LIB_DIR}/libavutil.a")
+    set(HAVE_FFMPEG_UTIL 1)
+    set(ALIASOF_libavutil_VERSION "Unknown")
+    if(EXISTS "${FFMPEG_LIB_DIR}/libswscale.a")
+        ocv_include_directories(${FFMPEG_INCLUDE_DIR})
+        set(HAVE_FFMPEG_SWSCALE 1)
+        set(ALIASOF_libswscale_VERSION "Unknown")
+        set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} "${FFMPEG_LIB_DIR}/libavcodec.a"
+            "${FFMPEG_LIB_DIR}/libavformat.a" "${FFMPEG_LIB_DIR}/libavutil.a"
+            "${FFMPEG_LIB_DIR}/libswscale.a")
+        set(HAVE_FFMPEG 1)
+        set(NEW_FFMPEG 1)
+    endif()
+    endif()
+    endif()
+    endif()
+  endif()
+endif()
+
+if(WIN32 AND WITH_FFMPEG)
+  include(3rdparty/ffmpeg/ffmpeg_version.cmake REQUIRED)
+endif()
+
 #################### LATEX for dpf documentation ##################
 if(BUILD_DOCS)
   include(cmake/OpenCVFindLATEX.cmake REQUIRED)
@@ -524,6 +563,7 @@ if(WITH_EIGEN)
             DOC "The path to Eigen2/Eigen3 headers")
   if(EIGEN_INCLUDE_PATH)
     ocv_include_directories(${EIGEN_INCLUDE_PATH})
+    ocv_parse_header("${EIGEN_INCLUDE_PATH}/Eigen/src/Core/util/Macros.h" EIGEN_VERSION_LINES EIGEN_WORLD_VERSION EIGEN_MAJOR_VERSION EIGEN_MINOR_VERSION)
     set(HAVE_EIGEN 1)
   endif()
 endif()
@@ -646,12 +686,17 @@ include(cmake/OpenCVGenConfig.cmake REQUIRED)
 # ----------------------------------------------------------------------------
 status("")
 status("General configuration for OpenCV ${OPENCV_VERSION} =====================================")
+if(OPENCV_SVNVERSION)
+  status("Version control:" ${OPENCV_SVNVERSION})
+endif()
 
 #build platform
 status("")
 status("  Platform:")
 status("    Host:"             ${CMAKE_HOST_SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_VERSION} ${CMAKE_HOST_SYSTEM_PROCESSOR})
-status("    Target:"           ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION} ${CMAKE_SYSTEM_PROCESSOR})
+if(CMAKE_CROSSCOMPILING)
+  status("    Target:"           ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION} ${CMAKE_SYSTEM_PROCESSOR})
+endif()
 status("    CMake:"            ${CMAKE_VERSION})
 status("    CMake generator:"  ${CMAKE_GENERATOR})
 status("    CMake build tool:" ${CMAKE_BUILD_TOOL})
@@ -664,11 +709,14 @@ endif()
 
 # C/C++ options
 status("")
-status("  C++:")
+status("  C/C++:")
 status("    Built as dynamic libs?:" BUILD_SHARED_LIBS THEN YES ELSE NO)
-status("    C++ Compiler:"           CMAKE_COMPILER    THEN "${CMAKE_COMPILER}" ELSE "${CMAKE_CXX_COMPILER}")
+status("    C++ Compiler:"           CMAKE_COMPILER_IS_GNUCXX THEN "${CMAKE_CXX_COMPILER} (ver ${CMAKE_GCC_REGEX_VERSION})" ELSE "${CMAKE_CXX_COMPILER}" )
 status("    C++ flags (Release):"    ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE})
 status("    C++ flags (Debug):"      ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG})
+status("    C Compiler:"             ${CMAKE_C_COMPILER})
+status("    C flags (Release):"      ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_RELEASE})
+status("    C flags (Debug):"        ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG})
 if(WIN32)
   status("    Linker flags (Release):" ${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_RELEASE})
   status("    Linker flags (Debug):"   ${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_DEBUG})
@@ -721,8 +769,8 @@ status("")
 status("  GUI: ")
 
 if (HAVE_QT)
-  status("    QT 4.x:"            HAVE_QT        THEN YES ELSE NO)
-  status("    QT OpenGL support:" HAVE_QT_OPENGL THEN YES ELSE NO)
+  status("    QT 4.x:"            HAVE_QT        THEN "YES (ver ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH} ${QT_EDITION})" ELSE NO)
+  status("    QT OpenGL support:" HAVE_QT_OPENGL THEN "YES (${QT_QTOPENGL_LIBRARY})" ELSE NO)
 else()
   if(WIN32)
     status("    Win32 UI:" YES)
@@ -734,45 +782,45 @@ else()
         status("    Cocoa:"  YES)
       endif()
     else()
-      status("    GTK+ 2.x:" HAVE_GTK      THEN YES ELSE NO)
-      status("    GThread :" HAVE_GTHREAD  THEN YES ELSE NO)
-      status("    GtkGlExt:" HAVE_GTKGLEXT THEN YES ELSE NO)
+      status("    GTK+ 2.x:" HAVE_GTK      THEN "YES (ver ${ALIASOF_gtk+-2.0_VERSION})"     ELSE NO)
+      status("    GThread :" HAVE_GTHREAD  THEN "YES (ver ${ALIASOF_gthread-2.0_VERSION})"  ELSE NO)
+      status("    GtkGlExt:" HAVE_GTKGLEXT THEN "YES (ver ${ALIASOF_gtkglext-1.0_VERSION})" ELSE NO)
     endif()
   endif()
 endif()
 
-status("    OpenGL support:" HAVE_OPENGL THEN YES ELSE NO)
+status("    OpenGL support:" HAVE_OPENGL THEN "YES (${OPENGL_LIBRARIES})" ELSE NO)
 
 # media
 status("")
 status("  Media I/O: ")
-status("    ZLib:"         ZLIB_FOUND    THEN "${ZLIB_LIBRARY}"    ELSE build)
+status("    ZLib:"         BUILD_ZLIB    THEN "build (ver ${ZLIB_VERSION_STRING})"               ELSE "${ZLIB_LIBRARY} (ver ${ZLIB_VERSION_STRING})")
 
 if(WITH_JPEG)
-  status("    JPEG:"       JPEG_FOUND    THEN "${JPEG_LIBRARY}"    ELSE build)
+  status("    JPEG:"       JPEG_FOUND    THEN "${JPEG_LIBRARY} (ver ${JPEG_LIB_VERSION})"        ELSE "build (ver ${JPEG_LIB_VERSION})")
 else()
   status("    JPEG:"       "NO")
 endif()
 if(WITH_PNG)
-  status("    PNG:"        PNG_FOUND     THEN "${PNG_LIBRARY}"     ELSE build)
+  status("    PNG:"        PNG_FOUND     THEN "${PNG_LIBRARY} (ver ${PNG_VERSION})"              ELSE "build (ver ${PNG_VERSION})")
 else()
   status("    PNG:"        "NO")
 endif()
 if(WITH_TIFF)
-  status("    TIFF:"       TIFF_FOUND    THEN "${TIFF_LIBRARY}"    ELSE build)
+  status("    TIFF:"       TIFF_FOUND    THEN "${TIFF_LIBRARY} (ver ${TIFF_VERSION})"            ELSE "build (ver ${TIFF_VERSION})")
 else()
   status("    TIFF:"       "NO")
 endif()
 if(WITH_JASPER)
-  status("    JPEG 2000:"  JASPER_FOUND  THEN "${JASPER_LIBRARY}"  ELSE build)
+  status("    JPEG 2000:"  JASPER_FOUND  THEN "${JASPER_LIBRARY} (ver ${JASPER_VERSION_STRING})" ELSE "build (ver ${JASPER_VERSION_STRING})")
 else()
   status("    JPEG 2000:"  "NO")
 endif()
 
-status("    OpenEXR:"   WITH_OPENEXR AND OPENEXR_FOUND     THEN YES             ELSE NO)
-status("    OpenNI:"    HAVE_OPENNI                        THEN YES             ELSE NO)
+status("    OpenEXR:"   WITH_OPENEXR AND OPENEXR_FOUND     THEN "${OPENEXR_LIBRARIES} (ver ${OPENEXR_VERSION})"                     ELSE NO)
+status("    OpenNI:"    HAVE_OPENNI                        THEN "YES (ver ${OPENNI_VERSION_STRING}, build ${OPENNI_VERSION_BUILD})" ELSE NO)
 status("    OpenNI PrimeSensor Modules:"
-                        HAVE_OPENNI_PRIME_SENSOR_MODULE    THEN YES             ELSE NO)
+                        HAVE_OPENNI_PRIME_SENSOR_MODULE    THEN "YES (${OPENNI_PRIME_SENSOR_MODULE})"                               ELSE NO)
 if(WIN32)
   status("    XIMEA:"     HAVE_XIMEA  THEN YES ELSE NO)
 endif()
@@ -781,19 +829,29 @@ endif()
 status("")
 if(UNIX AND NOT APPLE)
   status("  Video I/O:")
-  status("    DC1394 1.x:"     HAVE_DC1394         THEN YES ELSE NO)
-  status("    DC1394 2.x:"     HAVE_DC1394_2       THEN YES ELSE NO)
-  status("    FFMPEG:"         HAVE_FFMPEG         THEN YES ELSE NO)
-  status("      codec:"        HAVE_FFMPEG_CODEC   THEN YES ELSE NO)
-  status("      format:"       HAVE_FFMPEG_FORMAT  THEN YES ELSE NO)
-  status("      util:"         HAVE_FFMPEG_UTIL    THEN YES ELSE NO)
-  status("      swscale:"      HAVE_FFMPEG_SWSCALE THEN YES ELSE NO)
-  status("      gentoo-style:" HAVE_GENTOO_FFMPEG  THEN YES ELSE NO)
-  status("    GStreamer:"      HAVE_GSTREAMER      THEN YES ELSE NO)
-  status("    UniCap:"         HAVE_UNICAP         THEN YES ELSE NO)
+  status("    DC1394 1.x:"     HAVE_DC1394         THEN "YES (ver ${ALIASOF_libdc1394_VERSION})"   ELSE NO)
+  status("    DC1394 2.x:"     HAVE_DC1394_2       THEN "YES (ver ${ALIASOF_libdc1394-2_VERSION})" ELSE NO)
+  status("    GStreamer:"      HAVE_GSTREAMER      THEN "" ELSE NO)
+  if(HAVE_GSTREAMER)
+    status("      base:"       "YES (ver ${ALIASOF_gstreamer-base-0.10_VERSION})")
+    status("      app:"        "YES (ver ${ALIASOF_gstreamer-app-0.10_VERSION})")
+    status("      video:"      "YES (ver ${ALIASOF_gstreamer-video-0.10_VERSION})")
+  endif()
+  status("    UniCap:"         HAVE_UNICAP         THEN "YES (ver ${ALIASOF_libunicap_VERSION})"        ELSE NO)
+  status("    UniCap ucil:"    HAVE_UNICAP_UCIL    THEN "YES (ver ${ALIASOF_libucil_VERSION})"          ELSE NO)
   status("    PvAPI:"          HAVE_PVAPI          THEN YES ELSE NO)
-  status("    V4L/V4L2:"       HAVE_LIBV4L         THEN "Using libv4l" ELSE ${HAVE_CAMV4L}/${HAVE_CAMV4L2})
-  status("    Xine:"           HAVE_XINE           THEN YES ELSE NO)
+  if(HAVE_CAMV4L)
+    set(HAVE_CAMV4L_STR "YES")
+  else()
+    set(HAVE_CAMV4L_STR "NO")
+  endif()
+ if(HAVE_CAMV4L2)
+    set(HAVE_CAMV4L2_STR "YES")
+  else()
+    set(HAVE_CAMV4L2_STR "NO")
+  endif()
+  status("    V4L/V4L2:"       HAVE_LIBV4L         THEN "Using libv4l (ver ${ALIASOF_libv4l1_VERSION})" ELSE "${HAVE_CAMV4L_STR}/${HAVE_CAMV4L2_STR}")
+  status("    Xine:"           HAVE_XINE           THEN "YES (ver ${ALIASOF_libxine_VERSION})"          ELSE NO)
 
   if(ANDROID)
     if(HAVE_opencv_androidcamera)
@@ -809,9 +867,20 @@ elseif(APPLE)
     status("  Video I/O: AVFoundation")
   endif()
 elseif(WIN32)
-  status("  Video I/O:"        HAVE_VIDEOINPUT     THEN DirectShow ELSE NO)
+  status("  Video I/O:"      HAVE_VIDEOINPUT     THEN DirectShow ELSE NO)
 endif()
 
+if(WIN32)
+  status("    FFMPEG:"         WITH_FFMPEG         THEN "YES (prebuilt binaries)" ELSE NO)
+else()
+  status("    FFMPEG:"         HAVE_FFMPEG         THEN YES ELSE NO)
+endif()
+status("      codec:"        HAVE_FFMPEG_CODEC   THEN "YES (ver ${ALIASOF_libavcodec_VERSION})"  ELSE NO)
+status("      format:"       HAVE_FFMPEG_FORMAT  THEN "YES (ver ${ALIASOF_libavformat_VERSION})" ELSE NO)
+status("      util:"         HAVE_FFMPEG_UTIL    THEN "YES (ver ${ALIASOF_libavutil_VERSION})"   ELSE NO)
+status("      swscale:"      HAVE_FFMPEG_SWSCALE THEN "YES (ver ${ALIASOF_libswscale_VERSION})"  ELSE NO)
+status("      gentoo-style:" HAVE_GENTOO_FFMPEG  THEN YES ELSE NO)
+
 # Other third-party libraries
 status("")
 status("  Other third-party libraries:")
@@ -823,31 +892,48 @@ else()
   status("    Use IPP:"   WITH_IPP AND NOT IPP_FOUND THEN "IPP not found" ELSE NO)
 endif()
 
-status("    Use TBB:"   HAVE_TBB   THEN YES ELSE NO)
-status("    Use Cuda:"  HAVE_CUDA  THEN YES ELSE NO)
-status("    Use Eigen:" HAVE_EIGEN THEN YES ELSE NO)
+status("    Use TBB:"   HAVE_TBB   THEN "YES (ver ${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR} interface ${TBB_INTERFACE_VERSION})" ELSE NO)
+status("    Use Cuda:"  HAVE_CUDA  THEN "YES (ver ${CUDA_VERSION_STRING})" ELSE NO)
+status("    Use Eigen:" HAVE_EIGEN THEN "YES (ver ${EIGEN_WORLD_VERSION}.${EIGEN_MAJOR_VERSION}.${EIGEN_MINOR_VERSION})" ELSE NO)
 status("    Use Clp:"   HAVE_CLP   THEN YES ELSE NO)
 
-status("")
-status("  Python interpreter:"  PYTHON_EXECUTABLE        THEN "${PYTHON_EXECUTABLE} (ver ${PYTHON_VERSION_MAJOR_MINOR})" ELSE NO)
+if(HAVE_CUDA)
+  status("")
+  status("  NVIDIA CUDA:")
+
+  status("    Use CUFFT:"            HAVE_CUFFT  THEN YES ELSE NO)
+  status("    Use CUBLAS:"           HAVE_CUBLAS THEN YES ELSE NO)
+  status("    NVIDIA GPU arch:"      ${OPENCV_CUDA_ARCH_BIN})
+  status("    NVIDIA PTX archs:"     ${OPENCV_CUDA_ARCH_BIN})
+  status("    NVIDIA GPU features:"  ${OPENCV_CUDA_ARCH_FEATURES})
+endif()
+
 # interfaces to other languages
 status("")
-status("  Interfaces:")
-status("    Python:"              HAVE_opencv_python THEN YES ELSE NO)
-status("    Python numpy:"        PYTHON_USE_NUMPY THEN YES ELSE "NO (Python wrappers can not be generated)")
-if(ANDROID)
-  status("    Java:" HAVE_opencv_java THEN YES ELSE NO)
+status("  Python:")
+status("    Interpreter:"   PYTHON_EXECUTABLE     THEN "${PYTHON_EXECUTABLE} (ver ${PYTHON_VERSION_FULL})"         ELSE NO)
+if(BUILD_opencv_python)
+  status("    Libraries:"     HAVE_opencv_python  THEN  ${PYTHON_LIBRARIES}                                        ELSE NO)
+  status("    numpy:"         PYTHON_USE_NUMPY    THEN "${PYTHON_NUMPY_INCLUDE_DIR} (ver ${PYTHON_NUMPY_VERSION})" ELSE "NO (Python wrappers can not be generated)")
+  status("    packages path:" PYTHON_EXECUTABLE   THEN "${PYTHON_PACKAGES_PATH}"                                   ELSE "-")
+endif()
+
+if(BUILD_opencv_java)
+  status("")
+  status("  Java:" HAVE_opencv_java THEN YES ELSE NO)
 endif()
 
 # documentation
-status("")
-status("  Documentation:")
-status("    Sphinx:"              HAVE_SPHINX              THEN "${SPHINX_BUILD} (ver ${SPHINX_VERSION})" ELSE NO)
-status("    PdfLaTeX compiler:"   PDFLATEX_COMPILER        THEN "${PDFLATEX_COMPILER}" ELSE NO)
-if(BUILD_DOCS AND HAVE_SPHINX)
-  status("    Build Documentation:" PDFLATEX_COMPILER    THEN YES ELSE "YES (only HTML without math expressions)")
-else()
-  status("    Build Documentation:" NO)
+if(BUILD_DOCS)
+  status("")
+  status("  Documentation:")
+  if(HAVE_SPHINX)
+    status("    Build Documentation:" PDFLATEX_COMPILER      THEN YES ELSE "YES (only HTML and without math expressions)")
+  else()
+    status("    Build Documentation:" NO)
+  endif()
+  status("    Sphinx:"              HAVE_SPHINX              THEN "${SPHINX_BUILD} (ver ${SPHINX_VERSION})" ELSE NO)
+  status("    PdfLaTeX compiler:"   PDFLATEX_COMPILER        THEN "${PDFLATEX_COMPILER}" ELSE NO)
 endif()
 
 # samples and tests
index 1cbd299..11c4e1f 100644 (file)
 #     [+] improved toolchain loading speed
 #     [+] added assembler language support (.S)
 #     [+] allowed preset search paths and extra search suffixes
+#   - modified April 2012 Andrey Kamaev andrey.kamaev@itseez.com
+#     [+] updated for NDK r7c
 # ------------------------------------------------------------------------------
 
 cmake_minimum_required( VERSION 2.6.3 )
@@ -188,7 +190,7 @@ set( CMAKE_SYSTEM_NAME Linux )
 #this one not so much
 set( CMAKE_SYSTEM_VERSION 1 )
 
-set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" )
+set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" )
 if(NOT DEFINED ANDROID_NDK_SEARCH_PATHS)
  if( CMAKE_HOST_WIN32 )
   file( TO_CMAKE_PATH "$ENV{PROGRAMFILES}" ANDROID_NDK_SEARCH_PATHS )
index c32a313..2ee3637 100644 (file)
@@ -3390,6 +3390,7 @@ CvClassifier* cvCreateBtClassifierFromFile( const char* filename )
     int num_features;
     int num_classes;
     int type;
+    int values_read = -1;
 
     CV_ASSERT( filename != NULL );
 
@@ -3400,7 +3401,8 @@ CvClassifier* cvCreateBtClassifierFromFile( const char* filename )
         CV_ERROR( CV_StsError, "Unable to open file" );
     }
     
-    fscanf( file, "%d %d %d %d", &type, &num_classes, &num_features, &num_classifiers );
+    values_read = fscanf( file, "%d %d %d %d", &type, &num_classes, &num_features, &num_classifiers );
+    CV_Assert(values_read == 4);
 
     CV_ASSERT( type >= (int) CV_DABCLASS && type <= (int) CV_MREG );
     CV_ASSERT( num_features > 0 );
@@ -3418,7 +3420,8 @@ CvClassifier* cvCreateBtClassifierFromFile( const char* filename )
         int count;
         CvCARTClassifier* tree;
 
-        fscanf( file, "%d", &count );
+        values_read = fscanf( file, "%d", &count );
+        CV_Assert(values_read == 1);
 
         data_size = sizeof( *tree )
             + count * ( sizeof( *(tree->compidx) ) + sizeof( *(tree->threshold) ) +
@@ -3439,14 +3442,16 @@ CvClassifier* cvCreateBtClassifierFromFile( const char* filename )
         tree->count = count;
         for( j = 0; j < tree->count; j++ )
         {
-            fscanf( file, "%d %g %d %d", &(tree->compidx[j]),
+            values_read = fscanf( file, "%d %g %d %d", &(tree->compidx[j]),
                                          &(tree->threshold[j]),
                                          &(tree->left[j]),
                                          &(tree->right[j]) );
+            CV_Assert(values_read == 4);
         }
         for( j = 0; j <= tree->count; j++ )
         {
-            fscanf( file, "%g", &(tree->val[j]) );
+            values_read = fscanf( file, "%g", &(tree->val[j]) );
+            CV_Assert(values_read == 1);
         }
         ptr->trees[i] = tree;
     }
@@ -3553,6 +3558,7 @@ void cvReadTrainData( const char* filename, int flags,
     int m, n;
     int i, j;
     float val;
+    int values_read = -1;
 
     if( filename == NULL )
     {
@@ -3575,7 +3581,8 @@ void cvReadTrainData( const char* filename, int flags,
         CV_ERROR( CV_StsError, "Unable to open file" );
     }
 
-    fscanf( file, "%d %d", &m, &n );
+    values_read = fscanf( file, "%d %d", &m, &n );
+    CV_Assert(values_read == 2);
 
     if( CV_IS_ROW_SAMPLE( flags ) )
     {
@@ -3592,7 +3599,8 @@ void cvReadTrainData( const char* filename, int flags,
     {
         for( j = 0; j < n; j++ )
         {
-            fscanf( file, "%f", &val );
+            values_read = fscanf( file, "%f", &val );
+            CV_Assert(values_read == 1);
             if( CV_IS_ROW_SAMPLE( flags ) )
             {
                 CV_MAT_ELEM( **trainData, float, i, j ) = val;
@@ -3602,7 +3610,8 @@ void cvReadTrainData( const char* filename, int flags,
                 CV_MAT_ELEM( **trainData, float, j, i ) = val;
             }
         }
-        fscanf( file, "%f", &val );
+        values_read = fscanf( file, "%f", &val );
+        CV_Assert(values_read == 2);
         CV_MAT_ELEM( **trainClasses, float, 0, i ) = val;
     }
 
index 004508b..458712b 100644 (file)
@@ -285,18 +285,20 @@ void icvLoadHaarFeature( CvTHaarFeature* feature, FILE* file )
     int weight;
 
     nrect = 0;
-    fscanf( file, "%d", &nrect );
+    int values_read = fscanf( file, "%d", &nrect );
+    CV_Assert(values_read == 1);
 
     assert( nrect <= CV_HAAR_FEATURE_MAX );
 
     for( j = 0; j < nrect; j++ )
     {
-        fscanf( file, "%d %d %d %d %d %d",
+        values_read = fscanf( file, "%d %d %d %d %d %d",
             &(feature->rect[j].r.x),
             &(feature->rect[j].r.y),
             &(feature->rect[j].r.width),
             &(feature->rect[j].r.height),
             &tmp, &weight );
+        CV_Assert(values_read == 6);
         feature->rect[j].weight = (float) weight;
     }
     for( j = nrect; j < CV_HAAR_FEATURE_MAX; j++ )
@@ -307,7 +309,8 @@ void icvLoadHaarFeature( CvTHaarFeature* feature, FILE* file )
         feature->rect[j].r.height = 0;
         feature->rect[j].weight = 0.0f;
     }
-    fscanf( file, "%s", &(feature->desc[0]) );
+    values_read = fscanf( file, "%s", &(feature->desc[0]) );
+    CV_Assert(values_read == 1);
     feature->tilted = ( feature->desc[0] == 't' );
 }
 
@@ -342,19 +345,23 @@ CvIntHaarClassifier* icvLoadCARTHaarClassifier( FILE* file, int step )
     int count;
 
     ptr = NULL;
-    fscanf( file, "%d", &count );
+    int values_read = fscanf( file, "%d", &count );
+    CV_Assert(values_read == 1);
+
     if( count > 0 )
     {
         ptr = (CvCARTHaarClassifier*) icvCreateCARTHaarClassifier( count );
         for( i = 0; i < count; i++ )
         {
             icvLoadHaarFeature( &(ptr->feature[i]), file );
-            fscanf( file, "%f %d %d", &(ptr->threshold[i]), &(ptr->left[i]),
+            values_read = fscanf( file, "%f %d %d", &(ptr->threshold[i]), &(ptr->left[i]),
                                       &(ptr->right[i]) );
+            CV_Assert(values_read == 3);
         }
         for( i = 0; i <= count; i++ )
         {
-            fscanf( file, "%f", &(ptr->val[i]) );
+            values_read = fscanf( file, "%f", &(ptr->val[i]) );
+            CV_Assert(values_read == 1);
         }
         icvConvertToFastHaarFeature( ptr->feature, ptr->fastfeature, ptr->count, step );
     }
@@ -402,7 +409,8 @@ CvIntHaarClassifier* icvLoadCARTStageHaarClassifierF( FILE* file, int step )
         float threshold;
 
         count = 0;
-        fscanf( file, "%d", &count );
+        int values_read = fscanf( file, "%d", &count );
+        CV_Assert(values_read == 1);
         if( count > 0 )
         {
             ptr = (CvStageHaarClassifier*) icvCreateStageHaarClassifier( count, 0.0F );
@@ -411,7 +419,8 @@ CvIntHaarClassifier* icvLoadCARTStageHaarClassifierF( FILE* file, int step )
                 ptr->classifier[i] = icvLoadCARTHaarClassifier( file, step );
             }
 
-            fscanf( file, "%f", &threshold );
+            values_read = fscanf( file, "%f", &threshold );
+            CV_Assert(values_read == 1);
 
             ptr->threshold = threshold;
             /* to be compatible with the previous implementation */
index 348686a..dc9f3ac 100644 (file)
@@ -1854,9 +1854,11 @@ int icvGetHaarTraininDataFromVecCallback( CvMat* img, void* userdata )
 
     assert( img->rows * img->cols == ((CvVecFile*) userdata)->vecsize );
     
-    fread( &tmp, sizeof( tmp ), 1, ((CvVecFile*) userdata)->input );
-    fread( ((CvVecFile*) userdata)->vector, sizeof( short ),
+    size_t elements_read = fread( &tmp, sizeof( tmp ), 1, ((CvVecFile*) userdata)->input );
+    CV_Assert(elements_read == 1);
+    elements_read = fread( ((CvVecFile*) userdata)->vector, sizeof( short ),
            ((CvVecFile*) userdata)->vecsize, ((CvVecFile*) userdata)->input );
+    CV_Assert(elements_read == (size_t)((CvVecFile*) userdata)->vecsize);
     
     if( feof( ((CvVecFile*) userdata)->input ) || 
         (((CvVecFile*) userdata)->last)++ >= ((CvVecFile*) userdata)->count )
@@ -1919,10 +1921,12 @@ int icvGetHaarTrainingDataFromVec( CvHaarTrainingData* data, int first, int coun
 
     if( file.input != NULL )
     {
-        fread( &file.count, sizeof( file.count ), 1, file.input );
-        fread( &file.vecsize, sizeof( file.vecsize ), 1, file.input );
-        fread( &tmp, sizeof( tmp ), 1, file.input );
-        fread( &tmp, sizeof( tmp ), 1, file.input );
+        size_t elements_read1 = fread( &file.count, sizeof( file.count ), 1, file.input );
+        size_t elements_read2 = fread( &file.vecsize, sizeof( file.vecsize ), 1, file.input );
+        size_t elements_read3 = fread( &tmp, sizeof( tmp ), 1, file.input );
+        size_t elements_read4 = fread( &tmp, sizeof( tmp ), 1, file.input );
+        CV_Assert(elements_read1 == 1 && elements_read2 == 1 && elements_read3 == 1 && elements_read4 == 1);
+
         if( !feof( file.input ) )
         {
             if( file.vecsize != data->winsize.width * data->winsize.height )
@@ -1970,10 +1974,11 @@ int icvGetHaarTrainingDataFromBG( CvHaarTrainingData* data, int first, int count
 
         if( file.input != NULL )
         {
-            fread( &file.count, sizeof( file.count ), 1, file.input );
-            fread( &file.vecsize, sizeof( file.vecsize ), 1, file.input );
-            fread( &tmp, sizeof( tmp ), 1, file.input );
-            fread( &tmp, sizeof( tmp ), 1, file.input );
+            size_t elements_read1 = fread( &file.count, sizeof( file.count ), 1, file.input );
+            size_t elements_read2 = fread( &file.vecsize, sizeof( file.vecsize ), 1, file.input );
+            size_t elements_read3 = fread( &tmp, sizeof( tmp ), 1, file.input );
+            size_t elements_read4 = fread( &tmp, sizeof( tmp ), 1, file.input );
+            CV_Assert(elements_read1 == 1 && elements_read2 == 1 && elements_read3 == 1 && elements_read4 == 1);
             if( !feof( file.input ) )
             {
                 if( file.vecsize != data->winsize.width * data->winsize.height )
index 39313ec..2702384 100644 (file)
@@ -884,10 +884,11 @@ void cvShowVecSamples( const char* filename, int winwidth, int winheight,
 
     if( file.input != NULL )
     {
-        fread( &file.count, sizeof( file.count ), 1, file.input );
-        fread( &file.vecsize, sizeof( file.vecsize ), 1, file.input );
-        fread( &tmp, sizeof( tmp ), 1, file.input );
-        fread( &tmp, sizeof( tmp ), 1, file.input );
+        size_t elements_read1 = fread( &file.count, sizeof( file.count ), 1, file.input );
+        size_t elements_read2 = fread( &file.vecsize, sizeof( file.vecsize ), 1, file.input );
+        size_t elements_read3 = fread( &tmp, sizeof( tmp ), 1, file.input );
+        size_t elements_read4 = fread( &tmp, sizeof( tmp ), 1, file.input );
+        CV_Assert(elements_read1 == 1 && elements_read2 == 1 && elements_read3 == 1 && elements_read4 == 1);
 
         if( file.vecsize != winwidth * winheight )
         {
index 77d50d4..64089c6 100644 (file)
@@ -150,8 +150,10 @@ bool CvCascadeImageReader::PosReader::get( Mat &_img )
 {
     CV_Assert( _img.rows * _img.cols == vecSize );
     uchar tmp = 0;
-    fread( &tmp, sizeof( tmp ), 1, file );
-    fread( vec, sizeof( vec[0] ), vecSize, file );
+    size_t elements_read = fread( &tmp, sizeof( tmp ), 1, file );
+    CV_Assert(elements_read == 1);
+    elements_read = fread( vec, sizeof( vec[0] ), vecSize, file );
+    CV_Assert(elements_read == (size_t)(vecSize));
 
     if( feof( file ) || last++ >= count )
         return false;
index 47590a8..8f8bdc7 100644 (file)
@@ -1,5 +1,13 @@
 if (WIN32 AND CMAKE_GENERATOR MATCHES "(MinGW)|(MSYS)")
-    set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG" CACHE STRING "")
+  set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG" CACHE STRING "")
+endif()
+
+if(MSVC)
+  if(CMAKE_CXX_FLAGS STREQUAL CMAKE_CXX_FLAGS_INIT)
+    # override cmake default exception handling option
+    string(REPLACE "/EHsc" "/EHa" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}"  CACHE STRING "Flags used by the compiler during all build types." FORCE)
+  endif()
 endif()
 
 set(OPENCV_EXTRA_C_FLAGS "")
@@ -10,143 +18,142 @@ set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "")
 set(OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG "")
 
 if(MSVC)
-    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS")
-    # 64-bit portability warnings, in MSVC8
-    if(MSVC80)
-        set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} /Wp64")
-    endif()
-    #if(MSVC90)
-    #    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} /D _BIND_TO_CURRENT_CRT_VERSION=1 /D _BIND_TO_CURRENT_VCLIBS_VERSION=1")
-    #endif()
-
-    if(BUILD_WITH_DEBUG_INFO)
-        set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE} /debug")
-    endif()
-
-    # Remove unreferenced functions: function level linking
-    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} /Gy")
-    set(OPENCV_EXTRA_C_FLAGS_DEBUG "${OPENCV_EXTRA_C_FLAGS_DEBUG} /bigobj")
-    if(BUILD_WITH_DEBUG_INFO)
-       set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} /Zi")
-    endif()
+  set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS")
+  # 64-bit portability warnings, in MSVC80
+  if(MSVC80)
+    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} /Wp64")
+  endif()
+
+  if(BUILD_WITH_DEBUG_INFO)
+    set(OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE "${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE} /debug")
+  endif()
+
+  # Remove unreferenced functions: function level linking
+  set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} /Gy")
+  if(NOT MSVC_VERSION LESS 1400)
+    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} /bigobj")
+  endif()
+  if(BUILD_WITH_DEBUG_INFO)
+    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} /Zi")
+  endif()
 endif()
 
 if(CMAKE_COMPILER_IS_GNUCXX)
-    # High level of warnings.
-    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} -Wall")
-
-    # The -Wno-long-long is required in 64bit systems when including sytem headers.
-    if(X86_64)
-        set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} -Wno-long-long")
+  # High level of warnings.
+  set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} -Wall")
+
+  # The -Wno-long-long is required in 64bit systems when including sytem headers.
+  if(X86_64)
+    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} -Wno-long-long")
+  endif()
+
+  # We need pthread's
+  if(UNIX AND NOT ANDROID)
+    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} -pthread")
+  endif()
+
+  if(OPENCV_WARNINGS_ARE_ERRORS)
+    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} -Werror")
+  endif()
+
+  if(X86 AND NOT MINGW64 AND NOT X86_64 AND NOT APPLE)
+    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} -march=i686")
+  endif()
+
+  # Other optimizations
+  if(ENABLE_OMIT_FRAME_POINTER)
+    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -fomit-frame-pointer")
+  else()
+    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -fno-omit-frame-pointer")
+  endif()
+  if(ENABLE_FAST_MATH)
+    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -ffast-math")
+  endif()
+  if(ENABLE_POWERPC)
+    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -mcpu=G3 -mtune=G5")
+  endif()
+  if(ENABLE_SSE)
+    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -msse")
+  endif()
+  if(ENABLE_SSE2)
+    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -msse2")
+  endif()
+
+  # SSE3 and further should be disabled under MingW because it generates compiler errors
+  if(NOT MINGW)
+    if(ENABLE_SSE3)
+      set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -msse3")
     endif()
 
-    # We need pthread's
-    if(UNIX AND NOT ANDROID)
-        set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} -pthread")
+    if(${CMAKE_OPENCV_GCC_VERSION_NUM} GREATER 402)
+      set(HAVE_GCC43_OR_NEWER 1)
     endif()
-
-    if(OPENCV_WARNINGS_ARE_ERRORS)
-        set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} -Werror")
+    if(${CMAKE_OPENCV_GCC_VERSION_NUM} GREATER 401)
+      set(HAVE_GCC42_OR_NEWER 1)
     endif()
 
-    if(X86 AND NOT MINGW64 AND NOT X86_64 AND NOT APPLE)
-        set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} -march=i686")
-    endif()
-
-    # Other optimizations
-    if(ENABLE_OMIT_FRAME_POINTER)
-        set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -fomit-frame-pointer")
-    else()
-        set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -fno-omit-frame-pointer")
-    endif()
-    if(ENABLE_FAST_MATH)
-        set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -ffast-math")
-    endif()
-    if(ENABLE_POWERPC)
-        set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -mcpu=G3 -mtune=G5")
-    endif()
-    if(ENABLE_SSE)
-        set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -msse")
-    endif()
-    if(ENABLE_SSE2)
-        set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -msse2")
-    endif()
-
-    # SSE3 and further should be disabled under MingW because it generates compiler errors
-    if(NOT MINGW)
-        if(ENABLE_SSE3)
-            set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -msse3")
-        endif()
-
-        if(${CMAKE_OPENCV_GCC_VERSION_NUM} GREATER 402)
-            set(HAVE_GCC43_OR_NEWER 1)
+    if(HAVE_GCC42_OR_NEWER OR APPLE)
+      if(ENABLE_SSSE3)
+        set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -mssse3")
+      endif()
+      if(HAVE_GCC43_OR_NEWER)
+        if(ENABLE_SSE41)
+           set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -msse4.1")
         endif()
-        if(${CMAKE_OPENCV_GCC_VERSION_NUM} GREATER 401)
-            set(HAVE_GCC42_OR_NEWER 1)
-        endif()
-
-        if(HAVE_GCC42_OR_NEWER OR APPLE)
-            if(ENABLE_SSSE3)
-                set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -mssse3")
-            endif()
-            if(HAVE_GCC43_OR_NEWER)
-                if(ENABLE_SSE41)
-                    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -msse4.1")
-                endif()
-                if(ENABLE_SSE42)
-                    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -msse4.2")
-                endif()
-            endif()
-        endif()
-    endif(NOT MINGW)
-
-    if(X86 OR X86_64)
-        if(NOT APPLE AND CMAKE_SIZEOF_VOID_P EQUAL 4)
-            set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -mfpmath=387")
+        if(ENABLE_SSE42)
+           set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -msse4.2")
         endif()
+      endif()
     endif()
+  endif(NOT MINGW)
 
-    # Profiling?
-    if(ENABLE_PROFILING)
-        set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -pg -g")
-    elseif(NOT APPLE AND NOT ANDROID)
-        # Remove unreferenced functions: function level linking
-        set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} -ffunction-sections")
+  if(X86 OR X86_64)
+    if(NOT APPLE AND CMAKE_SIZEOF_VOID_P EQUAL 4)
+       set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -mfpmath=387")
     endif()
+  endif()
 
-    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -DNDEBUG")
-    set(OPENCV_EXTRA_C_FLAGS_DEBUG "${OPENCV_EXTRA_C_FLAGS_DEBUG} -O0 -DDEBUG -D_DEBUG")
-    if(BUILD_WITH_DEBUG_INFO)
-       set(OPENCV_EXTRA_C_FLAGS_DEBUG "${OPENCV_EXTRA_C_FLAGS_DEBUG} -ggdb3")
-    endif()
+  # Profiling?
+  if(ENABLE_PROFILING)
+    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -pg -g")
+  elseif(NOT APPLE AND NOT ANDROID)
+    # Remove unreferenced functions: function level linking
+    set(OPENCV_EXTRA_C_FLAGS "${OPENCV_EXTRA_C_FLAGS} -ffunction-sections")
+  endif()
+
+  set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} -DNDEBUG")
+  set(OPENCV_EXTRA_C_FLAGS_DEBUG "${OPENCV_EXTRA_C_FLAGS_DEBUG} -O0 -DDEBUG -D_DEBUG")
+  if(BUILD_WITH_DEBUG_INFO)
+    set(OPENCV_EXTRA_C_FLAGS_DEBUG "${OPENCV_EXTRA_C_FLAGS_DEBUG} -ggdb3")
+  endif()
 endif()
 
 if(MSVC)
-    # 64-bit MSVC compiler uses SSE/SSE2 by default
-    if(NOT MSVC64)
-       if(ENABLE_SSE)
-          set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} /arch:SSE")
-       endif()
-       if(ENABLE_SSE2)
-          set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} /arch:SSE2")
-       endif()
-    endif()
-    if(ENABLE_SSE3)
-       set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} /arch:SSE3")
-    endif()
-    if(ENABLE_SSE4_1)
-       set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} /arch:SSE4.1")
-    endif()
-    if (ENABLE_SSE OR ENABLE_SSE2 OR ENABLE_SSE3 OR ENABLE_SSE4_1)
-       set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} /Oi")
+  # 64-bit MSVC compiler uses SSE/SSE2 by default
+  if(NOT MSVC64)
+    if(ENABLE_SSE)
+      set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} /arch:SSE")
     endif()
+    if(ENABLE_SSE2)
+      set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} /arch:SSE2")
+    endif()
+  endif()
+  if(ENABLE_SSE3)
+    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} /arch:SSE3")
+  endif()
+  if(ENABLE_SSE4_1)
+    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} /arch:SSE4.1")
+  endif()
+  if(ENABLE_SSE OR ENABLE_SSE2 OR ENABLE_SSE3 OR ENABLE_SSE4_1)
+    set(OPENCV_EXTRA_C_FLAGS_RELEASE "${OPENCV_EXTRA_C_FLAGS_RELEASE} /Oi")
+  endif()
 endif()
 
 # Extra link libs if the user selects building static libs:
 if(NOT BUILD_SHARED_LIBS AND CMAKE_COMPILER_IS_GNUCXX AND NOT ANDROID)
-    # Android does not need these settings because they are already set by toolchain file
-    set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} stdc++)
-    set(OPENCV_EXTRA_C_FLAGS "-fPIC ${OPENCV_EXTRA_C_FLAGS}")
+  # Android does not need these settings because they are already set by toolchain file
+  set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} stdc++)
+  set(OPENCV_EXTRA_C_FLAGS "-fPIC ${OPENCV_EXTRA_C_FLAGS}")
 endif()
 
 # Add user supplied extra options (optimization, etc...)
@@ -169,23 +176,24 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OPENCV_EXTRA_EXE_LINKER_
 set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_RELEASE}")
 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${OPENCV_EXTRA_EXE_LINKER_FLAGS_DEBUG}")
 
-if (WIN32 AND MSVC)
-    # avoid warnings from MSVC about overriding the /W* option
-    # we replace /W3 with /W4 only for C++ files,
-    # since all the 3rd-party libraries OpenCV uses are in C,
-    # and we do not care about their warnings.
-    string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
-    string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
-    string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
-
-    # allow extern "C" functions throw exceptions
-    string(REPLACE "/EHsc" "/EHsc-" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
-    string(REPLACE "/EHsc" "/EHsc-" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
-    string(REPLACE "/EHsc" "/EHsc-" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
-    string(REPLACE "/EHsc" "/EHsc-" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
-    string(REPLACE "/EHsc" "/EHsc-" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
-    string(REPLACE "/EHsc" "/EHsc-" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
-
-    string(REPLACE "/Zm1000" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
-    string(REPLACE "/Zm1000" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+if(MSVC)
+  # avoid warnings from MSVC about overriding the /W* option
+  # we replace /W3 with /W4 only for C++ files,
+  # since all the 3rd-party libraries OpenCV uses are in C,
+  # and we do not care about their warnings.
+  string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+  string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
+  string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
+  
+  # allow extern "C" functions throw exceptions
+  foreach(flags CMAKE_C_FLAGS CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
+    string(REPLACE "/EHsc-" "/EHs" ${flags} "${${flags}}")
+    string(REPLACE "/EHsc" "/EHs" ${flags} "${${flags}}")
+    
+    string(REPLACE "/Zm1000" "" ${flags} "${${flags}}")
+  endforeach()
+
+  if(NOT ENABLE_NOISY_WARNINGS)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4251") #class 'std::XXX' needs to have dll-interface to be used by clients of YYY
+  endif()
 endif()
index a2397d4..6b79f8b 100644 (file)
@@ -127,7 +127,6 @@ if(ANDROID_EXECUTABLE)
   if(ANDROID_SDK_TARGETS AND CMAKE_VERSION VERSION_GREATER "2.8")
     set_property( CACHE ANDROID_SDK_TARGET PROPERTY STRINGS ${ANDROID_SDK_TARGETS} )
   endif()
-
 endif(ANDROID_EXECUTABLE)
 
 # finds minimal installed SDK target compatible with provided names or API levels
@@ -136,7 +135,7 @@ endif(ANDROID_EXECUTABLE)
 macro(android_get_compatible_target VAR)
   set(${VAR} "${VAR}-NOTFOUND")
   if(ANDROID_SDK_TARGETS)
-    list(GET ANDROID_SDK_TARGETS 1 __lvl)
+    list(GET ANDROID_SDK_TARGETS 0 __lvl)
     string(REGEX MATCH "[0-9]+$" __lvl "${__lvl}")
 
     #find minimal level mathing to all provided levels
index 679ecb8..8427751 100644 (file)
@@ -1,11 +1,19 @@
 file(TO_CMAKE_PATH "$ENV{ANT_DIR}" ANT_DIR_ENV_PATH)
 file(TO_CMAKE_PATH "$ENV{ProgramFiles}" ProgramFiles_ENV_PATH)
 
-find_host_program(ANT_EXECUTABLE NAMES ant.bat ant
-  PATHS "${ANT_DIR_ENV_PATH}/bin"
-        "${ProgramFiles_ENV_PATH}/apache-ant/bin"
+if(CMAKE_HOST_WIN32)
+  set(ANT_NAME ant.bat)
+else()
+  set(ANT_NAME ant)
+endif()
+
+find_host_program(ANT_EXECUTABLE NAMES ${ANT_NAME}
+  PATHS "${ANT_DIR_ENV_PATH}/bin" "${ProgramFiles_ENV_PATH}/apache-ant/bin"
+  NO_DEFAULT_PATH
   )
 
+find_host_program(ANT_EXECUTABLE NAMES ${ANT_NAME})
+
 if(ANT_EXECUTABLE)
   execute_process(COMMAND ${ANT_EXECUTABLE} -version
     OUTPUT_VARIABLE ANT_VERSION_FULL
index 3054fbe..1d003b9 100644 (file)
@@ -48,6 +48,9 @@ if(CMAKE_COMPILER_IS_GNUCXX)
     # Typical output in CMAKE_OPENCV_GCC_VERSION_FULL: "c+//0 (whatever) 4.2.3 (...)"
     # Look for the version number
     string(REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" CMAKE_GCC_REGEX_VERSION "${CMAKE_OPENCV_GCC_VERSION_FULL}")
+    if(NOT CMAKE_GCC_REGEX_VERSION)
+      string(REGEX MATCH "[0-9]+.[0-9]+" CMAKE_GCC_REGEX_VERSION "${CMAKE_OPENCV_GCC_VERSION_FULL}")
+    endif()
 
     # Split the three parts:
     string(REGEX MATCHALL "[0-9]+" CMAKE_OPENCV_GCC_VERSIONS "${CMAKE_GCC_REGEX_VERSION}")
index 67a4480..47cc22a 100644 (file)
@@ -1,7 +1,18 @@
+if(MSVC AND NOT PYTHON_EXECUTABLE)
+  # search for executable with the same bitness as resulting binaries
+  # standard FindPythonInterp always prefers executable from system path
+  foreach(_CURRENT_VERSION ${Python_ADDITIONAL_VERSIONS} 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2.0 1.6 1.5)
+    find_host_program(PYTHON_EXECUTABLE
+      NAMES python${_CURRENT_VERSION} python
+      PATHS [HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Python\\\\PythonCore\\\\${_CURRENT_VERSION}\\\\InstallPath]
+      NO_SYSTEM_ENVIRONMENT_PATH
+    )
+  endforeach()
+endif()
 find_host_package(PythonInterp)
 
-set(PYTHON_USE_NUMPY 0)
-set(HAVE_SPHINX 0)
+unset(PYTHON_USE_NUMPY CACHE)
+unset(HAVE_SPHINX CACHE)
 
 if(PYTHON_EXECUTABLE)
   if(NOT ANDROID AND NOT IOS)
@@ -14,9 +25,10 @@ if(PYTHON_EXECUTABLE)
 
   execute_process(COMMAND ${PYTHON_EXECUTABLE} --version
     ERROR_VARIABLE PYTHON_VERSION_FULL
-    OUTPUT_STRIP_TRAILING_WHITESPACE)
+    ERROR_STRIP_TRAILING_WHITESPACE)
 
   string(REGEX MATCH "[0-9]+.[0-9]+" PYTHON_VERSION_MAJOR_MINOR "${PYTHON_VERSION_FULL}")
+  string(REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" PYTHON_VERSION_FULL "${PYTHON_VERSION_FULL}")
 
   if(NOT ANDROID AND NOT IOS)
     if(CMAKE_HOST_UNIX)
@@ -46,18 +58,25 @@ if(PYTHON_EXECUTABLE)
       set(PYTHON_PACKAGES_PATH "${PYTHON_PATH}/Lib/site-packages")
     endif()
 
-    # Attempt to discover the NumPy include directory. If this succeeds, then build python API with NumPy
-    execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import os; os.environ['DISTUTILS_USE_SDK']='1'; import numpy.distutils; print numpy.distutils.misc_util.get_numpy_include_dirs()[0]"
-                    RESULT_VARIABLE PYTHON_NUMPY_PROCESS
-                    OUTPUT_VARIABLE PYTHON_NUMPY_INCLUDE_DIRS
-                    OUTPUT_STRIP_TRAILING_WHITESPACE)
-
-    if(PYTHON_NUMPY_PROCESS EQUAL 0)
-      set(PYTHON_USE_NUMPY 1)
-      add_definitions(-DPYTHON_USE_NUMPY=1)
-      file(TO_CMAKE_PATH "${PYTHON_NUMPY_INCLUDE_DIRS}" PYTHON_NUMPY_INCLUDE_DIRS)
-      ocv_include_directories(${PYTHON_NUMPY_INCLUDE_DIRS})
-      message(STATUS "    Use NumPy headers from: ${PYTHON_NUMPY_INCLUDE_DIRS}")
+    if(NOT PYTHON_NUMPY_INCLUDE_DIR)
+      # Attempt to discover the NumPy include directory. If this succeeds, then build python API with NumPy
+      execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import os; os.environ['DISTUTILS_USE_SDK']='1'; import numpy.distutils; print numpy.distutils.misc_util.get_numpy_include_dirs()[0]"
+                      RESULT_VARIABLE PYTHON_NUMPY_PROCESS
+                      OUTPUT_VARIABLE PYTHON_NUMPY_INCLUDE_DIR
+                      OUTPUT_STRIP_TRAILING_WHITESPACE)
+                      
+      if(PYTHON_NUMPY_PROCESS EQUAL 0)
+        file(TO_CMAKE_PATH "${PYTHON_NUMPY_INCLUDE_DIR}" PYTHON_NUMPY_INCLUDE_DIR)
+        set(PYTHON_NUMPY_INCLUDE_DIR ${PYTHON_NUMPY_INCLUDE_DIR} CACHE PATH "Path to numpy headers")
+      endif()
+    endif()
+    
+    if(PYTHON_NUMPY_INCLUDE_DIR)
+      set(PYTHON_USE_NUMPY TRUE)
+      execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print numpy.version.version"
+                        RESULT_VARIABLE PYTHON_NUMPY_PROCESS
+                        OUTPUT_VARIABLE PYTHON_NUMPY_VERSION
+                        OUTPUT_STRIP_TRAILING_WHITESPACE)
     endif()
   endif(NOT ANDROID AND NOT IOS)
 
@@ -73,7 +92,7 @@ if(PYTHON_EXECUTABLE)
       find_host_program(SPHINX_BUILD sphinx-build)
       if(SPHINX_BUILD)
         set(HAVE_SPHINX 1)
-        message(STATUS "    Found Sphinx ${SPHINX_VERSION}: ${SPHINX_BUILD}")
+        message(STATUS "  Found Sphinx ${SPHINX_VERSION}: ${SPHINX_BUILD}")
       endif()
     endif()
   endif(BUILD_DOCS)
index a60d2c0..51ec34e 100644 (file)
@@ -20,10 +20,10 @@ endif()
 if(NOT HAVE_TBB)
   set(TBB_DEFAULT_INCLUDE_DIRS "/opt/intel/tbb" "/usr/local/include" "/usr/include" "C:/Program Files/Intel/TBB" "C:/Program Files (x86)/Intel/TBB" "C:/Program Files (x86)/TBB" "${CMAKE_INSTALL_PREFIX}/include")
 
-  find_path(TBB_INCLUDE_DIR "tbb/tbb.h" PATHS ${TBB_DEFAULT_INCLUDE_DIRS} DOC "The path to TBB headers")
-  if(TBB_INCLUDE_DIR)
+  find_path(TBB_INCLUDE_DIRS "tbb/tbb.h" PATHS ${TBB_INCLUDE_DIR} ${TBB_DEFAULT_INCLUDE_DIRS} DOC "The path to TBB headers")
+  if(TBB_INCLUDE_DIRS)
     if(UNIX)
-      set(TBB_LIB_DIR "${TBB_INCLUDE_DIR}/../lib" CACHE PATH "Full path of TBB library directory")
+      set(TBB_LIB_DIR "${TBB_INCLUDE_DIRS}/../lib" CACHE PATH "Full path of TBB library directory")
       link_directories("${TBB_LIB_DIR}")
     endif()
     if(APPLE)
@@ -35,11 +35,11 @@ if(NOT HAVE_TBB)
       set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} tbb)
     elseif (WIN32)
       if(CMAKE_COMPILER_IS_GNUCXX)
-        set(TBB_LIB_DIR "${TBB_INCLUDE_DIR}/../lib" CACHE PATH "Full path of TBB library directory")
+        set(TBB_LIB_DIR "${TBB_INCLUDE_DIRS}/../lib" CACHE PATH "Full path of TBB library directory")
         link_directories("${TBB_LIB_DIR}")
         set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} tbb)
       else()
-        get_filename_component(_TBB_LIB_PATH "${TBB_INCLUDE_DIR}/../lib" ABSOLUTE)
+        get_filename_component(_TBB_LIB_PATH "${TBB_INCLUDE_DIRS}/../lib" ABSOLUTE)
 
         if(CMAKE_SYSTEM_PROCESSOR MATCHES amd64*|x86_64* OR MSVC64)
           set(_TBB_LIB_PATH "${_TBB_LIB_PATH}/intel64")
@@ -62,8 +62,20 @@ if(NOT HAVE_TBB)
     endif()
 
     set(HAVE_TBB 1)
-    if(NOT "${TBB_INCLUDE_DIR}" STREQUAL "")
-      ocv_include_directories("${TBB_INCLUDE_DIR}")
+    if(NOT "${TBB_INCLUDE_DIRS}" STREQUAL "")
+      ocv_include_directories("${TBB_INCLUDE_DIRS}")
     endif()
-  endif(TBB_INCLUDE_DIR)
+  endif(TBB_INCLUDE_DIRS)
 endif(NOT HAVE_TBB)
+
+# get TBB version
+if(HAVE_TBB)
+  find_file(TBB_STDDEF_PATH tbb/tbb_stddef.h "${TBB_INCLUDE_DIRS}")
+endif()
+if(HAVE_TBB AND TBB_STDDEF_PATH)
+  ocv_parse_header("${TBB_STDDEF_PATH}" TBB_VERSION_LINES TBB_VERSION_MAJOR TBB_VERSION_MINOR TBB_INTERFACE_VERSION)
+else()
+  unset(TBB_VERSION_MAJOR)
+  unset(TBB_VERSION_MINOR)
+  unset(TBB_INTERFACE_VERSION)
+endif()
index 270bd3b..1ceaa21 100644 (file)
@@ -113,17 +113,17 @@ function(set_ipp_old_libraries)
     endif()
 
     set(IPP_LIBRARIES
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPVM}${IPP_MRGD}${IPP_ARCH}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPVM}${IPP_DISP}${IPP_ARCH}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCC}${IPP_MRGD}${IPP_ARCH}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCC}${IPP_DISP}${IPP_ARCH}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCV}${IPP_MRGD}${IPP_ARCH}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCV}${IPP_DISP}${IPP_ARCH}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPIP}${IPP_MRGD}${IPP_ARCH}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPIP}${IPP_DISP}${IPP_ARCH}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPSP}${IPP_MRGD}${IPP_ARCH}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPSP}${IPP_DISP}${IPP_ARCH}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCORE}${IPP_ARCH}${IPP_SUFFIX}${IPP_LIB_SUFFIX }
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPVM}${IPP_MRGD}${IPP_ARCH}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPVM}${IPP_DISP}${IPP_ARCH}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCC}${IPP_MRGD}${IPP_ARCH}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCC}${IPP_DISP}${IPP_ARCH}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCV}${IPP_MRGD}${IPP_ARCH}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCV}${IPP_DISP}${IPP_ARCH}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPIP}${IPP_MRGD}${IPP_ARCH}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPIP}${IPP_DISP}${IPP_ARCH}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPSP}${IPP_MRGD}${IPP_ARCH}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPSP}${IPP_DISP}${IPP_ARCH}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCORE}${IPP_ARCH}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
         PARENT_SCOPE)
 
     return()
@@ -147,12 +147,12 @@ function(set_ipp_new_libraries)
     set(IPPVM      "vm")       # vector math
 
     set(IPP_LIBRARIES
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPVM}${IPP_SUFFIX}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCC}${IPP_SUFFIX}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCV}${IPP_SUFFIX}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPI}${IPP_SUFFIX}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPS}${IPP_SUFFIX}${IPP_LIB_SUFFIX }
-        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCORE}${IPP_SUFFIX}${IPP_LIB_SUFFIX }
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPVM}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCC}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCV}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPI}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPS}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
+        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCORE}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
         PARENT_SCOPE)
 
     return()
index 9ce4872..32d3e71 100644 (file)
@@ -74,13 +74,28 @@ IF (OPENEXR_INCLUDE_PATH AND OPENEXR_IMATH_LIBRARY AND OPENEXR_ILMIMF_LIBRARY AN
 ENDIF ()
 
 IF(OPENEXR_FOUND)
-    IF(NOT OPENEXR_FIND_QUIETLY)
-        MESSAGE(STATUS "Found OpenEXR: ${OPENEXR_ILMIMF_LIBRARY}")
-    ENDIF()
+  IF(NOT OPENEXR_FIND_QUIETLY)
+    MESSAGE(STATUS "Found OpenEXR: ${OPENEXR_ILMIMF_LIBRARY}")
+  ENDIF()
+  if(PKG_CONFIG_FOUND AND NOT OPENEXR_VERSION)
+    get_filename_component(OPENEXR_LIB_PATH "${OPENEXR_ILMIMF_LIBRARY}" PATH)
+    if(EXISTS "${OPENEXR_LIB_PATH}/pkgconfig/OpenEXR.pc")
+      execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --modversion "${OPENEXR_LIB_PATH}/pkgconfig/OpenEXR.pc"
+                      RESULT_VARIABLE PKG_CONFIG_PROCESS
+                      OUTPUT_VARIABLE OPENEXR_VERSION
+                      OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
+      if(NOT PKG_CONFIG_PROCESS EQUAL 0)
+        SET(OPENEXR_VERSION "Unknown")
+      endif()
+    endif()
+  endif()
+  if(NOT OPENEXR_VERSION)
+    SET(OPENEXR_VERSION "Unknown")
+  endif()
 ELSE()
-    IF(OPENEXR_FIND_REQUIRED)
-        MESSAGE(FATAL_ERROR "Could not find OpenEXR library")
-    ENDIF()
+  IF(OPENEXR_FIND_REQUIRED)
+    MESSAGE(FATAL_ERROR "Could not find OpenEXR library")
+  ENDIF()
 ENDIF()
 
 MARK_AS_ADVANCED(
@@ -90,4 +105,4 @@ MARK_AS_ADVANCED(
        OPENEXR_IMATH_LIBRARY
        OPENEXR_IEX_LIBRARY
        OPENEXR_HALF_LIBRARY
-    OPENEXR_ILMTHREAD_LIBRARY)
\ No newline at end of file
+    OPENEXR_ILMTHREAD_LIBRARY)
index bf9d614..2897a99 100644 (file)
@@ -48,9 +48,15 @@ if(OPENNI_LIBRARY AND OPENNI_INCLUDES)
     endif()
 endif() #if(OPENNI_LIBRARY AND OPENNI_INCLUDES)
 
-get_filename_component(OPENNI_LIB_DIR "${OPENNI_LIBRARY}" PATH CACHE)
-get_filename_component(OPENNI_INCLUDE_DIR ${OPENNI_INCLUDES} PATH CACHE)
-get_filename_component(OPENNI_PRIME_SENSOR_MODULE_BIN_DIR "${OPENNI_PRIME_SENSOR_MODULE}" PATH CACHE)
+get_filename_component(OPENNI_LIB_DIR "${OPENNI_LIBRARY}" PATH)
+get_filename_component(OPENNI_INCLUDE_DIR ${OPENNI_INCLUDES} PATH)
+get_filename_component(OPENNI_PRIME_SENSOR_MODULE_BIN_DIR "${OPENNI_PRIME_SENSOR_MODULE}" PATH)
+
+if(HAVE_OPENNI)
+  set(OPENNI_LIB_DIR "${OPENNI_LIB_DIR}" CACHE PATH "Path to OpenNI libraries" FORCE)
+  set(OPENNI_INCLUDE_DIR "${OPENNI_INCLUDE_DIR}" CACHE PATH "Path to OpenNI headers" FORCE)
+  set(OPENNI_PRIME_SENSOR_MODULE_BIN_DIR "${OPENNI_PRIME_SENSOR_MODULE_BIN_DIR}" CACHE PATH "Path to OpenNI PrimeSensor Module binaries" FORCE)
+endif()
 
 if(OPENNI_LIBRARY)
     set(OPENNI_LIB_DIR_INTERNAL "${OPENNI_LIB_DIR}" CACHE INTERNAL "This is the value of the last time OPENNI_LIB_DIR was set successfully." FORCE)
@@ -73,3 +79,11 @@ endif()
 mark_as_advanced(FORCE OPENNI_PRIME_SENSOR_MODULE)
 mark_as_advanced(FORCE OPENNI_LIBRARY)
 mark_as_advanced(FORCE OPENNI_INCLUDES)
+
+if(HAVE_OPENNI)
+  ocv_parse_header("${OPENNI_INCLUDE_DIR}/XnVersion.h" OPENNI_VERSION_LINES XN_MAJOR_VERSION XN_MINOR_VERSION XN_MAINTENANCE_VERSION XN_BUILD_VERSION)
+  if(XN_MAJOR_VERSION)
+    set(OPENNI_VERSION_STRING ${XN_MAJOR_VERSION}.${XN_MINOR_VERSION}.${XN_MAINTENANCE_VERSION} CACHE INTERNAL "OpenNI version")
+    set(OPENNI_VERSION_BUILD ${XN_BUILD_VERSION} CACHE INTERNAL "OpenNI build version")
+  endif()
+endif()
index bf28eaa..36e36a7 100644 (file)
@@ -13,8 +13,12 @@ else()
     set(ZLIB_LIBRARY z)
     set(ZLIB_LIBRARIES ${ZLIB_LIBRARY})
     set(ZLIB_INCLUDE_DIR "")
+    ocv_parse_header2(ZLIB "${ANDROID_SYSROOT}/usr/include/zlib.h" ZLIB_VERSION "")
   else()
     include(FindZLIB)
+    if(NOT ZLIB_VERSION_STRING)
+      ocv_parse_header2(ZLIB "${ZLIB_INCLUDE_DIR}/zlib.h" ZLIB_VERSION "")
+    endif()
   endif()
 endif()
 
@@ -33,6 +37,9 @@ if(WITH_TIFF)
     unset_all(TIFF_FOUND)
   else()
     include(FindTIFF)
+    if(TIFF_FOUND)
+      ocv_parse_header("${TIFF_INCLUDE_DIR}/tiff.h" TIFF_VERSION_LINES TIFF_VERSION_CLASSIC TIFF_VERSION_BIG TIFF_VERSION TIFF_BIGTIFF_VERSION)
+    endif()
   endif()
 endif()
 
@@ -43,6 +50,15 @@ if(WITH_TIFF AND NOT TIFF_FOUND)
   set(TIFF_LIBRARIES ${TIFF_LIBRARY})
   add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libtiff")
   set(TIFF_INCLUDE_DIR "${${TIFF_LIBRARY}_SOURCE_DIR}" "${${TIFF_LIBRARY}_BINARY_DIR}")
+  ocv_parse_header("${${TIFF_LIBRARY}_SOURCE_DIR}/tiff.h" TIFF_VERSION_LINES TIFF_VERSION_CLASSIC TIFF_VERSION_BIG TIFF_VERSION TIFF_BIGTIFF_VERSION)
+endif()
+
+if(TIFF_VERSION_CLASSIC AND NOT TIFF_VERSION)
+  set(TIFF_VERSION ${TIFF_VERSION_CLASSIC})
+endif()
+
+if(TIFF_BIGTIFF_VERSION AND NOT TIFF_VERSION_BIG)
+  set(TIFF_VERSION_BIG ${TIFF_BIGTIFF_VERSION})
 endif()
 
 ################### libjpeg - optional
@@ -63,6 +79,9 @@ if(WITH_JPEG AND NOT JPEG_FOUND)
   set(JPEG_INCLUDE_DIR "${${JPEG_LIBRARY}_SOURCE_DIR}")
 endif()
 
+ocv_parse_header("${JPEG_INCLUDE_DIR}/jpeglib.h" JPEG_VERSION_LINES JPEG_LIB_VERSION)
+
+
 ################### libjasper - optional (should be searched after libjpeg)
 if(WITH_JASPER)
   if(BUILD_JASPER)
@@ -81,6 +100,8 @@ if(WITH_JASPER AND NOT JASPER_FOUND)
   set(JASPER_INCLUDE_DIR "${${JASPER_LIBRARY}_SOURCE_DIR}")
 endif()
 
+ocv_parse_header2(JASPER "${JASPER_INCLUDE_DIR}/jasper/jas_config.h" JAS_VERSION "")
+
 ################### libpng - optional (should be searched after zlib)
 if(WITH_PNG)
   if(BUILD_PNG)
@@ -88,8 +109,13 @@ if(WITH_PNG)
   else()
     include(FindPNG)
     if(PNG_FOUND)
-      check_include_file(${PNG_PNG_INCLUDE_DIR}/png.h        HAVE_PNG_H)
-      check_include_file(${PNG_PNG_INCLUDE_DIR}/libpng/png.h HAVE_LIBPNG_PNG_H)
+      check_include_file("${PNG_PNG_INCLUDE_DIR}/png.h"        HAVE_PNG_H)
+      check_include_file("${PNG_PNG_INCLUDE_DIR}/libpng/png.h" HAVE_LIBPNG_PNG_H)
+      if(HAVE_PNG_H)
+        ocv_parse_header("${PNG_PNG_INCLUDE_DIR}/png.h" PNG_VERSION_LINES PNG_LIBPNG_VER_MAJOR PNG_LIBPNG_VER_MINOR PNG_LIBPNG_VER_RELEASE)
+      elseif(HAVE_LIBPNG_PNG_H)
+        ocv_parse_header("${PNG_PNG_INCLUDE_DIR}/libpng/png.h" PNG_VERSION_LINES PNG_LIBPNG_VER_MAJOR PNG_LIBPNG_VER_MINOR PNG_LIBPNG_VER_RELEASE)
+      endif()
     endif()
   endif()
 endif()
@@ -102,8 +128,11 @@ if(WITH_PNG AND NOT PNG_FOUND)
   add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libpng")
   set(PNG_INCLUDE_DIR "${${PNG_LIBRARY}_SOURCE_DIR}")
   set(PNG_DEFINITIONS "")
+  ocv_parse_header("${PNG_INCLUDE_DIR}/png.h" PNG_VERSION_LINES PNG_LIBPNG_VER_MAJOR PNG_LIBPNG_VER_MINOR PNG_LIBPNG_VER_RELEASE)
 endif()
 
+set(PNG_VERSION "${PNG_LIBPNG_VER_MAJOR}.${PNG_LIBPNG_VER_MINOR}.${PNG_LIBPNG_VER_RELEASE}")
+
 ################### OpenEXR - optional
 if(WITH_OPENEXR)
   include("${OpenCV_SOURCE_DIR}/cmake/OpenCVFindOpenEXR.cmake")
index 65c45c6..beb2fb1 100644 (file)
@@ -476,13 +476,13 @@ macro(ocv_create_module)
     RUNTIME DESTINATION bin COMPONENT main
     LIBRARY DESTINATION ${OPENCV_LIB_INSTALL_PATH} COMPONENT main
     ARCHIVE DESTINATION ${OPENCV_LIB_INSTALL_PATH} COMPONENT main
-
     )
 
   # only "public" headers need to be installed
   if(OPENCV_MODULE_${the_module}_HEADERS AND OPENCV_MODULES_PUBLIC MATCHES "(^|;)${the_module}(;|$)")
     foreach(hdr ${OPENCV_MODULE_${the_module}_HEADERS})
-      if(hdr MATCHES "(opencv2/.*)/[^/]+.h(..)?$")
+      string(REGEX REPLACE "^.*opencv2/" "opencv2/" hdr2 "${hdr}")
+      if(hdr2 MATCHES "^(opencv2/.*)/[^/]+.h(..)?$")
         install(FILES ${hdr} DESTINATION "${OPENCV_INCLUDE_PREFIX}/${CMAKE_MATCH_1}" COMPONENT main)
       endif()
     endforeach()
index ab6bb05..687ce4f 100644 (file)
@@ -104,6 +104,15 @@ macro(CHECK_MODULE module_name define)
 endmacro()
 
 
+set(OPENCV_BUILD_INFO_FILE "${OpenCV_BINARY_DIR}/version_string.tmp")
+file(REMOVE "${OPENCV_BUILD_INFO_FILE}")
+function(ocv_output_status msg)
+  message(STATUS "${msg}")
+  string(REPLACE "\\" "\\\\" msg "${msg}")
+  string(REPLACE "\"" "\\\"" msg "${msg}")
+  file(APPEND "${OPENCV_BUILD_INFO_FILE}" "\"${msg}\\n\"\n")
+endfunction()
+
 # Status report function.
 # Automatically align right column and selects text based on condition.
 # Usage:
@@ -133,7 +142,7 @@ function(status text)
     if(status_text_length LESS status_placeholder_length)
       string(SUBSTRING "${text}${status_placeholder}" 0 ${status_placeholder_length} status_text)
     elseif(DEFINED status_then OR DEFINED status_else)
-      message(STATUS "${text}")
+      ocv_output_status("${text}")
       set(status_text "${status_placeholder}")
     else()
       set(status_text "${text}")
@@ -142,17 +151,20 @@ function(status text)
     if(DEFINED status_then OR DEFINED status_else)
       if(${status_cond})
         string(REPLACE ";" " " status_then "${status_then}")
-        message(STATUS "${status_text}" "${status_then}")
+        string(REGEX REPLACE "^[ \t]+" "" status_then "${status_then}")
+        ocv_output_status("${status_text} ${status_then}")
       else()
         string(REPLACE ";" " " status_else "${status_else}")
-        message(STATUS "${status_text}" "${status_else}")
+        string(REGEX REPLACE "^[ \t]+" "" status_else "${status_else}")
+        ocv_output_status("${status_text} ${status_else}")
       endif()
     else()
       string(REPLACE ";" " " status_cond "${status_cond}")
-      message(STATUS "${status_text}" "${status_cond}")
+      string(REGEX REPLACE "^[ \t]+" "" status_cond "${status_cond}")
+      ocv_output_status("${status_text} ${status_cond}")
     endif()
   else()
-    message(STATUS "${text}")
+    ocv_output_status("${text}")
   endif()
 endfunction()
 
@@ -265,4 +277,76 @@ macro(ocv_to_full_paths VAR)
     set(${VAR} ${__tmp})
     unset(__tmp)
   endif()
-endmacro()
\ No newline at end of file
+endmacro()
+
+
+# read set of version defines from the header file
+macro(ocv_parse_header FILENAME FILE_VAR)
+  set(vars_regex "")
+  set(__parnet_scope OFF)
+  set(__add_cache OFF)
+  foreach(name ${ARGN})
+    if("${name}" STREQUAL "PARENT_SCOPE")
+      set(__parnet_scope ON)
+    elseif("${name}" STREQUAL "CACHE")
+      set(__add_cache ON)
+    elseif(vars_regex)
+      set(vars_regex "${vars_regex}|${name}")
+    else()
+      set(vars_regex "${name}")
+    endif()
+  endforeach()
+  if(EXISTS "${FILENAME}")
+    file(STRINGS "${FILENAME}" ${FILE_VAR} REGEX "#define[ \t]+(${vars_regex})[ \t]+[0-9]+" )
+  else()
+    unset(${FILE_VAR})
+  endif()
+  foreach(name ${ARGN})
+    if(NOT "${name}" STREQUAL "PARENT_SCOPE" AND NOT "${name}" STREQUAL "CACHE")
+      if(${FILE_VAR})
+        if(${FILE_VAR} MATCHES ".+[ \t]${name}[ \t]+([0-9]+).*")
+          string(REGEX REPLACE ".+[ \t]${name}[ \t]+([0-9]+).*" "\\1" ${name} "${${FILE_VAR}}")
+        else()
+          set(${name} "")
+        endif()
+        if(__add_cache)
+          set(${name} ${${name}} CACHE INTERNAL "${name} parsed from ${FILENAME}" FORCE)
+        elseif(__parnet_scope)
+          set(${name} "${${name}}" PARENT_SCOPE)
+        endif()
+      else()
+        unset(${name} CACHE)
+      endif()
+    endif()
+  endforeach()
+endmacro()
+
+# read single version define from the header file
+macro(ocv_parse_header2 LIBNAME HDR_PATH VARNAME SCOPE)
+  set(${LIBNAME}_H "")
+  if(EXISTS "${HDR_PATH}")
+    file(STRINGS "${HDR_PATH}" ${LIBNAME}_H REGEX "^#define[ \t]+${VARNAME}[ \t]+\"[^\"]*\".*$" LIMIT_COUNT 1)
+  endif()
+  if(${LIBNAME}_H)
+    string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_MAJOR "${${LIBNAME}_H}")
+    string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_MINOR  "${${LIBNAME}_H}")
+    string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_PATCH "${${LIBNAME}_H}")
+    set(${LIBNAME}_VERSION_MAJOR ${${LIBNAME}_VERSION_MAJOR} ${SCOPE})
+    set(${LIBNAME}_VERSION_MINOR ${${LIBNAME}_VERSION_MINOR} ${SCOPE})
+    set(${LIBNAME}_VERSION_PATCH ${${LIBNAME}_VERSION_PATCH} ${SCOPE})
+    set(${LIBNAME}_VERSION_STRING "${${LIBNAME}_VERSION_MAJOR}.${${LIBNAME}_VERSION_MINOR}.${${LIBNAME}_VERSION_PATCH}" ${SCOPE})
+
+    # append a TWEAK version if it exists:
+    set(${LIBNAME}_VERSION_TWEAK "")
+    if("${${LIBNAME}_H}" MATCHES "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.[0-9]+\\.[0-9]+\\.([0-9]+).*$")
+      set(${LIBNAME}_VERSION_TWEAK "${CMAKE_MATCH_1}" ${SCOPE})
+      set(${LIBNAME}_VERSION_STRING "${${LIBNAME}_VERSION_STRING}.${${LIBNAME}_VERSION_TWEAK}" ${SCOPE})
+    endif()
+  else()
+    unset(${LIBNAME}_VERSION_MAJOR CACHE)
+    unset(${LIBNAME}_VERSION_MINOR CACHE)
+    unset(${LIBNAME}_VERSION_PATCH CACHE)
+    unset(${LIBNAME}_VERSION_TWEAK CACHE)
+    unset(${LIBNAME}_VERSION_STRING CACHE)
+  endif()
+endmacro()
index 457dd4a..417f6eb 100644 (file)
@@ -40,6 +40,9 @@
 /* FFMpeg video library */
 #cmakedefine  HAVE_FFMPEG
 
+/* FFMpeg version flag */
+#cmakedefine  NEW_FFMPEG
+
 /* ffmpeg's libswscale */
 #cmakedefine  HAVE_FFMPEG_SWSCALE
 
diff --git a/doc/_themes/blue/searchbox.html b/doc/_themes/blue/searchbox.html
new file mode 100644 (file)
index 0000000..d5b45a7
--- /dev/null
@@ -0,0 +1,21 @@
+{#
+    basic/searchbox.html
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Sphinx sidebar template: quick search box.
+
+    :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+#}
+{%- if pagename != "search" %}
+<div id="searchbox" style="display: none">
+      <form class="search" action="{{ pathto('search') }}" method="get">
+      <input type="text" name="q" size="18" />
+      <input type="submit" value="{{ _('Search') }}" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+      </p>
+    </form>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+{%- endif %}
index 37215e1..2091634 100644 (file)
@@ -85,6 +85,7 @@ div.related a {
 
 div.sphinxsidebar {
     word-wrap: break-word;
+    width: 240px;
     {%- if theme_stickysidebar|tobool %}
     top: 30px;
     margin: 0;
index 5bca286..cbbd6cf 100644 (file)
 \setlength{\columnsep}{2pt}
 
 \begin{center}
-     \Large{\textbf{OpenCV 2.3 Cheat Sheet (C++)}} \\
+     \Large{\textbf{OpenCV 2.4 Cheat Sheet (C++)}} \\
 \end{center}
 \newlength{\MyLen}
 \settowidth{\MyLen}{\texttt{letterpaper}/\texttt{a4paper} \ }
index e711cb8..6c9cd28 100644 (file)
@@ -100,7 +100,7 @@ You need the following tools to be installed:
 
    Check the `Android SDK System Requirements
    <http://developer.android.com/sdk/requirements.html>`_ document for a list of Eclipse versions that are compatible with the Android SDK. 
-   For OpenCV 2.3.1 we recommend Eclipse 3.7 (Indigo) or Eclipse 3.6 (Helios). They work well for OpenCV under both Windows and Linux.
+   For OpenCV 2.4.0 we recommend Eclipse 3.6 (Helios) or later versions. They work well for OpenCV under both Windows and Linux.
    
    If you have no Eclipse installed, you can download it from this location:
     
@@ -154,12 +154,12 @@ Get the OpenCV package for Android development
    
    .. code-block:: bash
 
-      tar -jxvf ~/Downloads/OpenCV-2.3.1-android-bin.tar.bz2
+      tar -jxvf ~/Downloads/OpenCV-2.4.0-android-bin.tar.bz2
       
    For this tutorial I have unpacked OpenCV to the :file:`C:\\Work\\android-opencv\\` directory.
 
-.. |opencv_android_bin_pack| replace:: OpenCV-2.3.1-android-bin.tar.bz2
-.. _opencv_android_bin_pack_url: http://sourceforge.net/projects/opencvlibrary/files/opencv-android/2.3.1/OpenCV-2.3.1-android-bin.tar.bz2/download
+.. |opencv_android_bin_pack| replace:: OpenCV-2.4.0-android-bin.tar.bz2
+.. _opencv_android_bin_pack_url: http://sourceforge.net/projects/opencvlibrary/files/opencv-android/2.4.0/OpenCV-2.4.0-android-bin.tar.bz2/download
 .. |opencv_android_bin_pack_url| replace:: |opencv_android_bin_pack|
 .. |seven_zip| replace:: 7-Zip
 .. _seven_zip: http://www.7-zip.org/
index ebe4b63..13b5f60 100644 (file)
@@ -7,7 +7,7 @@ These steps have been tested for Ubuntu 10.04 but should work with other distros
 Required packages
 ==================
 
-  * GCC 4.x or later. This can be installed with
+  * GCC 4.4.x or later. This can be installed with
 
     .. code-block:: bash
 
@@ -15,13 +15,12 @@ Required packages
  
   * CMake 2.6 or higher
   * Subversion (SVN) client
-  * GTK+2.x or higher, including headers
+  * GTK+2.x or higher, including headers (libgtk2.0-dev)
   * pkgconfig
-  * libpng, zlib, libjpeg, libtiff, libjasper with development files (e.g. libpjeg-dev)
-  * Python 2.3 or later with developer packages (e.g. python-dev)
-  * SWIG 1.3.30 or later (only for versions prior to OpenCV 2.3)
-  * libavcodec
-  * libdc1394 2.x 
+  * Python 2.6 or later and Numpy 1.5 or later with developer packages (python-dev, python-numpy)
+  * ffmpeg or libav development packages: libavcodec-dev, libavformat-dev, libswscale-dev
+  * [optional] libdc1394 2.x 
+  * [optional] libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev.
 
 All the libraries above can be installed via Terminal or by using Synaptic Manager
 
index adf45e5..86d73ed 100644 (file)
@@ -16,7 +16,7 @@ Installation by using the pre-built libraries
 \r
 1. Open up a web browser and go to: http://sourceforge.net/projects/opencvlibrary/files/opencv-win/\r
 \r
-#. Open the folder for the latest version (currently this is 2.3).\r
+#. Open the folder for the latest version (currently this is 2.4).\r
 \r
 #. Choose a build you want to use and download it. The naming conventions used will show what kind of support they offer. For example:\r
    \r
@@ -60,7 +60,7 @@ If you are building your own libraries you can take either the source files from
 \r
    .. container:: enumeratevisibleitemswithsquare\r
 \r
-      + stable and tested build - http://code.opencv.org/svn/opencv/branches/2.3 (the number at the end will change with every new realease, so change it to that)\r
+      + stable and tested build - http://code.opencv.org/svn/opencv/branches/2.4 (the number at the end will change with every new realease, so change it to that)\r
       + development build - http://code.opencv.org/svn/opencv/trunk/\r
 \r
 While the later one may contain a couple of new and experimental algorithms, performance increases and interface improvements, be aware, that it may also contain many-many bugs. Using the first one is recommended in most of the cases. That is unless you are extending the OpenCV library itself or really need to most up to date version of it. \r
@@ -347,7 +347,7 @@ Set the OpenCV enviroment variable and add it to the systems path
 \r
 First we set an enviroment variable to make easier our work. This will hold the install directory of our OpenCV library that we use in our projects. Start up a command window and enter:\r
 \r
-.. code-block:: bash\r
+::\r
 \r
    setx -m OPENCV_DIR D:\OpenCV\Build\Install\r
 \r
@@ -355,7 +355,7 @@ Here the directory is where you have your OpenCV binaries (*installed* or *built
 \r
 If you built static libraries then you are done. Otherwise, you need to add the *bin* folders path to the systems path.This is cause you will use the OpenCV library in form of *\"Dynamic-link libraries\"* (also known as **DLL**). Inside these are stored all the algorithms and information the OpenCV library contains. The operating system will load them only on demand, during runtime. However, to do this he needs to know where they are. The systems **PATH** contains a list of folders where DLLs can be found. Add the OpenCV library path to this and the OS will know where to look if he ever needs the OpenCV binaries. Otherwise, you will need to copy the used DLLs right beside the applications executable file (*exe*) for the OS to find it, which is highly unpleasent if you work on many projects. To do this start up again the |PathEditor|_ and add the following new entry (right click in the application to bring up the menu):\r
 \r
-.. code-block:: bash\r
+::\r
 \r
    %OPENCV_DIR%\bin\r
 \r
index 6e3ecfc..4c597d5 100644 (file)
@@ -35,25 +35,29 @@ Accessing pixel intensity values
 
 In order to get pixel intensity value, you have to know the type of an image and the number of channels. Here is an example for a single channel grey scale image (type 8UC1) and pixel coordinates x and y: ::
 
-    Scalar intensity = img.at<uchar>(x, y);
+    Scalar intensity = img.at<uchar>(y, x);
 
-``intensity.val[0]`` contains a value from 0 to 255. Now let us consider a 3 channel image with ``BGR`` color ordering (the default format returned by ``imread``): ::
+``intensity.val[0]`` contains a value from 0 to 255. Note the ordering of ``x`` and ``y``. Since in OpenCV images are represented by the same structure as matrices, we use the same convention for both cases - the 0-based row index (or y-coordinate) goes first and the 0-based column index (or x-coordinate) follows it. Alternatively, you can use the following notation: ::
 
-    Vec3b intensity = img.at<Vec3b>(x, y);
+    Scalar intensity = img.at<uchar>(Point(x, y));
+
+Now let us consider a 3 channel image with ``BGR`` color ordering (the default format returned by ``imread``): ::
+
+    Vec3b intensity = img.at<Vec3b>(y, x);
     uchar blue = intensity.val[0];
     uchar green = intensity.val[1];
     uchar red = intensity.val[2];
 
 You can use the same method for floating-point images (for example, you can get such an image by running Sobel on a 3 channel image): ::
 
-    Vec3f intensity = img.at<Vec3f>(x, y);
+    Vec3f intensity = img.at<Vec3f>(y, x);
     float blue = intensity.val[0];
     float green = intensity.val[1];
     float red = intensity.val[2];
 
 The same method can be used to change pixel intensities: ::
 
-    img.at<uchar>(x, y) = 128;
+    img.at<uchar>(y, x) = 128;
 
 There are functions in OpenCV, especially from calib3d module, such as ``projectPoints``, that take an array of 2D or 3D points in the form of ``Mat``. Matrix should contain exactly one column, each row corresponds to a point, matrix type should be 32FC2 or 32FC3 correspondingly. Such a matrix can be easily constructed from ``std::vector``: ::
 
index 1611e34..098e5a5 100644 (file)
--- a/index.rst
+++ b/index.rst
@@ -17,5 +17,4 @@ Indices and tables
 ==================
 
 * :ref:`genindex`
-* :ref:`modindex`
 * :ref:`search`
index a5c9f0f..aa3a67c 100644 (file)
@@ -11,6 +11,13 @@ include (CMakeForceCompiler)
 CMAKE_FORCE_C_COMPILER (gcc gcc)
 CMAKE_FORCE_CXX_COMPILER (g++ g++)
 
+set (CMAKE_C_SIZEOF_DATA_PTR 4)
+set (CMAKE_C_HAS_ISYSROOT 1)
+set (CMAKE_C_COMPILER_ABI ELF)
+set (CMAKE_CXX_SIZEOF_DATA_PTR 4)
+set (CMAKE_CXX_HAS_ISYSROOT 1)
+set (CMAKE_CXX_COMPILER_ABI ELF)
+
 # Skip the platform compiler checks for cross compiling
 set (CMAKE_CXX_COMPILER_WORKS TRUE)
 set (CMAKE_C_COMPILER_WORKS TRUE)
index 85bb17b..78d45bc 100644 (file)
@@ -11,6 +11,13 @@ include (CMakeForceCompiler)
 CMAKE_FORCE_C_COMPILER (gcc gcc)
 CMAKE_FORCE_CXX_COMPILER (g++ g++)
 
+set (CMAKE_C_SIZEOF_DATA_PTR 4)
+set (CMAKE_C_HAS_ISYSROOT 1)
+set (CMAKE_C_COMPILER_ABI ELF)
+set (CMAKE_CXX_SIZEOF_DATA_PTR 4)
+set (CMAKE_CXX_HAS_ISYSROOT 1)
+set (CMAKE_CXX_COMPILER_ABI ELF)
+
 # Skip the platform compiler checks for cross compiling
 set (CMAKE_CXX_COMPILER_WORKS TRUE)
 set (CMAKE_C_COMPILER_WORKS TRUE)
index a2f9a53..d986a61 100644 (file)
@@ -86,6 +86,11 @@ protected:
 
     int emptyCameraCallbackReported;
 
+    static const char* flashModesNames[ANDROID_CAMERA_FLASH_MODES_NUM];
+    static const char* focusModesNames[ANDROID_CAMERA_FOCUS_MODES_NUM];
+    static const char* whiteBalanceModesNames[ANDROID_CAMERA_WHITE_BALANCE_MODES_NUM];
+    static const char* antibandingModesNames[ANDROID_CAMERA_ANTIBANDING_MODES_NUM];
+
     void doCall(void* buffer, size_t bufferSize)
     {
         if (cameraCallback == 0)
@@ -156,6 +161,68 @@ protected:
         camera->releaseRecordingFrame(dataPtr);
     }
 
+    // Split list of floats, returns number of floats found
+    static int split_float(const char *str, float* out, char delim, int max_elem_num,
+                           char **endptr = NULL)
+    {
+        // Find the first float.
+        char *end = const_cast<char*>(str);
+        int elem_num = 0;
+        for(; elem_num < max_elem_num; elem_num++ ){
+            char* curr_end;
+            out[elem_num] = (float)strtof(end, &curr_end);
+            // No other numbers found, finish the loop
+            if(end == curr_end){
+                break;
+            }
+            if (*curr_end != delim) {
+                // When end of string, finish the loop
+                if (*curr_end == 0){
+                    elem_num++;
+                    break;
+                }
+                else {
+                    LOGE("Cannot find delimeter (%c) in str=%s", delim, str);
+                    return -1;
+                }
+            }
+            // Skip the delimiter character
+            end = curr_end + 1;
+        }
+        if (endptr)
+            *endptr = end;
+        return elem_num;
+    }
+
+    int is_supported(const char* supp_modes_key, const char* mode)
+    {
+        const char* supported_modes = params.get(supp_modes_key);
+        return strstr(supported_modes, mode) > 0;
+    }
+
+    float getFocusDistance(int focus_distance_type){
+        if (focus_distance_type >= 0 && focus_distance_type < 3) {
+            float focus_distances[3];
+            const char* output = params.get(CameraParameters::KEY_FOCUS_DISTANCES);
+            int val_num = CameraHandler::split_float(output, focus_distances, ',', 3);
+            if(val_num == 3){
+                return focus_distances[focus_distance_type];
+            } else {
+                LOGE("Invalid focus distances.");
+            }
+        }
+        return -1;
+    }
+
+    static int getModeNum(const char** modes, const int modes_num, const char* mode_name)
+    {
+        for (int i = 0; i < modes_num; i++){
+            if(!strcmp(modes[i],mode_name))
+                return i;
+        }
+        return -1;
+    }
+
 public:
     CameraHandler(CameraCallback callback = 0, void* _userData = 0):
         cameraId(0),
@@ -220,6 +287,42 @@ public:
     std::string cameraPropertyPreviewFormatString;
 };
 
+const char* CameraHandler::flashModesNames[ANDROID_CAMERA_FLASH_MODES_NUM] =
+{
+    CameraParameters::FLASH_MODE_AUTO,
+    CameraParameters::FLASH_MODE_OFF,
+    CameraParameters::FLASH_MODE_ON,
+    CameraParameters::FLASH_MODE_RED_EYE,
+    CameraParameters::FLASH_MODE_TORCH
+};
+
+const char* CameraHandler::focusModesNames[ANDROID_CAMERA_FOCUS_MODES_NUM] =
+{
+    CameraParameters::FOCUS_MODE_AUTO,
+    CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO,
+    CameraParameters::FOCUS_MODE_EDOF,
+    CameraParameters::FOCUS_MODE_FIXED,
+    CameraParameters::FOCUS_MODE_INFINITY
+};
+
+const char* CameraHandler::whiteBalanceModesNames[ANDROID_CAMERA_WHITE_BALANCE_MODES_NUM] =
+{
+    CameraParameters::WHITE_BALANCE_AUTO,
+    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT,
+    CameraParameters::WHITE_BALANCE_DAYLIGHT,
+    CameraParameters::WHITE_BALANCE_FLUORESCENT,
+    CameraParameters::WHITE_BALANCE_INCANDESCENT,
+    CameraParameters::WHITE_BALANCE_SHADE,
+    CameraParameters::WHITE_BALANCE_TWILIGHT
+};
+
+const char* CameraHandler::antibandingModesNames[ANDROID_CAMERA_ANTIBANDING_MODES_NUM] =
+{
+    CameraParameters::ANTIBANDING_50HZ,
+    CameraParameters::ANTIBANDING_60HZ,
+    CameraParameters::ANTIBANDING_AUTO
+};
+
 
 CameraHandler* CameraHandler::initCameraConnect(const CameraCallback& callback, int cameraId, void* userData, CameraParameters* prevCameraParameters)
 {
@@ -229,7 +332,7 @@ CameraHandler* CameraHandler::initCameraConnect(const CameraCallback& callback,
 
 #ifdef ANDROID_r2_2_0
     camera = Camera::connect();
-#else 
+#else
     /* This is 2.3 or higher. The connect method has cameraID parameter */
     camera = Camera::connect(cameraId);
 #endif
@@ -273,6 +376,28 @@ CameraHandler* CameraHandler::initCameraConnect(const CameraCallback& callback,
         LOGD("Supported Antibanding Options: %s", handler->params.get(CameraParameters::KEY_SUPPORTED_ANTIBANDING));
         LOGD("Supported Flash Modes: %s", handler->params.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES));
 
+#if !defined(ANDROID_r2_2_0)
+        // Set focus mode to continuous-video if supported
+        const char* available_focus_modes = handler->params.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES);
+        if (available_focus_modes != 0)
+        {
+           if (strstr(available_focus_modes, "continuous-video") != NULL)
+           {
+               handler->params.set(CameraParameters::KEY_FOCUS_MODE, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO);
+
+               status_t resParams = handler->camera->setParameters(handler->params.flatten());
+
+                if (resParams != 0)
+                {
+                    LOGE("initCameraConnect: failed to set autofocus mode to \"continuous-video\"");
+                }
+                else
+                {
+                    LOGD("initCameraConnect: autofocus is set to mode \"continuous-video\"");
+                }
+           }
+       }
+#endif
 
         //check if yuv420sp format available. Set this format as preview format.
         const char* available_formats = handler->params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS);
@@ -312,17 +437,6 @@ CameraHandler* CameraHandler::initCameraConnect(const CameraCallback& callback,
             }
         }
     }
-#if !defined(ANDROID_r2_2_0)
-    const char* available_focus_modes = handler->params.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES);
-    if (available_focus_modes != 0)
-    {
-        // find continuous focus mode
-        if (strstr(available_focus_modes, "continuous-picture") != NULL)
-        {
-            handler->params.set(CameraParameters::KEY_FOCUS_MODE, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO);
-        }
-    }
-#endif
 
     status_t pdstatus;
 #if defined(ANDROID_r2_2_0)
@@ -424,7 +538,6 @@ double CameraHandler::getProperty(int propIdx)
         u.str = cameraPropertySupportedPreviewSizesString.c_str();
         return u.res;
     }
-
     case ANDROID_CAMERA_PROPERTY_PREVIEW_FORMAT_STRING:
     {
         const char* fmt = params.get(CameraParameters::KEY_PREVIEW_FORMAT);
@@ -445,7 +558,62 @@ double CameraHandler::getProperty(int propIdx)
         u.str = cameraPropertyPreviewFormatString.c_str();
         return u.res;
     }
-
+    case ANDROID_CAMERA_PROPERTY_EXPOSURE:
+    {
+        int exposure = params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
+        return exposure;
+    }
+    case ANDROID_CAMERA_PROPERTY_FPS:
+    {
+        return params.getPreviewFrameRate();
+    }
+    case ANDROID_CAMERA_PROPERTY_FLASH_MODE:
+    {
+        int flash_mode = getModeNum(CameraHandler::flashModesNames,
+                                    ANDROID_CAMERA_FLASH_MODES_NUM,
+                                    params.get(CameraParameters::KEY_FLASH_MODE));
+        return flash_mode;
+    }
+    case ANDROID_CAMERA_PROPERTY_FOCUS_MODE:
+    {
+        int focus_mode = getModeNum(CameraHandler::focusModesNames,
+                                    ANDROID_CAMERA_FOCUS_MODES_NUM,
+                                    params.get(CameraParameters::KEY_FOCUS_MODE));
+        return focus_mode;
+    }
+    case ANDROID_CAMERA_PROPERTY_WHITE_BALANCE:
+    {
+        int white_balance = getModeNum(CameraHandler::whiteBalanceModesNames,
+                                       ANDROID_CAMERA_WHITE_BALANCE_MODES_NUM,
+                                       params.get(CameraParameters::KEY_WHITE_BALANCE));
+        return white_balance;
+    }
+    case ANDROID_CAMERA_PROPERTY_ANTIBANDING:
+    {
+        int antibanding = getModeNum(CameraHandler::antibandingModesNames,
+                                     ANDROID_CAMERA_ANTIBANDING_MODES_NUM,
+                                     params.get(CameraParameters::KEY_ANTIBANDING));
+        return antibanding;
+    }
+    case ANDROID_CAMERA_PROPERTY_FOCAL_LENGTH:
+    {
+        float focal_length = params.getFloat(CameraParameters::KEY_FOCAL_LENGTH);
+        return focal_length;
+    }
+    case ANDROID_CAMERA_PROPERTY_FOCUS_DISTANCE_NEAR:
+    {
+        return getFocusDistance(ANDROID_CAMERA_FOCUS_DISTANCE_NEAR_INDEX);
+    }
+    case ANDROID_CAMERA_PROPERTY_FOCUS_DISTANCE_OPTIMAL:
+    {
+        return getFocusDistance(ANDROID_CAMERA_FOCUS_DISTANCE_OPTIMAL_INDEX);
+    }
+    case ANDROID_CAMERA_PROPERTY_FOCUS_DISTANCE_FAR:
+    {
+        return getFocusDistance(ANDROID_CAMERA_FOCUS_DISTANCE_FAR_INDEX);
+    }
+    default:
+        LOGW("CameraHandler::getProperty - Unsupported property.");
     };
     return -1;
 }
@@ -472,6 +640,80 @@ void CameraHandler::setProperty(int propIdx, double value)
         params.setPreviewSize(w, h);
     }
     break;
+    case ANDROID_CAMERA_PROPERTY_EXPOSURE:
+    {
+        int max_exposure = params.getInt("max-exposure-compensation");
+        int min_exposure = params.getInt("min-exposure-compensation");
+        if(max_exposure && min_exposure){
+            int exposure = (int)value;
+            if(exposure >= min_exposure && exposure <= max_exposure){
+                params.set("exposure-compensation", exposure);
+            } else {
+                LOGE("Exposure compensation not in valid range (%i,%i).", min_exposure, max_exposure);
+            }
+        } else {
+            LOGE("Exposure compensation adjust is not supported.");
+        }
+    }
+    break;
+    case ANDROID_CAMERA_PROPERTY_FLASH_MODE:
+    {
+        int new_val = (int)value;
+        if(new_val >= 0 && new_val < ANDROID_CAMERA_FLASH_MODES_NUM){
+            const char* mode_name = flashModesNames[new_val];
+            if(is_supported(CameraParameters::KEY_SUPPORTED_FLASH_MODES, mode_name))
+                params.set(CameraParameters::KEY_FLASH_MODE, mode_name);
+            else
+                LOGE("Flash mode %s is not supported.", mode_name);
+        } else {
+            LOGE("Flash mode value not in valid range.");
+        }
+    }
+    break;
+    case ANDROID_CAMERA_PROPERTY_FOCUS_MODE:
+    {
+        int new_val = (int)value;
+        if(new_val >= 0 && new_val < ANDROID_CAMERA_FOCUS_MODES_NUM){
+            const char* mode_name = focusModesNames[new_val];
+            if(is_supported(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, mode_name))
+                params.set(CameraParameters::KEY_FOCUS_MODE, mode_name);
+            else
+                LOGE("Focus mode %s is not supported.", mode_name);
+        } else {
+            LOGE("Focus mode value not in valid range.");
+        }
+    }
+    break;
+    case ANDROID_CAMERA_PROPERTY_WHITE_BALANCE:
+    {
+        int new_val = (int)value;
+        if(new_val >= 0 && new_val < ANDROID_CAMERA_WHITE_BALANCE_MODES_NUM){
+            const char* mode_name = whiteBalanceModesNames[new_val];
+            if(is_supported(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, mode_name))
+                params.set(CameraParameters::KEY_WHITE_BALANCE, mode_name);
+            else
+                LOGE("White balance mode %s is not supported.", mode_name);
+        } else {
+            LOGE("White balance mode value not in valid range.");
+        }
+    }
+    break;
+    case ANDROID_CAMERA_PROPERTY_ANTIBANDING:
+    {
+        int new_val = (int)value;
+        if(new_val >= 0 && new_val < ANDROID_CAMERA_ANTIBANDING_MODES_NUM){
+            const char* mode_name = antibandingModesNames[new_val];
+            if(is_supported(CameraParameters::KEY_SUPPORTED_ANTIBANDING, mode_name))
+                params.set(CameraParameters::KEY_ANTIBANDING, mode_name);
+            else
+                LOGE("Antibanding mode %s is not supported.", mode_name);
+        } else {
+            LOGE("Antibanding mode value not in valid range.");
+        }
+    }
+    break;
+    default:
+        LOGW("CameraHandler::setProperty - Unsupported property.");
     };
 }
 
index 56cbb74..2fec745 100644 (file)
@@ -5,7 +5,64 @@ enum {
     ANDROID_CAMERA_PROPERTY_FRAMEWIDTH = 0,
     ANDROID_CAMERA_PROPERTY_FRAMEHEIGHT = 1,
     ANDROID_CAMERA_PROPERTY_SUPPORTED_PREVIEW_SIZES_STRING = 2,
-    ANDROID_CAMERA_PROPERTY_PREVIEW_FORMAT_STRING = 3
+    ANDROID_CAMERA_PROPERTY_PREVIEW_FORMAT_STRING = 3,
+    ANDROID_CAMERA_PROPERTY_FPS = 4,
+    ANDROID_CAMERA_PROPERTY_EXPOSURE = 5,
+    ANDROID_CAMERA_PROPERTY_FLASH_MODE = 101,
+    ANDROID_CAMERA_PROPERTY_FOCUS_MODE = 102,
+    ANDROID_CAMERA_PROPERTY_WHITE_BALANCE = 103,
+    ANDROID_CAMERA_PROPERTY_ANTIBANDING = 104,
+    ANDROID_CAMERA_PROPERTY_FOCAL_LENGTH = 105,
+    ANDROID_CAMERA_PROPERTY_FOCUS_DISTANCE_NEAR = 106,
+    ANDROID_CAMERA_PROPERTY_FOCUS_DISTANCE_OPTIMAL = 107,
+    ANDROID_CAMERA_PROPERTY_FOCUS_DISTANCE_FAR = 108
+};
+
+
+enum {
+    ANDROID_CAMERA_FLASH_MODE_AUTO = 0,
+    ANDROID_CAMERA_FLASH_MODE_OFF,
+    ANDROID_CAMERA_FLASH_MODE_ON,
+    ANDROID_CAMERA_FLASH_MODE_RED_EYE,
+    ANDROID_CAMERA_FLASH_MODE_TORCH,
+    ANDROID_CAMERA_FLASH_MODES_NUM
+};
+
+enum {
+    ANDROID_CAMERA_FOCUS_MODE_AUTO = 0,
+    ANDROID_CAMERA_FOCUS_MODE_CONTINUOUS_PICTURE,
+    ANDROID_CAMERA_FOCUS_MODE_CONTINUOUS_VIDEO,
+    ANDROID_CAMERA_FOCUS_MODE_EDOF,
+    ANDROID_CAMERA_FOCUS_MODE_FIXED,
+    ANDROID_CAMERA_FOCUS_MODE_INFINITY,
+    ANDROID_CAMERA_FOCUS_MODE_MACRO,
+    ANDROID_CAMERA_FOCUS_MODES_NUM
+};
+
+enum {
+    ANDROID_CAMERA_WHITE_BALANCE_AUTO = 0,
+    ANDROID_CAMERA_WHITE_BALANCE_CLOUDY_DAYLIGHT,
+    ANDROID_CAMERA_WHITE_BALANCE_DAYLIGHT,
+    ANDROID_CAMERA_WHITE_BALANCE_FLUORESCENT,
+    ANDROID_CAMERA_WHITE_BALANCE_INCANDESCENT,
+    ANDROID_CAMERA_WHITE_BALANCE_SHADE,
+    ANDROID_CAMERA_WHITE_BALANCE_TWILIGHT,
+    ANDROID_CAMERA_WHITE_BALANCE_WARM_FLUORESCENT,
+    ANDROID_CAMERA_WHITE_BALANCE_MODES_NUM
+};
+
+enum {
+    ANDROID_CAMERA_ANTIBANDING_50HZ = 0,
+    ANDROID_CAMERA_ANTIBANDING_60HZ,
+    ANDROID_CAMERA_ANTIBANDING_AUTO,
+    ANDROID_CAMERA_ANTIBANDING_OFF,
+    ANDROID_CAMERA_ANTIBANDING_MODES_NUM
+};
+
+enum {
+    ANDROID_CAMERA_FOCUS_DISTANCE_NEAR_INDEX = 0,
+    ANDROID_CAMERA_FOCUS_DISTANCE_OPTIMAL_INDEX,
+    ANDROID_CAMERA_FOCUS_DISTANCE_FAR_INDEX
 };
 
 #endif // CAMERA_PROPERTIES_H
index e7b3305..4d40ea7 100644 (file)
@@ -33,7 +33,7 @@ where:
    * :math:`(u, v)` are the coordinates of the projection point in pixels
    * :math:`A` is a camera matrix, or a matrix of intrinsic parameters
    * :math:`(cx, cy)` is a principal point that is usually at the image center
-   * :math:`fx, fy` are the focal lengths expressed in pixel-related units
+   * :math:`fx, fy` are the focal lengths expressed in pixel units.
 
 
 Thus, if an image from the camera is
@@ -158,7 +158,7 @@ Finds the camera intrinsic and extrinsic parameters from several views of a cali
     :param term_crit: same as ``criteria``.
 
 The function estimates the intrinsic camera
-parameters and extrinsic parameters for each of the views. The algorithm is based on [Zhang2000] and [BoughuetMCT]. The coordinates of 3D object points and their corresponding 2D projections
+parameters and extrinsic parameters for each of the views. The algorithm is based on [Zhang2000]_ and [BouguetMCT]_. The coordinates of 3D object points and their corresponding 2D projections
 in each view must be specified. That may be achieved by using an
 object with a known geometry and easily detectable feature points.
 Such an object is called a calibration rig or calibration pattern,
@@ -616,7 +616,7 @@ Finds an object pose from 3D-2D point correspondences using the RANSAC scheme.
     :param flags: Method for solving a PnP problem (see  :ocv:func:`solvePnP` ).
 
 The function estimates an object pose given a set of object points, their corresponding image projections, as well as the camera matrix and the distortion coefficients. This function finds such a pose that minimizes reprojection error, that is, the sum of squared distances between the observed projections ``imagePoints`` and the projected (using
-:ocv:func:`projectPoints` ) ``objectPoints``. The use of RANSAC makes the function resistant to outliers.
+:ocv:func:`projectPoints` ) ``objectPoints``. The use of RANSAC makes the function resistant to outliers. The function is parallelized with the TBB library.
 
 
 
@@ -1127,8 +1127,7 @@ Computes disparity using the BM algorithm for a rectified stereo pair.
 
     :param state: The pre-initialized ``CvStereoBMState`` structure in the case of the old API.
 
-The method executes the BM algorithm on a rectified stereo pair. See the ``stereo_match.cpp`` OpenCV sample on how to prepare images and call the method. Note that the method is not constant, thus you should not use the same ``StereoBM`` instance from within different threads simultaneously.
-
+The method executes the BM algorithm on a rectified stereo pair. See the ``stereo_match.cpp`` OpenCV sample on how to prepare images and call the method. Note that the method is not constant, thus you should not use the same ``StereoBM`` instance from within different threads simultaneously. The function is parallelized with the TBB library.
 
 
 
@@ -1165,13 +1164,13 @@ Class for computing stereo correspondence using the semi-global block matching a
         ...
     };
 
-The class implements the modified H. Hirschmuller algorithm HH08 that differs from the original one as follows:
+The class implements the modified H. Hirschmuller algorithm [HH08]_ that differs from the original one as follows:
 
  * By default, the algorithm is single-pass, which means that you consider only 5 directions instead of 8. Set ``fullDP=true`` to run the full variant of the algorithm but beware that it may consume a lot of memory.
 
  * The algorithm matches blocks, not individual pixels. Though, setting ``SADWindowSize=1`` reduces the blocks to single pixels.
 
- * Mutual information cost function is not implemented. Instead, a simpler Birchfield-Tomasi sub-pixel metric from BT96 is used. Though, the color images are supported as well.
+ * Mutual information cost function is not implemented. Instead, a simpler Birchfield-Tomasi sub-pixel metric from [BT98]_ is used. Though, the color images are supported as well.
 
  * Some pre- and post- processing steps from K. Konolige algorithm :ocv:funcx:`StereoBM::operator()`  are included, for example: pre-filtering (``CV_STEREO_BM_XSOBEL`` type) and post-filtering (uniqueness check, quadratic interpolation and speckle filtering).
 
@@ -1556,13 +1555,6 @@ The function computes the rectification transformations without knowing intrinsi
 
     While the algorithm does not need to know the intrinsic parameters of the cameras, it heavily depends on the epipolar geometry. Therefore, if the camera lenses have a significant distortion, it would be better to correct it before computing the fundamental matrix and calling this function. For example, distortion coefficients can be estimated for each head of stereo camera separately by using :ocv:func:`calibrateCamera` . Then, the images can be corrected using :ocv:func:`undistort` , or just the point coordinates can be corrected with :ocv:func:`undistortPoints` .
 
-.. [BouguetMCT] J.Y.Bouguet. MATLAB calibration tool. http://www.vision.caltech.edu/bouguetj/calib_doc/
-
-.. [Hartley99] Hartley, R.I., Theory and Practice of Projective Rectification. IJCV 35 2, pp 115-127 (1999)
-
-.. [Zhang2000] Z. Zhang. A Flexible New Technique for Camera Calibration. IEEE Transactions on Pattern Analysis and Machine Intelligence, 22(11):1330-1334, 2000.
-
-
 
 triangulatePoints
 -----------------
@@ -1589,3 +1581,14 @@ The function reconstructs 3-dimensional points (in homogeneous coordinates) by u
 .. seealso::
 
     :ocv:func:`reprojectImageTo3D`
+
+
+.. [BT98] Birchfield, S. and Tomasi, C. A pixel dissimilarity measure that is insensitive to image sampling. IEEE Transactions on Pattern Analysis and Machine Intelligence. 1998.
+
+.. [BouguetMCT] J.Y.Bouguet. MATLAB calibration tool. http://www.vision.caltech.edu/bouguetj/calib_doc/
+
+.. [Hartley99] Hartley, R.I., Theory and Practice of Projective Rectification. IJCV 35 2, pp 115-127 (1999)
+
+.. [HH08] Hirschmuller, H. Stereo Processing by Semiglobal Matching and Mutual Information, PAMI(30), No. 2, February 2008, pp. 328-341.
+
+.. [Zhang2000] Z. Zhang. A Flexible New Technique for Camera Calibration. IEEE Transactions on Pattern Analysis and Machine Intelligence, 22(11):1330-1334, 2000.
index 7edbf45..678ccfa 100644 (file)
@@ -29,10 +29,18 @@ epnp::epnp(const cv::Mat& cameraMatrix, const cv::Mat& opoints, const cv::Mat& i
 \r
   alphas.resize(4 * number_of_correspondences); \r
   pcs.resize(3 * number_of_correspondences);\r
+\r
+  max_nr = 0;\r
+  A1 = NULL;\r
+  A2 = NULL;\r
 }\r
 \r
 epnp::~epnp()\r
 {\r
+    if (A1)\r
+        delete[] A1;\r
+    if (A2)\r
+        delete[] A2;\r
 }\r
 \r
 void epnp::choose_control_points(void)\r
@@ -513,9 +521,6 @@ void epnp::gauss_newton(const CvMat * L_6x10, const CvMat * Rho,
 \r
 void epnp::qr_solve(CvMat * A, CvMat * b, CvMat * X)\r
 {\r
-  static int max_nr = 0;\r
-  static double * A1, * A2;\r
-\r
   const int nr = A->rows;\r
   const int nc = A->cols;\r
 \r
index 71f3aa9..99378f9 100644 (file)
@@ -14,24 +14,24 @@ class epnp {
   void compute_pose(cv::Mat& R, cv::Mat& t);
  private:
   template <typename T>
-  void init_camera_parameters(const cv::Mat& cameraMatrix)\r
-  {    \r
-       uc = cameraMatrix.at<T> (0, 2);\r
-       vc = cameraMatrix.at<T> (1, 2);\r
-       fu = cameraMatrix.at<T> (0, 0);\r
-       fv = cameraMatrix.at<T> (1, 1);\r
+  void init_camera_parameters(const cv::Mat& cameraMatrix)
+  {    
+       uc = cameraMatrix.at<T> (0, 2);
+       vc = cameraMatrix.at<T> (1, 2);
+       fu = cameraMatrix.at<T> (0, 0);
+       fv = cameraMatrix.at<T> (1, 1);
   }
   template <typename OpointType, typename IpointType>
   void init_points(const cv::Mat& opoints, const cv::Mat& ipoints)
   {
-         for(int i = 0; i < number_of_correspondences; i++)\r
-         {\r
+         for(int i = 0; i < number_of_correspondences; i++)
+         {
                  pws[3 * i    ] = opoints.at<OpointType>(0,i).x;
                  pws[3 * i + 1] = opoints.at<OpointType>(0,i).y;
                  pws[3 * i + 2] = opoints.at<OpointType>(0,i).z;
 
                  us[2 * i    ] = ipoints.at<IpointType>(0,i).x*fu + uc;
-                 us[2 * i + 1] = ipoints.at<IpointType>(0,i).y*fv + vc;\r
+                 us[2 * i + 1] = ipoints.at<IpointType>(0,i).y*fv + vc;
          }
   }
   double reprojection_error(const double R[3][3], const double t[3]);
@@ -74,6 +74,8 @@ class epnp {
 
   double cws[4][3], ccs[4][3];
   double cws_determinant;
+  int max_nr;
+  double * A1, * A2;
 };
 
 #endif
index d76009a..23bf5f0 100644 (file)
@@ -333,6 +333,7 @@ void CV_CameraCalibrationTest::run( int start_from )
     goodTransVects  = 0;
     goodRotMatrs    = 0;
     int progress = 0;
+    int values_read = -1;
 
     sprintf( filepath, "%scameracalibration/", ts->get_data_path().c_str() );
     sprintf( filename, "%sdatafiles.txt", filepath );
@@ -344,11 +345,13 @@ void CV_CameraCalibrationTest::run( int start_from )
         goto _exit_;
     }
 
-    fscanf(datafile,"%d",&numTests);
+    values_read = fscanf(datafile,"%d",&numTests);
+    CV_Assert(values_read == 1);
 
     for( currTest = start_from; currTest < numTests; currTest++ )
     {
-        fscanf(datafile,"%s",i_dat_file);
+        values_read = fscanf(datafile,"%s",i_dat_file);
+        CV_Assert(values_read == 1);
         sprintf(filename, "%s%s", filepath, i_dat_file);
         file = fopen(filename,"r");
 
@@ -366,7 +369,8 @@ void CV_CameraCalibrationTest::run( int start_from )
             continue; // if there is more than one test, just skip the test
         }
 
-        fscanf(file,"%d %d\n",&(imageSize.width),&(imageSize.height));
+        values_read = fscanf(file,"%d %d\n",&(imageSize.width),&(imageSize.height));
+        CV_Assert(values_read == 2);
         if( imageSize.width <= 0 || imageSize.height <= 0 )
         {
             ts->printf( cvtest::TS::LOG, "Image size in test file is incorrect\n" );
@@ -375,7 +379,8 @@ void CV_CameraCalibrationTest::run( int start_from )
         }
 
         /* Read etalon size */
-        fscanf(file,"%d %d\n",&(etalonSize.width),&(etalonSize.height));
+        values_read = fscanf(file,"%d %d\n",&(etalonSize.width),&(etalonSize.height));
+        CV_Assert(values_read == 2);
         if( etalonSize.width <= 0 || etalonSize.height <= 0 )
         {
             ts->printf( cvtest::TS::LOG, "Pattern size in test file is incorrect\n" );
@@ -386,7 +391,8 @@ void CV_CameraCalibrationTest::run( int start_from )
         numPoints = etalonSize.width * etalonSize.height;
 
         /* Read number of images */
-        fscanf(file,"%d\n",&numImages);
+        values_read = fscanf(file,"%d\n",&numImages);
+        CV_Assert(values_read == 1);
         if( numImages <=0 )
         {
             ts->printf( cvtest::TS::LOG, "Number of images in test file is incorrect\n");
@@ -427,7 +433,8 @@ void CV_CameraCalibrationTest::run( int start_from )
             for( currPoint = 0; currPoint < numPoints; currPoint++ )
             {
                 double x,y,z;
-                fscanf(file,"%lf %lf %lf\n",&x,&y,&z);
+                values_read = fscanf(file,"%lf %lf %lf\n",&x,&y,&z);
+                CV_Assert(values_read == 3);
 
                 (objectPoints+i)->x = x;
                 (objectPoints+i)->y = y;
@@ -443,7 +450,8 @@ void CV_CameraCalibrationTest::run( int start_from )
             for( currPoint = 0; currPoint < numPoints; currPoint++ )
             {
                 double x,y;
-                fscanf(file,"%lf %lf\n",&x,&y);
+                values_read = fscanf(file,"%lf %lf\n",&x,&y);
+                CV_Assert(values_read == 2);
 
                 (imagePoints+i)->x = x;
                 (imagePoints+i)->y = y;
@@ -455,32 +463,40 @@ void CV_CameraCalibrationTest::run( int start_from )
 
         /* Focal lengths */
         double goodFcx,goodFcy;
-        fscanf(file,"%lf %lf",&goodFcx,&goodFcy);
+        values_read = fscanf(file,"%lf %lf",&goodFcx,&goodFcy);
+        CV_Assert(values_read == 2);
 
         /* Principal points */
         double goodCx,goodCy;
-        fscanf(file,"%lf %lf",&goodCx,&goodCy);
+        values_read = fscanf(file,"%lf %lf",&goodCx,&goodCy);
+        CV_Assert(values_read == 2);
 
         /* Read distortion */
 
-        fscanf(file,"%lf",goodDistortion+0);
-        fscanf(file,"%lf",goodDistortion+1);
-        fscanf(file,"%lf",goodDistortion+2);
-        fscanf(file,"%lf",goodDistortion+3);
+        values_read = fscanf(file,"%lf",goodDistortion+0); CV_Assert(values_read == 1);
+        values_read = fscanf(file,"%lf",goodDistortion+1); CV_Assert(values_read == 1);
+        values_read = fscanf(file,"%lf",goodDistortion+2); CV_Assert(values_read == 1);
+        values_read = fscanf(file,"%lf",goodDistortion+3); CV_Assert(values_read == 1);
 
         /* Read good Rot matrixes */
         for( currImage = 0; currImage < numImages; currImage++ )
         {
             for( i = 0; i < 3; i++ )
                 for( j = 0; j < 3; j++ )
-                    fscanf(file, "%lf", goodRotMatrs + currImage * 9 + j * 3 + i);
+                {
+                    values_read = fscanf(file, "%lf", goodRotMatrs + currImage * 9 + j * 3 + i);
+                    CV_Assert(values_read == 1);
+                }
         }
 
         /* Read good Trans vectors */
         for( currImage = 0; currImage < numImages; currImage++ )
         {
             for( i = 0; i < 3; i++ )
-                fscanf(file, "%lf", goodTransVects + currImage * 3 + i);
+            {
+                values_read = fscanf(file, "%lf", goodTransVects + currImage * 3 + i);
+                CV_Assert(values_read == 1);
+            }
         }
 
         calibFlags = 0
@@ -1508,7 +1524,7 @@ void CV_StereoCalibrationTest::run( int )
         const float minDisparity = 0.1f;
         const float maxDisparity = 600.0f;
         const int pointsCount = 500;
-        const float requiredAccuracy = 1e-3;
+        const float requiredAccuracy = 1e-3f;
         RNG& rng = ts->get_rng();
 
         Mat projectedPoints_1(2, pointsCount, CV_32FC1);
@@ -1544,7 +1560,7 @@ void CV_StereoCalibrationTest::run( int )
         }
 
         //check correctMatches
-        const float constraintAccuracy = 1e-5;
+        const float constraintAccuracy = 1e-5f;
         Mat newPoints1, newPoints2;
         Mat points1 = projectedPoints_1.t();
         points1 = points1.reshape(2, 1);
@@ -1767,7 +1783,7 @@ void CV_StereoCalibrationTest_C::correct( const Mat& F,
     CvMat _F = F, _points1 = points1, _points2 = points2;
     newPoints1.create(1, points1.cols, points1.type());
     newPoints2.create(1, points2.cols, points2.type());
-    CvMat _newPoints1 = newPoints1, _newPoints2 = _newPoints2;
+    CvMat _newPoints1 = newPoints1, _newPoints2 = newPoints2;
     cvCorrectMatches(&_F, &_points1, &_points2, &_newPoints1, &_newPoints2);
 }
 
index a3dd0a7..3173b23 100644 (file)
@@ -66,7 +66,6 @@ struct CV_EXPORTS CvMotionModel
        }
 
        float low_pass_gain;    // low pass gain
-       CvEMParams em_params;   // EM parameters
 };
 
 // Mean Shift Tracker parameters for specifying use of HSV channel and CamShift parameters.
@@ -109,7 +108,6 @@ struct CV_EXPORTS CvHybridTrackerParams
        float ms_tracker_weight;
        CvFeatureTrackerParams ft_params;
        CvMeanShiftTrackerParams ms_params;
-       CvEMParams em_params;
        int motion_model;
        float low_pass_gain;
 };
@@ -182,7 +180,6 @@ private:
 
        CvMat* samples;
        CvMat* labels;
-       CvEM em_model;
 
        Rect prev_window;
        Point2f prev_center;
index eca78dc..c0081c1 100644 (file)
@@ -47,7 +47,7 @@ static void sortMatrixRowsByIndices(InputArray _src, InputArray _indices, Output
     Mat dst = _dst.getMat();
     for(size_t idx = 0; idx < indices.size(); idx++) {
         Mat originalRow = src.row(indices[idx]);
-        Mat sortedRow = dst.row(idx);
+        Mat sortedRow = dst.row((int)idx);
         originalRow.copyTo(sortedRow);
     }
 }
@@ -127,8 +127,9 @@ static Mat interp1(InputArray _x, InputArray _Y, InputArray _xi)
         case CV_32SC1: return interp1_<int>(x,Y,xi); break;
         case CV_32FC1: return interp1_<float>(x,Y,xi); break;
         case CV_64FC1: return interp1_<double>(x,Y,xi); break;
-        default: CV_Error(CV_StsUnsupportedFormat, ""); return Mat();
+        default: CV_Error(CV_StsUnsupportedFormat, ""); break;
     }
+    return Mat();
 }
     
 namespace colormap
@@ -166,7 +167,7 @@ namespace colormap
         static Mat linear_colormap(InputArray X,
                 InputArray r, InputArray g, InputArray b,
                 float begin, float end, float n) {
-            return linear_colormap(X,r,g,b,linspace(begin,end,n));
+            return linear_colormap(X,r,g,b,linspace(begin,end, cvRound(n)));
         }
 
         // Interpolates from a base colormap.
index d7a529d..987e021 100644 (file)
@@ -117,7 +117,7 @@ public:
     void train(InputArray src, InputArray labels);
 
     // Predicts the label of a query image in src.
-    int predict(const InputArray src) const;
+    int predict(InputArray src) const;
 
     // See FaceRecognizer::load.
     void load(const FileStorage& fs);
@@ -384,7 +384,7 @@ void Fisherfaces::train(InputArray src, InputArray _lbls) {
     if(labels.size() != (size_t)N)
         CV_Error(CV_StsUnsupportedFormat, "Labels must be given as integer (CV_32SC1).");
     // compute the Fisherfaces
-    int C = remove_dups(labels).size(); // number of unique classes
+    int C = (int)remove_dups(labels).size(); // number of unique classes
     // clip number of components to be a valid number
     if((_num_components <= 0) || (_num_components > (C-1)))
         _num_components = (C-1);
@@ -495,8 +495,8 @@ inline void elbp_(InputArray _src, OutputArray _dst, int radius, int neighbors)
     dst.setTo(0);
     for(int n=0; n<neighbors; n++) {
         // sample points
-        float x = static_cast<float>(-radius) * sin(2.0*CV_PI*n/static_cast<float>(neighbors));
-        float y = static_cast<float>(radius) * cos(2.0*CV_PI*n/static_cast<float>(neighbors));
+        float x = static_cast<float>(-radius * sin(2.0*CV_PI*n/static_cast<float>(neighbors)));
+        float y = static_cast<float>(radius * cos(2.0*CV_PI*n/static_cast<float>(neighbors)));
         // relative indices
         int fx = static_cast<int>(floor(x));
         int fy = static_cast<int>(floor(y));
@@ -514,7 +514,7 @@ inline void elbp_(InputArray _src, OutputArray _dst, int radius, int neighbors)
         for(int i=radius; i < src.rows-radius;i++) {
             for(int j=radius;j < src.cols-radius;j++) {
                 // calculate interpolated value
-                float t = w1*src.at<_Tp>(i+fy,j+fx) + w2*src.at<_Tp>(i+fy,j+cx) + w3*src.at<_Tp>(i+cy,j+fx) + w4*src.at<_Tp>(i+cy,j+cx);
+                float t = static_cast<float>(w1*src.at<_Tp>(i+fy,j+fx) + w2*src.at<_Tp>(i+fy,j+cx) + w3*src.at<_Tp>(i+cy,j+fx) + w4*src.at<_Tp>(i+cy,j+cx));
                 // floating point precision, so check some machine-dependent epsilon
                 dst.at<int>(i-radius,j-radius) += ((t > src.at<_Tp>(i,j)) || (std::abs(t-src.at<_Tp>(i,j)) < std::numeric_limits<float>::epsilon())) << n;
             }
@@ -543,13 +543,13 @@ histc_(const Mat& src, int minVal=0, int maxVal=255, bool normed=false)
     // Establish the number of bins.
     int histSize = maxVal-minVal+1;
     // Set the ranges.
-    float range[] = { minVal, maxVal } ;
+    float range[] = { static_cast<float>(minVal), static_cast<float>(maxVal) };
     const float* histRange = { range };
     // calc histogram
     calcHist(&src, 1, 0, Mat(), result, 1, &histSize, &histRange, true, false);
     // normalize
     if(normed) {
-        result /= src.total();
+        result /= (int)src.total();
     }
     return result.reshape(1,1);
 }
index 1408fac..b499611 100644 (file)
@@ -132,17 +132,6 @@ void CvHybridTracker::newTracker(Mat image, Rect selection) {
        mstracker->newTrackingWindow(image, selection);
        fttracker->newTrackingWindow(image, selection);
 
-       params.em_params.covs = NULL;
-       params.em_params.means = NULL;
-       params.em_params.probs = NULL;
-       params.em_params.nclusters = 1;
-       params.em_params.weights = NULL;
-       params.em_params.cov_mat_type = CvEM::COV_MAT_SPHERICAL;
-       params.em_params.start_step = CvEM::START_AUTO_STEP;
-       params.em_params.term_crit.max_iter = 10000;
-       params.em_params.term_crit.epsilon = 0.001;
-       params.em_params.term_crit.type = CV_TERMCRIT_ITER | CV_TERMCRIT_EPS;
-
        samples = cvCreateMat(2, 1, CV_32FC1);
        labels = cvCreateMat(2, 1, CV_32SC1);
 
@@ -221,10 +210,16 @@ void CvHybridTracker::updateTrackerWithEM(Mat image) {
                                count++;
                        }
 
-       em_model.train(samples, 0, params.em_params, labels);
+    cv::Mat lbls;
+    
+    EM em_model(1, EM::COV_MAT_SPHERICAL, TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 10000, 0.001));
+    em_model.train(cvarrToMat(samples), lbls);
+    if(labels)
+        lbls.copyTo(cvarrToMat(labels));
 
-       curr_center.x = (float)em_model.getMeans().at<double> (0, 0);
-       curr_center.y = (float)em_model.getMeans().at<double> (0, 1);
+    Mat em_means = em_model.get<Mat>("means");
+       curr_center.x = (float)em_means.at<float>(0, 0);
+       curr_center.y = (float)em_means.at<float>(0, 1);
 }
 
 void CvHybridTracker::updateTrackerWithLowPassFilter(Mat image) {
index 44eb493..f37346f 100644 (file)
@@ -62,7 +62,7 @@ static Mat asRowMatrix(InputArrayOfArrays src, int rtype, double alpha=1, double
     if(n == 0)
         return Mat();
     // dimensionality of samples
-    int d = src.getMat(0).total();
+    int d = (int)src.getMat(0).total();
     // create data matrix
     Mat data(n, d, rtype);
     // copy data
@@ -82,7 +82,7 @@ void sortMatrixColumnsByIndices(InputArray _src, InputArray _indices, OutputArra
     Mat dst = _dst.getMat();
     for(size_t idx = 0; idx < indices.size(); idx++) {
         Mat originalCol = src.col(indices[idx]);
-        Mat sortedCol = dst.col(idx);
+        Mat sortedCol = dst.col((int)idx);
         originalCol.copyTo(sortedCol);
     }
 }
@@ -947,14 +947,14 @@ void LDA::lda(InputArray _src, InputArray _lbls) {
     vector<int> num2label = remove_dups(labels);
     map<int, int> label2num;
     for (size_t i = 0; i < num2label.size(); i++)
-        label2num[num2label[i]] = i;
+        label2num[num2label[i]] = (int)i;
     for (size_t i = 0; i < labels.size(); i++)
         mapped_labels[i] = label2num[labels[i]];
     // get sample size, dimension
     int N = data.rows;
     int D = data.cols;
     // number of unique labels
-    int C = num2label.size();
+    int C = (int)num2label.size();
     // throw error if less labels, than samples
     if (labels.size() != (size_t)N)
         CV_Error(CV_StsBadArg, "Error: The number of samples must equal the number of labels.");
index bd0f608..e2818ad 100644 (file)
@@ -440,9 +440,9 @@ cv::Mesh3D::~Mesh3D() {}
 void cv::Mesh3D::buildOctree() { if (octree.getNodes().empty()) octree.buildTree(vtx); }
 void cv::Mesh3D::clearOctree(){ octree = Octree(); }
 
-float cv::Mesh3D::estimateResolution(float tryRatio)
+float cv::Mesh3D::estimateResolution(float /*tryRatio*/)
 {
-    #if 0
+#if 0
     const int neighbors = 3;
     const int minReasonable = 10;
 
@@ -476,10 +476,10 @@ float cv::Mesh3D::estimateResolution(float tryRatio)
     sort(dist, less<double>());
    
     return resolution = (float)dist[ dist.size() / 2 ];
-    #else
+#else
     CV_Error(CV_StsNotImplemented, "");
     return 1.f;
-    #endif
+#endif
 }
 
 
@@ -1171,7 +1171,7 @@ private:
                 break;
                         
             std::transform(left.begin(), left.end(), buf_beg,  WgcHelper(group, groupingMat));
-            int minInd = min_element(buf_beg, buf_beg + left_size) - buf_beg;
+            size_t minInd = min_element(buf_beg, buf_beg + left_size) - buf_beg;
             
             if (buf[minInd] < model.T_GroupingCorespondances) /* can add corespondance to group */
             {
@@ -1182,14 +1182,14 @@ private:
                 left.erase(pos);
             }
             else
-                break;            
+                break;
         }
 
         if (group.size() >= 4)
-            groups.push_back(group);      
+            groups.push_back(group);
     }
 
-    /* converting the data to final result */    
+    /* converting the data to final result */
     for(size_t i = 0; i < groups.size(); ++i)
     {
         const group_t& group = groups[i];
@@ -1197,7 +1197,7 @@ private:
         vector< Vec2i > outgrp;
         for(citer pos = group.begin(); pos != group.end(); ++pos)
         {
-            const Match& m = allMatches[*pos];            
+            const Match& m = allMatches[*pos];
             outgrp.push_back(Vec2i(subset[m.modelInd], scene.subset[m.sceneInd]));
         }        
         result.push_back(outgrp);
index 87d2044..3f321b6 100644 (file)
@@ -16,7 +16,13 @@ else()
   set(cuda_link_libs "")
 endif()
 
-ocv_glob_module_sources(SOURCES ${lib_cuda} ${cuda_objs})
+set(OPENCV_VERSION_FILE "${opencv_core_BINARY_DIR}/version_string.inc")
+add_custom_command(OUTPUT "${OPENCV_VERSION_FILE}"
+                   COMMAND ${CMAKE_COMMAND} -E copy_if_different "${OPENCV_BUILD_INFO_FILE}" "${OPENCV_VERSION_FILE}"
+                   MAIN_DEPENDENCY "${OPENCV_BUILD_INFO_FILE}"
+                   COMMENT "")
+
+ocv_glob_module_sources(SOURCES ${lib_cuda} ${cuda_objs} "${OPENCV_VERSION_FILE}")
 
 ocv_create_module(${cuda_link_libs})
 ocv_add_precompiled_headers(${the_module})
@@ -24,6 +30,3 @@ ocv_add_precompiled_headers(${the_module})
 ocv_add_accuracy_tests()
 ocv_add_perf_tests()
 
-
-
-
index 49e7ae2..2d49f60 100644 (file)
@@ -42,7 +42,7 @@ The main purpose of this class is to convert compilation-time type information t
     cout << B.depth() << ", " << B.channels() << endl;
 
 
-So, such traits are used to tell OpenCV which data type you are working with, even if such a type is not native to OpenCV. For example, the matrix ``B`` intialization above is compiled because OpenCV defines the proper specialized template class ``DataType<complex<_Tp> >`` . This mechanism is also useful (and used in OpenCV this way) for generic algorithms implementations.
+So, such traits are used to tell OpenCV which data type you are working with, even if such a type is not native to OpenCV. For example, the matrix ``B`` initialization above is compiled because OpenCV defines the proper specialized template class ``DataType<complex<_Tp> >`` . This mechanism is also useful (and used in OpenCV this way) for generic algorithms implementations.
 
 
 Point\_
@@ -100,7 +100,7 @@ Size\_
 ------
 .. ocv:class:: Size_
 
-Template class for specfying the size of an image or rectangle. The class includes two members called ``width`` and ``height``. The structure can be converted to and from the old OpenCV structures
+Template class for specifying the size of an image or rectangle. The class includes two members called ``width`` and ``height``. The structure can be converted to and from the old OpenCV structures
 ``CvSize`` and ``CvSize2D32f`` . The same set of arithmetic and comparison operations as for ``Point_`` is available.
 
 OpenCV defines the following ``Size_<>`` aliases: ::
@@ -372,7 +372,7 @@ This class provides the following options:
 *
     Heterogeneous collections of objects. The standard STL and most other C++ and OpenCV containers can store only objects of the same type and the same size. The classical solution to store objects of different types in the same container is to store pointers to the base class ``base_class_t*``     instead but then you loose the automatic memory management. Again, by using ``Ptr<base_class_t>()``     instead of the raw pointers, you can solve the problem.
 
-The ``Ptr`` class treats the wrapped object as a black box. The reference counter is allocated and managed separately. The only thing the pointer class needs to know about the object is how to deallocate it. This knowledge is incapsulated in the ``Ptr::delete_obj()`` method that is called when the reference counter becomes 0. If the object is a C++ class instance, no additional coding is needed, because the default implementation of this method calls ``delete obj;`` .
+The ``Ptr`` class treats the wrapped object as a black box. The reference counter is allocated and managed separately. The only thing the pointer class needs to know about the object is how to deallocate it. This knowledge is encapsulated in the ``Ptr::delete_obj()`` method that is called when the reference counter becomes 0. If the object is a C++ class instance, no additional coding is needed, because the default implementation of this method calls ``delete obj;`` .
 However, if the object is deallocated in a different way, the specialized method should be created. For example, if you want to wrap ``FILE`` , the ``delete_obj`` may be implemented as follows: ::
 
     template<> inline void Ptr<FILE>::delete_obj()
@@ -711,7 +711,7 @@ This is a list of implemented matrix operations that can be combined in arbitrar
 *
     ``Mat_<destination_type>()`` constructors to cast the result to the proper type.
 
-.. note:: Comma-separated initializers and probably some other operations may require additional explicit ``Mat()`` or ``Mat_<T>()`` constuctor calls to resolve a possible ambiguity.
+.. note:: Comma-separated initializers and probably some other operations may require additional explicit ``Mat()`` or ``Mat_<T>()`` constructor calls to resolve a possible ambiguity.
 
 Here are examples of matrix expressions:
 
@@ -786,6 +786,8 @@ Various Mat constructors
 
     :param cols: Number of columns in a 2D array.
 
+    :param roi: Region of interest.
+
     :param size: 2D array size:  ``Size(cols, rows)`` . In the  ``Size()``  constructor, the number of rows and the number of columns go in the reverse order.
 
     :param sizes: Array of integers specifying an n-dimensional array shape.
@@ -890,7 +892,7 @@ The method makes a new header for the specified matrix row and returns it. This
         // works, but looks a bit obscure.
         A.row(i) = A.row(j) + 0;
 
-        // this is a bit longe, but the recommended method.
+        // this is a bit longer, but the recommended method.
         A.row(j).copyTo(A.row(i));
 
 Mat::col
@@ -996,7 +998,7 @@ When the operation mask is specified, and the ``Mat::create`` call shown above r
 
 Mat::convertTo
 ------------------
-Converts an array to another datatype with optional scaling.
+Converts an array to another data type with optional scaling.
 
 .. ocv:function:: void Mat::convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const
 
@@ -1008,7 +1010,7 @@ Converts an array to another datatype with optional scaling.
 
     :param beta: Optional delta added to the scaled values.
 
-The method converts source pixel values to the target datatype. ``saturate_cast<>`` is applied at the end to avoid possible overflows:
+The method converts source pixel values to the target data type. ``saturate_cast<>`` is applied at the end to avoid possible overflows:
 
 .. math::
 
@@ -1347,7 +1349,7 @@ Locates the matrix header within a parent matrix.
 
 .. ocv:function:: void Mat::locateROI( Size& wholeSize, Point& ofs ) const
 
-    :param wholeSize: Output parameter that contains the size of the whole matrix containing ``*this`` is a part.
+    :param wholeSize: Output parameter that contains the size of the whole matrix containing ``*this`` as a part.
 
     :param ofs: Output parameter that contains an offset of  ``*this``  inside the whole matrix.
 
@@ -1380,7 +1382,7 @@ The method is complimentary to
 
 In this example, the matrix size is increased by 4 elements in each direction. The matrix is shifted by 2 elements to the left and 2 elements up, which brings in all the necessary pixels for the filtering with the 5x5 kernel.
 
-It is your responsibility to make sure ``adjustROI`` does not cross the parent matrix boundary. If it does, the function signals an error.
+``adjustROI`` forces the adjusted ROI to be inside of the parent matrix that is boundaries of the adjusted ROI are constrained by boundaries of the parent matrix. For example, if the submatrix ``A`` is located in the first row of a parent matrix and you called ``A.adjustROI(2, 2, 2, 2)`` then ``A`` will not be increased in the upward direction.
 
 The function is used internally by the OpenCV filtering functions, like
 :ocv:func:`filter2D` , morphological operations, and so on.
@@ -1600,7 +1602,7 @@ The method returns a matrix size: ``Size(cols, rows)`` . When the matrix is more
 
 Mat::empty
 --------------
-Returns ``true`` if the array has no elemens.
+Returns ``true`` if the array has no elements.
 
 .. ocv:function:: bool Mat::empty() const
 
index 81bfb7a..6788651 100644 (file)
@@ -11,9 +11,9 @@ Finds centers of clusters and groups input samples around the clusters.
 
 .. ocv:pyfunction:: cv2.kmeans(data, K, criteria, attempts, flags[, bestLabels[, centers]]) -> retval, bestLabels, centers
 
-.. ocv:cfunction:: int cvKMeans2(const CvArr* samples, int nclusters, CvArr* labels, CvTermCriteria criteria, int attempts=1, CvRNG* rng=0, int flags=0, CvArr* centers=0, double* compactness=0)
+.. ocv:cfunction:: int cvKMeans2(const CvArr* samples, int clusterCount, CvArr* labels, CvTermCriteria criteria, int attempts=1, CvRNG* rng=0, int flags=0, CvArr* centers=0, double* compactness=0)
 
-.. ocv:pyoldfunction:: cv.KMeans2(samples, nclusters, labels, criteria)-> None
+.. ocv:pyoldfunction:: cv.KMeans2(samples, clusterCount, labels, criteria)-> None
 
     :param samples: Floating-point matrix of input samples, one row per sample.
 
@@ -23,7 +23,9 @@ Finds centers of clusters and groups input samples around the clusters.
 
     :param criteria: The algorithm termination criteria, that is, the maximum number of iterations and/or the desired accuracy. The accuracy is specified as ``criteria.epsilon``. As soon as each of the cluster centers moves by less than ``criteria.epsilon`` on some iteration, the algorithm stops.
 
-    :param attempts: Flag to specify the number of times the algorithm is executed using different initial labelings. The algorithm returns the labels that yield the best compactness (see the last function parameter).
+    :param attempts: Flag to specify the number of times the algorithm is executed using different initial labellings. The algorithm returns the labels that yield the best compactness (see the last function parameter).
+
+    :param rng: CvRNG state initialized by RNG().
 
     :param flags: Flag that can take the following values:
 
@@ -35,6 +37,8 @@ Finds centers of clusters and groups input samples around the clusters.
 
     :param centers: Output matrix of the cluster centers, one row per each cluster center.
 
+    :param compactness: The returned value that is described below.
+
 The function ``kmeans`` implements a k-means algorithm that finds the
 centers of ``clusterCount`` clusters and groups the input samples
 around the clusters. As an output,
index 6c96669..a4d8dce 100644 (file)
@@ -190,7 +190,7 @@ Fills the area bounded by one or more polygons.
 
 .. ocv:pyfunction:: cv2.fillPoly(img, pts, color[, lineType[, shift[, offset]]]) -> None
 
-.. ocv:cfunction:: void cvFillPoly( CvArr* img, CvPoint** pts, int* npts, int contours, CvScalar color, int lineType=8, int shift=0 )
+.. ocv:cfunction:: void cvFillPoly( CvArr* img, CvPoint** pts, int* npts, int ncontours, CvScalar color, int lineType=8, int shift=0 )
 .. ocv:pyoldfunction:: cv.FillPoly(img, polys, color, lineType=8, shift=0)-> None
 
     :param img: Image.
@@ -207,8 +207,10 @@ Fills the area bounded by one or more polygons.
 
     :param shift: Number of fractional bits in the vertex coordinates.
 
+    :param offset: Optional offset of all points of the contours.
+
 The function ``fillPoly`` fills an area bounded by several polygonal contours. The function can fill complex areas, for example,
-areas with holes, contours with self-intersections (some of thier parts), and so forth.
+areas with holes, contours with self-intersections (some of their parts), and so forth.
 
 
 
@@ -413,7 +415,7 @@ Draws a simple, thick, or filled up-right rectangle.
 
     :param pt1: Vertex of the rectangle.
 
-    :param pt2: Vertex of the recangle opposite to  ``pt1`` .
+    :param pt2: Vertex of the rectangle opposite to  ``pt1`` .
     
     :param r: Alternative specification of the drawn rectangle.
 
index bb4bfcf..909212d 100644 (file)
@@ -34,7 +34,7 @@ A storage for various OpenCV dynamic data structures, such as ``CvSeq``, ``CvSet
 
 Memory storage is a low-level structure used to store dynamically growing data structures such as sequences, contours, graphs, subdivisions, etc. It is organized as a list of memory blocks of equal size -
 ``bottom`` field is the beginning of the list of blocks and ``top`` is the currently used block, but not necessarily the last block of the list. All blocks between ``bottom`` and ``top``, not including the
-latter, are considered fully occupied; all blocks between ``top`` and the last block, not including  ``top``, are considered free and ``top`` itself is partly ocupied - ``free_space`` contains the number of free bytes left in the end of ``top``.
+latter, are considered fully occupied; all blocks between ``top`` and the last block, not including  ``top``, are considered free and ``top`` itself is partly occupied - ``free_space`` contains the number of free bytes left in the end of ``top``.
 
 A new memory buffer that may be allocated explicitly by :ocv:cfunc:`MemStorageAlloc` function or implicitly by higher-level functions, such as :ocv:cfunc:`SeqPush`,  :ocv:cfunc:`GraphAddEdge` etc.
 
@@ -126,16 +126,22 @@ There are helper functions to construct the slice and to compute its length:
 
 .. ocv:cfunction:: CvSlice cvSlice( int start, int end )
 
+    :param start: Inclusive left boundary.
+
+    :param end: Exclusive right boundary.
+
 ::
 
     #define CV_WHOLE_SEQ_END_INDEX 0x3fffffff
     #define CV_WHOLE_SEQ  cvSlice(0, CV_WHOLE_SEQ_END_INDEX)
 
-..
-
 .. ocv:cfunction:: int cvSliceLength( CvSlice slice, const CvSeq* seq )
 
-  Calculates the sequence slice length
+    :param slice: The slice of sequence.
+
+    :param seq: Source sequence.
+
+Calculates the sequence slice length.
 
 Some of functions that operate on sequences take a ``CvSlice slice`` parameter that is often set to the whole sequence (CV_WHOLE_SEQ) by default. Either of the ``start_index`` and  ``end_index`` may be negative or exceed the sequence length. If they are equal, the slice is considered empty (i.e., contains no elements). Because sequences are treated as circular structures, the slice may select a
 few elements in the end of a sequence followed by a few elements at the beginning of the sequence. For example,  ``cvSlice(-2, 3)`` in the case of a 10-element sequence will select a 5-element slice, containing the pre-last (8th), last (9th), the very first (0th), second (1th) and third (2nd)
@@ -338,7 +344,7 @@ Creates structure for depth-first graph traversal.
 
             * **CV_GRAPH_BACK_EDGE** stop at back edges ( ``back edge``  is an edge connecting the last visited vertex with some of its ancestors in the search tree)
 
-            * **CV_GRAPH_FORWARD_EDGE** stop at forward edges ( ``forward edge``  is an edge conecting the last visited vertex with some of its descendants in the search tree. The forward edges are only possible during oriented graph traversal)
+            * **CV_GRAPH_FORWARD_EDGE** stop at forward edges ( ``forward edge``  is an edge connecting the last visited vertex with some of its descendants in the search tree. The forward edges are only possible during oriented graph traversal)
 
             * **CV_GRAPH_CROSS_EDGE** stop at cross edges ( ``cross edge``  is an edge connecting different search trees or branches of the same tree. The  ``cross edges``  are only possible during oriented graph traversal)
 
@@ -715,7 +721,7 @@ The function removes a vertex from the graph by using its pointer together with
 
 GraphVtxDegree
 --------------
-Counts the number of edges indicent to the vertex.
+Counts the number of edges incident to the vertex.
 
 .. ocv:cfunction:: int cvGraphVtxDegree( const CvGraph* graph, int vtxIdx )
 
@@ -1222,7 +1228,7 @@ Searches for an element in a sequence.
 
     :param elem_idx: Output parameter; index of the found element
 
-    :param userdata: The user parameter passed to the compasion function; helps to avoid global variables in some cases
+    :param userdata: The user parameter passed to the comparison function; helps to avoid global variables in some cases
 
 ::
 
@@ -1265,7 +1271,7 @@ Sorts sequence element using the specified comparison function.
 
     :param func: The comparison function that returns a negative, zero, or positive value depending on the relationships among the elements (see the above declaration and the example below) - a similar function is used by  ``qsort``  from C runline except that in the latter,  ``userdata``  is not used
 
-    :param userdata: The user parameter passed to the compasion function; helps to avoid global variables in some cases
+    :param userdata: The user parameter passed to the comparison function; helps to avoid global variables in some cases
 
 ::
 
@@ -1552,5 +1558,5 @@ Gathers all node pointers to a single sequence.
 
     :param storage: Container for the sequence
 
-The function puts pointers of all nodes reacheable from  ``first`` into a single sequence. The pointers are written sequentially in the depth-first order.
+The function puts pointers of all nodes reachable from  ``first`` into a single sequence. The pointers are written sequentially in the depth-first order.
 
index fac19ae..106d698 100644 (file)
@@ -91,7 +91,7 @@ you can use::
 
    Ptr<T> ptr = new T(...);
 
-That is, ``Ptr<T> ptr`` incapsulates a pointer to a ``T`` instance and a reference counter associated with the pointer. See the 
+That is, ``Ptr<T> ptr`` encapsulates a pointer to a ``T`` instance and a reference counter associated with the pointer. See the 
 :ocv:class:`Ptr` 
 description for details.
 
index 790de4f..748f3a0 100644 (file)
@@ -750,7 +750,7 @@ or:
 
 DotProduct
 ----------
-Calculates the dot product of two arrays in Euclidian metrics.
+Calculates the dot product of two arrays in Euclidean metrics.
 
 .. ocv:cfunction:: double cvDotProduct(const CvArr* src1, const CvArr* src2)
 .. ocv:pyoldfunction:: cv.DotProduct(src1, src2)-> double
@@ -937,7 +937,7 @@ The function provides an easy way to handle both types of arrays - ``IplImage``
 
 .. seealso:: :ocv:cfunc:`GetImage`, :ocv:func:`cvarrToMat`.
 
-.. note:: If the input array is ``IplImage`` with planar data layout and COI set, the function returns the pointer to the selected plane and ``COI == 0``. This feature allows user to process ``IplImage`` strctures with planar data layout, even though OpenCV does not support such images.
+.. note:: If the input array is ``IplImage`` with planar data layout and COI set, the function returns the pointer to the selected plane and ``COI == 0``. This feature allows user to process ``IplImage`` structures with planar data layout, even though OpenCV does not support such images.
 
 GetNextSparseNode
 -----------------
index d5eeb91..f79ed54 100644 (file)
@@ -144,7 +144,7 @@ Type information. ::
 
 ..
 
-The structure contains information about one of the standard or user-defined types. Instances of the type may or may not contain a pointer to the corresponding  :ocv:struct:`CvTypeInfo` structure. In any case, there is a way to find the type info structure for a given object using the  :ocv:cfunc:`TypeOf` function. Aternatively, type info can be found by type name using :ocv:cfunc:`FindType`, which is used when an object is read from file storage. The user can register a new type with :ocv:cfunc:`RegisterType`
+The structure contains information about one of the standard or user-defined types. Instances of the type may or may not contain a pointer to the corresponding  :ocv:struct:`CvTypeInfo` structure. In any case, there is a way to find the type info structure for a given object using the  :ocv:cfunc:`TypeOf` function. Alternatively, type info can be found by type name using :ocv:cfunc:`FindType`, which is used when an object is read from file storage. The user can register a new type with :ocv:cfunc:`RegisterType`
 that adds the type information structure into the beginning of the type list. Thus, it is possible to create specialized types from generic standard types and override the basic methods.
 
 Clone
@@ -215,7 +215,7 @@ Finds a node in a map or file storage.
     :param name: The file node name 
 
 The function finds a file node by ``name``. The node is searched either in ``map`` or, if the pointer is NULL, among the top-level file storage nodes. Using this function for maps and  :ocv:cfunc:`GetSeqElem`
-(or sequence reader) for sequences, it is possible to nagivate through the file storage. To speed up multiple queries for a certain key (e.g., in the case of an array of structures) one may use a combination of  :ocv:cfunc:`GetHashedKey` and :ocv:cfunc:`GetFileNode`.
+(or sequence reader) for sequences, it is possible to navigate through the file storage. To speed up multiple queries for a certain key (e.g., in the case of an array of structures) one may use a combination of  :ocv:cfunc:`GetHashedKey` and :ocv:cfunc:`GetFileNode`.
 
 GetFileNodeName
 ---------------
@@ -356,7 +356,7 @@ Opens file storage for reading or writing data.
 
             * **CV_STORAGE_WRITE** the storage is open for writing 
 
-The function opens file storage for reading or writing data. In the latter case, a new file is created or an existing file is rewritten. The type of the read or written file is determined by the filename extension:  ``.xml`` for  ``XML`` and  ``.yml`` or  ``.yaml`` for  ``YAML``. The function returns a pointer to the :ocv:struct:`CvFileStorage` structure.
+The function opens file storage for reading or writing data. In the latter case, a new file is created or an existing file is rewritten. The type of the read or written file is determined by the filename extension:  ``.xml`` for  ``XML`` and  ``.yml`` or  ``.yaml`` for  ``YAML``. The function returns a pointer to the :ocv:struct:`CvFileStorage` structure. If the file cannot be opened then the function returns ``NULL``.
 
 Read
 ----
@@ -629,7 +629,7 @@ The function finishes the currently written stream and starts the next stream. I
     </opencv_storage>
     ...
 
-The YAML file will look like this: ::
+The YAML file will look like this: ::
 
     %YAML:1.0
     # stream #1 data
@@ -722,7 +722,7 @@ Writes an object to file storage.
 
     :param ptr: Pointer to the object 
 
-    :param attributes: The attributes of the object. They are specific for each particular type (see the dicsussion below).
+    :param attributes: The attributes of the object. They are specific for each particular type (see the discussion below).
 
 The function writes an object to file storage. First, the appropriate type info is found using :ocv:cfunc:`TypeOf`. Then, the ``write`` method associated with the type info is called.
 
@@ -796,7 +796,7 @@ Writes a file node to another file storage.
 
     :param node: The written node 
 
-    :param embed: If the written node is a collection and this parameter is not zero, no extra level of hiararchy is created. Instead, all the elements of  ``node``  are written into the currently written structure. Of course, map elements can only be embedded into another map, and sequence elements can only be embedded into another sequence. 
+    :param embed: If the written node is a collection and this parameter is not zero, no extra level of hierarchy is created. Instead, all the elements of  ``node``  are written into the currently written structure. Of course, map elements can only be embedded into another map, and sequence elements can only be embedded into another sequence. 
 
 The function writes a copy of a file node to file storage. Possible applications of the function are merging several file storages into one and conversion between XML and YAML formats.
 
index c32c35f..979e21f 100644 (file)
@@ -208,7 +208,7 @@ Calculates the per-element bit-wise conjunction of two arrays or an array and a
 
     :param src2: Second source array or a scalar.
 
-    :param dst: Destination arrayb that has the same size and type as the input array(s).
+    :param dst: Destination array that has the same size and type as the input array(s).
     
     :param mask: Optional operation mask, 8-bit single channel array, that specifies elements of the destination array to be changed.
 
@@ -1124,6 +1124,37 @@ To extract a channel from a new-style matrix, use
 .. seealso::  :ocv:func:`mixChannels` , :ocv:func:`split` , :ocv:func:`merge` , :ocv:func:`cvarrToMat` , :ocv:cfunc:`cvSetImageCOI` , :ocv:cfunc:`cvGetImageCOI`
 
 
+insertImageCOI
+---------------
+Copies the selected image channel from a new-style C++ matrix to the old-style C array.
+
+.. ocv:function:: void insertImageCOI(InputArray src, CvArr* dst, int coi=-1)
+
+    :param src: Source array with a single channel and the same size and depth as ``dst``.
+
+    :param dst: Destination array, it should be a pointer to  ``CvMat``  or  ``IplImage``.
+
+    :param coi: If the parameter is  ``>=0`` , it specifies the channel to insert. If it is  ``<0`` and ``dst``  is a pointer to  ``IplImage``  with a  valid COI set, the selected COI is extracted.
+
+The function ``insertImageCOI`` is used to extract an image COI from a new-style C++ matrix and put the result to the old-style array.
+
+The sample below illustrates how to use the function:
+::
+
+    Mat temp(240, 320, CV_8UC1, Scalar(255));
+    IplImage* img = cvCreateImage(cvSize(320,240), IPL_DEPTH_8U, 3);
+    insertImageCOI(temp, img, 1); //insert to the first channel
+    cvNamedWindow("window",1);
+    cvShowImage("window", img); //you should see green image, because channel number 1 is green (BGR)
+    cvWaitKey(0);
+    cvDestroyAllWindows();
+    cvReleaseImage(&img);
+
+To insert a channel to a new-style matrix, use
+:ocv:func:`merge` .
+
+.. seealso::  :ocv:func:`mixChannels` , :ocv:func:`split` , :ocv:func:`merge` , :ocv:func:`cvarrToMat` , :ocv:cfunc:`cvSetImageCOI` , :ocv:cfunc:`cvGetImageCOI`
+
 
 flip
 --------
@@ -1182,7 +1213,7 @@ Performs generalized matrix multiplication.
 .. ocv:pyfunction:: cv2.gemm(src1, src2, alpha, src3, gamma[, dst[, flags]]) -> dst
 
 .. ocv:cfunction:: void cvGEMM( const CvArr* src1, const CvArr* src2, double alpha, const CvArr* src3, double beta, CvArr* dst, int tABC=0)
-.. ocv:pyoldfunction:: cv.GEMM(src1, src2, alphs, src3, beta, dst, tABC=0)-> None
+.. ocv:pyoldfunction:: cv.GEMM(src1, src2, alpha, src3, beta, dst, tABC=0)-> None
 
     :param src1: First multiplied input matrix that should have  ``CV_32FC1`` , ``CV_64FC1`` , ``CV_32FC2`` , or  ``CV_64FC2``  type.
 
@@ -1373,7 +1404,7 @@ The function checks the range as follows:
 
 That is, ``dst`` (I) is set to 255 (all ``1`` -bits) if ``src`` (I) is within the specified 1D, 2D, 3D, ... box and 0 otherwise.
 
-When the lower and/or upper bounary parameters are scalars, the indexes ``(I)`` at ``lowerb`` and ``upperb`` in the above formulas should be omitted.
+When the lower and/or upper boundary parameters are scalars, the indexes ``(I)`` at ``lowerb`` and ``upperb`` in the above formulas should be omitted.
 
 
 invert
@@ -1398,7 +1429,7 @@ Finds the inverse or pseudo-inverse of a matrix.
 
             * **DECOMP_SVD** Singular value decomposition (SVD) method.
 
-            * **DECOMP_CHOLESKY** Cholesky decomposion. The matrix must be symmetrical and positively defined.
+            * **DECOMP_CHOLESKY** Cholesky decomposition. The matrix must be symmetrical and positively defined.
 
 The function ``invert`` inverts the matrix ``src`` and stores the result in ``dst`` .
 When the matrix ``src`` is singular or non-square, the function computes the pseudo-inverse matrix (the ``dst`` matrix) so that ``norm(src*dst - I)`` is minimal, where I is an identity matrix.
@@ -2097,7 +2128,7 @@ Normalizes the norm or value range of an array.
     
     :param alpha: Norm value to normalize to or the lower range boundary in case of the range normalization.
 
-    :param beta: Upper range boundary in case ofthe range normalization. It is not used for the norm normalization.
+    :param beta: Upper range boundary in case of the range normalization. It is not used for the norm normalization.
 
     :param normType: Normalization type. See the details below.
 
@@ -2423,6 +2454,8 @@ So, for a non-integer power exponent, the absolute values of input array element
 
 For some values of ``p`` , such as integer values, 0.5 and -0.5, specialized faster algorithms are used.
 
+Special values (NaN, Inf) are not handled.
+
 .. seealso::
 
     :ocv:func:`sqrt`,
@@ -3021,7 +3054,7 @@ If you need to extract a single channel or do some other sophisticated channel p
 
 sqrt
 ----
-Calculates a quare root of array elements.
+Calculates a square root of array elements.
 
 .. ocv:function:: void sqrt(InputArray src, OutputArray dst)
 
@@ -3203,7 +3236,7 @@ Performs SVD of a matrix
     
     :param vt: Transposed matrix of right singular values
     
-    :param flags: Opertion flags - see :ocv:func:`SVD::SVD`.
+    :param flags: Operation flags - see :ocv:func:`SVD::SVD`.
 
 The methods/functions perform SVD of matrix. Unlike ``SVD::SVD`` constructor and ``SVD::operator()``, they store the results to the user-provided matrices. ::
 
index 1895a41..5751e09 100644 (file)
@@ -31,7 +31,7 @@ Aligns a buffer size to the specified number of bytes.
 
     :param n: Alignment size that must be a power of two.
 
-The function returns the minimum number that is greater or equal to ``sz`` and is divisble by ``n`` :
+The function returns the minimum number that is greater or equal to ``sz`` and is divisible by ``n`` :
 
 .. math::
 
index be80309..f16b4ed 100644 (file)
@@ -148,17 +148,545 @@ FileStorage
 -----------
 .. ocv:class:: FileStorage
 
-XML/YAML file storage class that incapsulates all the information necessary for writing or reading data to/from file.
+XML/YAML file storage class that encapsulates all the information necessary for writing or reading data to/from a file.
+
+FileStorage::FileStorage
+------------------------
+The constructors.
+
+.. ocv:function:: FileStorage::FileStorage()
+
+.. ocv:function:: FileStorage::FileStorage(const string& filename, int flags, const string& encoding=string())
+
+    :param filename: Name of the file to open. Extension of the file (``.xml`` or ``.yml``/``.yaml``) determines its format (XML or YAML respectively). Also you can append ``.gz`` to work with compressed files, for example ``myHugeMatrix.xml.gz``.
+
+    :param flags: Mode of operation. Possible values are:
+
+        * **FileStorage::READ** Open the file for reading.
+
+        * **FileStorage::WRITE** Open the file for writing.
+
+        * **FileStorage::APPEND** Open the file for appending.
+
+    :param encoding: Encoding of the file. Note that UTF-16 XML encoding is not supported currently and you should use 8-bit encoding instead of it.
+
+The full constructor opens the file. Alternatively you can use the default constructor and then call :ocv:func:`FileStorage::open`.
+
+
+FileStorage::open
+-----------------
+Opens a file.
+
+.. ocv:function:: bool FileStorage::open(const string& filename, int flags, const string& encoding=string())
+
+See description of parameters in :ocv:func:`FileStorage::FileStorage`. The method calls :ocv:func:`FileStorage::release` before opening the file.
+
+
+FileStorage::isOpened
+---------------------
+Checks whether the file is opened.
+
+.. ocv:function:: bool FileStorage::isOpened() const
+
+    :returns: ``true`` if the object is associated with the current file and ``false`` otherwise.
+   
+It is a good practice to call this method after you tried to open a file.
+
+
+FileStorage::release
+--------------------
+Closes the file and releases all the memory buffers.
+
+.. ocv:function:: void FileStorage::release()
+
+Call this method after all I/O operations with the storage are finished.
+
+
+FileStorage::getFirstTopLevelNode
+---------------------------------
+Returns the first element of the top-level mapping.
+
+.. ocv:function:: FileNode FileStorage::getFirstTopLevelNode() const
+
+    :returns: The first element of the top-level mapping.
+
+
+FileStorage::root
+-----------------
+Returns the top-level mapping
+
+.. ocv:function:: FileNode FileStorage::root(int streamidx=0) const
+
+    :param streamidx: Zero-based index of the stream. In most cases there is only one stream in the file. However, YAML supports multiple streams and so there can be several.
+
+    :returns: The top-level mapping.
+
+
+FileStorage::operator[]
+-----------------------
+Returns the specified element of the top-level mapping.
+
+.. ocv:function:: FileNode FileStorage::operator[](const string& nodename) const
+
+.. ocv:function:: FileNode FileStorage::operator[](const char* nodename) const
+
+    :param nodename: Name of the file node.
+
+    :returns: Node with the given name.
+
+
+FileStorage::operator*
+----------------------
+Returns the obsolete C FileStorage structure.
+
+.. ocv:function:: CvFileStorage* FileStorage::operator *()
+
+.. ocv:function:: const CvFileStorage* FileStorage::operator *() const
+
+    :returns: Pointer to the underlying C FileStorage structure
+
+
+FileStorage::writeRaw
+---------------------
+Writes multiple numbers.
+
+.. ocv:function:: void FileStorage::writeRaw( const string& fmt, const uchar* vec, size_t len )
+
+     :param fmt: Specification of each array element that has the following format  ``([count]{'u'|'c'|'w'|'s'|'i'|'f'|'d'})...`` where the characters correspond to fundamental C++ types:
+
+            * **u** 8-bit unsigned number 
+
+            * **c** 8-bit signed number 
+
+            * **w** 16-bit unsigned number 
+
+            * **s** 16-bit signed number 
+
+            * **i** 32-bit signed number 
+
+            * **f** single precision floating-point number 
+
+            * **d** double precision floating-point number 
+
+            * **r** pointer, 32 lower bits of which are written as a signed integer. The type can be used to store structures with links between the elements. 
+            
+            ``count``  is the optional counter of values of a given type. For example,  ``2if``  means that each array element is a structure of 2 integers, followed by a single-precision floating-point number. The equivalent notations of the above specification are ' ``iif`` ', ' ``2i1f`` ' and so forth. Other examples:  ``u``  means that the array consists of bytes, and  ``2d``  means the array consists of pairs  of doubles.
+
+     :param vec: Pointer to the written array.
+
+     :param len: Number of the ``uchar`` elements to write.
+
+Writes one or more numbers of the specified format to the currently written structure. Usually it is more convenient to use :ocv:func:`operator <<` instead of this method.
+
+FileStorage::writeObj
+---------------------
+Writes the registered C structure (CvMat, CvMatND, CvSeq).
+
+.. ocv:function:: void FileStorage::writeObj( const string& name, const void* obj )
+
+    :param name: Name of the written object.
+
+    :param obj: Pointer to the object.
+
+See :ocv:cfunc:`Write` for details.
+
+
+FileStorage::getDefaultObjectName
+---------------------------------
+Returns the normalized object name for the specified name of a file.
+
+.. ocv:function:: static string FileStorage::getDefaultObjectName(const string& filename)
+
+   :param filename: Name of a file
+
+   :returns: The normalized object name.
+
+
+operator <<
+-----------
+Writes data to a file storage.
+
+.. ocv:function:: template<typename _Tp> FileStorage& operator << (FileStorage& fs, const _Tp& value)
+
+.. ocv:function:: template<typename _Tp> FileStorage& operator << ( FileStorage& fs, const vector<_Tp>& vec )
+
+    :param fs: Opened file storage to write data.
+
+    :param value: Value to be written to the file storage.
+
+    :param vec: Vector of values to be written to the file storage.
+
+It is the main function to write data to a file storage. See an example of its usage at the beginning of the section.
+
+
+operator >>
+-----------
+Reads data from a file storage.
+
+.. ocv:function:: template<typename _Tp> void operator >> (const FileNode& n, _Tp& value)
+
+.. ocv:function:: template<typename _Tp> void operator >> (const FileNode& n, vector<_Tp>& vec)
+
+.. ocv:function:: template<typename _Tp> FileNodeIterator& operator >> (FileNodeIterator& it, _Tp& value)
+
+.. ocv:function:: template<typename _Tp> FileNodeIterator& operator >> (FileNodeIterator& it, vector<_Tp>& vec)
+
+    :param n: Node from which data will be read.
+
+    :param it: Iterator from which data will be read.
+
+    :param value: Value to be read from the file storage.
+
+    :param vec: Vector of values to be read from the file storage.
+
+It is the main function to read data from a file storage. See an example of its usage at the beginning of the section.
 
 
 FileNode
 --------
 .. ocv:class:: FileNode
 
-The class ``FileNode`` represents each element of the file storage, be it a matrix, a matrix element or a top-level node, containing all the file content. That is, a file node may contain either a singe value (integer, floating-point value or a text string), or it can be a sequence of other file nodes, or it can be a mapping. Type of the file node can be determined using :ocv:func:`FileNode::type` method.
+File Storage Node class. The node is used to store each and every element of the file storage opened for reading. When XML/YAML file is read, it is first parsed and stored in the memory as a hierarchical collection of nodes. Each node can be a “leaf” that is contain a single number or a string, or be a collection of other nodes. There can be named collections (mappings) where each element has a name and it is accessed by a name, and ordered collections (sequences) where elements do not have names but rather accessed by index. Type of the file node can be determined using :ocv:func:`FileNode::type` method.
+
+Note that file nodes are only used for navigating file storages opened for reading. When a file storage is opened for writing, no data is stored in memory after it is written.
+
+
+FileNode::FileNode
+------------------
+The constructors.
+
+.. ocv:function:: FileNode::FileNode()
+
+.. ocv:function:: FileNode::FileNode(const CvFileStorage* fs, const CvFileNode* node)
+
+.. ocv:function:: FileNode::FileNode(const FileNode& node)
+
+    :param fs: Pointer to the obsolete file storage structure.
+
+    :param node: File node to be used as initialization for the created file node.
+
+These constructors are used to create a default file node, construct it from obsolete structures or from the another file node.
+
+
+FileNode::operator[]
+--------------------
+Returns element of a mapping node or a sequence node.
+
+.. ocv:function:: FileNode FileNode::operator[](const string& nodename) const
+
+.. ocv:function:: FileNode FileNode::operator[](const char* nodename) const
+
+.. ocv:function:: FileNode FileNode::operator[](int i) const
+
+    :param nodename: Name of an element in the mapping node.
+
+    :param i: Index of an element in the sequence node.
+
+    :returns: Returns the element with the given identifier.
+
+
+FileNode::type
+--------------
+Returns type of the node.
+
+.. ocv:function:: int FileNode::type() const
+
+    :returns: Type of the node. Possible values are:
+
+        * **FileNode::NONE** Empty node.
+
+        * **FileNode::INT** Integer.
+
+        * **FileNode::REAL** Floating-point number.
+
+        * **FileNode::FLOAT** Synonym or ``REAL``.
+
+        * **FileNode::STR** Text string in UTF-8 encoding.
+
+        * **FileNode::STRING** Synonym for ``STR``.
+
+        * **FileNode::REF** Integer of type ``size_t``. Typically used for storing complex dynamic structures where some elements reference the others.
+
+        * **FileNode::SEQ** Sequence.
+
+        * **FileNode::MAP** Mapping.
+
+        * **FileNode::FLOW** Compact representation of a sequence or mapping. Used only by the YAML writer.
+
+        * **FileNode::USER** Registered object (e.g. a matrix).
+
+        * **FileNode::EMPTY** Empty structure (sequence or mapping).
+
+        * **FileNode::NAMED** The node has a name (i.e. it is an element of a mapping).
+
+
+FileNode::empty
+---------------
+Checks whether the node is empty.
+
+.. ocv:function:: bool FileNode::empty() const
+
+    :returns: ``true`` if the node is empty.
+
+
+FileNode::isNone
+----------------
+Checks whether the node is a "none" object 
+
+.. ocv:function:: bool FileNode::isNone() const
+
+    :returns: ``true`` if the node is a "none" object.
+
+
+FileNode::isSeq
+---------------
+Checks whether the node is a sequence.
+
+.. ocv:function:: bool FileNode::isSeq() const
+
+    :returns: ``true`` if the node is a sequence.
+
+
+FileNode::isMap
+---------------
+Checks whether the node is a mapping.
+
+.. ocv:function:: bool FileNode::isMap() const
+
+    :returns: ``true`` if the node is a mapping.
+
+
+FileNode::isInt
+---------------
+Checks whether the node is an integer.
+    
+.. ocv:function:: bool FileNode::isInt() const
+
+    :returns: ``true`` if the node is an integer.
+
+
+FileNode::isReal
+----------------
+Checks whether the node is a floating-point number.
+
+.. ocv:function:: bool FileNode::isReal() const
+
+    :returns: ``true`` if the node is a floating-point number.
+
+
+FileNode::isString
+------------------
+Checks whether the node is a text string.
+
+.. ocv:function:: bool FileNode::isString() const
+
+    :returns: ``true`` if the node is a text string.
+
+
+FileNode::isNamed
+-----------------
+Checks whether the node has a name.
+
+.. ocv:function:: bool FileNode::isNamed() const
+
+    :returns: ``true`` if the node has a name.
+
+
+FileNode::name
+--------------
+Returns the node name.
+
+.. ocv:function:: string FileNode::name() const
+
+    :returns: The node name or an empty string if the node is nameless.
+
+
+FileNode::size
+--------------
+Returns the number of elements in the node.
+
+.. ocv:function:: size_t FileNode::size() const
+
+    :returns: The number of elements in the node, if it is a sequence or mapping, or 1 otherwise.
+
+
+FileNode::operator int
+----------------------
+Returns the node content as an integer.
+
+.. ocv:function:: FileNode::operator int() const
+
+    :returns: The node content as an integer. If the node stores a floating-point number, it is rounded.
+
+
+FileNode::operator float
+------------------------
+Returns the node content as float.
+
+.. ocv:function:: FileNode::operator float() const
+
+    :returns: The node content as float.
+
+
+FileNode::operator double
+-------------------------
+Returns the node content as double.
+
+.. ocv:function:: FileNode::operator double() const
+
+    :returns: The node content as double.
+
+
+FileNode::operator string
+-------------------------
+Returns the node content as text string.
+
+.. ocv:function:: FileNode::operator string() const
+
+    :returns: The node content as a text string.
+        
+
+FileNode::operator*
+-------------------
+Returns pointer to the underlying obsolete file node structure.
+
+.. ocv:function:: CvFileNode* FileNode::operator *()
+
+    :returns: Pointer to the underlying obsolete file node structure.
+
+
+FileNode::begin
+---------------
+Returns the iterator pointing to the first node element.
+
+.. ocv:function:: FileNodeIterator FileNode::begin() const
+
+   :returns: Iterator pointing to the first node element.
+
+
+FileNode::end
+-------------
+Returns the iterator pointing to the element following the last node element.
+
+.. ocv:function:: FileNodeIterator FileNode::end() const
+
+    :returns: Iterator pointing to the element following the last node element.
+
+
+FileNode::readRaw
+-----------------
+Reads node elements to the buffer with the specified format.
+
+.. ocv:function:: void FileNode::readRaw( const string& fmt, uchar* vec, size_t len ) const
+
+    :param fmt: Specification of each array element. It has the same format as in :ocv:func:`FileStorage::writeRaw`.
+
+    :param vec: Pointer to the destination array.
+
+    :param len: Number of elements to read. If it is greater than number of remaining elements then all of them will be read.
+
+Usually it is more convenient to use :ocv:func:`operator >>` instead of this method.
+
+FileNode::readObj
+-----------------
+Reads the registered object.
+
+.. ocv:function:: void* FileNode::readObj() const
+
+    :returns: Pointer to the read object.
+
+See :ocv:cfunc:`Read` for details.
 
 FileNodeIterator
 ----------------
 .. ocv:class:: FileNodeIterator
 
 The class ``FileNodeIterator`` is used to iterate through sequences and mappings. A standard STL notation, with ``node.begin()``, ``node.end()`` denoting the beginning and the end of a sequence, stored in ``node``.  See the data reading sample in the beginning of the section.
+
+
+FileNodeIterator::FileNodeIterator
+----------------------------------
+The constructors.
+
+.. ocv:function:: FileNodeIterator::FileNodeIterator()
+
+.. ocv:function:: FileNodeIterator::FileNodeIterator(const CvFileStorage* fs, const CvFileNode* node, size_t ofs=0)
+
+.. ocv:function:: FileNodeIterator::FileNodeIterator(const FileNodeIterator& it)
+
+    :param fs: File storage for the iterator.
+
+    :param node: File node for the iterator.
+
+    :param ofs: Index of the element in the node. The created iterator will point to this element.
+
+    :param it: Iterator to be used as initialization for the created iterator.
+
+These constructors are used to create a default iterator, set it to specific element in a file node or construct it from another iterator.
+
+
+FileNodeIterator::operator*
+---------------------------
+Returns the currently observed element.
+
+.. ocv:function:: FileNode FileNodeIterator::operator *() const
+
+    :returns: Currently observed element.
+
+
+FileNodeIterator::operator->
+----------------------------
+Accesses methods of the currently observed element.
+
+.. ocv:function:: FileNode FileNodeIterator::operator ->() const
+
+
+FileNodeIterator::operator ++
+-----------------------------
+Moves iterator to the next node.
+
+.. ocv:function:: FileNodeIterator& FileNodeIterator::operator ++ ()
+
+.. ocv:function:: FileNodeIterator FileNodeIterator::operator ++ (int)
+
+
+FileNodeIterator::operator --
+-----------------------------
+Moves iterator to the previous node.
+
+.. ocv:function:: FileNodeIterator& FileNodeIterator::operator -- ()
+
+.. ocv:function:: FileNodeIterator FileNodeIterator::operator -- (int)
+
+
+FileNodeIterator::operator +=
+-----------------------------
+Moves iterator forward by the specified offset.
+
+.. ocv:function:: FileNodeIterator& FileNodeIterator::operator += (int ofs)
+
+    :param ofs: Offset (possibly negative) to move the iterator.
+
+
+FileNodeIterator::operator -=
+-----------------------------
+Moves iterator backward by the specified offset (possibly negative).
+
+.. ocv:function:: FileNodeIterator& FileNodeIterator::operator -= (int ofs)
+
+    :param ofs: Offset (possibly negative) to move the iterator.
+
+
+FileNodeIterator::readRaw
+-------------------------
+Reads node elements to the buffer with the specified format.
+
+.. ocv:function:: FileNodeIterator& FileNodeIterator::readRaw( const string& fmt, uchar* vec, size_t maxCount=(size_t)INT_MAX )
+
+    :param fmt: Specification of each array element. It has the same format as in :ocv:func:`FileStorage::writeRaw`.
+
+    :param vec: Pointer to the destination array.
+
+    :param maxCount: Number of elements to read. If it is greater than number of remaining elements then all of them will be read.
+
+Usually it is more convenient to use :ocv:func:`operator >>` instead of this method.
index 4c52d21..b21430c 100644 (file)
@@ -218,6 +218,8 @@ CV_EXPORTS void setNumThreads(int nthreads);
 CV_EXPORTS int getNumThreads();
 CV_EXPORTS int getThreadNum();
 
+CV_EXPORTS_W const std::string& getBuildInformation();
+
 //! Returns the number of ticks.
 
 /*!
@@ -1944,6 +1946,9 @@ public:
     
     MSize size;
     MStep step;
+    
+protected:
+    void initEmpty();
 };
 
 
@@ -2727,7 +2732,6 @@ public:
     static MatExpr eye(Size size);
 
     //! some more overriden methods
-    Mat_ reshape(int _rows) const;
     Mat_& adjustROI( int dtop, int dbottom, int dleft, int dright );
     Mat_ operator()( const Range& rowRange, const Range& colRange ) const;
     Mat_ operator()( const Rect& roi ) const;
@@ -4273,6 +4277,7 @@ public:
     void set(const string& name, bool value);
     void set(const string& name, const string& value);
     void set(const string& name, const Mat& value);
+    void set(const string& name, const vector<Mat>& value);
     void set(const string& name, const Ptr<Algorithm>& value);
     
     void set(const char* name, int value);
@@ -4280,6 +4285,7 @@ public:
     void set(const char* name, bool value);
     void set(const char* name, const string& value);
     void set(const char* name, const Mat& value);
+    void set(const char* name, const vector<Mat>& value);
     void set(const char* name, const Ptr<Algorithm>& value);
     
     string paramHelp(const string& name) const;
@@ -4348,6 +4354,11 @@ public:
                   void (Algorithm::*setter)(const Mat&)=0,
                   const string& help=string());
     void addParam(Algorithm& algo, const char* name,
+                  vector<Mat>& value, bool readOnly=false, 
+                  vector<Mat> (Algorithm::*getter)()=0,
+                  void (Algorithm::*setter)(const vector<Mat>&)=0,
+                  const string& help=string());
+    void addParam(Algorithm& algo, const char* name,
                   Ptr<Algorithm>& value, bool readOnly=false, 
                   Ptr<Algorithm> (Algorithm::*getter)()=0,
                   void (Algorithm::*setter)(const Ptr<Algorithm>&)=0,
@@ -4359,7 +4370,7 @@ protected:
 
 struct CV_EXPORTS Param
 {
-    enum { INT=0, BOOLEAN=1, REAL=2, STRING=3, MAT=4, ALGORITHM=5 };
+    enum { INT=0, BOOLEAN=1, REAL=2, STRING=3, MAT=4, MAT_VECTOR=5, ALGORITHM=6 };
     
     Param();
     Param(int _type, bool _readonly, int _offset,
@@ -4414,6 +4425,14 @@ template<> struct ParamType<Mat>
     enum { type = Param::MAT };
 };
 
+template<> struct ParamType<vector<Mat> >
+{
+    typedef const vector<Mat>& const_param_type;
+    typedef vector<Mat> member_type;
+    
+    enum { type = Param::MAT_VECTOR };
+};
+
 template<> struct ParamType<Algorithm>
 {
     typedef const Ptr<Algorithm>& const_param_type;
index 3496399..ae8935f 100644 (file)
@@ -59,7 +59,7 @@ namespace cv
         // It is intended to pass to nvcc-compiled code. GpuMat depends on headers that nvcc can't compile\r
 \r
         template <bool expr> struct StaticAssert;\r
-        template <> struct StaticAssert<true> {static __CV_GPU_HOST_DEVICE__ void check(){}};        \r
+        template <> struct StaticAssert<true> {static __CV_GPU_HOST_DEVICE__ void check(){}};\r
 \r
                template<typename T> struct DevPtr\r
                {\r
index 427952d..0b72aff 100644 (file)
@@ -55,53 +55,55 @@ namespace cv
 
 //////////////////////////////// Mat ////////////////////////////////
 
-inline Mat::Mat()
-    : flags(0), dims(0), rows(0), cols(0), data(0), refcount(0),
-    datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows)
+inline void Mat::initEmpty()
 {
+    flags = MAGIC_VAL;
+    dims = rows = cols = 0;
+    data = datastart = dataend = datalimit = 0;
+    refcount = 0;
+    allocator = 0;
+}
+    
+inline Mat::Mat() : size(&rows)
+{
+    initEmpty();
 }
 
-inline Mat::Mat(int _rows, int _cols, int _type)
-    : flags(0), dims(0), rows(0), cols(0), data(0), refcount(0),
-    datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows)
+inline Mat::Mat(int _rows, int _cols, int _type) : size(&rows)
 {
+    initEmpty();
     create(_rows, _cols, _type);
 }
 
-inline Mat::Mat(int _rows, int _cols, int _type, const Scalar& _s)
-    : flags(0), dims(0), rows(0), cols(0), data(0), refcount(0),
-    datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows)
+inline Mat::Mat(int _rows, int _cols, int _type, const Scalar& _s) : size(&rows)
 {
+    initEmpty();
     create(_rows, _cols, _type);
     *this = _s;
 }
 
-inline Mat::Mat(Size _sz, int _type)
-    : flags(0), dims(0), rows(0), cols(0), data(0), refcount(0),
-    datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows)
+inline Mat::Mat(Size _sz, int _type) : size(&rows)
 {
+    initEmpty();
     create( _sz.height, _sz.width, _type );
 }
     
-inline Mat::Mat(Size _sz, int _type, const Scalar& _s)
-    : flags(0), dims(0), rows(0), cols(0), data(0), refcount(0),
-    datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows)
+inline Mat::Mat(Size _sz, int _type, const Scalar& _s) : size(&rows)
 {
+    initEmpty();
     create(_sz.height, _sz.width, _type);
     *this = _s;
 }
     
-inline Mat::Mat(int _dims, const int* _sz, int _type)
-    : flags(0), dims(0), rows(0), cols(0), data(0), refcount(0),
-    datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows)
+inline Mat::Mat(int _dims, const int* _sz, int _type) : size(&rows)
 {
+    initEmpty();
     create(_dims, _sz, _type);
 }
 
-inline Mat::Mat(int _dims, const int* _sz, int _type, const Scalar& _s)
-    : flags(0), dims(0), rows(0), cols(0), data(0), refcount(0),
-    datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows)
+inline Mat::Mat(int _dims, const int* _sz, int _type, const Scalar& _s) : size(&rows)
 {
+    initEmpty();
     create(_dims, _sz, _type);
     *this = _s;
 }    
@@ -169,27 +171,6 @@ inline Mat::Mat(Size _sz, int _type, void* _data, size_t _step)
 }
 
 
-inline Mat::Mat(const CvMat* m, bool copyData)
-    : flags(MAGIC_VAL + (m->type & (CV_MAT_TYPE_MASK|CV_MAT_CONT_FLAG))),
-    dims(2), rows(m->rows), cols(m->cols), data(m->data.ptr), refcount(0),
-    datastart(m->data.ptr), allocator(0), size(&rows)
-{
-    if( !copyData )
-    {
-        size_t esz = CV_ELEM_SIZE(m->type), minstep = cols*esz, _step = m->step;
-        if( _step == 0 )
-            _step = minstep;
-        datalimit = datastart + _step*rows;
-        dataend = datalimit - _step + minstep;
-        step[0] = _step; step[1] = esz;
-    }
-    else
-    {
-        data = datastart = dataend = 0;
-        Mat(m->rows, m->cols, m->type, m->data.ptr, m->step).copyTo(*this);
-    }
-}
-
 template<typename _Tp> inline Mat::Mat(const vector<_Tp>& vec, bool copyData)
     : flags(MAGIC_VAL | DataType<_Tp>::type | CV_MAT_CONT_FLAG),
     dims(2), rows((int)vec.size()), cols(1), data(0), refcount(0),
@@ -338,8 +319,9 @@ inline Mat Mat::colRange(const Range& r) const
 
 inline Mat Mat::diag(const Mat& d)
 {
-    CV_Assert( d.cols == 1 );
-    Mat m(d.rows, d.rows, d.type(), Scalar(0)), md = m.diag();
+    CV_Assert( d.cols == 1 || d.rows == 1 );
+    int len = d.rows + d.cols - 1;
+    Mat m(len, len, d.type(), Scalar(0)), md = m.diag();
     d.copyTo(md);
     return m;
 }
@@ -969,9 +951,6 @@ template<typename _Tp> inline int Mat_<_Tp>::channels() const
 template<typename _Tp> inline size_t Mat_<_Tp>::stepT(int i) const { return step.p[i]/elemSize(); }
 template<typename _Tp> inline size_t Mat_<_Tp>::step1(int i) const { return step.p[i]/elemSize1(); }
 
-template<typename _Tp> inline Mat_<_Tp> Mat_<_Tp>::reshape(int _rows) const
-{ return Mat_<_Tp>(Mat::reshape(0,_rows)); }
-
 template<typename _Tp> inline Mat_<_Tp>& Mat_<_Tp>::adjustROI( int dtop, int dbottom, int dleft, int dright )
 { return (Mat_<_Tp>&)(Mat::adjustROI(dtop, dbottom, dleft, dright));  }
 
index d0fdc71..83947b2 100644 (file)
@@ -2277,7 +2277,7 @@ public:
     { set((_Tp*)&vec.val[0], n, true); }    
     
     Vector(const std::vector<_Tp>& vec, bool _copyData=false)
-    { set((_Tp*)&vec[0], vec.size(), _copyData); }    
+    { set(!vec.empty() ? (_Tp*)&vec[0] : 0, vec.size(), _copyData); }    
     
     Vector(const Vector& d) { *this = d; }
     
@@ -2445,14 +2445,17 @@ dot(const Vector<_Tp>& v1, const Vector<_Tp>& v2)
     assert(v1.size() == v2.size());
 
     _Tw s = 0;
-    const _Tp *ptr1 = &v1[0], *ptr2 = &v2[0];
- #if CV_ENABLE_UNROLLED
-    for(; i <= n - 4; i += 4 )
-        s += (_Tw)ptr1[i]*ptr2[i] + (_Tw)ptr1[i+1]*ptr2[i+1] +
-            (_Tw)ptr1[i+2]*ptr2[i+2] + (_Tw)ptr1[i+3]*ptr2[i+3];
-#endif
-    for( ; i < n; i++ )
-        s += (_Tw)ptr1[i]*ptr2[i];
+    if( n > 0 )
+    {
+        const _Tp *ptr1 = &v1[0], *ptr2 = &v2[0];
+     #if CV_ENABLE_UNROLLED
+        for(; i <= n - 4; i += 4 )
+            s += (_Tw)ptr1[i]*ptr2[i] + (_Tw)ptr1[i+1]*ptr2[i+1] +
+                (_Tw)ptr1[i+2]*ptr2[i+2] + (_Tw)ptr1[i+3]*ptr2[i+3];
+    #endif
+        for( ; i < n; i++ )
+            s += (_Tw)ptr1[i]*ptr2[i];
+    }
     return s;
 }
     
@@ -2834,29 +2837,27 @@ public:
     {
         int _fmt = DataType<_Tp>::fmt;
         char fmt[] = { (char)((_fmt>>8)+'1'), (char)_fmt, '\0' };
-        fs->writeRaw( string(fmt), (uchar*)&vec[0], vec.size()*sizeof(_Tp) );
+        fs->writeRaw( string(fmt), !vec.empty() ? (uchar*)&vec[0] : 0, vec.size()*sizeof(_Tp) );
     }
     FileStorage* fs;
 };
 
-
 template<typename _Tp> static inline void write( FileStorage& fs, const vector<_Tp>& vec )
 {
     VecWriterProxy<_Tp, DataType<_Tp>::fmt != 0> w(&fs);
     w(vec);
 }
 
-template<typename _Tp> static inline FileStorage&
-operator << ( FileStorage& fs, const vector<_Tp>& vec )
+template<typename _Tp> static inline void write( FileStorage& fs, const string& name,
+                                                const vector<_Tp>& vec )
 {
-    VecWriterProxy<_Tp, DataType<_Tp>::generic_type == 0> w(&fs);
-    w(vec);
-    return fs;
-}
-
+    WriteStructContext ws(fs, name, CV_NODE_SEQ+(DataType<_Tp>::fmt != 0 ? CV_NODE_FLOW : 0));
+    write(fs, vec);
+}    
+    
 CV_EXPORTS_W void write( FileStorage& fs, const string& name, const Mat& value );
 CV_EXPORTS void write( FileStorage& fs, const string& name, const SparseMat& value );
-
+    
 template<typename _Tp> static inline FileStorage& operator << (FileStorage& fs, const _Tp& value)
 {
     if( !fs.isOpened() )
@@ -2893,7 +2894,7 @@ inline size_t FileNode::size() const
 {
     int t = type();
     return t == MAP ? ((CvSet*)node->data.map)->active_count :
-        t == SEQ ? node->data.seq->total : node != 0;
+        t == SEQ ? node->data.seq->total : (size_t)!isNone();
 }
 
 inline CvFileNode* FileNode::operator *() { return (CvFileNode*)node; }
@@ -2956,7 +2957,7 @@ static inline void read(const FileNode& node, string& value, const string& defau
 }
 
 CV_EXPORTS_W void read(const FileNode& node, Mat& mat, const Mat& default_mat=Mat() );
-CV_EXPORTS void read(const FileNode& node, SparseMat& mat, const SparseMat& default_mat=SparseMat() );    
+CV_EXPORTS void read(const FileNode& node, SparseMat& mat, const SparseMat& default_mat=SparseMat() );
     
 inline FileNode::operator int() const
 {
@@ -3011,10 +3012,10 @@ public:
         size_t remaining = it->remaining, cn = DataType<_Tp>::channels;
         int _fmt = DataType<_Tp>::fmt;
         char fmt[] = { (char)((_fmt>>8)+'1'), (char)_fmt, '\0' };
-               size_t remaining1 = remaining/cn;
-               count = count < remaining1 ? count : remaining1;
+        size_t remaining1 = remaining/cn;
+        count = count < remaining1 ? count : remaining1;
         vec.resize(count);
-        it->readRaw( string(fmt), (uchar*)&vec[0], count*sizeof(_Tp) );
+        it->readRaw( string(fmt), !vec.empty() ? (uchar*)&vec[0] : 0, count*sizeof(_Tp) );
     }
     FileNodeIterator* it;
 };
@@ -3027,9 +3028,15 @@ read( FileNodeIterator& it, vector<_Tp>& vec, size_t maxCount=(size_t)INT_MAX )
 }
 
 template<typename _Tp> static inline void
-read( FileNode& node, vector<_Tp>& vec, const vector<_Tp>& default_value=vector<_Tp>() )
+read( const FileNode& node, vector<_Tp>& vec, const vector<_Tp>& default_value=vector<_Tp>() )
 {
-    read( node.begin(), vec );
+    if(!node.node)
+        vec = default_value;
+    else
+    {
+        FileNodeIterator it = node.begin();
+        read( it, vec );
+    }
 }
     
 inline FileNodeIterator FileNode::begin() const
index 6eaed4a..ef0bf65 100644 (file)
@@ -32,5 +32,5 @@ PERF_TEST_P( Size_DepthSrc_DepthDst_Channels_alpha, convertTo,
 \r
     TEST_CYCLE() src.convertTo(dst, depthDst, alpha);\r
 \r
-    SANITY_CHECK(dst);\r
+    SANITY_CHECK(dst, 1e-12);\r
 }\r
index 576ad23..302b9b2 100644 (file)
@@ -32,5 +32,5 @@ PERF_TEST_P( Size_SrcDepth_DstChannels, merge,
     Mat dst;\r
     TEST_CYCLE() merge( (vector<Mat> &)mv, dst );\r
 \r
-    SANITY_CHECK(dst);\r
+    SANITY_CHECK(dst, 1e-12);\r
 }
\ No newline at end of file
index db75165..ea4e5ab 100644 (file)
@@ -29,5 +29,5 @@ PERF_TEST_P( Size_Depth_Channels, split,
 \r
     TEST_CYCLE() split(m, (vector<Mat>&)mv);\r
 \r
-    SANITY_CHECK(mv);\r
+    SANITY_CHECK(mv, 1e-12);\r
 }\r
index e0ab6c6..ab6ccc4 100644 (file)
@@ -149,17 +149,21 @@ struct CV_EXPORTS AlgorithmInfoData
 };
 
     
-static sorted_vector<string, Algorithm::Constructor> alglist;
+static sorted_vector<string, Algorithm::Constructor>& alglist()
+{
+    static sorted_vector<string, Algorithm::Constructor> alglist_var;
+    return alglist_var;
+}
 
 void Algorithm::getList(vector<string>& algorithms)
 {
-    alglist.get_keys(algorithms);
+    alglist().get_keys(algorithms);
 }
 
 Ptr<Algorithm> Algorithm::_create(const string& name)
 {
     Algorithm::Constructor c = 0;
-    if( !alglist.find(name, c) )
+    if( !alglist().find(name, c) )
         return Ptr<Algorithm>();
     return c();
 }
@@ -202,6 +206,11 @@ void Algorithm::set(const string& name, const Mat& value)
     info()->set(this, name.c_str(), ParamType<Mat>::type, &value);
 }
 
+void Algorithm::set(const string& name, const vector<Mat>& value)
+{
+    info()->set(this, name.c_str(), ParamType<vector<Mat> >::type, &value);
+}    
+    
 void Algorithm::set(const string& name, const Ptr<Algorithm>& value)
 {
     info()->set(this, name.c_str(), ParamType<Algorithm>::type, &value);
@@ -232,6 +241,11 @@ void Algorithm::set(const char* name, const Mat& value)
     info()->set(this, name, ParamType<Mat>::type, &value);
 }
 
+void Algorithm::set(const char* name, const vector<Mat>& value)
+{
+    info()->set(this, name, ParamType<vector<Mat> >::type, &value);
+}    
+    
 void Algorithm::set(const char* name, const Ptr<Algorithm>& value)
 {
     info()->set(this, name, ParamType<Algorithm>::type, &value);
@@ -272,7 +286,7 @@ AlgorithmInfo::AlgorithmInfo(const string& _name, Algorithm::Constructor create)
 {
     data = new AlgorithmInfoData;
     data->_name = _name;
-    alglist.add(_name, create);
+    alglist().add(_name, create);
 }
 
 AlgorithmInfo::~AlgorithmInfo()
@@ -298,6 +312,8 @@ void AlgorithmInfo::write(const Algorithm* algo, FileStorage& fs) const
             cv::write(fs, pname, algo->get<string>(pname));
         else if( p.type == Param::MAT )
             cv::write(fs, pname, algo->get<Mat>(pname));
+        else if( p.type == Param::MAT_VECTOR )
+            cv::write(fs, pname, algo->get<vector<Mat> >(pname));
         else if( p.type == Param::ALGORITHM )
         {
             WriteStructContext ws(fs, pname, CV_NODE_MAP);
@@ -317,7 +333,7 @@ void AlgorithmInfo::read(Algorithm* algo, const FileNode& fn) const
     {
         const Param& p = data->params.vec[i].second;
         const string& pname = data->params.vec[i].first;
-        FileNode n = fn[pname];
+        const FileNode n = fn[pname];
         if( n.empty() )
             continue;
         if( p.type == Param::INT )
@@ -331,9 +347,15 @@ void AlgorithmInfo::read(Algorithm* algo, const FileNode& fn) const
         else if( p.type == Param::MAT )
         {
             Mat m;
-            cv::read(fn, m);
+            cv::read(n, m);
             algo->set(pname, m);
         }
+        else if( p.type == Param::MAT_VECTOR )
+        {
+            vector<Mat> mv;
+            cv::read(n, mv);
+            algo->set(pname, mv);
+        }
         else if( p.type == Param::ALGORITHM )
         {
             Ptr<Algorithm> nestedAlgo = Algorithm::_create((string)n["name"]);
@@ -358,6 +380,7 @@ union GetSetParam
     double (Algorithm::*get_double)() const;
     string (Algorithm::*get_string)() const;
     Mat (Algorithm::*get_mat)() const;
+    vector<Mat> (Algorithm::*get_mat_vector)() const;
     Ptr<Algorithm> (Algorithm::*get_algo)() const;
     
     void (Algorithm::*set_int)(int);
@@ -365,6 +388,7 @@ union GetSetParam
     void (Algorithm::*set_double)(double);
     void (Algorithm::*set_string)(const string&);
     void (Algorithm::*set_mat)(const Mat&);
+    void (Algorithm::*set_mat_vector)(const vector<Mat>&);
     void (Algorithm::*set_algo)(const Ptr<Algorithm>&);
 };
     
@@ -436,6 +460,16 @@ void AlgorithmInfo::set(Algorithm* algo, const char* name, int argType, const vo
         else
             *(Mat*)((uchar*)algo + p->offset) = val;
     }
+    else if( argType == Param::MAT_VECTOR )
+    {
+        CV_Assert( p->type == Param::MAT_VECTOR );
+        
+        const vector<Mat>& val = *(const vector<Mat>*)value;
+        if( p->setter )
+            (algo->*f.set_mat_vector)(val);
+        else
+            *(vector<Mat>*)((uchar*)algo + p->offset) = val;
+    }
     else if( argType == Param::ALGORITHM )
     {
         CV_Assert( p->type == Param::ALGORITHM );
@@ -505,6 +539,13 @@ void AlgorithmInfo::get(const Algorithm* algo, const char* name, int argType, vo
         *(Mat*)value = p->getter ? (algo->*f.get_mat)() :
             *(Mat*)((uchar*)algo + p->offset);
     }
+    else if( argType == Param::MAT_VECTOR )
+    {
+        CV_Assert( p->type == Param::MAT_VECTOR );
+        
+        *(vector<Mat>*)value = p->getter ? (algo->*f.get_mat_vector)() :
+        *(vector<Mat>*)((uchar*)algo + p->offset);
+    }
     else if( argType == Param::ALGORITHM )
     {
         CV_Assert( p->type == Param::ALGORITHM );
@@ -548,7 +589,8 @@ void AlgorithmInfo::addParam_(Algorithm& algo, const char* name, int argType,
 {
     CV_Assert( argType == Param::INT || argType == Param::BOOLEAN ||
                argType == Param::REAL || argType == Param::STRING ||
-               argType == Param::MAT || argType == Param::ALGORITHM );
+               argType == Param::MAT || argType == Param::MAT_VECTOR ||
+               argType == Param::ALGORITHM );
     data->params.add(string(name), Param(argType, readOnly,
                      (int)((size_t)value - (size_t)(void*)&algo),
                      getter, setter, help));
@@ -604,6 +646,16 @@ void AlgorithmInfo::addParam(Algorithm& algo, const char* name,
     addParam_(algo, name, ParamType<Mat>::type, &value, readOnly,
               (Algorithm::Getter)getter, (Algorithm::Setter)setter, help);
 }
+
+void AlgorithmInfo::addParam(Algorithm& algo, const char* name,
+                             vector<Mat>& value, bool readOnly, 
+                             vector<Mat> (Algorithm::*getter)(),
+                             void (Algorithm::*setter)(const vector<Mat>&),
+                             const string& help)
+{
+    addParam_(algo, name, ParamType<vector<Mat> >::type, &value, readOnly,
+              (Algorithm::Getter)getter, (Algorithm::Setter)setter, help);
+}    
     
 void AlgorithmInfo::addParam(Algorithm& algo, const char* name,
                              Ptr<Algorithm>& value, bool readOnly, 
index e08fc98..80ed8cd 100644 (file)
@@ -47,6 +47,7 @@ namespace cv
 // On Win64 optimized versions of DFT and DCT fail the tests (fixed in VS2010)
 #if defined _MSC_VER && !defined CV_ICC && defined _M_X64 && _MSC_VER < 1600
 #pragma optimize("", off)
+#pragma warning( disable : 4748 )
 #endif
 
 /****************************************************************************************\
index 74c8364..0ac641a 100644 (file)
@@ -2032,8 +2032,9 @@ template<> struct mat_type_assotiations<CV_32S>
     static const type max_allowable = INT_MAX;
 };
 
+// inclusive maxVal !!!
 template<int depth>
-bool chackIntegerRang(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double& bad_value)
+bool checkIntegerRange(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double& bad_value)
 {
     typedef mat_type_assotiations<depth> type_ass; 
     
@@ -2041,7 +2042,7 @@ bool chackIntegerRang(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double
     {
         return true;
     }
-    else if (minVal >= type_ass::max_allowable || maxVal <= type_ass::min_allowable || maxVal <= minVal)
+    else if (minVal > type_ass::max_allowable || maxVal < type_ass::min_allowable || maxVal < minVal)
     {
         bad_pt = cv::Point(0,0);
         return false;
@@ -2051,7 +2052,7 @@ bool chackIntegerRang(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double
     for (int j = 0; j < as_one_channel.rows; ++j)
         for (int i = 0; i < as_one_channel.cols; ++i)
         {    
-            if (as_one_channel.at<typename type_ass::type>(j ,i) <= minVal || as_one_channel.at<typename type_ass::type>(j ,i) >= maxVal)
+            if (as_one_channel.at<typename type_ass::type>(j ,i) < minVal || as_one_channel.at<typename type_ass::type>(j ,i) > maxVal)
             {            
                 bad_pt.y = j ; 
                 bad_pt.x = i % src.channels();
@@ -2064,15 +2065,15 @@ bool chackIntegerRang(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double
     return true;
 }
 
-typedef bool (*check_pange_function)(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double& bad_value); 
+typedef bool (*check_range_function)(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double& bad_value); 
 
-check_pange_function check_range_functions[] = 
+check_range_function check_range_functions[] = 
 {
-    &chackIntegerRang<CV_8U>,
-    &chackIntegerRang<CV_8S>,
-    &chackIntegerRang<CV_16U>,
-    &chackIntegerRang<CV_16S>,
-    &chackIntegerRang<CV_32S>
+    &checkIntegerRange<CV_8U>,
+    &checkIntegerRange<CV_8S>,
+    &checkIntegerRange<CV_16U>,
+    &checkIntegerRange<CV_16S>,
+    &checkIntegerRange<CV_32S>
 };
 
 bool checkRange(InputArray _src, bool quiet, Point* pt, double minVal, double maxVal)
@@ -2102,8 +2103,9 @@ bool checkRange(InputArray _src, bool quiet, Point* pt, double minVal, double ma
 
     if (depth < CV_32F)
     {
-        int minVali = cvFloor(minVal);
-        int maxVali = cvCeil(maxVal);
+        // see "Bug #1784"
+        int minVali = minVal<(-INT_MAX - 1) ? (-INT_MAX - 1) : cvFloor(minVal);
+        int maxVali = maxVal>INT_MAX ? INT_MAX : cvCeil(maxVal) - 1; // checkIntegerRang() use inclusive maxVal
 
         (check_range_functions[depth])(src, badPt, minVali, maxVali, badValue);
     }
@@ -2487,7 +2489,7 @@ double cv::solvePoly( InputArray _coeffs0, OutputArray _roots0, int maxIters )
         for( i = 0; i < n; i++ )
         {
             p = roots[i];
-            C num = coeffs[n], denom = 1;
+            C num = coeffs[n], denom = coeffs[n];
             for( j = 0; j < n; j++ )
             {
                 num = num*p + coeffs[n-j-1];
index fc655b6..dbfa36e 100644 (file)
@@ -2098,7 +2098,7 @@ void cv::calcCovarMatrix( const Mat* data, int nsamples, Mat& covar, Mat& _mean,
 {
     CV_Assert( data && nsamples > 0 );
     Size size = data[0].size();
-    int sz = size.width*size.height, esz = (int)data[0].elemSize();
+    int sz = size.width * size.height, esz = (int)data[0].elemSize();
     int type = data[0].type();
     Mat mean;
     ctype = std::max(std::max(CV_MAT_DEPTH(ctype >= 0 ? ctype : type), _mean.depth()), CV_32F);
@@ -2116,6 +2116,7 @@ void cv::calcCovarMatrix( const Mat* data, int nsamples, Mat& covar, Mat& _mean,
     }
 
     Mat _data(nsamples, sz, type);
+
     for( int i = 0; i < nsamples; i++ )
     {
         CV_Assert( data[i].size() == size && data[i].type() == type );
@@ -2135,6 +2136,55 @@ void cv::calcCovarMatrix( const Mat* data, int nsamples, Mat& covar, Mat& _mean,
 
 void cv::calcCovarMatrix( InputArray _data, OutputArray _covar, InputOutputArray _mean, int flags, int ctype )
 {
+    if(_data.kind() == _InputArray::STD_VECTOR_MAT)
+    {
+        std::vector<cv::Mat> src;
+        _data.getMatVector(src);
+
+        CV_Assert( src.size() > 0 );
+
+        Size size = src[0].size();
+        int type = src[0].type();
+
+        ctype = std::max(std::max(CV_MAT_DEPTH(ctype >= 0 ? ctype : type), _mean.depth()), CV_32F);
+
+        Mat _data(static_cast<int>(src.size()), size.area(), type);
+
+        int i = 0;
+        for(vector<cv::Mat>::iterator each = src.begin(); each != src.end(); each++, i++ )
+        {
+            CV_Assert( (*each).size() == size && (*each).type() == type );
+            Mat dataRow(size.height, size.width, type, _data.ptr(i));
+            (*each).copyTo(dataRow);
+        }
+
+        Mat mean;
+        if( (flags & CV_COVAR_USE_AVG) != 0 )
+        {
+            CV_Assert( _mean.size() == size );
+
+            if( mean.type() != ctype )
+            {
+                mean = _mean.getMat();
+                _mean.create(mean.size(), ctype);
+                Mat tmp = _mean.getMat();
+                mean.convertTo(tmp, ctype);
+                mean = tmp;
+            }
+
+            mean = _mean.getMat().reshape(1, 1);
+        }
+
+        calcCovarMatrix( _data, _covar, mean, (flags & ~(CV_COVAR_ROWS|CV_COVAR_COLS)) | CV_COVAR_ROWS, ctype );
+
+        if( (flags & CV_COVAR_USE_AVG) == 0 )
+        {
+            mean = mean.reshape(1, size.height);
+            mean.copyTo(_mean);
+        }
+        return;
+    }
+
     Mat data = _data.getMat(), mean;
     CV_Assert( ((flags & CV_COVAR_ROWS) != 0) ^ ((flags & CV_COVAR_COLS) != 0) );
     bool takeRows = (flags & CV_COVAR_ROWS) != 0;
index 4fb901d..364e6f5 100644 (file)
@@ -262,10 +262,9 @@ void Mat::deallocate()
 }
 
     
-Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)
-    : flags(0), dims(0), rows(0), cols(0), data(0), refcount(0),
-    datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows)
+Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange) : size(&rows)
 {
+    initEmpty();
     CV_Assert( m.dims >= 2 );
     if( m.dims > 2 )
     {
@@ -336,21 +335,19 @@ Mat::Mat(const Mat& m, const Rect& roi)
 }
 
     
-Mat::Mat(int _dims, const int* _sizes, int _type, void* _data, const size_t* _steps)
-    : flags(MAGIC_VAL|CV_MAT_TYPE(_type)), dims(0),
-    rows(0), cols(0), data((uchar*)_data), refcount(0),
-    datastart((uchar*)_data), dataend((uchar*)_data), datalimit((uchar*)_data),
-    allocator(0), size(&rows)
+Mat::Mat(int _dims, const int* _sizes, int _type, void* _data, const size_t* _steps) : size(&rows)
 {
+    initEmpty();
+    flags |= CV_MAT_TYPE(_type);
+    data = datastart = (uchar*)_data;
     setSize(*this, _dims, _sizes, _steps, true);
     finalizeHdr(*this);
 }
     
     
-Mat::Mat(const Mat& m, const Range* ranges)
-    : flags(m.flags), dims(0), rows(0), cols(0), data(0), refcount(0),
-    datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows)
+Mat::Mat(const Mat& m, const Range* ranges) : size(&rows)
 {
+    initEmpty();
     int i, d = m.dims;
     
     CV_Assert(ranges);
@@ -374,12 +371,13 @@ Mat::Mat(const Mat& m, const Range* ranges)
 }
  
     
-Mat::Mat(const CvMatND* m, bool copyData)
-    : flags(MAGIC_VAL|CV_MAT_TYPE(m->type)), dims(0), rows(0), cols(0),
-    data((uchar*)m->data.ptr), refcount(0),
-    datastart((uchar*)m->data.ptr), allocator(0),
-    size(&rows)
+Mat::Mat(const CvMatND* m, bool copyData) : size(&rows)
 {
+    initEmpty();
+    if( !m )
+        return;
+    data = datastart = m->data.ptr;
+    flags |= CV_MAT_TYPE(m->type);
     int _sizes[CV_MAX_DIM];
     size_t _steps[CV_MAX_DIM];
     
@@ -434,12 +432,45 @@ Mat Mat::diag(int d) const
     
     return m;
 }
+
     
+Mat::Mat(const CvMat* m, bool copyData) : size(&rows)
+{
+    initEmpty();
     
-Mat::Mat(const IplImage* img, bool copyData)
-    : flags(MAGIC_VAL), dims(2), rows(0), cols(0),
-    data(0), refcount(0), datastart(0), dataend(0), allocator(0), size(&rows)
+    if( !m )
+        return;
+    
+    if( !copyData )
+    {
+        flags = MAGIC_VAL + (m->type & (CV_MAT_TYPE_MASK|CV_MAT_CONT_FLAG));
+        dims = 2;
+        rows = m->rows;
+        cols = m->cols;
+        data = datastart = m->data.ptr;
+        size_t esz = CV_ELEM_SIZE(m->type), minstep = cols*esz, _step = m->step;
+        if( _step == 0 )
+            _step = minstep;
+        datalimit = datastart + _step*rows;
+        dataend = datalimit - _step + minstep;
+        step[0] = _step; step[1] = esz;
+    }
+    else
+    {
+        data = datastart = dataend = 0;
+        Mat(m->rows, m->cols, m->type, m->data.ptr, m->step).copyTo(*this);
+    }
+}
+
+    
+Mat::Mat(const IplImage* img, bool copyData) : size(&rows)
 {
+    initEmpty();
+    
+    if( !img )
+        return;
+    
+    dims = 2;
     CV_DbgAssert(CV_IS_IMAGE(img) && img->imageData != 0);
     
     int depth = IPL2CV_DEPTH(img->depth);
@@ -2428,8 +2459,9 @@ double cv::kmeans( InputArray _data, int K,
 {
     const int SPP_TRIALS = 3;
     Mat data = _data.getMat();
-    int N = data.rows > 1 ? data.rows : data.cols;
-    int dims = (data.rows > 1 ? data.cols : 1)*data.channels();
+    bool isrow = data.rows == 1 && data.channels() > 1;
+    int N = !isrow ? data.rows : data.cols;
+    int dims = (!isrow ? data.cols : 1)*data.channels();
     int type = data.depth();
 
     attempts = std::max(attempts, 1);
@@ -2458,7 +2490,7 @@ double cv::kmeans( InputArray _data, int K,
     }
     int* labels = _labels.ptr<int>();
 
-    Mat centers(K, dims, type), old_centers(K, dims, type);
+    Mat centers(K, dims, type), old_centers(K, dims, type), temp(1, dims, type);
     vector<int> counters(K);
     vector<Vec2f> _box(dims);
     Vec2f* box = &_box[0];
@@ -2502,7 +2534,7 @@ double cv::kmeans( InputArray _data, int K,
     for( a = 0; a < attempts; a++ )
     {
         double max_center_shift = DBL_MAX;
-        for( iter = 0; iter < criteria.maxCount && max_center_shift > criteria.epsilon; iter++ )
+        for( iter = 0;; )
         {
             swap(centers, old_centers);
 
@@ -2579,13 +2611,17 @@ double cv::kmeans( InputArray _data, int K,
                     int farthest_i = -1;
                     float* new_center = centers.ptr<float>(k);
                     float* old_center = centers.ptr<float>(max_k);
+                    float* _old_center = temp.ptr<float>(); // normalized
+                    float scale = 1.f/counters[max_k];
+                    for( j = 0; j < dims; j++ )
+                        _old_center[j] = old_center[j]*scale;
                     
                     for( i = 0; i < N; i++ )
                     {
                         if( labels[i] != max_k )
                             continue;
                         sample = data.ptr<float>(i);
-                        double dist = normL2Sqr_(sample, old_center, dims);
+                        double dist = normL2Sqr_(sample, _old_center, dims);
                             
                         if( max_dist <= dist )
                         {
@@ -2596,6 +2632,7 @@ double cv::kmeans( InputArray _data, int K,
                     
                     counters[max_k]--;
                     counters[k]++;
+                    labels[farthest_i] = k;
                     sample = data.ptr<float>(farthest_i);
                     
                     for( j = 0; j < dims; j++ )
@@ -2627,6 +2664,9 @@ double cv::kmeans( InputArray _data, int K,
                     }
                 }
             }
+            
+            if( ++iter == MAX(criteria.maxCount, 2) || max_center_shift <= criteria.epsilon )
+                break;
 
             // assign labels
             compactness = 0;
index e829580..c8c3664 100644 (file)
@@ -2987,9 +2987,6 @@ cvWriteRawData( CvFileStorage* fs, const void* _data, int len, const char* dt )
 
     CV_CHECK_OUTPUT_FILE_STORAGE( fs );
 
-    if( !data0 )
-        CV_Error( CV_StsNullPtr, "Null data pointer" );
-
     if( len < 0 )
         CV_Error( CV_StsOutOfRange, "Negative number of elements" );
 
@@ -2997,6 +2994,9 @@ cvWriteRawData( CvFileStorage* fs, const void* _data, int len, const char* dt )
 
     if( !len )
         return;
+    
+    if( !data0 )
+        CV_Error( CV_StsNullPtr, "Null data pointer" );
 
     if( fmt_pair_count == 1 )
     {
@@ -3457,6 +3457,8 @@ icvReadMat( CvFileStorage* fs, CvFileNode* node )
         mat = cvCreateMat( rows, cols, elem_type );
         cvReadRawData( fs, data, mat->data.ptr, dt );
     }
+    else if( rows == 0 && cols == 0 )
+        mat = cvCreateMatHeader( 0, 1, elem_type );
     else
         mat = cvCreateMatHeader( rows, cols, elem_type );
 
@@ -5195,7 +5197,7 @@ FileNodeIterator::FileNodeIterator()
 FileNodeIterator::FileNodeIterator(const CvFileStorage* _fs,
                                    const CvFileNode* _node, size_t _ofs)
 {
-    if( _fs && _node )
+    if( _fs && _node && CV_NODE_TYPE(_node->tag) != CV_NODE_NONE )
     {
         int node_type = _node->tag & FileNode::TYPE_MASK;
         fs = _fs;
@@ -5358,7 +5360,7 @@ void write( FileStorage& fs, const string& name, const SparseMat& value )
     Ptr<CvSparseMat> mat = (CvSparseMat*)value;
     cvWrite( *fs, name.size() ? name.c_str() : 0, mat );
 }
-
+    
 
 WriteStructContext::WriteStructContext(FileStorage& _fs, const string& name,
                    int flags, const string& typeName) : fs(&_fs)
index 309303f..ec2eaab 100644 (file)
@@ -1605,25 +1605,20 @@ struct BatchDistInvoker
                 // we handle both CV_32S and CV_32F cases with a single branch
                 int* distptr = (int*)dist->ptr(i);
                 
-                int k, k0, k0_, j;
-                for( k0 = 0; k0 < K; k0++ )
-                    if( nidxptr[k0] < 0 )
-                        break;
-                k0_ = std::max(k0, 1);
+                int j, k;
                 
                 for( j = 0; j < src2->rows; j++ )
                 {
                     int d = bufptr[j];
-                    if( d < distptr[k0_-1] )
+                    if( d < distptr[K-1] )
                     {
-                        for( k = std::min(k0-1, K-2); k >= 0 && distptr[k] > d; k-- )
+                        for( k = K-2; k >= 0 && distptr[k] > d; k-- )
                         {
                             nidxptr[k+1] = nidxptr[k];
                             distptr[k+1] = distptr[k];
                         }
                         nidxptr[k+1] = j + update;
                         distptr[k+1] = d;
-                        k0_ = k0 = std::min(k0 + 1, K);
                     }
                 }
             }
index e0c1eb9..b8c46fa 100644 (file)
@@ -374,6 +374,46 @@ int getThreadNum(void)
 #endif
 }
 
+#if ANDROID
+static inline int getNumberOfCPUsImpl()
+{
+   FILE* cpuPossible = fopen("/sys/devices/system/cpu/possible", "r");
+   if(!cpuPossible)
+       return 1;
+
+   char buf[2000]; //big enough for 1000 CPUs in worst possible configuration
+   char* pbuf = fgets(buf, sizeof(buf), cpuPossible);
+   fclose(cpuPossible);
+   if(!pbuf)
+      return 1;
+
+   //parse string of form "0-1,3,5-7,10,13-15"
+   int cpusAvailable = 0;
+
+   while(*pbuf)
+   {
+      const char* pos = pbuf;
+      bool range = false;
+      while(*pbuf && *pbuf != ',')
+      {
+          if(*pbuf == '-') range = true;
+          ++pbuf;
+      }
+      if(*pbuf) *pbuf++ = 0;
+      if(!range)
+        ++cpusAvailable;
+      else
+      {
+          int rstart = 0, rend = 0;
+          sscanf(pos, "%d-%d", &rstart, &rend);
+          cpusAvailable += rend - rstart + 1;
+      }
+      
+   }
+   return cpusAvailable ? cpusAvailable : 1;
+}
+#endif
+
 int getNumberOfCPUs(void)
 {
 #if defined WIN32 || defined _WIN32
@@ -381,6 +421,10 @@ int getNumberOfCPUs(void)
     GetSystemInfo( &sysinfo );
     
     return (int)sysinfo.dwNumberOfProcessors;
+#elif ANDROID
+    static int ncpus = getNumberOfCPUsImpl();
+    printf("CPUS= %d\n", ncpus);
+    return ncpus;
 #elif defined __linux__
     return (int)sysconf( _SC_NPROCESSORS_ONLN );
 #elif defined __APPLE__
@@ -410,6 +454,14 @@ int getNumberOfCPUs(void)
 #endif
 }
 
+const std::string& getBuildInformation()
+{
+    static std::string build_info =
+#include "version_string.inc"
+    ;
+    return build_info;
+}
+
 string format( const char* fmt, ... )
 {
     char buf[1 << 16];
index 2d55796..9f8ccb2 100644 (file)
@@ -1437,6 +1437,9 @@ protected:
                 Mat mask1;
                 Mat c, d;
                 
+                rng.fill(a, RNG::UNIFORM, 0, 100);
+                rng.fill(b, RNG::UNIFORM, 0, 100);
+                
                 // [-2,2) range means that the each generated random number
                 // will be one of -2, -1, 0, 1. Saturated to [0,255], it will become
                 // 0, 0, 0, 1 => the mask will be filled by ~25%.
index 2aae11f..6d16044 100644 (file)
@@ -42,7 +42,7 @@
 \r
 #include "test_precomp.hpp"\r
 #include <time.h>\r
-\r
+#include <limits>\r
 using namespace cv;\r
 using namespace std;\r
 \r
@@ -82,7 +82,7 @@ private:
     void print_information(int right, int result);\r
 };\r
 \r
-CV_CountNonZeroTest::CV_CountNonZeroTest(): eps_32(1e-8f), eps_64(1e-16f), src(Mat()), current_type(-1) {}\r
+CV_CountNonZeroTest::CV_CountNonZeroTest(): eps_32(std::numeric_limits<float>::min()), eps_64(std::numeric_limits<double>::min()), src(Mat()), current_type(-1) {}\r
 CV_CountNonZeroTest::~CV_CountNonZeroTest() {}\r
 \r
 void CV_CountNonZeroTest::generate_src_data(cv::Size size, int type)\r
@@ -252,4 +252,4 @@ void CV_CountNonZeroTest::run(int)
     }\r
 }\r
 \r
-// TEST (Core_CountNonZero, accuracy) { CV_CountNonZeroTest test; test.safe_run(); }\r
+TEST (Core_CountNonZero, accuracy) { CV_CountNonZeroTest test; test.safe_run(); }\r
index b05857e..ffeda69 100644 (file)
@@ -146,7 +146,6 @@ void Core_EigenTest_Scalar_32::run(int)
         float value = cv::randu<float>();\r
         cv::Mat src(1, 1, CV_32FC1, Scalar::all((float)value));\r
         test_values(src);\r
-        src.~Mat();\r
     }\r
 }\r
 \r
@@ -158,7 +157,6 @@ void Core_EigenTest_Scalar_64::run(int)
         float value = cv::randu<float>();\r
         cv::Mat src(1, 1, CV_64FC1, Scalar::all((double)value));\r
         test_values(src);\r
-        src.~Mat();\r
     }\r
 }\r
 \r
@@ -401,8 +399,6 @@ bool Core_EigenTest::check_full(int type)
         else   src.at<double>(k, j) = src.at<double>(j, k) = cv::randu<double>();\r
 \r
         if (!test_values(src)) return false;\r
-\r
-        src.~Mat();\r
     }\r
 \r
     return true;\r
index 40aab53..67be5d0 100644 (file)
@@ -377,6 +377,53 @@ protected:
 
 TEST(Core_InputOutput, write_read_consistency) { Core_IOTest test; test.safe_run(); }
 
+
+class CV_MiscIOTest : public cvtest::BaseTest
+{
+public:
+    CV_MiscIOTest() {}
+    ~CV_MiscIOTest() {}   
+protected:
+    void run(int)
+    {
+        try
+        {
+            FileStorage fs("test.xml", FileStorage::WRITE);
+            vector<int> mi, mi2, mi3, mi4;
+            vector<Mat> mv, mv2, mv3, mv4;
+            Mat m(10, 9, CV_32F);
+            Mat empty;
+            randu(m, 0, 1);
+            mi3.push_back(5);
+            mv3.push_back(m);
+            fs << "mi" << mi;
+            fs << "mv" << mv;
+            fs << "mi3" << mi3;
+            fs << "mv3" << mv3;
+            fs << "empty" << empty;
+            fs.release();
+            fs.open("test.xml", FileStorage::READ);
+            fs["mi"] >> mi2;
+            fs["mv"] >> mv2;
+            fs["mi3"] >> mi4;
+            fs["mv3"] >> mv4;
+            fs["empty"] >> empty;
+            CV_Assert( mi2.empty() );
+            CV_Assert( mv2.empty() );
+            CV_Assert( norm(mi3, mi4, CV_C) == 0 );
+            CV_Assert( mv4.size() == 1 );
+            double n = norm(mv3[0], mv4[0], CV_C);
+            CV_Assert( n == 0 );
+        }
+        catch(...)
+        {
+            ts->set_failed_test_info(cvtest::TS::FAIL_MISMATCH);
+        }
+    }
+};
+
+TEST(Core_InputOutput, misc) { CV_MiscIOTest test; test.safe_run(); }
+
 /*class CV_BigMatrixIOTest : public cvtest::BaseTest
 {
 public:
index e479a82..346accd 100644 (file)
@@ -10,7 +10,7 @@ public:
     Core_ReduceTest() {};
 protected:
     void run( int);
-    int checkOp( const Mat& src, int dstType, int opType, const Mat& opRes, int dim, double eps );
+    int checkOp( const Mat& src, int dstType, int opType, const Mat& opRes, int dim );
     int checkCase( int srcType, int dstType, int dim, Size sz );
     int checkDim( int dim, Size sz );
     int checkSize( Size sz );
@@ -80,7 +80,7 @@ void getMatTypeStr( int type, string& str)
     type == CV_64FC1 ? "CV_64FC1" : "unsupported matrix type";
 }
 
-int Core_ReduceTest::checkOp( const Mat& src, int dstType, int opType, const Mat& opRes, int dim, double eps )
+int Core_ReduceTest::checkOp( const Mat& src, int dstType, int opType, const Mat& opRes, int dim )
 {
     int srcType = src.type();
     bool support = false;
@@ -117,12 +117,30 @@ int Core_ReduceTest::checkOp( const Mat& src, int dstType, int opType, const Mat
     }
     if( !support )
         return cvtest::TS::OK;
+
+    double eps = 0.0;
+    if ( opType == CV_REDUCE_SUM || opType == CV_REDUCE_AVG )
+    {
+        if ( dstType == CV_32F )
+            eps = 1.e-5;
+        else if( dstType == CV_64F )
+            eps = 1.e-8;
+        else if ( dstType == CV_32S )
+            eps = 0.6;
+    }
     
     assert( opRes.type() == CV_64FC1 );
-    Mat _dst, dst;
+    Mat _dst, dst, diff;
     reduce( src, _dst, dim, opType, dstType );
     _dst.convertTo( dst, CV_64FC1 );
-    if( norm( opRes, dst, NORM_INF ) > eps )
+
+    absdiff( opRes,dst,diff );
+    bool check = false;
+    if (dstType == CV_32F || dstType == CV_64F)
+        check = countNonZero(diff>eps*dst) > 0;
+    else
+        check = countNonZero(diff>eps) > 0;
+    if( check )
     {
         char msg[100];
         const char* opTypeStr = opType == CV_REDUCE_SUM ? "CV_REDUCE_SUM" :
@@ -168,21 +186,19 @@ int Core_ReduceTest::checkCase( int srcType, int dstType, int dim, Size sz )
         assert( 0 );
     
     // 1. sum
-    tempCode = checkOp( src, dstType, CV_REDUCE_SUM, sum, dim, 
-                       srcType == CV_32FC1 && dstType == CV_32FC1 ? 0.05 : FLT_EPSILON );
+    tempCode = checkOp( src, dstType, CV_REDUCE_SUM, sum, dim );
     code = tempCode != cvtest::TS::OK ? tempCode : code;
     
     // 2. avg
-    tempCode = checkOp( src, dstType, CV_REDUCE_AVG, avg, dim, 
-                       dstType == CV_32SC1 ? 0.6 : 0.00007 );
+    tempCode = checkOp( src, dstType, CV_REDUCE_AVG, avg, dim );
     code = tempCode != cvtest::TS::OK ? tempCode : code;
     
     // 3. max
-    tempCode = checkOp( src, dstType, CV_REDUCE_MAX, max, dim, FLT_EPSILON );
+    tempCode = checkOp( src, dstType, CV_REDUCE_MAX, max, dim );
     code = tempCode != cvtest::TS::OK ? tempCode : code;
     
     // 4. min
-    tempCode = checkOp( src, dstType, CV_REDUCE_MIN, min, dim, FLT_EPSILON );
+    tempCode = checkOp( src, dstType, CV_REDUCE_MIN, min, dim );
     code = tempCode != cvtest::TS::OK ? tempCode : code;
     
     return code;
index 5785e83..a847574 100644 (file)
@@ -2347,6 +2347,41 @@ void Core_SolvePolyTest::run( int )
     }
 }
 
+class Core_CheckRange_Empty : public cvtest::BaseTest
+{
+public:
+    Core_CheckRange_Empty(){}
+    ~Core_CheckRange_Empty(){}
+protected:
+    virtual void run( int start_from );
+};
+
+void Core_CheckRange_Empty::run( int )
+{
+    cv::Mat m;
+    ASSERT_TRUE( cv::checkRange(m) );
+}
+
+TEST(Core_CheckRange_Empty, accuracy) { Core_CheckRange_Empty test; test.safe_run(); }
+
+class Core_CheckRange_INT_MAX : public cvtest::BaseTest
+{
+public:
+    Core_CheckRange_INT_MAX(){}
+    ~Core_CheckRange_INT_MAX(){}
+protected:
+    virtual void run( int start_from );
+};
+
+void Core_CheckRange_INT_MAX::run( int )
+{
+    cv::Mat m(3, 3, CV_32SC1, cv::Scalar(INT_MAX));
+    ASSERT_FALSE( cv::checkRange(m, true, 0, 0, INT_MAX) );
+    ASSERT_TRUE( cv::checkRange(m) );
+}
+
+TEST(Core_CheckRange_INT_MAX, accuracy) { Core_CheckRange_INT_MAX test; test.safe_run(); }
+
 template <typename T> class Core_CheckRange : public testing::Test {};
 
 TYPED_TEST_CASE_P(Core_CheckRange);
@@ -2402,7 +2437,17 @@ TYPED_TEST_P(Core_CheckRange, Bounds)
     delete bad_pt;
 }
 
-REGISTER_TYPED_TEST_CASE_P(Core_CheckRange, Negative, Positive, Bounds);
+TYPED_TEST_P(Core_CheckRange, Zero)
+{
+    double min_bound = 0.0;
+    double max_bound = 0.1;
+
+    cv::Mat src = cv::Mat::zeros(3,3, cv::DataDepth<TypeParam>::value);
+
+    ASSERT_TRUE( checkRange(src, true, NULL, min_bound, max_bound) );
+}
+
+REGISTER_TYPED_TEST_CASE_P(Core_CheckRange, Negative, Positive, Bounds, Zero);
 
 typedef ::testing::Types<signed char,unsigned char, signed short, unsigned short, signed int> mat_data_types;
 INSTANTIATE_TYPED_TEST_CASE_P(Negative_Test, Core_CheckRange, mat_data_types);
@@ -2428,5 +2473,129 @@ TEST(Core_SolvePoly, accuracy) { Core_SolvePolyTest test; test.safe_run(); }
 
 // TODO: eigenvv, invsqrt, cbrt, fastarctan, (round, floor, ceil(?)),
 
+
+class CV_KMeansSingularTest : public cvtest::BaseTest
+{
+public:
+    CV_KMeansSingularTest() {}
+    ~CV_KMeansSingularTest() {}   
+protected:
+    void run(int)
+    {
+        int i, iter = 0, N = 0, N0 = 0, K = 0, dims = 0;
+        Mat labels;
+        try
+        {
+            RNG& rng = theRNG();
+            const int MAX_DIM=5;
+            int MAX_POINTS = 100, maxIter = 100;
+            for( iter = 0; iter < maxIter; iter++ )
+            {
+                ts->update_context(this, iter, true);
+                dims = rng.uniform(1, MAX_DIM+1);
+                N = rng.uniform(1, MAX_POINTS+1);
+                N0 = rng.uniform(1, MAX(N/10, 2));
+                K = rng.uniform(1, N+1);
+                
+                Mat data0(N0, dims, CV_32F);
+                rng.fill(data0, RNG::UNIFORM, -1, 1);
+                
+                Mat data(N, dims, CV_32F);
+                for( i = 0; i < N; i++ )
+                    data0.row(rng.uniform(0, N0)).copyTo(data.row(i));
+                
+                kmeans(data, K, labels, TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 30, 0),
+                       5, KMEANS_PP_CENTERS);
+                
+                Mat hist(K, 1, CV_32S, Scalar(0));
+                for( i = 0; i < N; i++ )
+                {
+                    int l = labels.at<int>(i);
+                    CV_Assert(0 <= l && l < K);
+                    hist.at<int>(l)++;
+                }
+                for( i = 0; i < K; i++ )
+                    CV_Assert( hist.at<int>(i) != 0 );
+            }
+        }
+        catch(...)
+        {
+            ts->printf(cvtest::TS::LOG,
+                       "context: iteration=%d, N=%d, N0=%d, K=%d\n",
+                       iter, N, N0, K);
+            std::cout << labels << std::endl;
+            ts->set_failed_test_info(cvtest::TS::FAIL_MISMATCH);
+        }
+    }
+};
+
+TEST(Core_KMeans, singular) { CV_KMeansSingularTest test; test.safe_run(); }
+
+TEST(CovariationMatrixVectorOfMat, accuracy)
+{
+    unsigned int col_problem_size = 8, row_problem_size = 8, vector_size = 16;
+    cv::Mat src(vector_size, col_problem_size * row_problem_size, CV_32F);
+    int singleMatFlags = CV_COVAR_ROWS;
+
+    cv::Mat gold;
+    cv::Mat goldMean;
+    cv::randu(src,cv::Scalar(-128), cv::Scalar(128));
+    cv::calcCovarMatrix(src,gold,goldMean,singleMatFlags,CV_32F);
+    std::vector<cv::Mat> srcVec;
+    for(size_t i = 0; i < vector_size; i++)
+    {
+        srcVec.push_back(src.row(static_cast<int>(i)).reshape(0,col_problem_size));
+    }
+
+    cv::Mat actual;
+    cv::Mat actualMean;
+    cv::calcCovarMatrix(srcVec, actual, actualMean,singleMatFlags,CV_32F);
+
+    cv::Mat diff;
+    cv::absdiff(gold, actual, diff);
+    cv::Scalar s = cv::sum(diff);
+    ASSERT_EQ(s.dot(s), 0.0);
+
+    cv::Mat meanDiff;
+    cv::absdiff(goldMean, actualMean.reshape(0,1), meanDiff);
+    cv::Scalar sDiff = cv::sum(meanDiff);
+    ASSERT_EQ(sDiff.dot(sDiff), 0.0);
+}
+
+TEST(CovariationMatrixVectorOfMatWithMean, accuracy)
+{
+    unsigned int col_problem_size = 8, row_problem_size = 8, vector_size = 16;
+    cv::Mat src(vector_size, col_problem_size * row_problem_size, CV_32F);
+    int singleMatFlags = CV_COVAR_ROWS | CV_COVAR_USE_AVG;
+
+    cv::Mat gold;
+    cv::randu(src,cv::Scalar(-128), cv::Scalar(128));
+    cv::Mat goldMean;
+
+    cv::reduce(src,goldMean,0 ,CV_REDUCE_AVG, CV_32F);
+
+    cv::calcCovarMatrix(src,gold,goldMean,singleMatFlags,CV_32F);
+
+    std::vector<cv::Mat> srcVec;
+    for(size_t i = 0; i < vector_size; i++)
+    {
+        srcVec.push_back(src.row(static_cast<int>(i)).reshape(0,col_problem_size));
+    }
+
+    cv::Mat actual;
+    cv::Mat actualMean = goldMean.reshape(0, row_problem_size);
+    cv::calcCovarMatrix(srcVec, actual, actualMean,singleMatFlags,CV_32F);
+
+    cv::Mat diff;
+    cv::absdiff(gold, actual, diff);
+    cv::Scalar s = cv::sum(diff);
+    ASSERT_EQ(s.dot(s), 0.0);
+
+    cv::Mat meanDiff;
+    cv::absdiff(goldMean, actualMean.reshape(0,1), meanDiff);
+    cv::Scalar sDiff = cv::sum(meanDiff);
+    ASSERT_EQ(sDiff.dot(sDiff), 0.0);
+}
+
 /* End of file. */
 
index 8528fc3..3917e5f 100644 (file)
@@ -630,7 +630,7 @@ bool CV_OperationsTest::TestTemplateMat()
 
         Mat_<uchar> matFromData(1, 4, uchar_data);
         const Mat_<uchar> mat2 = matFromData.clone();
-        CHECK_DIFF(matFromData, eye.reshape(1));
+        CHECK_DIFF(matFromData, eye.reshape(1, 1));
         if (matFromData(Point(0,0)) != uchar_data[0])throw test_excep();
         if (mat2(Point(0,0)) != uchar_data[0]) throw test_excep();
 
index d4427a5..616264d 100644 (file)
@@ -109,6 +109,10 @@ void Core_RandTest::run( int )
         int dist_type = cvtest::randInt(rng) % (CV_RAND_NORMAL+1);
         int i, k, SZ = N/cn;
         Scalar A, B;
+
+        double eps = 1.e-4;
+        if (depth == CV_64F)
+            eps = 1.e-7;
         
         bool do_sphere_test = dist_type == CV_RAND_UNI;
         Mat arr[2], hist[4];
@@ -170,7 +174,7 @@ void Core_RandTest::run( int )
             }
         }
         
-        if( maxk >= 1 && norm(arr[0], arr[1], NORM_INF) != 0 )
+        if( maxk >= 1 && norm(arr[0], arr[1], NORM_INF) > eps)
         {
             ts->printf( cvtest::TS::LOG, "RNG output depends on the array lengths (some generated numbers get lost?)" );
             ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
index 8a8c2f6..577ac6e 100644 (file)
@@ -500,7 +500,7 @@ The constructor
 
     :param max_features: Maximum desired number of features.
 
-    :param max_iters: Maximum number of times to try adjusting the feature detector parameters. For :ocv:class:`FastAdjuster` , this number can be high, but with ``Star`` or ``Surf``  many iterations can be time-comsuming.  At each iteration the detector is rerun.
+    :param max_iters: Maximum number of times to try adjusting the feature detector parameters. For :ocv:class:`FastAdjuster` , this number can be high, but with ``Star`` or ``Surf``  many iterations can be time-consuming.  At each iteration the detector is rerun.
 
 AdjusterAdapter
 ---------------
index 7289b53..fbe2729 100644 (file)
@@ -196,7 +196,7 @@ Finds the ``k`` best matches for each query keypoint.
 
 .. ocv:function:: void GenericDescriptorMatcher::knnMatch(           const Mat& queryImage, vector<KeyPoint>& queryKeypoints,      vector<vector<DMatch> >& matches, int k,       const vector<Mat>& masks=vector<Mat>(),       bool compactResult=false )
     
-The methods are extended variants of ``GenericDescriptorMatch::match``. The parameters are similar, and the  the semantics is similar to ``DescriptorMatcher::knnMatch``. But this class does not require explicitly computed keypoint descriptors.
+The methods are extended variants of ``GenericDescriptorMatch::match``. The parameters are similar, and the semantics is similar to ``DescriptorMatcher::knnMatch``. But this class does not require explicitly computed keypoint descriptors.
 
 
 
index ae90623..6638b26 100644 (file)
@@ -15,7 +15,7 @@ Detects corners using the FAST algorithm
 
     :param threshold: Threshold on difference between intensity of the central pixel and pixels on a circle around this pixel. See the algorithm description below.
 
-    :param nonmaxSupression: If it is true, non-maximum supression is applied to detected corners (keypoints).
+    :param nonmaxSupression: If it is true, non-maximum suppression is applied to detected corners (keypoints).
 
 Detects corners using the FAST algorithm by E. Rosten (*Machine Learning for High-speed Corner Detection*, 2006).
 
@@ -43,7 +43,7 @@ Maximally stable extremal region extractor. ::
     };
 
 The class encapsulates all the parameters of the MSER extraction algorithm (see
-http://en.wikipedia.org/wiki/Maximally_stable_extremal_regions). Also see http://opencv.willowgarage.com/wiki/documentation/cpp/features2d/MSER for usefull comments and parameters description.
+http://en.wikipedia.org/wiki/Maximally_stable_extremal_regions). Also see http://opencv.willowgarage.com/wiki/documentation/cpp/features2d/MSER for useful comments and parameters description.
 
 
 StarDetector
index a5f82b5..d952092 100644 (file)
@@ -186,7 +186,7 @@ Computes an image descriptor using the set visual vocabulary.
 
 BOWImgDescriptorExtractor::descriptorSize
 ---------------------------------------------
-Returns an image discriptor size if the vocabulary is set. Otherwise, it returns 0.
+Returns an image descriptor size if the vocabulary is set. Otherwise, it returns 0.
 
 .. ocv:function:: int BOWImgDescriptorExtractor::descriptorSize() const
 
index c825707..7247b92 100644 (file)
@@ -172,20 +172,4 @@ void BriefDescriptorExtractor::computeImpl(const Mat& image, std::vector<KeyPoin
     test_fn_(sum, keypoints, descriptors);
 }
 
-static Algorithm* createBRIEF() { return new BriefDescriptorExtractor; }
-static AlgorithmInfo brief_info("Feature2D.BRIEF", createBRIEF);
-
-AlgorithmInfo* BriefDescriptorExtractor::info() const
-{
-    static volatile bool initialized = false;
-    if( !initialized )
-    {
-        BriefDescriptorExtractor brief;
-        brief_info.addParam(brief, "bytes", brief.bytes_);
-
-        initialized = true;
-    }
-    return &brief_info;
-}
-
 } // namespace cv
index 8fd8f40..9b3a668 100644 (file)
@@ -195,7 +195,7 @@ DenseFeatureDetector::DenseFeatureDetector( float _initFeatureScale, int _featur
 
 void DenseFeatureDetector::detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask ) const
 {
-    float curScale = initFeatureScale;
+    float curScale = static_cast<float>(initFeatureScale);
     int curStep = initXyStep;
     int curBound = initImgBound;
     for( int curLevel = 0; curLevel < featureScaleLevels; curLevel++ )
@@ -208,7 +208,7 @@ void DenseFeatureDetector::detectImpl( const Mat& image, vector<KeyPoint>& keypo
             }
         }
 
-        curScale = curScale * featureScaleMul;
+        curScale = static_cast<float>(curScale * featureScaleMul);
         if( varyXyStepWithScale ) curStep = static_cast<int>( curStep * featureScaleMul + 0.5f );
         if( varyImgBoundWithScale ) curBound = static_cast<int>( curBound * featureScaleMul + 0.5f );
     }
@@ -359,5 +359,161 @@ void PyramidAdaptedFeatureDetector::detectImpl( const Mat& image, vector<KeyPoin
     if( !mask.empty() )
         KeyPointsFilter::runByPixelsMask( keypoints, mask );
 }
+    
+    
+/////////////////////// AlgorithmInfo for various detector & descriptors ////////////////////////////
+
+/* NOTE!!!
+   All the AlgorithmInfo-related stuff should be in the same file as initModule_features2d().
+   Otherwise, linker may throw away some seemingly unused stuff.
+*/
+    
+static Algorithm* createBRIEF() { return new BriefDescriptorExtractor; }
+static AlgorithmInfo& brief_info()
+{
+    static AlgorithmInfo brief_info_var("Feature2D.BRIEF", createBRIEF);
+    return brief_info_var;
+}
+
+static AlgorithmInfo& brief_info_auto = brief_info();
+
+AlgorithmInfo* BriefDescriptorExtractor::info() const
+{
+    static volatile bool initialized = false;
+    if( !initialized )
+    {
+        BriefDescriptorExtractor brief;
+        brief_info().addParam(brief, "bytes", brief.bytes_);
+        
+        initialized = true;
+    }
+    return &brief_info();
+}
+    
+///////////////////////////////////////////////////////////////////////////////////////////////////////////
+    
+static Algorithm* createFAST() { return new FastFeatureDetector; }
+static AlgorithmInfo& fast_info()
+{
+    static AlgorithmInfo fast_info_var("Feature2D.FAST", createFAST);
+    return fast_info_var;
+}
 
+static AlgorithmInfo& fast_info_auto = fast_info();
+
+AlgorithmInfo* FastFeatureDetector::info() const
+{
+    static volatile bool initialized = false;
+    if( !initialized )
+    {
+        FastFeatureDetector obj;
+        fast_info().addParam(obj, "threshold", obj.threshold);
+        fast_info().addParam(obj, "nonmaxSuppression", obj.nonmaxSuppression);
+        
+        initialized = true;
+    }
+    return &fast_info();
+}
+    
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////
+    
+static Algorithm* createStarDetector() { return new StarDetector; }
+static AlgorithmInfo& star_info()
+{
+    static AlgorithmInfo star_info_var("Feature2D.STAR", createStarDetector);
+    return star_info_var;
+}
+
+static AlgorithmInfo& star_info_auto = star_info();
+
+AlgorithmInfo* StarDetector::info() const
+{
+    static volatile bool initialized = false;
+    if( !initialized )
+    {
+        StarDetector obj;
+        star_info().addParam(obj, "maxSize", obj.maxSize);
+        star_info().addParam(obj, "responseThreshold", obj.responseThreshold);
+        star_info().addParam(obj, "lineThresholdProjected", obj.lineThresholdProjected);
+        star_info().addParam(obj, "lineThresholdBinarized", obj.lineThresholdBinarized);
+        star_info().addParam(obj, "suppressNonmaxSize", obj.suppressNonmaxSize);
+        
+        initialized = true;
+    }
+    return &star_info();
+}    
+    
+///////////////////////////////////////////////////////////////////////////////////////////////////////////
+    
+static Algorithm* createMSER() { return new MSER; }
+static AlgorithmInfo& mser_info()
+{
+    static AlgorithmInfo mser_info_var("Feature2D.MSER", createMSER);
+    return mser_info_var;
+}
+
+static AlgorithmInfo& mser_info_auto = mser_info();
+
+AlgorithmInfo* MSER::info() const
+{
+    static volatile bool initialized = false;
+    if( !initialized )
+    {
+        MSER obj;
+        mser_info().addParam(obj, "delta", obj.delta);
+        mser_info().addParam(obj, "minArea", obj.minArea);
+        mser_info().addParam(obj, "maxArea", obj.maxArea);
+        mser_info().addParam(obj, "maxVariation", obj.maxVariation);
+        mser_info().addParam(obj, "minDiversity", obj.minDiversity);
+        mser_info().addParam(obj, "maxEvolution", obj.maxEvolution);
+        mser_info().addParam(obj, "areaThreshold", obj.areaThreshold);
+        mser_info().addParam(obj, "minMargin", obj.minMargin);
+        mser_info().addParam(obj, "edgeBlurSize", obj.edgeBlurSize);
+        
+        initialized = true;
+    }
+    return &mser_info();
+}
+    
+    
+///////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static Algorithm* createORB() { return new ORB; }
+static AlgorithmInfo& orb_info()
+{
+    static AlgorithmInfo orb_info_var("Feature2D.ORB", createORB);
+    return orb_info_var;
+}
+
+static AlgorithmInfo& orb_info_auto = orb_info();
+
+AlgorithmInfo* ORB::info() const
+{
+    static volatile bool initialized = false;
+    if( !initialized )
+    {
+        ORB obj;
+        orb_info().addParam(obj, "nFeatures", obj.nfeatures);
+        orb_info().addParam(obj, "scaleFactor", obj.scaleFactor);
+        orb_info().addParam(obj, "nLevels", obj.nlevels);
+        orb_info().addParam(obj, "firstLevel", obj.firstLevel);
+        orb_info().addParam(obj, "edgeThreshold", obj.edgeThreshold);
+        orb_info().addParam(obj, "patchSize", obj.patchSize);
+        orb_info().addParam(obj, "WTA_K", obj.WTA_K);
+        orb_info().addParam(obj, "scoreType", obj.scoreType);
+        
+        initialized = true;
+    }
+    return &orb_info();
+}
+    
+bool initModule_features2d(void)
+{
+    Ptr<Algorithm> brief = createBRIEF(), orb = createORB(),
+        star = createStarDetector(), fastd = createFAST(), mser = createMSER();
+    return brief->info() != 0 && orb->info() != 0 && star->info() != 0 &&
+        fastd->info() != 0 && mser->info() != 0;
+}
+    
 }
index 2be9df6..2bc25dd 100644 (file)
@@ -391,22 +391,4 @@ void FastFeatureDetector::detectImpl( const Mat& image, vector<KeyPoint>& keypoi
     KeyPointsFilter::runByPixelsMask( keypoints, mask );
 }
 
-    
-static Algorithm* createFAST() { return new FastFeatureDetector; }
-static AlgorithmInfo fast_info("Feature2D.FAST", createFAST);
-    
-AlgorithmInfo* FastFeatureDetector::info() const
-{
-    static volatile bool initialized = false;
-    if( !initialized )
-    {
-        FastFeatureDetector obj;
-        fast_info.addParam(obj, "threshold", obj.threshold);
-        fast_info.addParam(obj, "nonmaxSuppression", obj.nonmaxSuppression);
-        
-        initialized = true;
-    }
-    return &fast_info;
-}
-    
 }
index b15dd64..61a6ced 100755 (executable)
@@ -383,7 +383,7 @@ void BFMatcher::knnMatchImpl( const Mat& queryDescriptors, vector<vector<DMatch>
         vector<DMatch>& mq = matches.back();
         mq.reserve(knn);
         
-        for( int k = 0; k < knn; k++ )
+        for( int k = 0; k < nidx.cols; k++ )
         {
             if( nidxptr[k] < 0 )
                 break;
index f99bf81..f7bd7a8 100644 (file)
@@ -1299,28 +1299,4 @@ void MserFeatureDetector::detectImpl( const Mat& image, vector<KeyPoint>& keypoi
     }
 }
     
-static Algorithm* createMSER() { return new MSER; }
-static AlgorithmInfo mser_info("Feature2D.MSER", createMSER);
-    
-AlgorithmInfo* MSER::info() const
-{
-    static volatile bool initialized = false;
-    if( !initialized )
-    {
-        MSER obj;
-        mser_info.addParam(obj, "delta", obj.delta);
-        mser_info.addParam(obj, "minArea", obj.minArea);
-        mser_info.addParam(obj, "maxArea", obj.maxArea);
-        mser_info.addParam(obj, "maxVariation", obj.maxVariation);
-        mser_info.addParam(obj, "minDiversity", obj.minDiversity);
-        mser_info.addParam(obj, "maxEvolution", obj.maxEvolution);
-        mser_info.addParam(obj, "areaThreshold", obj.areaThreshold);
-        mser_info.addParam(obj, "minMargin", obj.minMargin);
-        mser_info.addParam(obj, "edgeBlurSize", obj.edgeBlurSize);
-        
-        initialized = true;
-    }
-    return &mser_info;
-}    
-
 }
index d6c59de..ed838d3 100644 (file)
@@ -546,31 +546,6 @@ static void makeRandomPattern(int patchSize, Point* pattern, int npoints)
 }
 
     
-///////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-static Algorithm* createORB() { return new ORB; }
-static AlgorithmInfo orb_info("Feature2D.ORB", createORB);
-    
-AlgorithmInfo* ORB::info() const
-{
-    static volatile bool initialized = false;
-    if( !initialized )
-    {
-        ORB obj;
-        orb_info.addParam(obj, "nFeatures", obj.nfeatures);
-        orb_info.addParam(obj, "scaleFactor", obj.scaleFactor);
-        orb_info.addParam(obj, "nLevels", obj.nlevels);
-        orb_info.addParam(obj, "firstLevel", obj.firstLevel);
-        orb_info.addParam(obj, "edgeThreshold", obj.edgeThreshold);
-        orb_info.addParam(obj, "patchSize", obj.patchSize);
-        orb_info.addParam(obj, "WTA_K", obj.WTA_K);
-        orb_info.addParam(obj, "scoreType", obj.scoreType);
-        
-        initialized = true;
-    }
-    return &orb_info;
-}
-    
 static inline float getScale(int level, int firstLevel, double scaleFactor)
 {
     return (float)std::pow(scaleFactor, (double)(level - firstLevel));
index 60c332e..3775ebd 100644 (file)
@@ -447,25 +447,4 @@ void StarDetector::operator()(const Mat& img, vector<KeyPoint>& keypoints) const
                                     lineThresholdBinarized, suppressNonmaxSize );
 }
     
-    
-static Algorithm* createStarDetector() { return new StarDetector; }
-static AlgorithmInfo star_info("Feature2D.STAR", createStarDetector);
-    
-AlgorithmInfo* StarDetector::info() const
-{
-    static volatile bool initialized = false;
-    if( !initialized )
-    {
-        StarDetector obj;
-        star_info.addParam(obj, "maxSize", obj.maxSize);
-        star_info.addParam(obj, "responseThreshold", obj.responseThreshold);
-        star_info.addParam(obj, "lineThresholdProjected", obj.lineThresholdProjected);
-        star_info.addParam(obj, "lineThresholdBinarized", obj.lineThresholdBinarized);
-        star_info.addParam(obj, "suppressNonmaxSize", obj.suppressNonmaxSize);
-        
-        initialized = true;
-    }
-    return &star_info;
-}    
-
 }
index 8c5fc6f..36052e9 100644 (file)
@@ -269,13 +269,15 @@ static Mat readMatFromBin( const string& filename )
     if( f )
     {
         int rows, cols, type, dataSize;
-        fread( (void*)&rows, sizeof(int), 1, f );
-        fread( (void*)&cols, sizeof(int), 1, f );
-        fread( (void*)&type, sizeof(int), 1, f );
-        fread( (void*)&dataSize, sizeof(int), 1, f );
+        size_t elements_read1 = fread( (void*)&rows, sizeof(int), 1, f );
+        size_t elements_read2 = fread( (void*)&cols, sizeof(int), 1, f );
+        size_t elements_read3 = fread( (void*)&type, sizeof(int), 1, f );
+        size_t elements_read4 = fread( (void*)&dataSize, sizeof(int), 1, f );
+        CV_Assert(elements_read1 == 1 && elements_read2 == 1 && elements_read3 == 1 && elements_read4 == 1);
 
         uchar* data = (uchar*)cvAlloc(dataSize);
-        fread( (void*)data, 1, dataSize, f );
+        size_t elements_read = fread( (void*)data, 1, dataSize, f );
+        CV_Assert(elements_read == (size_t)(dataSize));
         fclose(f);
 
         return Mat( rows, cols, type, data );
index 32a4be9..89e51c1 100644 (file)
@@ -75,7 +75,8 @@ int CV_MserTest::LoadBoxes(const char* path, vector<CvBox2D>& boxes)
     while (!feof(f))
     {
         CvBox2D box;
-        fscanf(f,"%f,%f,%f,%f,%f\n",&box.angle,&box.center.x,&box.center.y,&box.size.width,&box.size.height);
+        int values_read = fscanf(f,"%f,%f,%f,%f,%f\n",&box.angle,&box.center.x,&box.center.y,&box.size.width,&box.size.height);
+        CV_Assert(values_read == 5);
         boxes.push_back(box);
     }
     fclose(f);
index 4ea53bd..1e065d3 100644 (file)
@@ -3,16 +3,18 @@ Clustering
 
 .. highlight:: cpp
 
-flann::hierarchicalClustering<ET,DT>
+flann::hierarchicalClustering<Distance>
 --------------------------------------------
 Clusters features using hierarchical k-means algorithm.
 
-.. ocv:function:: int flann::hierarchicalClustering<ET,DT>(const Mat& features, Mat& centers,                                      const KMeansIndexParams& params)
+.. ocv:function:: template<typename Distance> int flann::hierarchicalClustering(const Mat& features, Mat& centers, const cvflann::KMeansIndexParams& params, Distance d = Distance())
 
-    :param features: The points to be clustered. The matrix must have elements of type ET. 
+    :param features: The points to be clustered. The matrix must have elements of type ``Distance::ElementType``.
     
-    :param centers: The centers of the clusters obtained. The matrix must have type DT. The number of rows in this matrix represents the number of clusters desired, however, because of the way the cut in the hierarchical tree is chosen, the number of clusters computed will be the highest number of the form  ``(branching-1)*k+1``  that's lower than the number of clusters desired, where  ``branching``  is the tree's branching factor (see description of the KMeansIndexParams). 
+    :param centers: The centers of the clusters obtained. The matrix must have type ``Distance::ResultType``. The number of rows in this matrix represents the number of clusters desired, however, because of the way the cut in the hierarchical tree is chosen, the number of clusters computed will be the highest number of the form  ``(branching-1)*k+1``  that's lower than the number of clusters desired, where  ``branching``  is the tree's branching factor (see description of the KMeansIndexParams). 
     
-    :param params: Parameters used in the construction of the hierarchical k-means tree 
+    :param params: Parameters used in the construction of the hierarchical k-means tree.
+
+    :param d: Distance to be used for clustering.
     
 The method clusters the given feature vectors by constructing a hierarchical k-means tree and choosing a cut in the tree that minimizes the cluster's variance. It returns the number of clusters found.
index 05ef45a..de2781a 100644 (file)
@@ -71,7 +71,7 @@ The method constructs a fast search structure from a set of features using the s
     
            * **centers_init** The algorithm to use for selecting the initial centers when performing a k-means clustering step. The possible values are  ``CENTERS_RANDOM``  (picks the initial cluster centers randomly),  ``CENTERS_GONZALES``  (picks the initial centers using Gonzales' algorithm) and  ``CENTERS_KMEANSPP``  (picks the initial centers using the algorithm suggested in  arthur_kmeanspp_2007 ) 
     
-           * **cb_index** This parameter (cluster boundary index) influences the way exploration is performed in the hierarchical kmeans tree. When  ``cb_index``  is zero the next kmeans domain to be explored is choosen to be the one with the closest center. A value greater then zero also takes into account the size of the domain. 
+           * **cb_index** This parameter (cluster boundary index) influences the way exploration is performed in the hierarchical kmeans tree. When  ``cb_index``  is zero the next kmeans domain to be explored is chosen to be the one with the closest center. A value greater then zero also takes into account the size of the domain. 
 
     *
        **CompositeIndexParams** When using a parameters object of this type the index created combines the randomized kd-trees  and the hierarchical k-means tree. ::
@@ -205,7 +205,7 @@ Saves the index to a file.
 
 flann::Index_<T>::getIndexParameters
 --------------------------------------------
-Returns the index paramreters.
+Returns the index parameters.
 
 .. ocv:function:: const IndexParams* flann::Index_<T>::getIndexParameters()
 
index ff19f62..93dd89c 100644 (file)
@@ -225,7 +225,11 @@ int GenericIndex<Distance>::radiusSearch(const Mat& query, Mat& indices, Mat& di
  * @deprecated Use GenericIndex class instead
  */
 template <typename T>
-class FLANN_DEPRECATED Index_ {
+class
+#ifndef _MSC_VER
+ FLANN_DEPRECATED
+#endif
+ Index_ {
 public:
         typedef typename L2<T>::ElementType ElementType;
         typedef typename L2<T>::ResultType DistanceType;
@@ -277,6 +281,10 @@ private:
         ::cvflann::Index< L1<ElementType> >* nnIndex_L1;
 };
 
+#ifdef _MSC_VER
+template <typename T>
+class FLANN_DEPRECATED Index_;
+#endif
 
 template <typename T>
 Index_<T>::Index_(const Mat& dataset, const ::cvflann::IndexParams& params)
index a403b68..bc16c5b 100644 (file)
@@ -33,18 +33,16 @@ if (HAVE_CUDA)
   #set (CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-keep")
   #set (CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-Xcompiler;/EHsc-;")
     
-  foreach(var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
-    string(REPLACE "/W4" "/W3" ${var} "${${var}}")
-  endforeach()
-
   if(MSVC)
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4211 /wd4201 /wd4100 /wd4505 /wd4408 /wd4251")
-
-    foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
-      string(REPLACE "/EHsc-" "/EHs" ${var} "${${var}}")
-    endforeach()
+    if(NOT ENABLE_NOISY_WARNINGS)
+      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4211 /wd4201 /wd4100 /wd4505 /wd4408")
+      
+      foreach(var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
+        string(REPLACE "/W4" "/W3" ${var} "${${var}}")
+      endforeach()
     
-    set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -Xcompiler /wd4251)
+      set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -Xcompiler /wd4251)
+    endif()
   endif()
 
   OCV_CUDA_COMPILE(cuda_objs ${lib_cuda} ${ncv_cuda})
index 808238b..e95b453 100644 (file)
@@ -279,7 +279,7 @@ Class computing stereo correspondence using the constant space belief propagatio
     };
 
 
-The class implements algorithm described in [Yang2010]_. ``StereoConstantSpaceBP`` supports both local minimum and global minimum data cost initialization algortihms. For more details, see the paper mentioned above. By default, a local algorithm is used. To enable a global algorithm, set ``use_local_init_data_cost`` to ``false`` .
+The class implements algorithm described in [Yang2010]_. ``StereoConstantSpaceBP`` supports both local minimum and global minimum data cost initialization algorithms. For more details, see the paper mentioned above. By default, a local algorithm is used. To enable a global algorithm, set ``use_local_init_data_cost`` to ``false`` .
 
 
 
@@ -323,7 +323,7 @@ Enables the :ocv:class:`gpu::StereoConstantSpaceBP` constructors.
 
 For more details, see [Yang2010]_.
 
-By default, ``StereoConstantSpaceBP`` uses floating-point arithmetics and the ``CV_32FC1`` type for messages. But it can also use fixed-point arithmetics and the ``CV_16SC1`` message type for better perfomance. To avoid an overflow in this case, the parameters must satisfy the following requirement:
+By default, ``StereoConstantSpaceBP`` uses floating-point arithmetics and the ``CV_32FC1`` type for messages. But it can also use fixed-point arithmetics and the ``CV_16SC1`` message type for better performance. To avoid an overflow in this case, the parameters must satisfy the following requirement:
 
 .. math::
 
@@ -359,7 +359,7 @@ gpu::DisparityBilateralFilter
 -----------------------------
 .. ocv:class:: gpu::DisparityBilateralFilter
 
-Class refinining a disparity map using joint bilateral filtering. ::
+Class refining a disparity map using joint bilateral filtering. ::
 
     class CV_EXPORTS DisparityBilateralFilter
     {
index 375b998..3021890 100644 (file)
@@ -172,7 +172,7 @@ Ensures that the size of a matrix is big enough and the matrix has a proper type
 
     :param cols: Minimum desired number of columns.
 
-    :param size: Rows and coumns passed as a structure.
+    :param size: Rows and columns passed as a structure.
 
     :param type: Desired matrix type.
 
index 68118e1..d63f055 100644 (file)
@@ -168,7 +168,7 @@ Constructor.
 
     :param threshold: Threshold on difference between intensity of the central pixel and pixels on a circle around this pixel.
 
-    :param nonmaxSupression: If it is true, non-maximum supression is applied to detected corners (keypoints).
+    :param nonmaxSupression: If it is true, non-maximum suppression is applied to detected corners (keypoints).
 
     :param keypointsRatio: Inner buffer size for keypoints store is determined as (keypointsRatio * image_width * image_height).
 
@@ -188,7 +188,7 @@ Finds the keypoints using FAST detector.
     :param keypoints: The output vector of keypoints. Can be stored both in CPU and GPU memory. For GPU memory:
 
             * keypoints.ptr<Vec2s>(LOCATION_ROW)[i] will contain location of i'th point
-            * keypoints.ptr<float>(RESPONSE_ROW)[i] will contaion response of i'th point (if non-maximum supression is applied)
+            * keypoints.ptr<float>(RESPONSE_ROW)[i] will contain response of i'th point (if non-maximum suppression is applied)
 
 
 
@@ -238,7 +238,7 @@ Gets final array of keypoints.
 
     :param keypoints: The output vector of keypoints.
 
-The function performs nonmax supression if needed and returns final count of keypoints.
+The function performs non-max suppression if needed and returns final count of keypoints.
 
 
 
@@ -529,7 +529,7 @@ Converts matrices obtained via :ocv:func:`gpu::BruteForceMatcher_GPU::matchSingl
 
 gpu::BruteForceMatcher_GPU::knnMatch
 ----------------------------------------
-Finds the k best matches for each descriptor from a query set with train descriptors.
+Finds the ``k`` best matches for each descriptor from a query set with train descriptors.
 
 .. ocv:function:: void gpu::BruteForceMatcher_GPU::knnMatch(const GpuMat& query, const GpuMat& train, std::vector< std::vector<DMatch> >&matches, int k, const GpuMat& mask = GpuMat(), bool compactResult = false)
 
@@ -551,7 +551,7 @@ Finds the k best matches for each descriptor from a query set with train descrip
 
     :param stream: Stream for the asynchronous version.
 
-The function returns detected k (or less if not possible) matches in the increasing order by distance.
+The function returns detected ``k`` (or less if not possible) matches in the increasing order by distance.
 
 The third variant of the method stores the results in GPU memory.
 
index 78fb1bf..f63e242 100644 (file)
@@ -109,7 +109,7 @@ By using ``FilterEngine_GPU`` instead of functions you can avoid unnecessary mem
     filter.release();
 
 
-``FilterEngine_GPU`` can process a rectangular sub-region of an image. By default, if ``roi == Rect(0,0,-1,-1)`` , ``FilterEngine_GPU`` processes the inner region of an image ( ``Rect(anchor.x, anchor.y, src_size.width - ksize.width, src_size.height - ksize.height)`` ) because some filters do not check whether indices are outside the image for better perfomance. See below to understand which filters support processing the whole image and which do not and identify image type limitations.
+``FilterEngine_GPU`` can process a rectangular sub-region of an image. By default, if ``roi == Rect(0,0,-1,-1)`` , ``FilterEngine_GPU`` processes the inner region of an image ( ``Rect(anchor.x, anchor.y, src_size.width - ksize.width, src_size.height - ksize.height)`` ) because some filters do not check whether indices are outside the image for better performance. See below to understand which filters support processing the whole image and which do not and identify image type limitations.
 
 .. note:: The GPU filters do not support the in-place mode.
 
@@ -469,7 +469,7 @@ Creates a primitive column filter with the specified kernel.
 
 .. ocv:function:: Ptr<BaseColumnFilter_GPU> gpu::getLinearColumnFilter_GPU(int bufType, int dstType, const Mat& columnKernel, int anchor = -1, int borderType = BORDER_CONSTANT)
 
-    :param bufType: Inermediate buffer type with as many channels as  ``dstType`` .
+    :param bufType: Intermediate buffer type with as many channels as  ``dstType`` .
 
     :param dstType: Destination array type. ``CV_8UC1`` , ``CV_8UC4`` , ``CV_16SC1`` , ``CV_16SC2`` , ``CV_16SC3`` , ``CV_32SC1`` , ``CV_32FC1`` destination types are supported.
 
@@ -581,7 +581,7 @@ Applies the generalized Sobel operator to an image.
 
     :param dy: Derivative order in respect of y.
 
-    :param ksize: Size of the extended Sobel kernel. Possible valies are 1, 3, 5 or 7.
+    :param ksize: Size of the extended Sobel kernel. Possible values are 1, 3, 5 or 7.
 
     :param scale: Optional scale factor for the computed derivative values. By default, no scaling is applied. For details, see  :ocv:func:`getDerivKernels` .
 
index d09ef7d..7795d0d 100644 (file)
@@ -61,7 +61,7 @@ Performs a mean-shift segmentation of the source image and eliminates small segm
 
     :param sr: Color window radius.
 
-    :param minsize: Minimum segment size. Smaller segements are merged.
+    :param minsize: Minimum segment size. Smaller segments are merged.
 
     :param criteria: Termination criteria. See :ocv:class:`TermCriteria`.
 
@@ -229,7 +229,7 @@ The source matrix should be continuous, otherwise reallocation and data copying
 
     * If the source matrix is complex and the output is not specified as real, the destination matrix is complex and has the ``dft_size``    size and ``CV_32FC2``    type. The destination matrix contains a full result of the DFT (forward or inverse).
 
-    * If the source matrix is complex and the output is specified as real, the function assumes that its input is the result of the forward transform (see the next item). The destionation matrix has the ``dft_size`` size and ``CV_32FC1`` type. It contains the result of the inverse DFT.
+    * If the source matrix is complex and the output is specified as real, the function assumes that its input is the result of the forward transform (see the next item). The destination matrix has the ``dft_size`` size and ``CV_32FC1`` type. It contains the result of the inverse DFT.
 
     * If the source matrix is real (its type is ``CV_32FC1`` ), forward DFT is performed. The result of the DFT is packed into complex ( ``CV_32FC2`` ) matrix. So, the width of the destination matrix is ``dft_size.width / 2 + 1`` . But if the source is a single column, the height is reduced instead of the width.
 
@@ -392,7 +392,7 @@ Converts an image from one color space to another.
 
     :param stream: Stream for the asynchronous version.
 
-3-channel color spaces (like ``HSV``, ``XYZ``, and so on) can be stored in a 4-channel image for better perfomance.
+3-channel color spaces (like ``HSV``, ``XYZ``, and so on) can be stored in a 4-channel image for better performance.
 
 .. seealso:: :ocv:func:`cvtColor`
 
@@ -499,7 +499,7 @@ gpu::buildWarpAffineMaps
 ------------------------
 Builds transformation maps for affine transformation.
 
-.. ocv:function:: void buildWarpAffineMaps(const Mat& M, bool inverse, Size dsize, GpuMat& xmap, GpuMat& ymap, Stream& stream = Stream::Null());
+.. ocv:function:: void buildWarpAffineMaps(const Mat& M, bool inverse, Size dsize, GpuMat& xmap, GpuMat& ymap, Stream& stream = Stream::Null())
 
     :param M: *2x3*  transformation matrix.
 
@@ -543,7 +543,7 @@ gpu::buildWarpPerspectiveMaps
 -----------------------------
 Builds transformation maps for perspective transformation.
 
-.. ocv:function:: void buildWarpAffineMaps(const Mat& M, bool inverse, Size dsize, GpuMat& xmap, GpuMat& ymap, Stream& stream = Stream::Null());
+.. ocv:function:: void buildWarpAffineMaps(const Mat& M, bool inverse, Size dsize, GpuMat& xmap, GpuMat& ymap, Stream& stream = Stream::Null())
 
     :param M: *3x3*  transformation matrix.
 
index 029fee8..2e7ee3d 100644 (file)
@@ -43,7 +43,7 @@ Utilizing Multiple GPUs
 -----------------------
 
 In the current version, each of the OpenCV GPU algorithms can use only a single GPU. So, to utilize multiple GPUs, you have to manually distribute the work between GPUs. 
-Switching active devie can be done using :ocv:func:`gpu::setDevice()' function.  For more details please read Cuda C Programing Guid.
+Switching active devie can be done using :ocv:func:`gpu::setDevice()` function.  For more details please read Cuda C Programing Guide.
 
 While developing algorithms for multiple GPUs, note a data passing overhead. For primitive functions and small images, it can be significant, which may eliminate all the advantages of having multiple GPUs. But for high-level algorithms, consider using multi-GPU acceleration. For example, the Stereo Block Matching algorithm has been successfully parallelized using the following algorithm:
 
index f55fbd3..b6543f8 100644 (file)
@@ -191,9 +191,9 @@ Computes polar angles of complex matrix elements.
 
     :param y: Source matrix containing imaginary components ( ``CV_32FC1`` ).
 
-    :param angle: Destionation matrix of angles ( ``CV_32FC1`` ).
+    :param angle: Destination matrix of angles ( ``CV_32FC1`` ).
 
-    :param angleInDegrees: Flag for angles that must be evaluated in degress.
+    :param angleInDegrees: Flag for angles that must be evaluated in degrees.
 
     :param stream: Stream for the asynchronous version.
 
@@ -213,9 +213,9 @@ Converts Cartesian coordinates into polar.
 
     :param magnitude: Destination matrix of float magnitudes ( ``CV_32FC1`` ).
 
-    :param angle: Destionation matrix of angles ( ``CV_32FC1`` ).
+    :param angle: Destination matrix of angles ( ``CV_32FC1`` ).
 
-    :param angleInDegrees: Flag for angles that must be evaluated in degress.
+    :param angleInDegrees: Flag for angles that must be evaluated in degrees.
 
     :param stream: Stream for the asynchronous version.
 
@@ -237,7 +237,7 @@ Converts polar coordinates into Cartesian.
 
     :param y: Destination matrix of imaginary components ( ``CV_32FC1`` ).
 
-    :param angleInDegrees: Flag that indicates angles in degress.
+    :param angleInDegrees: Flag that indicates angles in degrees.
 
     :param stream: Stream for the asynchronous version.
 
index 0c8ad59..f2a6287 100644 (file)
@@ -1,7 +1,7 @@
 /*M///////////////////////////////////////////////////////////////////////////////////////\r
 //\r
-// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. \r
-// \r
+// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.\r
+//\r
 //  By downloading, copying, installing or using the software you agree to this license.\r
 //  If you do not agree to this license, do not download, install,\r
 //  copy or use the software.\r
 /// \brief Model and solver parameters\r
 struct NCVBroxOpticalFlowDescriptor\r
 {\r
-       /// flow smoothness\r
-       Ncv32f alpha;\r
-       /// gradient constancy importance\r
-       Ncv32f gamma;\r
-       /// pyramid scale factor\r
-       Ncv32f scale_factor;\r
-       /// number of lagged non-linearity iterations (inner loop)\r
-       Ncv32u number_of_inner_iterations;\r
-       /// number of warping iterations (number of pyramid levels)\r
-       Ncv32u number_of_outer_iterations;\r
-       /// number of linear system solver iterations\r
-       Ncv32u number_of_solver_iterations;\r
+    /// flow smoothness\r
+    Ncv32f alpha;\r
+    /// gradient constancy importance\r
+    Ncv32f gamma;\r
+    /// pyramid scale factor\r
+    Ncv32f scale_factor;\r
+    /// number of lagged non-linearity iterations (inner loop)\r
+    Ncv32u number_of_inner_iterations;\r
+    /// number of warping iterations (number of pyramid levels)\r
+    Ncv32u number_of_outer_iterations;\r
+    /// number of linear system solver iterations\r
+    Ncv32u number_of_solver_iterations;\r
 };\r
 \r
 /////////////////////////////////////////////////////////////////////////////////////////\r
@@ -93,11 +93,11 @@ struct NCVBroxOpticalFlowDescriptor
 \r
 NCV_EXPORTS\r
 NCVStatus NCVBroxOpticalFlow(const NCVBroxOpticalFlowDescriptor desc,\r
-                                                        INCVMemAllocator &gpu_mem_allocator,\r
-                                                        const NCVMatrix<Ncv32f> &frame0,\r
-                                                        const NCVMatrix<Ncv32f> &frame1,\r
-                                                        NCVMatrix<Ncv32f> &u,\r
-                                                        NCVMatrix<Ncv32f> &v,\r
-                                                        cudaStream_t stream);\r
+                             INCVMemAllocator &gpu_mem_allocator,\r
+                             const NCVMatrix<Ncv32f> &frame0,\r
+                             const NCVMatrix<Ncv32f> &frame1,\r
+                             NCVMatrix<Ncv32f> &u,\r
+                             NCVMatrix<Ncv32f> &v,\r
+                             cudaStream_t stream);\r
 \r
 #endif\r
index 88fdddd..eddc390 100644 (file)
@@ -59,6 +59,7 @@
 #define _ncvhaarobjectdetection_hpp_\r
 \r
 #include <string>\r
+#include <vector_types.h>\r
 #include "NCV.hpp"\r
 \r
 \r
 //\r
 //==============================================================================\r
 \r
-\r
 struct HaarFeature64\r
 {\r
-    uint2 _ui2;\r
+    union\r
+    {\r
+        uint2 _ui2;\r
+        struct {NcvRect8u__ _rect; Ncv32f _f;};\r
+    };\r
+\r
 \r
 #define HaarFeature64_CreateCheck_MaxRectField                  0xFF\r
 \r
     __host__ NCVStatus setRect(Ncv32u rectX, Ncv32u rectY, Ncv32u rectWidth, Ncv32u rectHeight, Ncv32u /*clsWidth*/, Ncv32u /*clsHeight*/)\r
     {\r
         ncvAssertReturn(rectWidth <= HaarFeature64_CreateCheck_MaxRectField && rectHeight <= HaarFeature64_CreateCheck_MaxRectField, NCV_HAAR_TOO_LARGE_FEATURES);\r
-        ((NcvRect8u*)&(this->_ui2.x))->x = (Ncv8u)rectX;\r
-        ((NcvRect8u*)&(this->_ui2.x))->y = (Ncv8u)rectY;\r
-        ((NcvRect8u*)&(this->_ui2.x))->width = (Ncv8u)rectWidth;\r
-        ((NcvRect8u*)&(this->_ui2.x))->height = (Ncv8u)rectHeight;\r
+        _rect = NcvRect8u(rectX,rectY,rectWidth,rectHeight);\r
+\r
         return NCV_SUCCESS;\r
     }\r
 \r
     __host__ NCVStatus setWeight(Ncv32f weight)\r
     {\r
-        ((Ncv32f*)&(this->_ui2.y))[0] = weight;\r
+        _f = weight;\r
+\r
         return NCV_SUCCESS;\r
     }\r
 \r
     __device__ __host__ void getRect(Ncv32u *rectX, Ncv32u *rectY, Ncv32u *rectWidth, Ncv32u *rectHeight)\r
     {\r
-        NcvRect8u tmpRect = *(NcvRect8u*)(&this->_ui2.x);\r
-        *rectX = tmpRect.x;\r
-        *rectY = tmpRect.y;\r
-        *rectWidth = tmpRect.width;\r
-        *rectHeight = tmpRect.height;\r
+        *rectX = _rect.x;\r
+        *rectY = _rect.y;\r
+        *rectWidth = _rect.width;\r
+        *rectHeight = _rect.height;\r
     }\r
 \r
     __device__ __host__ Ncv32f getWeight(void)\r
     {\r
-        return *(Ncv32f*)(&this->_ui2.y);\r
+        return _f;\r
     }\r
 };\r
 \r
@@ -171,23 +174,27 @@ public:
 \r
 struct HaarClassifierNodeDescriptor32\r
 {\r
+union\r
+{\r
     uint1 _ui1;\r
+    Ncv32f _f;\r
+};\r
 \r
     __host__ NCVStatus create(Ncv32f leafValue)\r
     {\r
-        *(Ncv32f *)&this->_ui1 = leafValue;\r
+        _f = leafValue;\r
         return NCV_SUCCESS;\r
     }\r
 \r
     __host__ NCVStatus create(Ncv32u offsetHaarClassifierNode)\r
     {\r
-        this->_ui1.x = offsetHaarClassifierNode;\r
+        _ui1.x = offsetHaarClassifierNode;\r
         return NCV_SUCCESS;\r
     }\r
 \r
     __host__ Ncv32f getLeafValueHost(void)\r
     {\r
-        return *(Ncv32f *)&this->_ui1.x;\r
+        return _f;\r
     }\r
 \r
 #ifdef __CUDACC__\r
@@ -199,57 +206,67 @@ struct HaarClassifierNodeDescriptor32
 \r
     __device__ __host__ Ncv32u getNextNodeOffset(void)\r
     {\r
-        return this->_ui1.x;\r
+        return _ui1.x;\r
     }\r
 };\r
 \r
 \r
 struct HaarClassifierNode128\r
 {\r
+union\r
+{\r
     uint4 _ui4;\r
+    struct\r
+    {\r
+        HaarFeatureDescriptor32 _f;\r
+        Ncv32f _t;\r
+        HaarClassifierNodeDescriptor32 _nl;\r
+        HaarClassifierNodeDescriptor32 _nr;\r
+    };\r
+};\r
 \r
     __host__ NCVStatus setFeatureDesc(HaarFeatureDescriptor32 f)\r
     {\r
-        this->_ui4.x = *(Ncv32u *)&f;\r
+        _f = f;\r
         return NCV_SUCCESS;\r
     }\r
 \r
     __host__ NCVStatus setThreshold(Ncv32f t)\r
     {\r
-        this->_ui4.y = *(Ncv32u *)&t;\r
+        _t = t;\r
         return NCV_SUCCESS;\r
     }\r
 \r
     __host__ NCVStatus setLeftNodeDesc(HaarClassifierNodeDescriptor32 nl)\r
     {\r
-        this->_ui4.z = *(Ncv32u *)&nl;\r
+        _nl = nl;\r
         return NCV_SUCCESS;\r
     }\r
 \r
     __host__ NCVStatus setRightNodeDesc(HaarClassifierNodeDescriptor32 nr)\r
     {\r
-        this->_ui4.w = *(Ncv32u *)&nr;\r
+        _nr = nr;\r
         return NCV_SUCCESS;\r
     }\r
 \r
     __host__ __device__ HaarFeatureDescriptor32 getFeatureDesc(void)\r
     {\r
-        return *(HaarFeatureDescriptor32 *)&this->_ui4.x;\r
+        return _f;\r
     }\r
 \r
     __host__ __device__ Ncv32f getThreshold(void)\r
     {\r
-        return *(Ncv32f*)&this->_ui4.y;\r
+        return _t;\r
     }\r
 \r
     __host__ __device__ HaarClassifierNodeDescriptor32 getLeftNodeDesc(void)\r
     {\r
-        return *(HaarClassifierNodeDescriptor32 *)&this->_ui4.z;\r
+        return _nl;\r
     }\r
 \r
     __host__ __device__ HaarClassifierNodeDescriptor32 getRightNodeDesc(void)\r
     {\r
-        return *(HaarClassifierNodeDescriptor32 *)&this->_ui4.w;\r
+        return _nr;\r
     }\r
 };\r
 \r
@@ -260,11 +277,15 @@ struct HaarStage64
 #define HaarStage64_Interpret_MaskRootNodeOffset    0xFFFF0000\r
 #define HaarStage64_Interpret_ShiftRootNodeOffset   16\r
 \r
+union\r
+{\r
     uint2 _ui2;\r
+    struct {Ncv32f _t; Ncv32u _root;};\r
+};\r
 \r
     __host__ NCVStatus setStageThreshold(Ncv32f t)\r
     {\r
-        this->_ui2.x = *(Ncv32u *)&t;\r
+        _t = t;\r
         return NCV_SUCCESS;\r
     }\r
 \r
@@ -290,7 +311,7 @@ struct HaarStage64
 \r
     __host__ __device__ Ncv32f getStageThreshold(void)\r
     {\r
-        return *(Ncv32f*)&this->_ui2.x;\r
+        return _t;\r
     }\r
 \r
     __host__ __device__ Ncv32u getStartClassifierRootNodeOffset(void)\r
@@ -304,14 +325,12 @@ struct HaarStage64
     }\r
 };\r
 \r
-\r
 NCV_CT_ASSERT(sizeof(HaarFeature64) == 8);\r
 NCV_CT_ASSERT(sizeof(HaarFeatureDescriptor32) == 4);\r
 NCV_CT_ASSERT(sizeof(HaarClassifierNodeDescriptor32) == 4);\r
 NCV_CT_ASSERT(sizeof(HaarClassifierNode128) == 16);\r
 NCV_CT_ASSERT(sizeof(HaarStage64) == 8);\r
 \r
-\r
 //==============================================================================\r
 //\r
 // Classifier cascade descriptor\r
index 79d6caa..ae2a144 100644 (file)
@@ -134,15 +134,24 @@ typedef      unsigned char Ncv8u;
 typedef              float Ncv32f;\r
 typedef             double Ncv64f;\r
 \r
-\r
-struct NcvRect8u\r
+struct NcvRect8u__\r
 {\r
     Ncv8u x;\r
     Ncv8u y;\r
     Ncv8u width;\r
     Ncv8u height;\r
-    __host__ __device__ NcvRect8u() : x(0), y(0), width(0), height(0) {};\r
-    __host__ __device__ NcvRect8u(Ncv8u x, Ncv8u y, Ncv8u width, Ncv8u height) : x(x), y(y), width(width), height(height) {}\r
+};\r
+\r
+struct NcvRect8u : NcvRect8u__\r
+{\r
+    __host__ __device__ NcvRect8u() {}\r
+    __host__ __device__ NcvRect8u(Ncv8u x, Ncv8u y, Ncv8u width, Ncv8u height)\r
+    {\r
+        x = x;\r
+        y = y;\r
+        width = width;\r
+        height = height;\r
+    }\r
 };\r
 \r
 \r
index 7c0473e..f556c19 100644 (file)
@@ -33,9 +33,9 @@ private:
        TestRectStdDev& operator=(const TestRectStdDev&);       \r
 \r
     NCVTestSourceProvider<Ncv8u> &src;\r
-    NcvRect32u rect;\r
     Ncv32u width;\r
     Ncv32u height;\r
+    NcvRect32u rect;\r
     Ncv32f scaleFactor;\r
 \r
     NcvBool bTextureCache;\r
index 0b6f845..bdc043f 100644 (file)
@@ -249,7 +249,7 @@ TEST_P(ProjectPoints, Accuracy)
 \r
     for (size_t i = 0; i < dst_gold.size(); ++i)\r
     {\r
-        cv::Point2f res = h_dst.at<cv::Point2f>(0, i);\r
+        cv::Point2f res = h_dst.at<cv::Point2f>(0, (int)i);\r
         cv::Point2f res_gold = dst_gold[i];\r
 \r
         ASSERT_LE(cv::norm(res_gold - res) / cv::norm(res_gold), 1e-3f);\r
@@ -291,7 +291,7 @@ TEST_P(SolvePnPRansac, Accuracy)
 \r
     cv::Mat rvec, tvec;\r
     std::vector<int> inliers;\r
-    cv::gpu::solvePnPRansac(object, cv::Mat(1, image_vec.size(), CV_32FC2, &image_vec[0]),\r
+    cv::gpu::solvePnPRansac(object, cv::Mat(1, (int)image_vec.size(), CV_32FC2, &image_vec[0]),\r
                             camera_mat, cv::Mat(1, 8, CV_32F, cv::Scalar::all(0)),\r
                             rvec, tvec, false, 200, 2.f, 100, &inliers);\r
 \r
index aa1a4a0..7fe0b27 100644 (file)
@@ -244,7 +244,7 @@ TEST_P(PyrLKOpticalFlow, Sparse)
     cv::goodFeaturesToTrack(gray_frame, pts, 1000, 0.01, 0.0);\r
 \r
     cv::gpu::GpuMat d_pts;\r
-    cv::Mat pts_mat(1, pts.size(), CV_32FC2, (void*)&pts[0]);\r
+    cv::Mat pts_mat(1, (int)pts.size(), CV_32FC2, (void*)&pts[0]);\r
     d_pts.upload(pts_mat);\r
 \r
     cv::gpu::PyrLKOpticalFlow pyrLK;\r
index 9074494..bc73d30 100644 (file)
@@ -195,7 +195,7 @@ Mat getMat(InputArray arr)
     return arr.getMat();\r
 }\r
 \r
-double checkNorm(InputArray m1, const InputArray m2)\r
+double checkNorm(InputArray m1, InputArray m2)\r
 {\r
     return norm(getMat(m1), getMat(m2), NORM_INF);\r
 }\r
index cf16839..17d5a1a 100644 (file)
@@ -52,19 +52,12 @@ set(grfmt_srcs src/bitstrm.cpp ${grfmt_srcs})
 
 source_group("Src\\grfmts" FILES ${grfmt_hdrs} ${grfmt_srcs})
 
-set(highgui_hdrs src/precomp.hpp src/utils.hpp)
-
 if(NEW_FFMPEG)
-set(highgui_srcs
-    src/cap.cpp
-    src/cap_images.cpp
-    src/cap_ffmpeg_v2.cpp
-    src/loadsave.cpp
-    src/precomp.cpp
-    src/utils.cpp
-    src/window.cpp
-    )
+  set(highgui_hdrs src/precomp.hpp src/utils.hpp src/cap_ffmpeg_impl_v2.hpp)
 else()
+  set(highgui_hdrs src/precomp.hpp src/utils.hpp src/cap_ffmpeg_impl.hpp)
+endif()
+
 set(highgui_srcs
     src/cap.cpp
     src/cap_images.cpp
@@ -74,129 +67,144 @@ set(highgui_srcs
     src/utils.cpp
     src/window.cpp
     )
-endif()
 
 file(GLOB highgui_ext_hdrs "include/opencv2/${name}/*.hpp" "include/opencv2/${name}/*.h")
 
 #YV
 if (HAVE_QT)
-    if (HAVE_QT_OPENGL)
-        set(QT_USE_QTOPENGL TRUE)
-    endif()
-    INCLUDE(${QT_USE_FILE})
-    
-    SET(_RCCS_FILES src/window_QT.qrc)
-    QT4_ADD_RESOURCES(_RCC_OUTFILES ${_RCCS_FILES})
-
-    SET(_MOC_HEADERS src/window_QT.h )
-    QT4_WRAP_CPP(_MOC_OUTFILES ${_MOC_HEADERS})
-     
-    set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} ${QT_LIBRARIES} ${QT_QTTEST_LIBRARY})
-    set(highgui_srcs ${highgui_srcs} src/window_QT.cpp ${_MOC_OUTFILES} ${_RCC_OUTFILES} )
+  if (HAVE_QT_OPENGL)
+    set(QT_USE_QTOPENGL TRUE)
+  endif()
+  INCLUDE(${QT_USE_FILE})
+
+  SET(_RCCS_FILES src/window_QT.qrc)
+  QT4_ADD_RESOURCES(_RCC_OUTFILES ${_RCCS_FILES})
+
+  SET(_MOC_HEADERS src/window_QT.h )
+  QT4_WRAP_CPP(_MOC_OUTFILES ${_MOC_HEADERS})
+
+  set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} ${QT_LIBRARIES} ${QT_QTTEST_LIBRARY})
+  set(highgui_srcs ${highgui_srcs} src/window_QT.cpp ${_MOC_OUTFILES} ${_RCC_OUTFILES} )
 endif()
     
 if(WIN32)
-    if(NOT HAVE_QT)
-        set(highgui_srcs ${highgui_srcs} src/window_w32.cpp)
-    endif()
-    set(highgui_srcs ${highgui_srcs} src/cap_vfw.cpp src/cap_cmu.cpp src/cap_dshow.cpp)
-    if(HAVE_MIL)
-        set(highgui_srcs ${highgui_srcs} src/cap_mil.cpp)
-    endif()
+  if(NOT HAVE_QT)
+    set(highgui_srcs ${highgui_srcs} src/window_w32.cpp)
+  endif()
+  set(highgui_srcs ${highgui_srcs} src/cap_vfw.cpp src/cap_cmu.cpp src/cap_dshow.cpp)
+  if(HAVE_MIL)
+    set(highgui_srcs ${highgui_srcs} src/cap_mil.cpp)
+  endif()
 endif()
 
 if(UNIX)
-    if(NOT HAVE_QT)        
-        if(HAVE_GTK)
-            set(highgui_srcs ${highgui_srcs} src/window_gtk.cpp)
-        endif()
+  if(NOT HAVE_QT)        
+    if(HAVE_GTK)
+      set(highgui_srcs ${highgui_srcs} src/window_gtk.cpp)
     endif()
+  endif()
 
-    if(HAVE_XINE)
-        set(highgui_srcs ${highgui_srcs} src/cap_xine.cpp)
-    endif()
+  if(HAVE_XINE)
+    set(highgui_srcs ${highgui_srcs} src/cap_xine.cpp)
+  endif()
 
-    if(HAVE_DC1394_2)
-        set(highgui_srcs ${highgui_srcs} src/cap_dc1394_v2.cpp)
-    endif()
+  if(HAVE_DC1394_2)
+    set(highgui_srcs ${highgui_srcs} src/cap_dc1394_v2.cpp)
+  endif()
 
-    if(HAVE_DC1394)
-        set(highgui_srcs ${highgui_srcs} src/cap_dc1394.cpp)
-    endif()
+  if(HAVE_DC1394)
+    set(highgui_srcs ${highgui_srcs} src/cap_dc1394.cpp)
+  endif()
 
-    if(HAVE_FFMPEG)
-        if(BZIP2_LIBRARIES)
-            set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} ${BZIP2_LIBRARIES})
-        endif()
+  if(HAVE_FFMPEG)
+    if(BZIP2_LIBRARIES)
+      set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} ${BZIP2_LIBRARIES})
     endif()
+  endif()
     
-    if(HAVE_PVAPI)
-        add_definitions(-DHAVE_PVAPI)
-        set(highgui_srcs src/cap_pvapi.cpp ${highgui_srcs})
-        set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} PvAPI)
+  if(HAVE_PVAPI)
+    add_definitions(-DHAVE_PVAPI)
+    ocv_include_directories(${PVAPI_INCLUDE_PATH})
+    if(X86)
+      set(PVAPI_SDK_SUBDIR x86)
+    elseif(X86_64)
+      set(PVAPI_SDK_SUBDIR x64)
+    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES arm)
+      set(PVAPI_SDK_SUBDIR arm)
     endif()
-
-    if(HAVE_GSTREAMER)
-        set(highgui_srcs ${highgui_srcs} src/cap_gstreamer.cpp)
+    if(PVAPI_SDK_SUBDIR AND CMAKE_COMPILER_IS_GNUCXX)
+      get_filename_component(PVAPI_EXPECTED_LIB_PATH "${PVAPI_INCLUDE_PATH}/../lib-pc/${PVAPI_SDK_SUBDIR}/${CMAKE_OPENCV_GCC_VERSION_MAJOR}.${CMAKE_OPENCV_GCC_VERSION_MINOR}" ABSOLUTE)
+      link_directories(${PVAPI_EXPECTED_LIB_PATH})
     endif()
+    set(highgui_srcs src/cap_pvapi.cpp ${highgui_srcs})
+    set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} PvAPI)
+  endif()
 
-    if(HAVE_UNICAP)
-        set(highgui_srcs ${highgui_srcs} src/cap_unicap.cpp)
-    endif()
+  if(HAVE_GSTREAMER)
+    set(highgui_srcs ${highgui_srcs} src/cap_gstreamer.cpp)
+  endif()
 
-    if(HAVE_LIBV4L)
-        set(highgui_srcs ${highgui_srcs} src/cap_libv4l.cpp)
-    else()
-        if(HAVE_CAMV4L OR HAVE_CAMV4L2)
-            set(highgui_srcs ${highgui_srcs} src/cap_v4l.cpp)
-        endif()
+  if(HAVE_UNICAP)
+    set(highgui_srcs ${highgui_srcs} src/cap_unicap.cpp)
+  endif()
+
+  if(HAVE_LIBV4L)
+    set(highgui_srcs ${highgui_srcs} src/cap_libv4l.cpp)
+  else()
+    if(HAVE_CAMV4L OR HAVE_CAMV4L2)
+      set(highgui_srcs ${highgui_srcs} src/cap_v4l.cpp)
     endif()
+  endif()
 
-    foreach(P ${HIGHGUI_INCLUDE_DIRS})
-        ocv_include_directories(${P})
-    endforeach()
+  foreach(P ${HIGHGUI_INCLUDE_DIRS})
+    ocv_include_directories(${P})
+  endforeach()
 
-    foreach(P ${HIGHGUI_LIBRARY_DIRS})
-        link_directories(${P})
-    endforeach()
+  foreach(P ${HIGHGUI_LIBRARY_DIRS})
+    link_directories(${P})
+  endforeach()
 endif()
 
 #OpenNI
 if(WITH_OPENNI AND HAVE_OPENNI)
-    set(highgui_srcs ${highgui_srcs} src/cap_openni.cpp)
-    ocv_include_directories(${OPENNI_INCLUDE_DIR})
+  set(highgui_srcs ${highgui_srcs} src/cap_openni.cpp)
+  ocv_include_directories(${OPENNI_INCLUDE_DIR})
 endif()
 
 #YV
 if(APPLE)
-       if (NOT IOS)
-        add_definitions(-DHAVE_QUICKTIME=1)
-       endif()
+  if (NOT IOS)
+    add_definitions(-DHAVE_QUICKTIME=1)
+  endif()
 
-    if(NOT OPENCV_BUILD_3RDPARTY_LIBS)
-        add_definitions(-DHAVE_IMAGEIO=1)
-    endif()
+  if(NOT OPENCV_BUILD_3RDPARTY_LIBS)
+    add_definitions(-DHAVE_IMAGEIO=1)
+  endif()
     
-    if (NOT HAVE_QT)
-        if(WITH_CARBON)
-            add_definitions(-DHAVE_CARBON=1)
-            set(highgui_srcs ${highgui_srcs} src/window_carbon.cpp)
-        else()
-            add_definitions(-DHAVE_COCOA=1)
-            set(highgui_srcs ${highgui_srcs} src/window_cocoa.mm)
-        endif()
+  if (NOT HAVE_QT)
+    if(WITH_CARBON)
+      add_definitions(-DHAVE_CARBON=1)
+      set(highgui_srcs ${highgui_srcs} src/window_carbon.cpp)
+    else()
+      add_definitions(-DHAVE_COCOA=1)
+      set(highgui_srcs ${highgui_srcs} src/window_cocoa.mm)
     endif()
+  endif()
     
-    if(WITH_QUICKTIME)
-        set(highgui_srcs ${highgui_srcs} src/cap_qt.cpp)
+  if(WITH_QUICKTIME)
+    set(highgui_srcs ${highgui_srcs} src/cap_qt.cpp)
+  else()
+    if(WITH_AVFOUNDATION)
+      add_definitions(-DHAVE_AVFOUNDATION=1)
+      set(highgui_srcs ${highgui_srcs} src/cap_avfoundation.mm)
     else()
-               if (WITH_AVFOUNDATION)
-                       add_definitions(-DHAVE_AVFOUNDATION=1)
-                   set(highgui_srcs ${highgui_srcs} src/cap_avfoundation.mm)
-               else()
-            set(highgui_srcs ${highgui_srcs} src/cap_qtkit.mm)
-        endif()
+      set(highgui_srcs ${highgui_srcs} src/cap_qtkit.mm)
     endif()
+  endif()
+    
+  if(HAVE_FFMPEG)
+    set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} "-framework VideoDecodeAcceleration")
+  endif()
 endif(APPLE)
 
 if(HAVE_opencv_androidcamera)
@@ -234,14 +242,13 @@ if(IOS)
 endif()
 
 if(WIN32)
-  link_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/lib")
-  include_directories(AFTER "${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/include") #for directshow
+  link_directories("${OpenCV_SOURCE_DIR}/3rdparty/lib")
+  include_directories(AFTER "${OpenCV_SOURCE_DIR}/3rdparty/include") #for directshow
 endif()
 
 source_group("Src" FILES ${highgui_srcs} ${highgui_hdrs})
 source_group("Include" FILES ${highgui_ext_hdrs})
 ocv_set_module_sources(HEADERS ${highgui_ext_hdrs} SOURCES ${highgui_srcs} ${highgui_hdrs} ${grfmt_srcs} ${grfmt_hdrs})
-
 ocv_module_include_directories()
 
 ocv_create_module(${GRFMT_LIBS} ${HIGHGUI_LIBRARIES})
@@ -259,11 +266,11 @@ set_target_properties(${the_module} PROPERTIES LINK_INTERFACE_LIBRARIES "")
 
 ocv_add_precompiled_headers(${the_module})
 
-if(CMAKE_COMPILER_IS_GNUCXX)
+if(CMAKE_COMPILER_IS_GNUCXX AND NOT ENABLE_NOISY_WARNINGS)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
 endif()
 
-if(WIN32)
+if(WIN32 AND WITH_FFMPEG)
   #copy ffmpeg dll to the output folder
   if(MSVC64 OR MINGW64)
     set(FFMPEG_SUFFIX _64)
index 566349e..02beddb 100644 (file)
@@ -8,7 +8,7 @@ applications and can be used within functionally rich UI frameworks (such as Qt*
 It provides easy interface to:
 
 * Create and manipulate windows that can display images and "remember" their content (no need to handle repaint events from OS).
-* Add trackbars to the windows, handle simple mouse events as well as keyboard commmands.
+* Add trackbars to the windows, handle simple mouse events as well as keyboard commands.
 * Read and write images to/from disk or memory.
 * Read video from camera or file and write video to a file.
 
index 5d39642..7d27353 100644 (file)
@@ -105,7 +105,7 @@ Provides parameters of a window.
 
     :param name: Name of the window.
 
-    :param prop_id: Window property to retrive. The following operation flags are available:
+    :param prop_id: Window property to retrieve. The following operation flags are available:
         
             * **CV_WND_PROP_FULLSCREEN**  Change if the window is fullscreen ( ``CV_WINDOW_NORMAL``  or  ``CV_WINDOW_FULLSCREEN`` ).
             
@@ -224,11 +224,11 @@ Displays a text on the window statusbar during the specified period of time.
 
 The function ``displayOverlay`` displays useful information/tips on top of the window for a certain amount of time
 *delayms*
-. This information is displayed on the window statubar (the window must be created with the ``CV_GUI_EXPANDED`` flags).
+. This information is displayed on the window statusbar (the window must be created with the ``CV_GUI_EXPANDED`` flags).
 
 createOpenGLCallback
 ------------------------
-Creates a callback function called to draw OpenGL on top the the image display by ``windowname``.
+Creates a callback function called to draw OpenGL on top the image display by ``windowname``.
 
 .. ocv:function:: void createOpenGLCallback( const string& window_name, OpenGLCallback callbackOpenGL, void* userdata =NULL, double angle=-1, double zmin=-1, double zmax=-1)
 
index 71dead4..0d70b05 100644 (file)
@@ -128,6 +128,51 @@ The function ``imwrite`` saves the image to the specified file. The image format
 :ocv:func:`Mat::convertTo` , and
 :ocv:func:`cvtColor` to convert it before saving. Or, use the universal XML I/O functions to save the image to XML or YAML format.
 
+It is possible to store PNG images with an alpha channel using this function. To do this, create 8-bit (or 16-bit) 4-channel image BGRA, where the alpha channel goes last. Fully transparent pixels should have alpha set to 0, fully opaque pixels should have alpha set to 255/65535. The sample below shows how to create such a BGRA image and store to PNG file. It also demonstrates how to set custom compression parameters ::
+    
+    #include <vector>
+    #include <stdio.h>
+    #include <opencv2/opencv.hpp>
+    
+    using namespace cv;
+    using namespace std;
+
+    void createAlphaMat(Mat &mat)
+    {
+        for (int i = 0; i < mat.rows; ++i) {
+            for (int j = 0; j < mat.cols; ++j) {
+                Vec4b& rgba = mat.at<Vec4b>(i, j);
+                rgba[0] = UCHAR_MAX;
+                rgba[1] = saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX);
+                rgba[2] = saturate_cast<uchar>((float (mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX);
+                rgba[3] = saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2]));
+            }
+        }
+    }
+
+    int main(int argv, char **argc)
+    {
+        // Create mat with alpha channel
+        Mat mat(480, 640, CV_8UC4);
+        createAlphaMat(mat);
+
+        vector<int> compression_params;
+        compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
+        compression_params.push_back(9);
+
+        try {
+            imwrite("alpha.png", mat, compression_params);
+        }
+        catch (runtime_error& ex) {
+            fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what());
+            return 1;
+        }
+
+        fprintf(stdout, "Saved PNG file with alpha data.\n");
+        return 0;
+    }
+
+
 VideoCapture
 ------------
 .. ocv:class:: VideoCapture
@@ -264,7 +309,7 @@ Decodes and returns the grabbed video frame.
 
 .. ocv:pyoldfunction:: cv.RetrieveFrame(capture) -> iplimage
 
-The methods/functions decode and retruen the just grabbed frame. If no frames has been grabbed (camera has been disconnected, or there are no more frames in video file), the methods return false and the functions return NULL pointer.
+The methods/functions decode and return the just grabbed frame. If no frames has been grabbed (camera has been disconnected, or there are no more frames in video file), the methods return false and the functions return NULL pointer.
 
 .. note:: OpenCV 1.x functions ``cvRetrieveFrame`` and ``cv.RetrieveFrame`` return image stored inside the video capturing structure. It is not allowed to modify or release the image! You can copy the frame using :ocv:cfunc:`cvCloneImage` and then do whatever you want with the copy.
 
@@ -283,7 +328,7 @@ Grabs, decodes and returns the next video frame.
 
 .. ocv:pyoldfunction:: cv.QueryFrame(capture) -> iplimage
 
-The methods/functions combine :ocv:func:`VideoCapture::grab` and :ocv:func:`VideoCapture::retrieve` in one call. This is the most convenient method for reading video files or capturing data from decode and retruen the just grabbed frame. If no frames has been grabbed (camera has been disconnected, or there are no more frames in video file), the methods return false and the functions return NULL pointer.
+The methods/functions combine :ocv:func:`VideoCapture::grab` and :ocv:func:`VideoCapture::retrieve` in one call. This is the most convenient method for reading video files or capturing data from decode and return the just grabbed frame. If no frames has been grabbed (camera has been disconnected, or there are no more frames in video file), the methods return false and the functions return NULL pointer.
 
 .. note:: OpenCV 1.x functions ``cvRetrieveFrame`` and ``cv.RetrieveFrame`` return image stored inside the video capturing structure. It is not allowed to modify or release the image! You can copy the frame using :ocv:cfunc:`cvCloneImage` and then do whatever you want with the copy.
 
index c964f30..29066e5 100644 (file)
@@ -24,7 +24,7 @@ Creates a trackbar and attaches it to the specified window.
 
     :param userdata: User data that is passed as is to the callback. It can be used to handle trackbar events without using global variables.
 
-The function ``createTrackbar`` creates a trackbar (a slider or range control) with the specified name and range, assigns a variable ``value`` to be a position syncronized with the trackbar and specifies the callback function ``onChange`` to be called on the trackbar position change. The created trackbar is displayed in the specified window ``winname``.
+The function ``createTrackbar`` creates a trackbar (a slider or range control) with the specified name and range, assigns a variable ``value`` to be a position synchronized with the trackbar and specifies the callback function ``onChange`` to be called on the trackbar position change. The created trackbar is displayed in the specified window ``winname``.
 
 .. note::
     
index 726707f..5c5d24b 100644 (file)
@@ -232,8 +232,9 @@ public:
     
     virtual ~VideoWriter();
     CV_WRAP virtual bool open(const string& filename, int fourcc, double fps,
-                      Size frameSize, bool isColor=true);
+                      Size frameSize, bool isColor=true);    
     CV_WRAP virtual bool isOpened() const;
+    CV_WRAP virtual void release();
     virtual VideoWriter& operator << (const Mat& image);
     CV_WRAP virtual void write(const Mat& image);
     
index 6ba3103..2e61927 100644 (file)
@@ -436,6 +436,16 @@ enum
     CV_CAP_PROP_XI_AEAG_LEVEL    = 419,       // Average intensity of output signal AEAG should achieve(in %)
     CV_CAP_PROP_XI_TIMEOUT       = 420,       // Image capture timeout in milliseconds
     
+    // Properties for Android cameras
+    CV_CAP_PROP_ANDROID_FLASH_MODE = 8001,
+    CV_CAP_PROP_ANDROID_FOCUS_MODE = 8002,
+    CV_CAP_PROP_ANDROID_WHITE_BALANCE = 8003,
+    CV_CAP_PROP_ANDROID_ANTIBANDING = 8004,
+    CV_CAP_PROP_ANDROID_FOCAL_LENGTH = 8005,
+    CV_CAP_PROP_ANDROID_FOCUS_DISTANCE_NEAR = 8006,
+    CV_CAP_PROP_ANDROID_FOCUS_DISTANCE_OPTIMAL = 8007,
+    CV_CAP_PROP_ANDROID_FOCUS_DISTANCE_FAR = 8008,
+
     // Properties of cameras available through AVFOUNDATION interface
     CV_CAP_PROP_IOS_DEVICE_FOCUS = 9001,
     CV_CAP_PROP_IOS_DEVICE_EXPOSURE = 9002,
@@ -477,6 +487,45 @@ enum
   CV_CAP_ANDROID_COLOR_FRAME_RGBA = 4
 };
 
+// supported Android camera flash modes
+enum {
+    CV_CAP_ANDROID_FLASH_MODE_AUTO = 0,
+    CV_CAP_ANDROID_FLASH_MODE_OFF,
+    CV_CAP_ANDROID_FLASH_MODE_ON,
+    CV_CAP_ANDROID_FLASH_MODE_RED_EYE,
+    CV_CAP_ANDROID_FLASH_MODE_TORCH
+};
+
+// supported Android camera focus modes
+enum {
+    CV_CAP_ANDROID_FOCUS_MODE_AUTO = 0,
+    CV_CAP_ANDROID_FOCUS_MODE_CONTINUOUS_VIDEO,
+    CV_CAP_ANDROID_FOCUS_MODE_EDOF,
+    CV_CAP_ANDROID_FOCUS_MODE_FIXED,
+    CV_CAP_ANDROID_FOCUS_MODE_INFINITY,
+    CV_CAP_ANDROID_FOCUS_MODE_MACRO
+};
+
+// supported Android camera white balance modes
+enum {
+    CV_CAP_ANDROID_WHITE_BALANCE_AUTO = 0,
+    CV_CAP_ANDROID_WHITE_BALANCE_CLOUDY_DAYLIGHT,
+    CV_CAP_ANDROID_WHITE_BALANCE_DAYLIGHT,
+    CV_CAP_ANDROID_WHITE_BALANCE_FLUORESCENT,
+    CV_CAP_ANDROID_WHITE_BALANCE_INCANDESCENT,
+    CV_CAP_ANDROID_WHITE_BALANCE_SHADE,
+    CV_CAP_ANDROID_WHITE_BALANCE_TWILIGHT,
+    CV_CAP_ANDROID_WHITE_BALANCE_WARM_FLUORESCENT
+};
+
+// supported Android camera antibanding modes
+enum {
+    CV_CAP_ANDROID_ANTIBANDING_50HZ = 0,
+    CV_CAP_ANDROID_ANTIBANDING_60HZ,
+    CV_CAP_ANDROID_ANTIBANDING_AUTO,
+    CV_CAP_ANDROID_ANTIBANDING_OFF
+};
+
 /* retrieve or set capture properties */
 CVAPI(double) cvGetCaptureProperty( CvCapture* capture, int property_id );
 CVAPI(int)    cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
diff --git a/modules/highgui/perf/perf_input.cpp b/modules/highgui/perf/perf_input.cpp
new file mode 100644 (file)
index 0000000..4215895
--- /dev/null
@@ -0,0 +1,27 @@
+#include "perf_precomp.hpp"
+
+using namespace std;
+using namespace cv;
+using namespace perf;
+using std::tr1::make_tuple;
+using std::tr1::get;
+
+typedef std::tr1::tuple<String, bool> VideoCapture_Reading_t;
+typedef perf::TestBaseWithParam<VideoCapture_Reading_t> VideoCapture_Reading;
+
+PERF_TEST_P(VideoCapture_Reading, ReadFile,
+            testing::Combine( testing::Values( "highgui/video/big_buck_bunny.avi",
+                                               "highgui/video/big_buck_bunny.mov",
+                                               "highgui/video/big_buck_bunny.mp4",
+                                               "highgui/video/big_buck_bunny.mpg",
+                                               "highgui/video/big_buck_bunny.wmv" ),
+                              testing::Values(true, true, true, true, true) ))
+{
+  string filename = getDataPath(get<0>(GetParam()));
+
+  VideoCapture cap;
+
+  TEST_CYCLE() cap.open(filename);
+
+  SANITY_CHECK(cap.isOpened());
+}
diff --git a/modules/highgui/perf/perf_main.cpp b/modules/highgui/perf/perf_main.cpp
new file mode 100644 (file)
index 0000000..ebe94ab
--- /dev/null
@@ -0,0 +1,3 @@
+#include "perf_precomp.hpp"
+
+CV_PERF_TEST_MAIN(highgui)
diff --git a/modules/highgui/perf/perf_output.cpp b/modules/highgui/perf/perf_output.cpp
new file mode 100644 (file)
index 0000000..e7ddaa6
--- /dev/null
@@ -0,0 +1,29 @@
+#include "perf_precomp.hpp"
+
+using namespace std;
+using namespace cv;
+using namespace perf;
+using std::tr1::make_tuple;
+using std::tr1::get;
+
+typedef std::tr1::tuple<String, bool> VideoWriter_Writing_t;
+typedef perf::TestBaseWithParam<VideoWriter_Writing_t> VideoWriter_Writing;
+
+PERF_TEST_P(VideoWriter_Writing, WriteFrame,
+            testing::Combine( testing::Values( "python/images/QCIF_00.bmp",
+                                               "python/images/QCIF_01.bmp",
+                                               "python/images/QCIF_02.bmp",
+                                               "python/images/QCIF_03.bmp",
+                                               "python/images/QCIF_04.bmp",
+                                               "python/images/QCIF_05.bmp" ),
+            testing::Bool()))
+{
+  string filename = getDataPath(get<0>(GetParam()));
+  bool isColor = get<1>(GetParam());
+
+  VideoWriter writer("perf_writer.avi", CV_FOURCC('X', 'V', 'I', 'D'), 25, cv::Size(640, 480), isColor);
+
+  TEST_CYCLE() { Mat image = imread(filename, 1); writer << image; }
+
+  SANITY_CHECK(writer.isOpened());
+}
diff --git a/modules/highgui/perf/perf_precomp.cpp b/modules/highgui/perf/perf_precomp.cpp
new file mode 100644 (file)
index 0000000..8552ac3
--- /dev/null
@@ -0,0 +1 @@
+#include "perf_precomp.hpp"
diff --git a/modules/highgui/perf/perf_precomp.hpp b/modules/highgui/perf/perf_precomp.hpp
new file mode 100644 (file)
index 0000000..2ffa9ee
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef __OPENCV_PERF_PRECOMP_HPP__
+#define __OPENCV_PERF_PRECOMP_HPP__
+
+#include "opencv2/ts/ts.hpp"
+#include "opencv2/highgui/highgui.hpp"
+
+#if GTEST_CREATE_SHARED_LIBRARY
+#error no modules except ts should have GTEST_CREATE_SHARED_LIBRARY defined
+#endif
+
+#endif
index 0a8968b..96767d9 100644 (file)
@@ -493,9 +493,14 @@ VideoWriter::VideoWriter(const string& filename, int fourcc, double fps, Size fr
     open(filename, fourcc, fps, frameSize, isColor);
 }
 
-VideoWriter::~VideoWriter()
+void VideoWriter::release()
 {
     writer.release();
+}    
+    
+VideoWriter::~VideoWriter()
+{
+    release();
 }
     
 bool VideoWriter::open(const string& filename, int fourcc, double fps, Size frameSize, bool isColor)
index 8396945..9e5788a 100644 (file)
@@ -263,11 +263,30 @@ double CvCapture_Android::getProperty( int propIdx )
         return (double)m_activity->getFrameWidth();
     case CV_CAP_PROP_FRAME_HEIGHT:
         return (double)m_activity->getFrameHeight();
-
     case CV_CAP_PROP_SUPPORTED_PREVIEW_SIZES_STRING:
-       return (double)m_activity->getProperty(ANDROID_CAMERA_PROPERTY_SUPPORTED_PREVIEW_SIZES_STRING);
+    return (double)m_activity->getProperty(ANDROID_CAMERA_PROPERTY_SUPPORTED_PREVIEW_SIZES_STRING);
     case CV_CAP_PROP_PREVIEW_FORMAT:
         return (double)m_activity->getProperty(ANDROID_CAMERA_PROPERTY_PREVIEW_FORMAT_STRING);
+    case CV_CAP_PROP_FPS:
+        return (double)m_activity->getProperty(ANDROID_CAMERA_PROPERTY_FPS);
+    case CV_CAP_PROP_EXPOSURE:
+        return (double)m_activity->getProperty(ANDROID_CAMERA_PROPERTY_EXPOSURE);
+    case CV_CAP_PROP_ANDROID_FLASH_MODE:
+        return (double)m_activity->getProperty(ANDROID_CAMERA_PROPERTY_FLASH_MODE);
+    case CV_CAP_PROP_ANDROID_FOCUS_MODE:
+        return (double)m_activity->getProperty(ANDROID_CAMERA_PROPERTY_FOCUS_MODE);
+    case CV_CAP_PROP_ANDROID_WHITE_BALANCE:
+        return (double)m_activity->getProperty(ANDROID_CAMERA_PROPERTY_WHITE_BALANCE);
+    case CV_CAP_PROP_ANDROID_ANTIBANDING:
+        return (double)m_activity->getProperty(ANDROID_CAMERA_PROPERTY_ANTIBANDING);
+    case CV_CAP_PROP_ANDROID_FOCAL_LENGTH:
+        return (double)m_activity->getProperty(ANDROID_CAMERA_PROPERTY_FOCAL_LENGTH);
+    case CV_CAP_PROP_ANDROID_FOCUS_DISTANCE_NEAR:
+        return (double)m_activity->getProperty(ANDROID_CAMERA_PROPERTY_FOCUS_DISTANCE_NEAR);
+    case CV_CAP_PROP_ANDROID_FOCUS_DISTANCE_OPTIMAL:
+        return (double)m_activity->getProperty(ANDROID_CAMERA_PROPERTY_FOCUS_DISTANCE_OPTIMAL);
+    case CV_CAP_PROP_ANDROID_FOCUS_DISTANCE_FAR:
+        return (double)m_activity->getProperty(ANDROID_CAMERA_PROPERTY_FOCUS_DISTANCE_FAR);
     default:
         CV_Error( CV_StsOutOfRange, "Failed attempt to GET unsupported camera property." );
         break;
@@ -288,11 +307,24 @@ bool CvCapture_Android::setProperty( int propIdx, double propValue )
         case CV_CAP_PROP_FRAME_HEIGHT:
             m_activity->setProperty(ANDROID_CAMERA_PROPERTY_FRAMEHEIGHT, propValue);
             break;
-
         case CV_CAP_PROP_AUTOGRAB:
            m_shouldAutoGrab=(propValue != 0);
             break;
-
+        case CV_CAP_PROP_EXPOSURE:
+            m_activity->setProperty(ANDROID_CAMERA_PROPERTY_EXPOSURE, propValue);
+            break;
+        case CV_CAP_PROP_ANDROID_FLASH_MODE:
+            m_activity->setProperty(ANDROID_CAMERA_PROPERTY_FLASH_MODE, propValue);
+            break;
+        case CV_CAP_PROP_ANDROID_FOCUS_MODE:
+            m_activity->setProperty(ANDROID_CAMERA_PROPERTY_FOCUS_MODE, propValue);
+            break;
+        case CV_CAP_PROP_ANDROID_WHITE_BALANCE:
+            m_activity->setProperty(ANDROID_CAMERA_PROPERTY_WHITE_BALANCE, propValue);
+            break;
+        case CV_CAP_PROP_ANDROID_ANTIBANDING:
+            m_activity->setProperty(ANDROID_CAMERA_PROPERTY_ANTIBANDING, propValue);
+            break;
         default:
             CV_Error( CV_StsOutOfRange, "Failed attempt to SET unsupported camera property." );
            return false;
index 16bcef3..4a6061f 100644 (file)
@@ -207,6 +207,7 @@ DEFINE_GUID(MEDIASUBTYPE_RGB24,0xe436eb7d,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf
 DEFINE_GUID(MEDIASUBTYPE_RGB32,0xe436eb7e,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
 DEFINE_GUID(MEDIASUBTYPE_RGB555,0xe436eb7c,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
 DEFINE_GUID(MEDIASUBTYPE_RGB565,0xe436eb7b,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
+DEFINE_GUID(MEDIASUBTYPE_I420,0x49343230,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
 DEFINE_GUID(MEDIASUBTYPE_UYVY,0x59565955,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
 DEFINE_GUID(MEDIASUBTYPE_Y211,0x31313259,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
 DEFINE_GUID(MEDIASUBTYPE_Y411,0x31313459,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
@@ -339,7 +340,7 @@ static bool verbose = true;
 //videoInput defines
 #define VI_VERSION     0.1995
 #define VI_MAX_CAMERAS  20
-#define VI_NUM_TYPES    19 //MGB
+#define VI_NUM_TYPES    20 //MGB
 #define VI_NUM_FORMATS  18 //DON'T TOUCH
 
 //defines for setPhyCon - tuner is not as well supported as composite and s-video
@@ -1066,6 +1067,7 @@ videoInput::videoInput(){
     mediaSubtypes[16]    = MEDIASUBTYPE_Y800;
     mediaSubtypes[17]    = MEDIASUBTYPE_Y8;
     mediaSubtypes[18]    = MEDIASUBTYPE_GREY;
+       mediaSubtypes[19]    = MEDIASUBTYPE_I420;
 
     //The video formats we support
     formatTypes[VI_NTSC_M]        = AnalogVideo_NTSC_M;
@@ -2171,6 +2173,7 @@ void videoInput::getMediaSubtypeAsString(GUID type, char * typeAsString){
     else if(type == MEDIASUBTYPE_Y800)     sprintf(tmpStr, "Y800");
     else if(type == MEDIASUBTYPE_Y8)       sprintf(tmpStr, "Y8");
     else if(type == MEDIASUBTYPE_GREY)     sprintf(tmpStr, "GREY");
+       else if(type == MEDIASUBTYPE_I420)     sprintf(tmpStr, "I420");
     else sprintf(tmpStr, "OTHER");
 
     memcpy(typeAsString, tmpStr, sizeof(char)*8);
@@ -3279,8 +3282,7 @@ bool CvCaptureCAM_DShow::setProperty( int property_id, double value )
 {
     // image capture properties
     bool handled = false;
-
-    switch( property_id )
+       switch( property_id )
     {
         case CV_CAP_PROP_FRAME_WIDTH:
             width = cvRound(value);
@@ -3302,8 +3304,13 @@ bool CvCaptureCAM_DShow::setProperty( int property_id, double value )
             break;
 
         case CV_CAP_PROP_FPS:
-            VI.setIdealFramerate(index,cvRound(value));
-            handled = true;
+            int fps = cvRound(value);
+                       if (fps != VI.getFPS(0))
+                       {
+                           VI.stopDevice(index);
+                           VI.setIdealFramerate(index,fps);
+                           VI.setupDevice(index);
+                       }
             break;
 
     }
@@ -3311,16 +3318,18 @@ bool CvCaptureCAM_DShow::setProperty( int property_id, double value )
     if ( handled ) {
         // a stream setting
         if( width > 0 && height > 0 )
+        {
+            if( width != VI.getWidth(index) || height != VI.getHeight(index) )//|| fourcc != VI.getFourcc(index) )
             {
-            if( width != VI.getWidth(index) || height != VI.getHeight(index) ) //|| fourcc != VI.getFourcc(index) )
-            {
+                int fps = static_cast<int>(VI.getFPS(index));
                 VI.stopDevice(index);
-                VI.setupDeviceFourcc(index, width, height,fourcc);
+                VI.setIdealFramerate(index, fps);
+                VI.setupDeviceFourcc(index, width, height, fourcc);
             }
             width = height = fourcc = -1;
             return VI.isDeviceSetup(index);
         }
-        return true;
+               return true;
     }
 
     // show video/camera filter dialog
index 251ddc4..5b98456 100644 (file)
 #include "precomp.hpp"
 
 #ifdef HAVE_FFMPEG
+#ifdef NEW_FFMPEG
+#include "cap_ffmpeg_impl_v2.hpp"
+#else
 #include "cap_ffmpeg_impl.hpp"
+#endif
 #else
 #include "cap_ffmpeg_api.hpp"
 #endif
index fa847ce..c27cd02 100644 (file)
@@ -245,7 +245,7 @@ void CvCapture_FFMPEG::init()
 void CvCapture_FFMPEG::close()
 {
     if( picture )
-    av_free(picture);
+        av_free(picture);
 
     if( video_st )
     {
@@ -316,13 +316,13 @@ bool CvCapture_FFMPEG::reopen()
 }
 
 #ifndef AVSEEK_FLAG_FRAME
-       #define AVSEEK_FLAG_FRAME 0
+#define AVSEEK_FLAG_FRAME 0
 #endif
 #ifndef AVSEEK_FLAG_ANY
-       #define AVSEEK_FLAG_ANY 1
+#define AVSEEK_FLAG_ANY 1
 #endif
 #ifndef SHORTER_DISTANCE_FOR_SEEK_TO_MAKE_IT_FASTER
-    #define SHORTER_DISTANCE_FOR_SEEK_TO_MAKE_IT_FASTER 25
+#define SHORTER_DISTANCE_FOR_SEEK_TO_MAKE_IT_FASTER 25
 #endif
 
 bool CvCapture_FFMPEG::open( const char* _filename )
@@ -358,24 +358,24 @@ bool CvCapture_FFMPEG::open( const char* _filename )
 
         avcodec_thread_init(enc, get_number_of_cpus());
 
-        #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
-            #define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
-        #endif
+#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
+#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
+#endif
         
         if( AVMEDIA_TYPE_VIDEO == enc->codec_type && video_stream < 0) {
             AVCodec *codec = avcodec_find_decoder(enc->codec_id);
             if (!codec ||
-            avcodec_open(enc, codec) < 0)
-            goto exit_func;
+                avcodec_open(enc, codec) < 0)
+                goto exit_func;
             video_stream = i;
             video_st = ic->streams[i];
             picture = avcodec_alloc_frame();
 
             rgb_picture.data[0] = (uint8_t*)malloc(
-                                    avpicture_get_size( PIX_FMT_BGR24,
-                                    enc->width, enc->height ));
+                    avpicture_get_size( PIX_FMT_BGR24,
+                                        enc->width, enc->height ));
             avpicture_fill( (AVPicture*)&rgb_picture, rgb_picture.data[0],
-                    PIX_FMT_BGR24, enc->width, enc->height );
+                            PIX_FMT_BGR24, enc->width, enc->height );
 
             frame.width = enc->width;
             frame.height = enc->height;
@@ -406,7 +406,7 @@ bool CvCapture_FFMPEG::open( const char* _filename )
         int     flags = AVSEEK_FLAG_FRAME | AVSEEK_FLAG_BACKWARD;
         av_seek_frame(ic, video_stream, ts, flags);
     }
-exit_func:
+    exit_func:
 
     if( !valid )
         close();
@@ -445,22 +445,22 @@ bool CvCapture_FFMPEG::grabFrame()
             break;
         
                if( packet.stream_index != video_stream ) {
-                       av_free_packet (&packet);
-                       continue;
-               }
+            av_free_packet (&packet);
+            continue;
+        }
 
 #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
-                       avcodec_decode_video2(video_st->codec, picture, &got_picture, &packet); 
+        avcodec_decode_video2(video_st->codec, picture, &got_picture, &packet);
+#else
+#if LIBAVFORMAT_BUILD > 4628
+        avcodec_decode_video(video_st->codec,
+                             picture, &got_picture,
+                             packet.data, packet.size);
 #else
-       #if LIBAVFORMAT_BUILD > 4628
-                       avcodec_decode_video(video_st->codec,
-                                                                picture, &got_picture,
-                                                                packet.data, packet.size);
-       #else
-                       avcodec_decode_video(&video_st->codec,
-                                                                picture, &got_picture,
-                                                                packet.data, packet.size);
-       #endif
+        avcodec_decode_video(&video_st->codec,
+                             picture, &got_picture,
+                             packet.data, packet.size);
+#endif
 #endif
 
         if (got_picture) {
@@ -496,18 +496,18 @@ bool CvCapture_FFMPEG::retrieveFrame(int, unsigned char** data, int* step, int*
 #endif
 #else
     img_convert_ctx = sws_getContext(video_st->codec->width,
-                  video_st->codec->height,
-                  video_st->codec->pix_fmt,
-                  video_st->codec->width,
-                  video_st->codec->height,
-                  PIX_FMT_BGR24,
-                  SWS_BICUBIC,
-                  NULL, NULL, NULL);
-
-         sws_scale(img_convert_ctx, picture->data,
-             picture->linesize, 0,
-             video_st->codec->height,
-             rgb_picture.data, rgb_picture.linesize);
+                                     video_st->codec->height,
+                                     video_st->codec->pix_fmt,
+                                     video_st->codec->width,
+                                     video_st->codec->height,
+                                     PIX_FMT_BGR24,
+                                     SWS_BICUBIC,
+                                     NULL, NULL, NULL);
+
+    sws_scale(img_convert_ctx, picture->data,
+              picture->linesize, 0,
+              video_st->codec->height,
+              rgb_picture.data, rgb_picture.linesize);
     sws_freeContext(img_convert_ctx);
 #endif
     *data = frame.data;
@@ -554,31 +554,43 @@ double CvCapture_FFMPEG::getProperty( int property_id )
         if(video_st->cur_dts != AV_NOPTS_VALUE_ && video_st->duration != AV_NOPTS_VALUE_)
             return(((video_st->cur_dts-video_st->first_dts)+(1.0/frameScale)) / (double)video_st->duration);
         break;
-       case CV_FFMPEG_CAP_PROP_FRAME_COUNT:
-           if(video_st->duration != AV_NOPTS_VALUE_)
-            return (double)ceil(ic->duration * av_q2d(video_st->r_frame_rate) / AV_TIME_BASE);
-           break;
+    case CV_FFMPEG_CAP_PROP_FRAME_COUNT:
+        {
+            int64_t nbf = ic->streams[video_stream]->nb_frames;
+            double eps = 0.000025;
+            if (nbf == 0)
+            {
+                double fps = static_cast<double>(ic->streams[video_stream]->r_frame_rate.num) / static_cast<double>(ic->streams[video_stream]->r_frame_rate.den);
+                if (fps < eps)
+                {
+                    fps = 1.0 / (static_cast<double>(ic->streams[video_stream]->codec->time_base.num) / static_cast<double>(ic->streams[video_stream]->codec->time_base.den));
+                }
+                nbf = static_cast<int64_t>(round(ic->duration * fps) / AV_TIME_BASE);
+            }
+            return nbf;
+        }
+        break;
     case CV_FFMPEG_CAP_PROP_FRAME_WIDTH:
         return (double)frame.width;
-    break;
+        break;
     case CV_FFMPEG_CAP_PROP_FRAME_HEIGHT:
         return (double)frame.height;
-    break;
+        break;
     case CV_FFMPEG_CAP_PROP_FPS:
 #if LIBAVCODEC_BUILD > 4753
         return av_q2d (video_st->r_frame_rate);
 #else
         return (double)video_st->codec.frame_rate
-            / (double)video_st->codec.frame_rate_base;
+                / (double)video_st->codec.frame_rate_base;
 #endif
-    break;
+        break;
     case CV_FFMPEG_CAP_PROP_FOURCC:
 #if LIBAVFORMAT_BUILD > 4628
         return (double)video_st->codec->codec_tag;
 #else
         return (double)video_st->codec.codec_tag;
 #endif
-    break;
+        break;
     }
        
     return 0;
@@ -605,24 +617,24 @@ bool CvCapture_FFMPEG::seekKeyAndRunOverFrames(int framenumber)
 {
     int ret;
     if (framenumber > video_st->cur_dts-1) {
-    if (framenumber-(video_st->cur_dts-1) > SHORTER_DISTANCE_FOR_SEEK_TO_MAKE_IT_FASTER) {
-    ret = av_seek_frame(ic, video_stream, framenumber, 1);
-    assert(ret >= 0);
-    if( ret < 0 )
-    return false;
-    }
-    grabFrame();
-    while ((video_st->cur_dts-1) < framenumber)
-    if ( !grabFrame() ) return false;
+        if (framenumber-(video_st->cur_dts-1) > SHORTER_DISTANCE_FOR_SEEK_TO_MAKE_IT_FASTER) {
+            ret = av_seek_frame(ic, video_stream, framenumber, 1);
+            assert(ret >= 0);
+            if( ret < 0 )
+                return false;
+        }
+        grabFrame();
+        while ((video_st->cur_dts-1) < framenumber)
+            if ( !grabFrame() ) return false;
     }
     else if ( framenumber < (video_st->cur_dts-1) ) {
-    ret=av_seek_frame(ic, video_stream, framenumber, 1);
-    assert( ret >= 0 );
-    if( ret < 0 )
-    return false;
-    grabFrame();
-    while ((video_st->cur_dts-1) < framenumber )
-    if ( !grabFrame() ) return false;
+        ret=av_seek_frame(ic, video_stream, framenumber, 1);
+        assert( ret >= 0 );
+        if( ret < 0 )
+            return false;
+        grabFrame();
+        while ((video_st->cur_dts-1) < framenumber )
+            if ( !grabFrame() ) return false;
     }
     return true;
 }
@@ -666,7 +678,7 @@ bool CvCapture_FFMPEG::setProperty( int property_id, double value )
                 if (!slowSeek((int)timestamp))
                 {
                     fprintf(stderr, "HIGHGUI ERROR: AVI: could not (slow) seek to position %0.3f\n",
-                        (double)timestamp / AV_TIME_BASE);
+                            (double)timestamp / AV_TIME_BASE);
                     return false;
                 }
             }
@@ -674,7 +686,7 @@ bool CvCapture_FFMPEG::setProperty( int property_id, double value )
             {
                 int flags = AVSEEK_FLAG_ANY;
                 if (timestamp < ic->streams[video_stream]->cur_dts)
-                  flags |= AVSEEK_FLAG_BACKWARD;
+                    flags |= AVSEEK_FLAG_BACKWARD;
                 int ret = av_seek_frame(ic, video_stream, timestamp, flags);
                 if (ret < 0)
                 {
@@ -698,7 +710,7 @@ bool CvCapture_FFMPEG::setProperty( int property_id, double value )
 struct CvVideoWriter_FFMPEG
 {
     bool open( const char* filename, int fourcc,
-        double fps, int width, int height, bool isColor );
+               double fps, int width, int height, bool isColor );
     void close();
     bool writeFrame( const unsigned char* data, int step, int width, int height, int cn, int origin );
 
@@ -724,34 +736,34 @@ static const char * icvFFMPEGErrStr(int err)
 {
 #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
     switch(err) {
-               case AVERROR_BSF_NOT_FOUND:
-                       return "Bitstream filter not found";
-               case AVERROR_DECODER_NOT_FOUND:
-                       return "Decoder not found";
-               case AVERROR_DEMUXER_NOT_FOUND:
-                       return "Demuxer not found";
-               case AVERROR_ENCODER_NOT_FOUND:
-                       return "Encoder not found";
-               case AVERROR_EOF:
-                       return "End of file";
-               case AVERROR_EXIT:
-                       return "Immediate exit was requested; the called function should not be restarted";
-               case AVERROR_FILTER_NOT_FOUND:
-                       return "Filter not found";
-               case AVERROR_INVALIDDATA:
-                       return "Invalid data found when processing input";
-               case AVERROR_MUXER_NOT_FOUND:
-                       return "Muxer not found";
-               case AVERROR_OPTION_NOT_FOUND:
-                       return "Option not found";
-               case AVERROR_PATCHWELCOME:
-                       return "Not yet implemented in FFmpeg, patches welcome";
-               case AVERROR_PROTOCOL_NOT_FOUND:
-                       return "Protocol not found";
-               case AVERROR_STREAM_NOT_FOUND:
-                       return "Stream not found";
-               default:
-                       break;
+    case AVERROR_BSF_NOT_FOUND:
+        return "Bitstream filter not found";
+    case AVERROR_DECODER_NOT_FOUND:
+        return "Decoder not found";
+    case AVERROR_DEMUXER_NOT_FOUND:
+        return "Demuxer not found";
+    case AVERROR_ENCODER_NOT_FOUND:
+        return "Encoder not found";
+    case AVERROR_EOF:
+        return "End of file";
+    case AVERROR_EXIT:
+        return "Immediate exit was requested; the called function should not be restarted";
+    case AVERROR_FILTER_NOT_FOUND:
+        return "Filter not found";
+    case AVERROR_INVALIDDATA:
+        return "Invalid data found when processing input";
+    case AVERROR_MUXER_NOT_FOUND:
+        return "Muxer not found";
+    case AVERROR_OPTION_NOT_FOUND:
+        return "Option not found";
+    case AVERROR_PATCHWELCOME:
+        return "Not yet implemented in FFmpeg, patches welcome";
+    case AVERROR_PROTOCOL_NOT_FOUND:
+        return "Protocol not found";
+    case AVERROR_STREAM_NOT_FOUND:
+        return "Stream not found";
+    default:
+        break;
        }
 #else
     switch(err) {
@@ -818,7 +830,7 @@ static AVFrame * icv_alloc_picture_FFMPEG(int pix_fmt, int width, int height, bo
                        return NULL;
                }
                avpicture_fill((AVPicture *)picture, picture_buf,
-                               (PixelFormat) pix_fmt, width, height);
+                       (PixelFormat) pix_fmt, width, height);
        }
        else {
        }
@@ -875,11 +887,11 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc,
        of which frame timestamps are represented. for fixed-fps content,
        timebase should be 1/framerate and timestamp increments should be
        identically 1. */
-        frame_rate = static_cast<int>(fps+0.5);
-        frame_rate_base = 1;
-        while (fabs(static_cast<double>(frame_rate)/frame_rate_base) - fps > 0.001){
-                frame_rate_base *= 10;
-                frame_rate = static_cast<int>(fps*frame_rate_base + 0.5);
+    frame_rate = static_cast<int>(fps+0.5);
+    frame_rate_base = 1;
+    while (fabs(static_cast<double>(frame_rate)/frame_rate_base) - fps > 0.001){
+        frame_rate_base *= 10;
+        frame_rate = static_cast<int>(fps*frame_rate_base + 0.5);
        }
 #if LIBAVFORMAT_BUILD > 4752
     c->time_base.den = frame_rate;
@@ -947,9 +959,9 @@ int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st, uint8_
         AVPacket pkt;
         av_init_packet(&pkt);
 
-               #ifndef PKT_FLAG_KEY
-                       #define PKT_FLAG_KEY AV_PKT_FLAG_KEY
-               #endif
+#ifndef PKT_FLAG_KEY
+#define PKT_FLAG_KEY AV_PKT_FLAG_KEY
+#endif
                
         pkt.flags |= PKT_FLAG_KEY; 
         pkt.stream_index= video_st->index;
@@ -966,7 +978,8 @@ int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st, uint8_
             av_init_packet(&pkt);
 
 #if LIBAVFORMAT_BUILD > 4752
-            pkt.pts = av_rescale_q(c->coded_frame->pts, c->time_base, video_st->time_base);
+            if(c->coded_frame->pts != (int64_t)AV_NOPTS_VALUE)
+                pkt.pts = av_rescale_q(c->coded_frame->pts, c->time_base, video_st->time_base);
 #else
                        pkt.pts = c->coded_frame->pts;
 #endif
@@ -1054,7 +1067,7 @@ bool CvVideoWriter_FFMPEG::writeFrame( const unsigned char* data, int step, int
     }
 
        // check if buffer sizes match, i.e. image has expected format (size, channels, bitdepth, alignment)
-/*#if LIBAVCODEC_VERSION_INT >= ((52<<16)+(37<<8)+0)
+    /*#if LIBAVCODEC_VERSION_INT >= ((52<<16)+(37<<8)+0)
        assert (image->imageSize == avpicture_get_size( (PixelFormat)input_pix_fmt, image->width, image->height ));
 #else
        assert (image->imageSize == avpicture_get_size( input_pix_fmt, image->width, image->height ));
@@ -1064,38 +1077,38 @@ bool CvVideoWriter_FFMPEG::writeFrame( const unsigned char* data, int step, int
                assert( input_picture );
                // let input_picture point to the raw data buffer of 'image'
                avpicture_fill((AVPicture *)input_picture, (uint8_t *) data,
-                               (PixelFormat)input_pix_fmt, width, height);
+                       (PixelFormat)input_pix_fmt, width, height);
 
 #if !defined(HAVE_FFMPEG_SWSCALE)
                // convert to the color format needed by the codec
                if( img_convert((AVPicture *)picture, c->pix_fmt,
-                                       (AVPicture *)input_picture, (PixelFormat)input_pix_fmt,
-                                       width, height) < 0){
+                        (AVPicture *)input_picture, (PixelFormat)input_pix_fmt,
+                        width, height) < 0){
                        return false;
                }
 #else
                img_convert_ctx = sws_getContext(width,
-                            height,
-                     (PixelFormat)input_pix_fmt,
-                            c->width,
-                            c->height,
-                            c->pix_fmt,
-                            SWS_BICUBIC,
-                            NULL, NULL, NULL);
-
-                   if ( sws_scale(img_convert_ctx, input_picture->data,
-                            input_picture->linesize, 0,
-                            height,
-                            picture->data, picture->linesize) < 0 )
-                   {
-               return false;
-                   }
+                                         height,
+                                         (PixelFormat)input_pix_fmt,
+                                         c->width,
+                                         c->height,
+                                         c->pix_fmt,
+                                         SWS_BICUBIC,
+                                         NULL, NULL, NULL);
+
+        if ( sws_scale(img_convert_ctx, input_picture->data,
+                       input_picture->linesize, 0,
+                       height,
+                       picture->data, picture->linesize) < 0 )
+        {
+            return false;
+        }
                sws_freeContext(img_convert_ctx);
 #endif
        }
        else{
                avpicture_fill((AVPicture *)picture, (uint8_t *) data,
-                               (PixelFormat)input_pix_fmt, width, height);
+                       (PixelFormat)input_pix_fmt, width, height);
        }
 
        ret = icv_av_write_frame_FFMPEG( oc, video_st, outbuf, outbuf_size, picture) >= 0;
@@ -1124,306 +1137,312 @@ void CvVideoWriter_FFMPEG::close()
 #if LIBAVFORMAT_BUILD > 4628
        if( video_st->codec->pix_fmt != input_pix_fmt){
 #else
-       if( video_st->codec.pix_fmt != input_pix_fmt){
+        if( video_st->codec.pix_fmt != input_pix_fmt){
 #endif
-               if(picture->data[0])
-           free(picture->data[0]);
-        picture->data[0] = 0;
-       }
-       av_free(picture);
+            if(picture->data[0])
+                free(picture->data[0]);
+            picture->data[0] = 0;
+        }
+        av_free(picture);
 
-    if (input_picture) {
-        av_free(input_picture);
-    }
+        if (input_picture) {
+            av_free(input_picture);
+        }
 
-       /* close codec */
+        /* close codec */
 #if LIBAVFORMAT_BUILD > 4628
-       avcodec_close(video_st->codec);
+        avcodec_close(video_st->codec);
 #else
-       avcodec_close(&(video_st->codec));
+        avcodec_close(&(video_st->codec));
 #endif
 
-       av_free(outbuf);
+        av_free(outbuf);
 
-       /* free the streams */
-       for(i = 0; i < oc->nb_streams; i++) {
-               av_freep(&oc->streams[i]->codec);
-               av_freep(&oc->streams[i]);
-       }
+        /* free the streams */
+        for(i = 0; i < oc->nb_streams; i++) {
+            av_freep(&oc->streams[i]->codec);
+            av_freep(&oc->streams[i]);
+        }
 
-       if (!(fmt->flags & AVFMT_NOFILE)) {
-               /* close the output file */
+        if (!(fmt->flags & AVFMT_NOFILE)) {
+            /* close the output file */
 
 
 #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(49<<8)+0)
-               url_fclose(oc->pb);
+            url_fclose(oc->pb);
 #else
-               url_fclose(&oc->pb);
+            url_fclose(&oc->pb);
 #endif
 
-       }
+        }
 
-       /* free the stream */
-       av_free(oc);
+        /* free the stream */
+        av_free(oc);
 
-    if( temp_image.data )
-    {
-        free(temp_image.data);
-        temp_image.data = 0;
-    }
+        if( temp_image.data )
+        {
+            free(temp_image.data);
+            temp_image.data = 0;
+        }
 
-       init();
-}
+        init();
+    }
 
-/// Create a video writer object that uses FFMPEG
-bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
-               double fps, int width, int height, bool is_color )
-{
-       CodecID codec_id = CODEC_ID_NONE;
+    /// Create a video writer object that uses FFMPEG
+    bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
+                                     double fps, int width, int height, bool is_color )
+    {
+        CodecID codec_id = CODEC_ID_NONE;
         int err, codec_pix_fmt, bitrate_scale = 64;
 
-    close();
+        close();
 
-       // check arguments
+        // check arguments
         assert(filename);
         assert(fps > 0);
         assert(width > 0  &&  height > 0);
 
-       // tell FFMPEG to register codecs
+        // tell FFMPEG to register codecs
         av_register_all();
 
-       /* auto detect the output format from the name and fourcc code. */
+        /* auto detect the output format from the name and fourcc code. */
 
 #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
-       fmt = av_guess_format(NULL, filename, NULL);
+        fmt = av_guess_format(NULL, filename, NULL);
 #else
-       fmt = guess_format(NULL, filename, NULL);
+        fmt = guess_format(NULL, filename, NULL);
 #endif
-       
-       if (!fmt)
-        return false;
 
-       /* determine optimal pixel format */
-    if (is_color) {
-        input_pix_fmt = PIX_FMT_BGR24;
-    }
-       else {
-        input_pix_fmt = PIX_FMT_GRAY8;
-    }
+        if (!fmt)
+            return false;
 
-       /* Lookup codec_id for given fourcc */
+        /* determine optimal pixel format */
+        if (is_color) {
+            input_pix_fmt = PIX_FMT_BGR24;
+        }
+        else {
+            input_pix_fmt = PIX_FMT_GRAY8;
+        }
+
+        /* Lookup codec_id for given fourcc */
 #if LIBAVCODEC_VERSION_INT<((51<<16)+(49<<8)+0)
-    if( (codec_id = codec_get_bmp_id( fourcc )) == CODEC_ID_NONE )
-        return false;
+        if( (codec_id = codec_get_bmp_id( fourcc )) == CODEC_ID_NONE )
+            return false;
 #else
-       const struct AVCodecTag * tags[] = { codec_bmp_tags, NULL};
-    if( (codec_id = av_codec_get_id(tags, fourcc)) == CODEC_ID_NONE )
-        return false;
+        const struct AVCodecTag * tags[] = { codec_bmp_tags, NULL};
+        if( (codec_id = av_codec_get_id(tags, fourcc)) == CODEC_ID_NONE )
+            return false;
 #endif
 
-    // alloc memory for context
+        // alloc memory for context
 #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
-       oc = avformat_alloc_context();
+        oc = avformat_alloc_context();
 #else
-       oc = av_alloc_format_context();
+        oc = av_alloc_format_context();
 #endif
-       assert (oc);
+        assert (oc);
 
-       /* set file name */
-       oc->oformat = fmt;
-       snprintf(oc->filename, sizeof(oc->filename), "%s", filename);
+        /* set file name */
+        oc->oformat = fmt;
+        snprintf(oc->filename, sizeof(oc->filename), "%s", filename);
 
-       /* set some options */
-       oc->max_delay = (int)(0.7*AV_TIME_BASE);  /* This reduces buffer underrun warnings with MPEG */
+        /* set some options */
+        oc->max_delay = (int)(0.7*AV_TIME_BASE);  /* This reduces buffer underrun warnings with MPEG */
 
-    // set a few optimal pixel formats for lossless codecs of interest..
-    switch (codec_id) {
+        // set a few optimal pixel formats for lossless codecs of interest..
+        switch (codec_id) {
 #if LIBAVCODEC_VERSION_INT>((50<<16)+(1<<8)+0)
-    case CODEC_ID_JPEGLS:
-        // BGR24 or GRAY8 depending on is_color...
-        codec_pix_fmt = input_pix_fmt;
-        break;
+        case CODEC_ID_JPEGLS:
+            // BGR24 or GRAY8 depending on is_color...
+            codec_pix_fmt = input_pix_fmt;
+            break;
 #endif
-    case CODEC_ID_HUFFYUV:
-        codec_pix_fmt = PIX_FMT_YUV422P;
-        break;
-    case CODEC_ID_MJPEG:
-    case CODEC_ID_LJPEG:
-      codec_pix_fmt = PIX_FMT_YUVJ420P;
-      bitrate_scale = 128;
-      break;
-    case CODEC_ID_RAWVIDEO:
-        codec_pix_fmt = input_pix_fmt == PIX_FMT_GRAY8 ||
-                        input_pix_fmt == PIX_FMT_GRAY16LE ||
-                        input_pix_fmt == PIX_FMT_GRAY16BE ? input_pix_fmt : PIX_FMT_YUV420P;
-        break;
-    default:
-        // good for lossy formats, MPEG, etc.
-        codec_pix_fmt = PIX_FMT_YUV420P;
-        break;
-    }
+        case CODEC_ID_HUFFYUV:
+            codec_pix_fmt = PIX_FMT_YUV422P;
+            break;
+        case CODEC_ID_MJPEG:
+        case CODEC_ID_LJPEG:
+            codec_pix_fmt = PIX_FMT_YUVJ420P;
+            bitrate_scale = 128;
+            break;
+        case CODEC_ID_RAWVIDEO:
+            codec_pix_fmt = input_pix_fmt == PIX_FMT_GRAY8 ||
+                            input_pix_fmt == PIX_FMT_GRAY16LE ||
+                            input_pix_fmt == PIX_FMT_GRAY16BE ? input_pix_fmt : PIX_FMT_YUV420P;
+            break;
+        default:
+            // good for lossy formats, MPEG, etc.
+            codec_pix_fmt = PIX_FMT_YUV420P;
+            break;
+        }
 
-       // TODO -- safe to ignore output audio stream?
-       video_st = icv_add_video_stream_FFMPEG(oc, codec_id,
-                       width, height, width*height*bitrate_scale,
-            fps, codec_pix_fmt);
+        // TODO -- safe to ignore output audio stream?
+        video_st = icv_add_video_stream_FFMPEG(oc, codec_id,
+                                               width, height, width*height*bitrate_scale,
+                                               fps, codec_pix_fmt);
 
 
-       /* set the output parameters (must be done even if no
+        /* set the output parameters (must be done even if no
        parameters). */
-    if (av_set_parameters(oc, NULL) < 0) {
-        return false;
-    }
+        if (av_set_parameters(oc, NULL) < 0) {
+            return false;
+        }
 
-    dump_format(oc, 0, filename, 1);
+        dump_format(oc, 0, filename, 1);
 
-    /* now that all the parameters are set, we can open the audio and
+        /* now that all the parameters are set, we can open the audio and
        video codecs and allocate the necessary encode buffers */
-    if (!video_st){
-        return false;
-       }
+        if (!video_st){
+            return false;
+        }
 
-    AVCodec *codec;
-    AVCodecContext *c;
+        AVCodec *codec;
+        AVCodecContext *c;
 
 #if LIBAVFORMAT_BUILD > 4628
-    c = (video_st->codec);
+        c = (video_st->codec);
 #else
-    c = &(video_st->codec);
+        c = &(video_st->codec);
 #endif
 
-    c->codec_tag = fourcc;
-    /* find the video encoder */
-    codec = avcodec_find_encoder(c->codec_id);
-    if (!codec) {
-        return false;
-    }
+        c->codec_tag = fourcc;
+        /* find the video encoder */
+        codec = avcodec_find_encoder(c->codec_id);
+        if (!codec) {
+            fprintf(stderr, "Could not find encoder for codec id %d: %s", c->codec_id, icvFFMPEGErrStr(
+            #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
+                    AVERROR_ENCODER_NOT_FOUND
+            #else
+                    -1
+            #endif
+                    ));
+            return false;
+        }
 
-       c->bit_rate_tolerance = c->bit_rate;
+        c->bit_rate_tolerance = c->bit_rate;
 
-    /* open the codec */
-    if ( (err=avcodec_open(c, codec)) < 0) {
-               char errtext[256];
-               sprintf(errtext, "Could not open codec '%s': %s", codec->name, icvFFMPEGErrStr(err));
-               return false;
-    }
+        /* open the codec */
+        if ( (err=avcodec_open(c, codec)) < 0 ) {
+            fprintf(stderr, "Could not open codec '%s': %s", codec->name, icvFFMPEGErrStr(err));
+            return false;
+        }
 
-    outbuf = NULL;
+        outbuf = NULL;
 
-    if (!(oc->oformat->flags & AVFMT_RAWPICTURE)) {
-        /* allocate output buffer */
-               /* assume we will never get codec output with more than 4 bytes per pixel... */
-               outbuf_size = width*height*4;
-        outbuf = (uint8_t *) av_malloc(outbuf_size);
-    }
+        if (!(oc->oformat->flags & AVFMT_RAWPICTURE)) {
+            /* allocate output buffer */
+            /* assume we will never get codec output with more than 4 bytes per pixel... */
+            outbuf_size = width*height*4;
+            outbuf = (uint8_t *) av_malloc(outbuf_size);
+        }
 
-       bool need_color_convert;
-       need_color_convert = (c->pix_fmt != input_pix_fmt);
+        bool need_color_convert;
+        need_color_convert = (c->pix_fmt != input_pix_fmt);
 
-    /* allocate the encoded raw picture */
-    picture = icv_alloc_picture_FFMPEG(c->pix_fmt, c->width, c->height, need_color_convert);
-    if (!picture) {
-        return false;
-    }
+        /* allocate the encoded raw picture */
+        picture = icv_alloc_picture_FFMPEG(c->pix_fmt, c->width, c->height, need_color_convert);
+        if (!picture) {
+            return false;
+        }
 
-    /* if the output format is not our input format, then a temporary
+        /* if the output format is not our input format, then a temporary
        picture of the input format is needed too. It is then converted
           to the required output format */
-       input_picture = NULL;
-    if ( need_color_convert ) {
-        input_picture = icv_alloc_picture_FFMPEG(input_pix_fmt, c->width, c->height, false);
-        if (!input_picture) {
-            return false;
+        input_picture = NULL;
+        if ( need_color_convert ) {
+            input_picture = icv_alloc_picture_FFMPEG(input_pix_fmt, c->width, c->height, false);
+            if (!input_picture) {
+                return false;
+            }
         }
-    }
 
-       /* open the output file, if needed */
-    if (!(fmt->flags & AVFMT_NOFILE)) {
-        if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
-            return false;
+        /* open the output file, if needed */
+        if (!(fmt->flags & AVFMT_NOFILE)) {
+            if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
+                return false;
+            }
         }
-    }
 
-    /* write the stream header, if any */
-    av_write_header( oc );
+        /* write the stream header, if any */
+        av_write_header( oc );
 
-       return true;
-}
+        return true;
+    }
 
 
 
-CvCapture_FFMPEG* cvCreateFileCapture_FFMPEG( const char* filename )
-{
-    CvCapture_FFMPEG* capture = (CvCapture_FFMPEG*)malloc(sizeof(*capture));
-    capture->init();
-    if( capture->open( filename ))
-        return capture;
-    capture->close();
-    free(capture);
-    return 0;
-}
+    CvCapture_FFMPEG* cvCreateFileCapture_FFMPEG( const char* filename )
+    {
+        CvCapture_FFMPEG* capture = (CvCapture_FFMPEG*)malloc(sizeof(*capture));
+        capture->init();
+        if( capture->open( filename ))
+            return capture;
+        capture->close();
+        free(capture);
+        return 0;
+    }
 
 
-void cvReleaseCapture_FFMPEG(CvCapture_FFMPEG** capture)
-{
-    if( capture && *capture )
+    void cvReleaseCapture_FFMPEG(CvCapture_FFMPEG** capture)
     {
-        (*capture)->close();
-        free(*capture);
-        *capture = 0;
+        if( capture && *capture )
+        {
+            (*capture)->close();
+            free(*capture);
+            *capture = 0;
+        }
     }
-}
 
-int cvSetCaptureProperty_FFMPEG(CvCapture_FFMPEG* capture, int prop_id, double value)
-{
-    return capture->setProperty(prop_id, value);
-}
+    int cvSetCaptureProperty_FFMPEG(CvCapture_FFMPEG* capture, int prop_id, double value)
+    {
+        return capture->setProperty(prop_id, value);
+    }
 
-double cvGetCaptureProperty_FFMPEG(CvCapture_FFMPEG* capture, int prop_id)
-{
-    return capture->getProperty(prop_id);
-}
+    double cvGetCaptureProperty_FFMPEG(CvCapture_FFMPEG* capture, int prop_id)
+    {
+        return capture->getProperty(prop_id);
+    }
 
-int cvGrabFrame_FFMPEG(CvCapture_FFMPEG* capture)
-{
-    return capture->grabFrame();
-}
+    int cvGrabFrame_FFMPEG(CvCapture_FFMPEG* capture)
+    {
+        return capture->grabFrame();
+    }
 
-int cvRetrieveFrame_FFMPEG(CvCapture_FFMPEG* capture, unsigned char** data, int* step, int* width, int* height, int* cn)
-{
-    return capture->retrieveFrame(0, data, step, width, height, cn);
-}
+    int cvRetrieveFrame_FFMPEG(CvCapture_FFMPEG* capture, unsigned char** data, int* step, int* width, int* height, int* cn)
+    {
+        return capture->retrieveFrame(0, data, step, width, height, cn);
+    }
 
 
 
-CvVideoWriter_FFMPEG* cvCreateVideoWriter_FFMPEG( const char* filename, int fourcc, double fps,
-                                                  int width, int height, int isColor )
-{
-    CvVideoWriter_FFMPEG* writer = (CvVideoWriter_FFMPEG*)malloc(sizeof(*writer));
-    writer->init();
-    if( writer->open( filename, fourcc, fps, width, height, isColor != 0 ))
-        return writer;
-    writer->close();
-    free(writer);
-    return 0;
-}
+    CvVideoWriter_FFMPEG* cvCreateVideoWriter_FFMPEG( const char* filename, int fourcc, double fps,
+                                                      int width, int height, int isColor )
+    {
+        CvVideoWriter_FFMPEG* writer = (CvVideoWriter_FFMPEG*)malloc(sizeof(*writer));
+        writer->init();
+        if( writer->open( filename, fourcc, fps, width, height, isColor != 0 ))
+            return writer;
+        writer->close();
+        free(writer);
+        return 0;
+    }
 
 
-void cvReleaseVideoWriter_FFMPEG( CvVideoWriter_FFMPEG** writer )
-{
-    if( writer && *writer )
+    void cvReleaseVideoWriter_FFMPEG( CvVideoWriter_FFMPEG** writer )
     {
-        (*writer)->close();
-        free(*writer);
-        *writer = 0;
+        if( writer && *writer )
+        {
+            (*writer)->close();
+            free(*writer);
+            *writer = 0;
+        }
     }
-}
 
 
-int cvWriteFrame_FFMPEG( CvVideoWriter_FFMPEG* writer,
-                         const unsigned char* data, int step,
-                         int width, int height, int cn, int origin)
-{
-    return writer->writeFrame(data, step, width, height, cn, origin);
-}
+    int cvWriteFrame_FFMPEG( CvVideoWriter_FFMPEG* writer,
+                             const unsigned char* data, int step,
+                             int width, int height, int cn, int origin)
+    {
+        return writer->writeFrame(data, step, width, height, cn, origin);
+    }
 
index 50ef663..e89af78 100755 (executable)
@@ -125,6 +125,10 @@ extern "C" {
     #include <sys/sysctl.h>
 #endif
 
+#ifndef MIN
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
 int get_number_of_cpus(void)
 {
 #if defined WIN32 || defined _WIN32
@@ -218,7 +222,6 @@ struct CvCapture_FFMPEG
     double  dts_to_sec(int64_t dts);
 
     AVFormatContext * ic;
-    AVCodecContext  * avcodec_context;
     AVCodec         * avcodec;
     int               video_stream;
     AVStream        * video_st;
@@ -256,11 +259,10 @@ void CvCapture_FFMPEG::init()
     memset( &frame, 0, sizeof(frame) );
     filename = 0;
     packet.data = NULL;
-       #if defined(HAVE_FFMPEG_SWSCALE)
-               img_convert_ctx = 0;
-       #endif
+#if defined(HAVE_FFMPEG_SWSCALE)
+    img_convert_ctx = 0;
+#endif
 
-    avcodec_context = 0;
     avcodec = 0;
     frame_number = 0;
     eps_zero = 0.000025;
@@ -270,41 +272,29 @@ void CvCapture_FFMPEG::init()
 void CvCapture_FFMPEG::close()
 {
     if( picture )
-    av_free(picture);
+        av_free(picture);
 
     if( video_st )
     {
-        #if LIBAVFORMAT_BUILD > 4628
-                avcodec_close( video_st->codec );
-
-        #else
-                avcodec_close( &(video_st->codec) );
-
-        #endif
-                video_st = NULL;
-    }
-
-    if ( avcodec_context )
-    {
-        #if LIBAVFORMAT_BUILD > 4628
-                avcodec_close( avcodec_context );
+#if LIBAVFORMAT_BUILD > 4628
+        avcodec_close( video_st->codec );
 
-        #else
-                avcodec_close( &avcodec_context );
+#else
+        avcodec_close( &(video_st->codec) );
 
-        #endif
-                avcodec_context = NULL;
+#endif
+        video_st = NULL;
     }
 
     if( ic )
     {
-     #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 24, 2)
+#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 24, 2)
                av_close_input_file(ic);
-        #else
+#else
                avformat_close_input(&ic);
-     #endif
+#endif
 
-     ic = NULL;
+        ic = NULL;
     }
 
     if( rgb_picture.data[0] )
@@ -327,29 +317,23 @@ void CvCapture_FFMPEG::close()
 */
 bool CvCapture_FFMPEG::reopen()
 {
-    if ( filename==NULL ) return false;
+    /*if ( filename==NULL ) return false;
 
        #if LIBAVFORMAT_BUILD > 4628
                avcodec_close( video_st->codec );
-               avcodec_close( avcodec_context );
        #else
                avcodec_close( &video_st->codec );
-               avcodec_close( &avcodec_context );
        #endif
     #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 24, 2)
         av_close_input_file(ic);
+        av_open_input_file(&ic, filename, )
     #else
         avformat_close_input(&ic);
+        avformat_open_input(&ic, filename, NULL, NULL);
     #endif
 
-    // reopen video
-    avformat_open_input(&ic, filename, NULL, NULL);
-    #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 6, 0)
-        #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 24, 2)
-            avformat_find_stream_info(ic);
-        #else
-            avformat_find_stream_info(ic, NULL);
-        #endif
+    #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 3, 0)
+             avformat_find_stream_info(ic, NULL);
     #else
         av_find_stream_info(ic);
     #endif
@@ -373,16 +357,16 @@ bool CvCapture_FFMPEG::reopen()
 
        // reset framenumber to zero
        frame_number = 0;
-    picture_pts=0;
+    picture_pts=0;*/
 
     return true;
 }
 
 #ifndef AVSEEK_FLAG_FRAME
-    #define AVSEEK_FLAG_FRAME 0
+#define AVSEEK_FLAG_FRAME 0
 #endif
 #ifndef AVSEEK_FLAG_ANY
-    #define AVSEEK_FLAG_ANY 1
+#define AVSEEK_FLAG_ANY 1
 #endif
 
 bool CvCapture_FFMPEG::open( const char* _filename )
@@ -392,16 +376,14 @@ bool CvCapture_FFMPEG::open( const char* _filename )
 
     close();
        
-       #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 13, 0)
-               avformat_network_init();
-       #endif
+#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 13, 0)
+    avformat_network_init();
+#endif
 
     /* register all codecs, demux and protocols */
     av_register_all();
 
-    #ifndef _DEBUG
-        // av_log_level = AV_LOG_QUIET;
-    #endif
+    av_log_set_level(AV_LOG_ERROR);
 
     int err = avformat_open_input(&ic, _filename, NULL, NULL);
     if (err < 0) {
@@ -409,56 +391,52 @@ bool CvCapture_FFMPEG::open( const char* _filename )
         goto exit_func;
     }
     err =
-    #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 6, 0)
-        #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 24, 2)
-            avformat_find_stream_info(ic);
-        #else
-            avformat_find_stream_info(ic, NULL);
-        #endif
-    #else
-        av_find_stream_info(ic);
-    #endif
+#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 3, 0)
+    avformat_find_stream_info(ic, NULL);
+#else
+    av_find_stream_info(ic);
+#endif
     if (err < 0) {
         CV_WARN("Could not find codec parameters");
         goto exit_func;
     }
     for(i = 0; i < ic->nb_streams; i++)
     {
-        #if LIBAVFORMAT_BUILD > 4628
-                AVCodecContext *enc = ic->streams[i]->codec;
-        #else
-                AVCodecContext *enc = &ic->streams[i]->codec;
-        #endif
-
-        #ifdef FF_API_THREAD_INIT
-                avcodec_thread_init(enc, get_number_of_cpus());
-        #else
-                enc->thread_count = get_number_of_cpus();
-        #endif
-
-        #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
-            #define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
-        #endif
+#if LIBAVFORMAT_BUILD > 4628
+        AVCodecContext *enc = ic->streams[i]->codec;
+#else
+        AVCodecContext *enc = &ic->streams[i]->codec;
+#endif
+
+#ifdef FF_API_THREAD_INIT
+        avcodec_thread_init(enc, get_number_of_cpus());
+#else
+        enc->thread_count = get_number_of_cpus();
+#endif
+
+#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
+#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
+#endif
 
         if( AVMEDIA_TYPE_VIDEO == enc->codec_type && video_stream < 0) {
             AVCodec *codec = avcodec_find_decoder(enc->codec_id);
             if (!codec ||
-                #if LIBAVCODEC_VERSION_INT >= ((53<<16)+(8<<8)+0)
-                            avcodec_open2(enc, codec, NULL)
-                #else
-                            avcodec_open(enc, codec)
-                #endif
-                        < 0) goto exit_func;
+#if LIBAVCODEC_VERSION_INT >= ((53<<16)+(8<<8)+0)
+                avcodec_open2(enc, codec, NULL)
+#else
+                avcodec_open(enc, codec)
+#endif
+                < 0) goto exit_func;
 
             video_stream = i;
             video_st = ic->streams[i];
             picture = avcodec_alloc_frame();
 
             rgb_picture.data[0] = (uint8_t*)malloc(
-                                    avpicture_get_size( PIX_FMT_BGR24,
-                                    enc->width, enc->height ));
+                    avpicture_get_size( PIX_FMT_BGR24,
+                                        enc->width, enc->height ));
             avpicture_fill( (AVPicture*)&rgb_picture, rgb_picture.data[0],
-                    PIX_FMT_BGR24, enc->width, enc->height );
+                            PIX_FMT_BGR24, enc->width, enc->height );
 
             frame.width = enc->width;
             frame.height = enc->height;
@@ -472,7 +450,7 @@ bool CvCapture_FFMPEG::open( const char* _filename )
     if(video_stream >= 0) valid = true;
 
     // perform check if source is seekable via ffmpeg's seek function av_seek_frame(...)
-    err = av_seek_frame(ic, video_stream, 10, 0);
+    /*err = av_seek_frame(ic, video_stream, 10, 0);
     if (err < 0)
     {
         filename=(char*)malloc(strlen(_filename)+1);
@@ -488,8 +466,8 @@ bool CvCapture_FFMPEG::open( const char* _filename )
         int64_t ts    = video_st->first_dts;
         int     flags = AVSEEK_FLAG_FRAME | AVSEEK_FLAG_BACKWARD;
         av_seek_frame(ic, video_stream, ts, flags);
-    }
-exit_func:
+    }*/
+    exit_func:
 
     if( !valid )
         close();
@@ -531,28 +509,28 @@ bool CvCapture_FFMPEG::grabFrame()
 
         if( packet.stream_index != video_stream )
         {
-                av_free_packet (&packet);
-                count_errs++;
-                if (count_errs > max_number_of_attempts) break; else
+            av_free_packet (&packet);
+            count_errs++;
+            if (count_errs > max_number_of_attempts) break; else
                 continue;
         }
 
         // Decode video frame
         avcodec_decode_video2(video_st->codec, picture, &got_picture, &packet);
 
-            // Did we get a video frame?
-            if(got_picture)
-            {
-                          frame_number++;
-                          picture_pts = packet.pts;
-                          valid = true;
-                      }
-                      else
-                      {
-                          count_errs++;
-                          if (count_errs > max_number_of_attempts)
-                                  break;
-                      }
+        // Did we get a video frame?
+        if(got_picture)
+        {
+            frame_number++;
+            picture_pts = packet.pts;
+            valid = true;
+        }
+        else
+        {
+            count_errs++;
+            if (count_errs > max_number_of_attempts)
+                break;
+        }
 
     }
 
@@ -566,49 +544,47 @@ bool CvCapture_FFMPEG::retrieveFrame(int, unsigned char** data, int* step, int*
     if( !video_st || !picture->data[0] )
         return false;
 
-    rgb_picture = *avcodec_alloc_frame();
-
     avpicture_fill((AVPicture*)&rgb_picture, rgb_picture.data[0], PIX_FMT_RGB24, video_st->codec->width, video_st->codec->height);
 
     frame.width = video_st->codec->width;
     frame.height = video_st->codec->height;
 
-   img_convert_ctx = sws_getContext(
-                                                         video_st->codec->width, video_st->codec->height,
-                                                                   video_st->codec->pix_fmt,
-                                                                   video_st->codec->width, video_st->codec->height,
-                                                                   PIX_FMT_BGR24,
-                                                                   SWS_BICUBIC,
-                                                                   NULL, NULL, NULL
-                                                                  );
+    img_convert_ctx = sws_getContext(
+            video_st->codec->width, video_st->codec->height,
+            video_st->codec->pix_fmt,
+            video_st->codec->width, video_st->codec->height,
+            PIX_FMT_BGR24,
+            SWS_BICUBIC,
+            NULL, NULL, NULL
+            );
 
-                          img_convert_ctx = sws_getCachedContext(
-                                                                   img_convert_ctx,
-                                                                   video_st->codec->width, video_st->codec->height,
-                                                                   video_st->codec->pix_fmt,
-                                                                   video_st->codec->width, video_st->codec->height,
-                                                                   PIX_FMT_BGR24,
-                                                                   SWS_BICUBIC,
-                                                                   NULL, NULL, NULL
-                                                                  );
+    img_convert_ctx = sws_getCachedContext(
+            img_convert_ctx,
+            video_st->codec->width, video_st->codec->height,
+            video_st->codec->pix_fmt,
+            video_st->codec->width, video_st->codec->height,
+            PIX_FMT_BGR24,
+            SWS_BICUBIC,
+            NULL, NULL, NULL
+            );
 
-              if (img_convert_ctx == NULL)
-                  CV_Error(0, "Cannot initialize the conversion context!");
+    if (img_convert_ctx == NULL)
+        return false;//CV_Error(0, "Cannot initialize the conversion context!");
 
-              sws_scale(
-                          img_convert_ctx,
-                          picture->data,
-                          picture->linesize,
-                          0, video_st->codec->height,
-                          rgb_picture.data,
-                          rgb_picture.linesize
-                       );
+    sws_scale(
+            img_convert_ctx,
+            picture->data,
+            picture->linesize,
+            0, video_st->codec->height,
+            rgb_picture.data,
+            rgb_picture.linesize
+            );
 
-              sws_freeContext(img_convert_ctx);
+    sws_freeContext(img_convert_ctx);
 
 
 
-     frame_number++;
+    frame_number++;
 
     *data = frame.data;
     *step = frame.step;
@@ -631,8 +607,8 @@ double CvCapture_FFMPEG::getProperty( int property_id )
     if( !video_st ) return 0;
 
     // double frameScale = av_q2d (video_st->time_base) * av_q2d (video_st->r_frame_rate);
-    int64_t timestamp;
-    timestamp = picture_pts;
+    //int64_t timestamp;
+    //timestamp = picture_pts;
 
     switch( property_id )
     {
@@ -650,25 +626,25 @@ double CvCapture_FFMPEG::getProperty( int property_id )
         break;
     case CV_FFMPEG_CAP_PROP_FRAME_WIDTH:
         return (double)frame.width;
-    break;
+        break;
     case CV_FFMPEG_CAP_PROP_FRAME_HEIGHT:
         return (double)frame.height;
-    break;
+        break;
     case CV_FFMPEG_CAP_PROP_FPS:
 #if LIBAVCODEC_BUILD > 4753
         return av_q2d (video_st->r_frame_rate);
 #else
         return (double)video_st->codec.frame_rate
-            / (double)video_st->codec.frame_rate_base;
+                / (double)video_st->codec.frame_rate_base;
 #endif
-    break;
-    case CV_FFMPEG_CAP_PROP_FOURCC:
+        break;
+     case CV_FFMPEG_CAP_PROP_FOURCC:
 #if LIBAVFORMAT_BUILD > 4628
         return (double)video_st->codec->codec_tag;
 #else
         return (double)video_st->codec.codec_tag;
 #endif
-    break;
+        break;
     }
 
     return 0;
@@ -731,7 +707,7 @@ int64_t CvCapture_FFMPEG::get_total_frames()
 
     if (nbf == 0)
     {
-        nbf = static_cast<int64_t>(get_duration_sec() * get_fps());
+        nbf = (int64_t)floor(get_duration_sec() * get_fps() + 0.5);
     }
     return nbf;
 }
@@ -832,7 +808,7 @@ bool CvCapture_FFMPEG::setProperty( int property_id, double value )
 struct CvVideoWriter_FFMPEG
 {
     bool open( const char* filename, int fourcc,
-        double fps, int width, int height, bool isColor );
+               double fps, int width, int height, bool isColor );
     void close();
     bool writeFrame( const unsigned char* data, int step, int width, int height, int cn, int origin );
 
@@ -849,6 +825,8 @@ struct CvVideoWriter_FFMPEG
     AVStream        * video_st;
     int               input_pix_fmt;
     Image_FFMPEG      temp_image;
+    int               frame_width, frame_height;
+    bool              ok;
 #if defined(HAVE_FFMPEG_SWSCALE)
     struct SwsContext *img_convert_ctx;
 #endif
@@ -858,34 +836,34 @@ static const char * icvFFMPEGErrStr(int err)
 {
 #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
     switch(err) {
-        case AVERROR_BSF_NOT_FOUND:
-            return "Bitstream filter not found";
-        case AVERROR_DECODER_NOT_FOUND:
-            return "Decoder not found";
-        case AVERROR_DEMUXER_NOT_FOUND:
-            return "Demuxer not found";
-        case AVERROR_ENCODER_NOT_FOUND:
-            return "Encoder not found";
-        case AVERROR_EOF:
-            return "End of file";
-        case AVERROR_EXIT:
-            return "Immediate exit was requested; the called function should not be restarted";
-        case AVERROR_FILTER_NOT_FOUND:
-            return "Filter not found";
-        case AVERROR_INVALIDDATA:
-            return "Invalid data found when processing input";
-        case AVERROR_MUXER_NOT_FOUND:
-            return "Muxer not found";
-        case AVERROR_OPTION_NOT_FOUND:
-            return "Option not found";
-        case AVERROR_PATCHWELCOME:
-            return "Not yet implemented in FFmpeg, patches welcome";
-        case AVERROR_PROTOCOL_NOT_FOUND:
-            return "Protocol not found";
-        case AVERROR_STREAM_NOT_FOUND:
-            return "Stream not found";
-        default:
-            break;
+    case AVERROR_BSF_NOT_FOUND:
+        return "Bitstream filter not found";
+    case AVERROR_DECODER_NOT_FOUND:
+        return "Decoder not found";
+    case AVERROR_DEMUXER_NOT_FOUND:
+        return "Demuxer not found";
+    case AVERROR_ENCODER_NOT_FOUND:
+        return "Encoder not found";
+    case AVERROR_EOF:
+        return "End of file";
+    case AVERROR_EXIT:
+        return "Immediate exit was requested; the called function should not be restarted";
+    case AVERROR_FILTER_NOT_FOUND:
+        return "Filter not found";
+    case AVERROR_INVALIDDATA:
+        return "Invalid data found when processing input";
+    case AVERROR_MUXER_NOT_FOUND:
+        return "Muxer not found";
+    case AVERROR_OPTION_NOT_FOUND:
+        return "Option not found";
+    case AVERROR_PATCHWELCOME:
+        return "Not yet implemented in FFmpeg, patches welcome";
+    case AVERROR_PROTOCOL_NOT_FOUND:
+        return "Protocol not found";
+    case AVERROR_STREAM_NOT_FOUND:
+        return "Stream not found";
+    default:
+        break;
     }
 #else
     switch(err) {
@@ -925,9 +903,11 @@ void CvVideoWriter_FFMPEG::init()
     video_st = 0;
     input_pix_fmt = 0;
     memset(&temp_image, 0, sizeof(temp_image));
-       #if defined(HAVE_FFMPEG_SWSCALE)
-               img_convert_ctx = 0;
-       #endif
+#if defined(HAVE_FFMPEG_SWSCALE)
+    img_convert_ctx = 0;
+#endif
+    frame_width = frame_height = 0;
+    ok = false;
 }
 
 /**
@@ -952,7 +932,7 @@ static AVFrame * icv_alloc_picture_FFMPEG(int pix_fmt, int width, int height, bo
             return NULL;
         }
         avpicture_fill((AVPicture *)picture, picture_buf,
-                (PixelFormat) pix_fmt, width, height);
+                       (PixelFormat) pix_fmt, width, height);
     }
     else {
     }
@@ -970,28 +950,28 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc,
     int frame_rate, frame_rate_base;
     AVCodec *codec;
 
-    #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 10, 0)
-        st = avformat_new_stream(oc, 0);
-    #else
-        st = av_new_stream(oc, 0);
-    #endif
+#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 10, 0)
+    st = avformat_new_stream(oc, 0);
+#else
+    st = av_new_stream(oc, 0);
+#endif
 
     if (!st) {
         CV_WARN("Could not allocate stream");
         return NULL;
     }
 
-       #if LIBAVFORMAT_BUILD > 4628
-               c = st->codec;
-       #else
-               c = &(st->codec);
-       #endif
+#if LIBAVFORMAT_BUILD > 4628
+    c = st->codec;
+#else
+    c = &(st->codec);
+#endif
 
-       #if LIBAVFORMAT_BUILD > 4621
-               c->codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
-       #else
-               c->codec_id = oc->oformat->video_codec;
-       #endif
+#if LIBAVFORMAT_BUILD > 4621
+    c->codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
+#else
+    c->codec_id = oc->oformat->video_codec;
+#endif
 
     if(codec_id != CODEC_ID_NONE){
         c->codec_id = codec_id;
@@ -1003,8 +983,15 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc,
     c->codec_type = AVMEDIA_TYPE_VIDEO;
 
     /* put sample parameters */
+    unsigned long long lbit_rate = static_cast<unsigned long long>(bitrate);
+    lbit_rate += (bitrate / 4);
+    lbit_rate = std::min(lbit_rate, static_cast<unsigned long long>(std::numeric_limits<int>::max()));
     c->bit_rate = bitrate;
 
+    // took advice from
+    // http://ffmpeg-users.933282.n4.nabble.com/warning-clipping-1-dct-coefficients-to-127-127-td934297.html
+    c->qmin = 3;
+
     /* resolution must be a multiple of two */
     c->width = w;
     c->height = h;
@@ -1019,30 +1006,30 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc,
         frame_rate_base*=10;
         frame_rate=(int)(fps*frame_rate_base + 0.5);
     }
-       #if LIBAVFORMAT_BUILD > 4752
-               c->time_base.den = frame_rate;
-               c->time_base.num = frame_rate_base;
-               /* adjust time base for supported framerates */
-               if(codec && codec->supported_framerates){
-                       const AVRational *p= codec->supported_framerates;
-                       AVRational req = {frame_rate, frame_rate_base};
-                       const AVRational *best=NULL;
-                       AVRational best_error= {INT_MAX, 1};
-                       for(; p->den!=0; p++){
-                               AVRational error= av_sub_q(req, *p);
-                               if(error.num <0) error.num *= -1;
-                               if(av_cmp_q(error, best_error) < 0){
-                                       best_error= error;
-                                       best= p;
-                               }
-                       }
-                       c->time_base.den= best->num;
-                       c->time_base.num= best->den;
-               }
-       #else
-               c->frame_rate = frame_rate;
-               c->frame_rate_base = frame_rate_base;
-       #endif
+#if LIBAVFORMAT_BUILD > 4752
+    c->time_base.den = frame_rate;
+    c->time_base.num = frame_rate_base;
+    /* adjust time base for supported framerates */
+    if(codec && codec->supported_framerates){
+        const AVRational *p= codec->supported_framerates;
+        AVRational req = {frame_rate, frame_rate_base};
+        const AVRational *best=NULL;
+        AVRational best_error= {INT_MAX, 1};
+        for(; p->den!=0; p++){
+            AVRational error= av_sub_q(req, *p);
+            if(error.num <0) error.num *= -1;
+            if(av_cmp_q(error, best_error) < 0){
+                best_error= error;
+                best= p;
+            }
+        }
+        c->time_base.den= best->num;
+        c->time_base.num= best->den;
+    }
+#else
+    c->frame_rate = frame_rate;
+    c->frame_rate_base = frame_rate_base;
+#endif
 
     c->gop_size = 12; /* emit one intra frame every twelve frames at most */
     c->pix_fmt = (PixelFormat) pixel_format;
@@ -1057,26 +1044,28 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc,
         /* avoid FFMPEG warning 'clipping 1 dct coefficients...' */
         c->mb_decision=2;
     }
-       #if LIBAVCODEC_VERSION_INT>0x000409
-               // some formats want stream headers to be seperate
-               if(oc->oformat->flags & AVFMT_GLOBALHEADER)
-               {
-                       c->flags |= CODEC_FLAG_GLOBAL_HEADER;
-               }
-       #endif
+#if LIBAVCODEC_VERSION_INT>0x000409
+    // some formats want stream headers to be seperate
+    if(oc->oformat->flags & AVFMT_GLOBALHEADER)
+    {
+        c->flags |= CODEC_FLAG_GLOBAL_HEADER;
+    }
+#endif
 
     return st;
 }
 
+static const int OPENCV_NO_FRAMES_WRITTEN_CODE = 1000;
+
 int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st, uint8_t * outbuf, uint32_t outbuf_size, AVFrame * picture )
 {
-       #if LIBAVFORMAT_BUILD > 4628
-               AVCodecContext * c = video_st->codec;
-       #else
-               AVCodecContext * c = &(video_st->codec);
-       #endif
+#if LIBAVFORMAT_BUILD > 4628
+    AVCodecContext * c = video_st->codec;
+#else
+    AVCodecContext * c = &(video_st->codec);
+#endif
     int out_size;
-    int ret;
+    int ret = 0;
 
     if (oc->oformat->flags & AVFMT_RAWPICTURE) {
         /* raw video case. The API will change slightly in the near
@@ -1084,9 +1073,9 @@ int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st, uint8_
         AVPacket pkt;
         av_init_packet(&pkt);
 
-        #ifndef PKT_FLAG_KEY
-            #define PKT_FLAG_KEY AV_PKT_FLAG_KEY
-        #endif
+#ifndef PKT_FLAG_KEY
+#define PKT_FLAG_KEY AV_PKT_FLAG_KEY
+#endif
 
         pkt.flags |= PKT_FLAG_KEY;
         pkt.stream_index= video_st->index;
@@ -1102,11 +1091,12 @@ int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st, uint8_
             AVPacket pkt;
             av_init_packet(&pkt);
 
-       #if LIBAVFORMAT_BUILD > 4752
+#if LIBAVFORMAT_BUILD > 4752
+            if(c->coded_frame->pts != (int64_t)AV_NOPTS_VALUE)
                                pkt.pts = av_rescale_q(c->coded_frame->pts, c->time_base, video_st->time_base);
-       #else
-                               pkt.pts = c->coded_frame->pts;
-       #endif
+#else
+            pkt.pts = c->coded_frame->pts;
+#endif
             if(c->coded_frame->key_frame)
                 pkt.flags |= PKT_FLAG_KEY;
             pkt.stream_index= video_st->index;
@@ -1116,64 +1106,67 @@ int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st, uint8_
             /* write the compressed frame in the media file */
             ret = av_write_frame(oc, &pkt);
         } else {
-            ret = 0;
+            ret = OPENCV_NO_FRAMES_WRITTEN_CODE;
         }
     }
-    if (ret != 0) return -1;
-
-    return 0;
+    return ret;
 }
 
 /// write a frame with FFMPEG
 bool CvVideoWriter_FFMPEG::writeFrame( const unsigned char* data, int step, int width, int height, int cn, int origin )
 {
     bool ret = false;
+    
+    if( (width & -2) != frame_width || (height & -2) != frame_height || !data )
+        return false;
+    width = frame_width;
+    height = frame_height;
 
     // typecast from opaque data type to implemented struct
-       #if LIBAVFORMAT_BUILD > 4628
-               AVCodecContext *c = video_st->codec;
-       #else
-               AVCodecContext *c = &(video_st->codec);
-       #endif
+#if LIBAVFORMAT_BUILD > 4628
+    AVCodecContext *c = video_st->codec;
+#else
+    AVCodecContext *c = &(video_st->codec);
+#endif
 
-       #if LIBAVFORMAT_BUILD < 5231
-               // It is not needed in the latest versions of the ffmpeg
-               if( c->codec_id == CODEC_ID_RAWVIDEO && origin != 1 )
-               {
-                       if( !temp_image.data )
-                       {
-                               temp_image.step = (width*cn + 3) & -4;
-                               temp_image.width = width;
-                               temp_image.height = height;
-                               temp_image.cn = cn;
-                               temp_image.data = (unsigned char*)malloc(temp_image.step*temp_image.height);
-                       }
-                       for( int y = 0; y < height; y++ )
-                               memcpy(temp_image.data + y*temp_image.step, data + (height-1-y)*step, width*cn);
-                       data = temp_image.data;
-                       step = temp_image.step;
-               }
-       #else
-               if( width*cn != step )
-               {
-                       if( !temp_image.data )
-                       {
-                               temp_image.step = width*cn;
-                               temp_image.width = width;
-                               temp_image.height = height;
-                               temp_image.cn = cn;
-                               temp_image.data = (unsigned char*)malloc(temp_image.step*temp_image.height);
-                       }
-                       if (origin == 1)
-                               for( int y = 0; y < height; y++ )
-                                       memcpy(temp_image.data + y*temp_image.step, data + (height-1-y)*step, temp_image.step);
-                       else
-                               for( int y = 0; y < height; y++ )
-                                       memcpy(temp_image.data + y*temp_image.step, data + y*step, temp_image.step);
-                       data = temp_image.data;
-                       step = temp_image.step;
-               }
-       #endif
+#if LIBAVFORMAT_BUILD < 5231
+    // It is not needed in the latest versions of the ffmpeg
+    if( c->codec_id == CODEC_ID_RAWVIDEO && origin != 1 )
+    {
+        if( !temp_image.data )
+        {
+            temp_image.step = (width*cn + 3) & -4;
+            temp_image.width = width;
+            temp_image.height = height;
+            temp_image.cn = cn;
+            temp_image.data = (unsigned char*)malloc(temp_image.step*temp_image.height);
+        }
+        for( int y = 0; y < height; y++ )
+            memcpy(temp_image.data + y*temp_image.step, data + (height-1-y)*step, width*cn);
+        data = temp_image.data;
+        step = temp_image.step;
+    }
+#else
+    if( width*cn != step )
+    {
+        if( !temp_image.data )
+        {
+            temp_image.step = width*cn;
+            temp_image.width = width;
+            temp_image.height = height;
+            temp_image.cn = cn;
+            temp_image.data = (unsigned char*)malloc(temp_image.step*temp_image.height);
+        }
+        if (origin == 1)
+            for( int y = 0; y < height; y++ )
+                memcpy(temp_image.data + y*temp_image.step, data + (height-1-y)*step, temp_image.step);
+        else
+            for( int y = 0; y < height; y++ )
+                memcpy(temp_image.data + y*temp_image.step, data + y*step, temp_image.step);
+        data = temp_image.data;
+        step = temp_image.step;
+    }
+#endif
 
     // check parameters
     if (input_pix_fmt == PIX_FMT_BGR24) {
@@ -1194,38 +1187,38 @@ bool CvVideoWriter_FFMPEG::writeFrame( const unsigned char* data, int step, int
         assert( input_picture );
         // let input_picture point to the raw data buffer of 'image'
         avpicture_fill((AVPicture *)input_picture, (uint8_t *) data,
-                (PixelFormat)input_pix_fmt, width, height);
+                       (PixelFormat)input_pix_fmt, width, height);
 
 #if !defined(HAVE_FFMPEG_SWSCALE)
         // convert to the color format needed by the codec
         if( img_convert((AVPicture *)picture, c->pix_fmt,
-                    (AVPicture *)input_picture, (PixelFormat)input_pix_fmt,
-                    width, height) < 0){
+                        (AVPicture *)input_picture, (PixelFormat)input_pix_fmt,
+                        width, height) < 0){
             return false;
         }
 #else
         img_convert_ctx = sws_getContext(width,
-                     height,
-                     (PixelFormat)input_pix_fmt,
-                     c->width,
-                     c->height,
-                     c->pix_fmt,
-                     SWS_BICUBIC,
-                     NULL, NULL, NULL);
-
-            if ( sws_scale(img_convert_ctx, input_picture->data,
-                     input_picture->linesize, 0,
-                     height,
-                     picture->data, picture->linesize) < 0 )
-            {
-               return false;
-            }
+                                         height,
+                                         (PixelFormat)input_pix_fmt,
+                                         c->width,
+                                         c->height,
+                                         c->pix_fmt,
+                                         SWS_BICUBIC,
+                                         NULL, NULL, NULL);
+
+        if ( sws_scale(img_convert_ctx, input_picture->data,
+                       input_picture->linesize, 0,
+                       height,
+                       picture->data, picture->linesize) < 0 )
+        {
+            return false;
+        }
         sws_freeContext(img_convert_ctx);
 #endif
     }
     else{
         avpicture_fill((AVPicture *)picture, (uint8_t *) data,
-                (PixelFormat)input_pix_fmt, width, height);
+                       (PixelFormat)input_pix_fmt, width, height);
     }
 
     ret = icv_av_write_frame_FFMPEG( oc, video_st, outbuf, outbuf_size, picture) >= 0;
@@ -1248,332 +1241,373 @@ void CvVideoWriter_FFMPEG::close()
     // TODO -- do we need to account for latency here?
 
     /* write the trailer, if any */
-    av_write_trailer(oc);
+    if(ok && oc)
+    {
+        if (!(oc->oformat->flags & AVFMT_RAWPICTURE))
+        {
+            for(;;)
+            {
+                int ret = icv_av_write_frame_FFMPEG( oc, video_st, outbuf, outbuf_size, NULL);
+                if( ret == OPENCV_NO_FRAMES_WRITTEN_CODE || ret < 0 )
+                    break;
+            }
+        }
+        av_write_trailer(oc);
+    }
 
     // free pictures
-       #if LIBAVFORMAT_BUILD > 4628
-               if( video_st->codec->pix_fmt != input_pix_fmt){
-       #else
+#if LIBAVFORMAT_BUILD > 4628
+    if( video_st->codec->pix_fmt != input_pix_fmt){
+#else
                if( video_st->codec.pix_fmt != input_pix_fmt){
-       #endif
-        if(picture->data[0])
-           free(picture->data[0]);
-        picture->data[0] = 0;
-    }
-    av_free(picture);
+#endif
+            if(picture->data[0])
+                free(picture->data[0]);
+            picture->data[0] = 0;
+        }
+        av_free(picture);
 
-    if (input_picture) {
-        av_free(input_picture);
-    }
+        if (input_picture) {
+            av_free(input_picture);
+        }
 
-    /* close codec */
-       #if LIBAVFORMAT_BUILD > 4628
+        /* close codec */
+#if LIBAVFORMAT_BUILD > 4628
                avcodec_close(video_st->codec);
-       #else
+#else
                avcodec_close(&(video_st->codec));
-       #endif
+#endif
 
-    av_free(outbuf);
+        av_free(outbuf);
 
-    /* free the streams */
-    for(i = 0; i < oc->nb_streams; i++) {
-        av_freep(&oc->streams[i]->codec);
-        av_freep(&oc->streams[i]);
-    }
+        /* free the streams */
+        for(i = 0; i < oc->nb_streams; i++) {
+            av_freep(&oc->streams[i]->codec);
+            av_freep(&oc->streams[i]);
+        }
 
-    if (!(fmt->flags & AVFMT_NOFILE)) {
-        /* close the output file */
+        if (!(fmt->flags & AVFMT_NOFILE)) {
+            /* close the output file */
 
-       #if LIBAVCODEC_VERSION_INT < ((52<<16)+(123<<8)+0)
-       #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(49<<8)+0)
+#if LIBAVCODEC_VERSION_INT < ((52<<16)+(123<<8)+0)
+#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(49<<8)+0)
                        url_fclose(oc->pb);
-       #else
+#else
                        url_fclose(&oc->pb);
-       #endif
-       #else
+#endif
+#else
                        avio_close(oc->pb);
-       #endif
+#endif
 
-    }
+        }
 
-    /* free the stream */
-    av_free(oc);
+        /* free the stream */
+        av_free(oc);
 
-    if( temp_image.data )
-    {
-        free(temp_image.data);
-        temp_image.data = 0;
-    }
+        if( temp_image.data )
+        {
+            free(temp_image.data);
+            temp_image.data = 0;
+        }
 
-    init();
-}
+        init();
+    }
 
-/// Create a video writer object that uses FFMPEG
-bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
-        double fps, int width, int height, bool is_color )
-{
-    CodecID codec_id = CODEC_ID_NONE;
-    int err, codec_pix_fmt, bitrate_scale=64;
+    /// Create a video writer object that uses FFMPEG
+    bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
+                                     double fps, int width, int height, bool is_color )
+    {
+        CodecID codec_id = CODEC_ID_NONE;
+        int err, codec_pix_fmt;
+        double bitrate_scale = 1;
 
-    close();
+        close();
 
-    // check arguments
-    assert (filename);
-    assert (fps > 0);
-    assert (width > 0  &&  height > 0);
+        // check arguments
+        if( !filename )
+            return false;
+        if(fps <= 0)
+            return false;
+        
+        // we allow frames of odd width or height, but in this case we truncate
+        // the rightmost column/the bottom row. Probably, this should be handled more elegantly,
+        // but some internal functions inside FFMPEG swscale require even width/height.
+        width &= -2;
+        height &= -2;
+        if( width <= 0 || height <= 0 )
+            return false;
 
-    // tell FFMPEG to register codecs
-    av_register_all ();
+        // tell FFMPEG to register codecs
+        av_register_all();
+        av_log_set_level(AV_LOG_ERROR);
 
-    /* auto detect the output format from the name and fourcc code. */
+        /* auto detect the output format from the name and fourcc code. */
 
-       #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
+#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
                fmt = av_guess_format(NULL, filename, NULL);
-       #else
+#else
                fmt = guess_format(NULL, filename, NULL);
-       #endif
+#endif
 
-    if (!fmt)
-        return false;
+        if (!fmt)
+            return false;
 
-    /* determine optimal pixel format */
-    if (is_color) {
-        input_pix_fmt = PIX_FMT_BGR24;
-    }
-    else {
-        input_pix_fmt = PIX_FMT_GRAY8;
-    }
+        /* determine optimal pixel format */
+        if (is_color) {
+            input_pix_fmt = PIX_FMT_BGR24;
+        }
+        else {
+            input_pix_fmt = PIX_FMT_GRAY8;
+        }
 
-    /* Lookup codec_id for given fourcc */
-       #if LIBAVCODEC_VERSION_INT<((51<<16)+(49<<8)+0)
+        /* Lookup codec_id for given fourcc */
+#if LIBAVCODEC_VERSION_INT<((51<<16)+(49<<8)+0)
                if( (codec_id = codec_get_bmp_id( fourcc )) == CODEC_ID_NONE )
                        return false;
-       #else
+#else
                const struct AVCodecTag * tags[] = { codec_bmp_tags, NULL};
                if( (codec_id = av_codec_get_id(tags, fourcc)) == CODEC_ID_NONE )
                        return false;
-       #endif
+#endif
 
-    // alloc memory for context
-       #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
+        // alloc memory for context
+#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
                oc = avformat_alloc_context();
-       #else
+#else
                oc = av_alloc_format_context();
-       #endif
-    assert (oc);
+#endif
+        assert (oc);
 
-    /* set file name */
-    oc->oformat = fmt;
-    snprintf(oc->filename, sizeof(oc->filename), "%s", filename);
+        /* set file name */
+        oc->oformat = fmt;
+        snprintf(oc->filename, sizeof(oc->filename), "%s", filename);
 
-    /* set some options */
-    oc->max_delay = (int)(0.7*AV_TIME_BASE);  /* This reduces buffer underrun warnings with MPEG */
+        /* set some options */
+        oc->max_delay = (int)(0.7*AV_TIME_BASE);  /* This reduces buffer underrun warnings with MPEG */
 
-    // set a few optimal pixel formats for lossless codecs of interest..
-    switch (codec_id) {
-       #if LIBAVCODEC_VERSION_INT>((50<<16)+(1<<8)+0)
+        // set a few optimal pixel formats for lossless codecs of interest..
+        switch (codec_id) {
+#if LIBAVCODEC_VERSION_INT>((50<<16)+(1<<8)+0)
                case CODEC_ID_JPEGLS:
                        // BGR24 or GRAY8 depending on is_color...
                        codec_pix_fmt = input_pix_fmt;
                        break;
-       #endif
-    case CODEC_ID_HUFFYUV:
-        codec_pix_fmt = PIX_FMT_YUV422P;
-        break;
-    case CODEC_ID_MJPEG:
-    case CODEC_ID_LJPEG:
-      codec_pix_fmt = PIX_FMT_YUVJ420P;
-      bitrate_scale = 128;
-      break;
-    case CODEC_ID_RAWVIDEO:
-        codec_pix_fmt = input_pix_fmt == PIX_FMT_GRAY8 ||
-                        input_pix_fmt == PIX_FMT_GRAY16LE ||
-                        input_pix_fmt == PIX_FMT_GRAY16BE ? input_pix_fmt : PIX_FMT_YUV420P;
-        break;
-    default:
-        // good for lossy formats, MPEG, etc.
-        codec_pix_fmt = PIX_FMT_YUV420P;
-        break;
-    }
-
-    // TODO -- safe to ignore output audio stream?
-    video_st = icv_add_video_stream_FFMPEG(oc, codec_id,
-            width, height, width*height*bitrate_scale,
-            fps, codec_pix_fmt);
+#endif
+        case CODEC_ID_HUFFYUV:
+            codec_pix_fmt = PIX_FMT_YUV422P;
+            break;
+        case CODEC_ID_MJPEG:
+        case CODEC_ID_LJPEG:
+            codec_pix_fmt = PIX_FMT_YUVJ420P;
+            bitrate_scale = 3;
+            break;
+        case CODEC_ID_RAWVIDEO:
+            codec_pix_fmt = input_pix_fmt == PIX_FMT_GRAY8 ||
+                            input_pix_fmt == PIX_FMT_GRAY16LE ||
+                            input_pix_fmt == PIX_FMT_GRAY16BE ? input_pix_fmt : PIX_FMT_YUV420P;
+            break;
+        default:
+            // good for lossy formats, MPEG, etc.
+            codec_pix_fmt = PIX_FMT_YUV420P;
+            break;
+        }
+        
+        double bitrate = MIN(bitrate_scale*fps*width*height, (double)INT_MAX/2);
 
+        // TODO -- safe to ignore output audio stream?
+        video_st = icv_add_video_stream_FFMPEG(oc, codec_id,
+                                               width, height, (int)(bitrate + 0.5),
+                                               fps, codec_pix_fmt);
 
-    /* set the output parameters (must be done even if no
+        /* set the output parameters (must be done even if no
        parameters). */
-       #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
+#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
         if (av_set_parameters(oc, NULL) < 0) {
-        return false;
-    }
-    #endif
+            return false;
+        }
+#endif
 
-       #if FF_API_DUMP_FORMAT
+#if 0
+#if FF_API_DUMP_FORMAT
                dump_format(oc, 0, filename, 1);
-       #else
+#else
                av_dump_format(oc, 0, filename, 1);
-       #endif
+#endif
+#endif
 
-    /* now that all the parameters are set, we can open the audio and
+        /* now that all the parameters are set, we can open the audio and
        video codecs and allocate the necessary encode buffers */
-    if (!video_st){
-        return false;
-    }
+        if (!video_st){
+            return false;
+        }
 
-    AVCodec *codec;
-    AVCodecContext *c;
+        AVCodec *codec;
+        AVCodecContext *c;
 
-       #if LIBAVFORMAT_BUILD > 4628
+#if LIBAVFORMAT_BUILD > 4628
                c = (video_st->codec);
-       #else
+#else
                c = &(video_st->codec);
-       #endif
+#endif
 
-    c->codec_tag = fourcc;
-    /* find the video encoder */
-    codec = avcodec_find_encoder(c->codec_id);
-    if (!codec) {
-        return false;
-    }
+        c->codec_tag = fourcc;
+        /* find the video encoder */
+        codec = avcodec_find_encoder(c->codec_id);
+        if (!codec) {
+            fprintf(stderr, "Could not find encoder for codec id %d: %s", c->codec_id, icvFFMPEGErrStr(
+            #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
+                    AVERROR_ENCODER_NOT_FOUND
+            #else
+                    -1
+            #endif
+                    ));
+            return false;
+        }
 
-    c->bit_rate_tolerance = c->bit_rate;
+        unsigned long long lbit_rate = static_cast<unsigned long long>(c->bit_rate);
+        lbit_rate += (bitrate / 4);
+        lbit_rate = std::min(lbit_rate, static_cast<unsigned long long>(std::numeric_limits<int>::max()));
+        c->bit_rate_tolerance = static_cast<int>(lbit_rate);
 
-    /* open the codec */
-    if ((err=
-         #if LIBAVCODEC_VERSION_INT >= ((53<<16)+(8<<8)+0)
+        /* open the codec */
+        if ((err=
+#if LIBAVCODEC_VERSION_INT >= ((53<<16)+(8<<8)+0)
              avcodec_open2(c, codec, NULL)
-         #else
+#else
              avcodec_open(c, codec)
-         #endif
-        ) < 0) {
-        char errtext[256];
-        sprintf(errtext, "Could not open codec '%s': %s", codec->name, icvFFMPEGErrStr(err));
-        return false;
-    }
+#endif
+             ) < 0) {
+            fprintf(stderr, "Could not open codec '%s': %s", codec->name, icvFFMPEGErrStr(err));
+            return false;
+        }
 
-    outbuf = NULL;
+        outbuf = NULL;
 
-    if (!(oc->oformat->flags & AVFMT_RAWPICTURE)) {
-        /* allocate output buffer */
-        /* assume we will never get codec output with more than 4 bytes per pixel... */
-        outbuf_size = width*height*4;
-        outbuf = (uint8_t *) av_malloc(outbuf_size);
-    }
+        if (!(oc->oformat->flags & AVFMT_RAWPICTURE)) {
+            /* allocate output buffer */
+            /* assume we will never get codec output with more than 4 bytes per pixel... */
+            outbuf_size = width*height*4;
+            outbuf = (uint8_t *) av_malloc(outbuf_size);
+        }
 
-    bool need_color_convert;
-    need_color_convert = (c->pix_fmt != input_pix_fmt);
+        bool need_color_convert;
+        need_color_convert = (c->pix_fmt != input_pix_fmt);
 
-    /* allocate the encoded raw picture */
-    picture = icv_alloc_picture_FFMPEG(c->pix_fmt, c->width, c->height, need_color_convert);
-    if (!picture) {
-        return false;
-    }
+        /* allocate the encoded raw picture */
+        picture = icv_alloc_picture_FFMPEG(c->pix_fmt, c->width, c->height, need_color_convert);
+        if (!picture) {
+            return false;
+        }
 
-    /* if the output format is not our input format, then a temporary
+        /* if the output format is not our input format, then a temporary
        picture of the input format is needed too. It is then converted
        to the required output format */
-    input_picture = NULL;
-    if ( need_color_convert ) {
-        input_picture = icv_alloc_picture_FFMPEG(input_pix_fmt, c->width, c->height, false);
-        if (!input_picture) {
-            return false;
+        input_picture = NULL;
+        if ( need_color_convert ) {
+            input_picture = icv_alloc_picture_FFMPEG(input_pix_fmt, c->width, c->height, false);
+            if (!input_picture) {
+                return false;
+            }
         }
-    }
 
-    /* open the output file, if needed */
-    if (!(fmt->flags & AVFMT_NOFILE)) {
-       #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
+        /* open the output file, if needed */
+        if (!(fmt->flags & AVFMT_NOFILE)) {
+#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
                        if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0)
-       #else
+#else
                 if (avio_open(&oc->pb, filename, AVIO_FLAG_WRITE) < 0)
-       #endif
+#endif
+                {
+                return false;
+            }
+        }
+
+        /* write the stream header, if any */
+        err=avformat_write_header(oc, NULL);
+        if(err < 0)
         {
+            close();
+            remove(filename);
             return false;
         }
+        frame_width = width;
+        frame_height = height;
+        ok = true;
+        return true;
     }
 
-    /* write the stream header, if any */
-    avformat_write_header(oc, NULL);
-
-    return true;
-}
-
-
-
-CvCapture_FFMPEG* cvCreateFileCapture_FFMPEG( const char* filename )
-{
-    CvCapture_FFMPEG* capture = (CvCapture_FFMPEG*)malloc(sizeof(*capture));
-    capture->init();
-    if( capture->open( filename ))
-        return capture;
-    capture->close();
-    free(capture);
-    return 0;
-}
 
 
-void cvReleaseCapture_FFMPEG(CvCapture_FFMPEG** capture)
-{
-    if( capture && *capture )
+    CvCapture_FFMPEG* cvCreateFileCapture_FFMPEG( const char* filename )
     {
-        (*capture)->close();
-        free(*capture);
-        *capture = 0;
+        CvCapture_FFMPEG* capture = (CvCapture_FFMPEG*)malloc(sizeof(*capture));
+        capture->init();
+        if( capture->open( filename ))
+            return capture;
+        capture->close();
+        free(capture);
+        return 0;
     }
-}
 
-int cvSetCaptureProperty_FFMPEG(CvCapture_FFMPEG* capture, int prop_id, double value)
-{
-    return capture->setProperty(prop_id, value);
-}
 
-double cvGetCaptureProperty_FFMPEG(CvCapture_FFMPEG* capture, int prop_id)
-{
-    return capture->getProperty(prop_id);
-}
+    void cvReleaseCapture_FFMPEG(CvCapture_FFMPEG** capture)
+    {
+        if( capture && *capture )
+        {
+            (*capture)->close();
+            free(*capture);
+            *capture = 0;
+        }
+    }
 
-int cvGrabFrame_FFMPEG(CvCapture_FFMPEG* capture)
-{
-    return capture->grabFrame();
-}
+    int cvSetCaptureProperty_FFMPEG(CvCapture_FFMPEG* capture, int prop_id, double value)
+    {
+        return capture->setProperty(prop_id, value);
+    }
 
-int cvRetrieveFrame_FFMPEG(CvCapture_FFMPEG* capture, unsigned char** data, int* step, int* width, int* height, int* cn)
-{
-    return capture->retrieveFrame(0, data, step, width, height, cn);
-}
+    double cvGetCaptureProperty_FFMPEG(CvCapture_FFMPEG* capture, int prop_id)
+    {
+        return capture->getProperty(prop_id);
+    }
 
+    int cvGrabFrame_FFMPEG(CvCapture_FFMPEG* capture)
+    {
+        return capture->grabFrame();
+    }
 
+    int cvRetrieveFrame_FFMPEG(CvCapture_FFMPEG* capture, unsigned char** data, int* step, int* width, int* height, int* cn)
+    {
+        return capture->retrieveFrame(0, data, step, width, height, cn);
+    }
 
-CvVideoWriter_FFMPEG* cvCreateVideoWriter_FFMPEG( const char* filename, int fourcc, double fps,
-                                                  int width, int height, int isColor )
-{
-    CvVideoWriter_FFMPEG* writer = (CvVideoWriter_FFMPEG*)malloc(sizeof(*writer));
-    writer->init();
-    if( writer->open( filename, fourcc, fps, width, height, isColor != 0 ))
-        return writer;
-    writer->close();
-    free(writer);
-    return 0;
-}
+    CvVideoWriter_FFMPEG* cvCreateVideoWriter_FFMPEG( const char* filename, int fourcc, double fps,
+                                                      int width, int height, int isColor )
+    {
+        CvVideoWriter_FFMPEG* writer = (CvVideoWriter_FFMPEG*)malloc(sizeof(*writer));
+        writer->init();
+        if( writer->open( filename, fourcc, fps, width, height, isColor != 0 ))
+            return writer;
+        writer->close();
+        free(writer);
+        return 0;
+    }
 
 
-void cvReleaseVideoWriter_FFMPEG( CvVideoWriter_FFMPEG** writer )
-{
-    if( writer && *writer )
+    void cvReleaseVideoWriter_FFMPEG( CvVideoWriter_FFMPEG** writer )
     {
-        (*writer)->close();
-        free(*writer);
-        *writer = 0;
+        if( writer && *writer )
+        {
+            (*writer)->close();
+            free(*writer);
+            *writer = 0;
+        }
     }
-}
 
 
-int cvWriteFrame_FFMPEG( CvVideoWriter_FFMPEG* writer,
-                         const unsigned char* data, int step,
-                         int width, int height, int cn, int origin)
-{
-    return writer->writeFrame(data, step, width, height, cn, origin);
-}
+    int cvWriteFrame_FFMPEG( CvVideoWriter_FFMPEG* writer,
+                             const unsigned char* data, int step,
+                             int width, int height, int cn, int origin)
+    {
+        return writer->writeFrame(data, step, width, height, cn, origin);
+    }
 
diff --git a/modules/highgui/src/cap_ffmpeg_v2.cpp b/modules/highgui/src/cap_ffmpeg_v2.cpp
deleted file mode 100644 (file)
index cd972dd..0000000
+++ /dev/null
@@ -1,251 +0,0 @@
-/*M///////////////////////////////////////////////////////////////////////////////////////
-//
-//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
-//
-//  By downloading, copying, installing or using the software you agree to this license.
-//  If you do not agree to this license, do not download, install,
-//  copy or use the software.
-//
-//
-//                          License Agreement
-//                For Open Source Computer Vision Library
-//
-// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
-// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
-// Third party copyrights are property of their respective owners.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-//   * Redistribution's of source code must retain the above copyright notice,
-//     this list of conditions and the following disclaimer.
-//
-//   * Redistribution's in binary form must reproduce the above copyright notice,
-//     this list of conditions and the following disclaimer in the documentation
-//     and/or other materials provided with the distribution.
-//
-//   * The name of the copyright holders may not be used to endorse or promote products
-//     derived from this software without specific prior written permission.
-//
-// This software is provided by the copyright holders and contributors "as is" and
-// any express or implied warranties, including, but not limited to, the implied
-// warranties of merchantability and fitness for a particular purpose are disclaimed.
-// In no event shall the Intel Corporation or contributors be liable for any direct,
-// indirect, incidental, special, exemplary, or consequential damages
-// (including, but not limited to, procurement of substitute goods or services;
-// loss of use, data, or profits; or business interruption) however caused
-// and on any theory of liability, whether in contract, strict liability,
-// or tort (including negligence or otherwise) arising in any way out of
-// the use of this software, even if advised of the possibility of such damage.
-//
-//M*/
-
-#include "precomp.hpp"
-
-#ifdef HAVE_FFMPEG
-#include "cap_ffmpeg_impl_v2.hpp"
-#else
-#include "cap_ffmpeg_api.hpp"
-#endif
-
-static CvCreateFileCapture_Plugin icvCreateFileCapture_FFMPEG_p = 0;
-static CvReleaseCapture_Plugin icvReleaseCapture_FFMPEG_p = 0;
-static CvGrabFrame_Plugin icvGrabFrame_FFMPEG_p = 0;
-static CvRetrieveFrame_Plugin icvRetrieveFrame_FFMPEG_p = 0;
-static CvSetCaptureProperty_Plugin icvSetCaptureProperty_FFMPEG_p = 0;
-static CvGetCaptureProperty_Plugin icvGetCaptureProperty_FFMPEG_p = 0;
-static CvCreateVideoWriter_Plugin icvCreateVideoWriter_FFMPEG_p = 0;
-static CvReleaseVideoWriter_Plugin icvReleaseVideoWriter_FFMPEG_p = 0;
-static CvWriteFrame_Plugin icvWriteFrame_FFMPEG_p = 0;
-
-static void
-icvInitFFMPEG(void)
-{
-    static int ffmpegInitialized = 0;
-    if( !ffmpegInitialized )
-    {
-    #if defined WIN32 || defined _WIN32
-        const char* module_name = "opencv_ffmpeg"
-        #if (defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __x86_64__)
-            "_64"
-        #endif
-            ".dll";
-
-        static HMODULE icvFFOpenCV = LoadLibrary( module_name );
-        if( icvFFOpenCV )
-        {
-            icvCreateFileCapture_FFMPEG_p =
-                (CvCreateFileCapture_Plugin)GetProcAddress(icvFFOpenCV, "cvCreateFileCapture_FFMPEG");
-            icvReleaseCapture_FFMPEG_p =
-                (CvReleaseCapture_Plugin)GetProcAddress(icvFFOpenCV, "cvReleaseCapture_FFMPEG");
-            icvGrabFrame_FFMPEG_p =
-                (CvGrabFrame_Plugin)GetProcAddress(icvFFOpenCV, "cvGrabFrame_FFMPEG");
-            icvRetrieveFrame_FFMPEG_p =
-                (CvRetrieveFrame_Plugin)GetProcAddress(icvFFOpenCV, "cvRetrieveFrame_FFMPEG");
-            icvSetCaptureProperty_FFMPEG_p =
-                (CvSetCaptureProperty_Plugin)GetProcAddress(icvFFOpenCV, "cvSetCaptureProperty_FFMPEG");
-            icvGetCaptureProperty_FFMPEG_p =
-                (CvGetCaptureProperty_Plugin)GetProcAddress(icvFFOpenCV, "cvGetCaptureProperty_FFMPEG");
-            icvCreateVideoWriter_FFMPEG_p =
-                (CvCreateVideoWriter_Plugin)GetProcAddress(icvFFOpenCV, "cvCreateVideoWriter_FFMPEG");
-            icvReleaseVideoWriter_FFMPEG_p =
-                (CvReleaseVideoWriter_Plugin)GetProcAddress(icvFFOpenCV, "cvReleaseVideoWriter_FFMPEG");
-            icvWriteFrame_FFMPEG_p =
-                (CvWriteFrame_Plugin)GetProcAddress(icvFFOpenCV, "cvWriteFrame_FFMPEG");
-
-#if 0
-            if( icvCreateFileCapture_FFMPEG_p != 0 &&
-                icvReleaseCapture_FFMPEG_p != 0 &&
-                icvGrabFrame_FFMPEG_p != 0 &&
-                icvRetrieveFrame_FFMPEG_p != 0 &&
-                icvSetCaptureProperty_FFMPEG_p != 0 &&
-                icvGetCaptureProperty_FFMPEG_p != 0 &&
-                icvCreateVideoWriter_FFMPEG_p != 0 &&
-                icvReleaseVideoWriter_FFMPEG_p != 0 &&
-                icvWriteFrame_FFMPEG_p != 0 )
-            {
-                printf("Successfully initialized ffmpeg plugin!\n");
-            }
-            else
-            {
-                printf("Failed to load FFMPEG plugin: module handle=%p\n", icvFFOpenCV);
-            }
-#endif
-        }
-    #elif defined HAVE_FFMPEG
-        icvCreateFileCapture_FFMPEG_p = (CvCreateFileCapture_Plugin)cvCreateFileCapture_FFMPEG;
-        icvReleaseCapture_FFMPEG_p = (CvReleaseCapture_Plugin)cvReleaseCapture_FFMPEG;
-        icvGrabFrame_FFMPEG_p = (CvGrabFrame_Plugin)cvGrabFrame_FFMPEG;
-        icvRetrieveFrame_FFMPEG_p = (CvRetrieveFrame_Plugin)cvRetrieveFrame_FFMPEG;
-        icvSetCaptureProperty_FFMPEG_p = (CvSetCaptureProperty_Plugin)cvSetCaptureProperty_FFMPEG;
-        icvGetCaptureProperty_FFMPEG_p = (CvGetCaptureProperty_Plugin)cvGetCaptureProperty_FFMPEG;
-        icvCreateVideoWriter_FFMPEG_p = (CvCreateVideoWriter_Plugin)cvCreateVideoWriter_FFMPEG;
-        icvReleaseVideoWriter_FFMPEG_p = (CvReleaseVideoWriter_Plugin)cvReleaseVideoWriter_FFMPEG;
-        icvWriteFrame_FFMPEG_p = (CvWriteFrame_Plugin)cvWriteFrame_FFMPEG;
-    #endif
-
-        ffmpegInitialized = 1;
-    }
-}
-
-
-class CvCapture_FFMPEG_proxy : public CvCapture
-{
-public:
-    CvCapture_FFMPEG_proxy() { ffmpegCapture = 0; }
-    virtual ~CvCapture_FFMPEG_proxy() { close(); }
-
-    virtual double getProperty(int propId)
-    {
-        return ffmpegCapture ? icvGetCaptureProperty_FFMPEG_p(ffmpegCapture, propId) : 0;
-    }
-    virtual bool setProperty(int propId, double value)
-    {
-        return ffmpegCapture ? icvSetCaptureProperty_FFMPEG_p(ffmpegCapture, propId, value)!=0 : false;
-    }
-    virtual bool grabFrame()
-    {
-        return ffmpegCapture ? icvGrabFrame_FFMPEG_p(ffmpegCapture)!=0 : false;
-    }
-    virtual IplImage* retrieveFrame(int)
-    {
-        unsigned char* data = 0;
-        int step=0, width=0, height=0, cn=0;
-
-        if(!ffmpegCapture ||
-           !icvRetrieveFrame_FFMPEG_p(ffmpegCapture,&data,&step,&width,&height,&cn))
-           return 0;
-        cvInitImageHeader(&frame, cvSize(width, height), 8, cn);
-        cvSetData(&frame, data, step);
-        return &frame;
-    }
-    virtual bool open( const char* filename )
-    {
-        close();
-
-        icvInitFFMPEG();
-        if( !icvCreateFileCapture_FFMPEG_p )
-            return false;
-        ffmpegCapture = icvCreateFileCapture_FFMPEG_p( filename );
-        return ffmpegCapture != 0;
-    }
-    virtual void close()
-    {
-        if( ffmpegCapture && icvReleaseCapture_FFMPEG_p )
-            icvReleaseCapture_FFMPEG_p( &ffmpegCapture );
-        assert( ffmpegCapture == 0 );
-        ffmpegCapture = 0;
-    }
-
-protected:
-    void* ffmpegCapture;
-    IplImage frame;
-};
-
-
-CvCapture* cvCreateFileCapture_FFMPEG_proxy(const char * filename)
-{
-    CvCapture_FFMPEG_proxy* result = new CvCapture_FFMPEG_proxy;
-    if( result->open( filename ))
-        return result;
-    delete result;
-#if defined WIN32 || defined _WIN32
-    return cvCreateFileCapture_VFW(filename);
-#else
-    return 0;
-#endif
-}
-
-
-class CvVideoWriter_FFMPEG_proxy : public CvVideoWriter
-{
-public:
-    CvVideoWriter_FFMPEG_proxy() { ffmpegWriter = 0; }
-    virtual ~CvVideoWriter_FFMPEG_proxy() { close(); }
-
-    virtual bool writeFrame( const IplImage* image )
-    {
-        if(!ffmpegWriter)
-            return false;
-        CV_Assert(image->depth == 8);
-
-        return icvWriteFrame_FFMPEG_p(ffmpegWriter, (const uchar*)image->imageData,
-             image->widthStep, image->width, image->height, image->nChannels, image->origin) !=0;
-    }
-    virtual bool open( const char* filename, int fourcc, double fps, CvSize frameSize, bool isColor )
-    {
-        close();
-        icvInitFFMPEG();
-        if( !icvCreateVideoWriter_FFMPEG_p )
-            return false;
-        ffmpegWriter = icvCreateVideoWriter_FFMPEG_p( filename, fourcc, fps, frameSize.width, frameSize.height, isColor );
-        return ffmpegWriter != 0;
-    }
-
-    virtual void close()
-    {
-        if( ffmpegWriter && icvReleaseVideoWriter_FFMPEG_p )
-            icvReleaseVideoWriter_FFMPEG_p( &ffmpegWriter );
-        assert( ffmpegWriter == 0 );
-        ffmpegWriter = 0;
-    }
-
-protected:
-    void* ffmpegWriter;
-};
-
-
-CvVideoWriter* cvCreateVideoWriter_FFMPEG_proxy( const char* filename, int fourcc,
-                                          double fps, CvSize frameSize, int isColor )
-{
-    CvVideoWriter_FFMPEG_proxy* result = new CvVideoWriter_FFMPEG_proxy;
-
-    if( result->open( filename, fourcc, fps, frameSize, isColor != 0 ))
-        return result;
-    delete result;
-#if defined WIN32 || defined _WIN32
-    return cvCreateVideoWriter_VFW(filename, fourcc, fps, frameSize, isColor);
-#else
-    return 0;
-#endif
-}
index 46df5ce..3cc367a 100644 (file)
 
 #ifdef HAVE_OPENNI
 
+#if TBB_INTERFACE_VERSION < 5000
+# undef HAVE_TBB
+#endif
+
 #include <iostream>
 #include <queue>
 #include "XnCppWrapper.h"
index 31518f8..a80b993 100644 (file)
@@ -109,6 +109,7 @@ protected:
 CvCaptureCAM_PvAPI::CvCaptureCAM_PvAPI()
 {
        monocrome=false;
+    memset(&this->Camera, 0, sizeof(this->Camera));
 }
 void CvCaptureCAM_PvAPI::Sleep(unsigned int time)
 {
index d58760d..66aa6c9 100644 (file)
 #include <zlib.h>
 #include "grfmt_png.hpp"
 
+#if defined _MSC_VER && _MSC_VER >= 1200
+    // disable warnings related to _setjmp
+    #pragma warning( disable: 4611 )
+#endif
+
 namespace cv
 {
 
index fb5c5df..e2eed5e 100644 (file)
@@ -57,11 +57,9 @@ public:
     {\r
         const int img_r = 4096;\r
         const int img_c = 4096;\r
-        Size frame_s = Size(img_c, img_r);\r
-        const double fps = 30;\r
-        const double time_sec = 2;\r
-        const int coeff = static_cast<int>(static_cast<double>(cv::min(img_c, img_r)) / (fps * time_sec));\r
-\r
+        const double fps0 = 15;\r
+        const double time_sec = 1;\r
+        \r
         const size_t n = sizeof(codec_bmp_tags)/sizeof(codec_bmp_tags[0]);\r
 \r
         bool created = false;\r
@@ -69,25 +67,59 @@ public:
         for (size_t j = 0; j < n; ++j)\r
         {\r
         stringstream s; s << codec_bmp_tags[j].tag;\r
+        int tag = codec_bmp_tags[j].tag;\r
+        \r
+        if( tag != MKTAG('H', '2', '6', '3') &&\r
+            tag != MKTAG('H', '2', '6', '1') &&\r
+            tag != MKTAG('D', 'I', 'V', 'X') &&\r
+            tag != MKTAG('D', 'X', '5', '0') &&\r
+            tag != MKTAG('X', 'V', 'I', 'D') &&\r
+            tag != MKTAG('m', 'p', '4', 'v') &&\r
+            tag != MKTAG('D', 'I', 'V', '3') &&\r
+            tag != MKTAG('W', 'M', 'V', '1') &&\r
+            tag != MKTAG('W', 'M', 'V', '2') &&\r
+            tag != MKTAG('M', 'P', 'E', 'G') &&\r
+            tag != MKTAG('M', 'J', 'P', 'G') &&\r
+            tag != MKTAG('j', 'p', 'e', 'g') &&\r
+            tag != 0 &&\r
+            tag != MKTAG('I', '4', '2', '0') &&\r
+            tag != MKTAG('Y', 'U', 'Y', '2') &&\r
+            tag != MKTAG('F', 'L', 'V', '1') )\r
+            continue;\r
 \r
         const string filename = "output_"+s.str()+".avi";\r
 \r
-        Mat img(img_r, img_c, CV_8UC3, Scalar::all(0));\r
         try\r
         {\r
-            VideoWriter writer(filename, codec_bmp_tags[j].tag, fps, frame_s);\r
+            double fps = fps0;\r
+            Size frame_s = Size(img_c, img_r);\r
+            \r
+            if( tag == CV_FOURCC('H', '2', '6', '1') )\r
+                frame_s = Size(352, 288);\r
+            else if( tag == CV_FOURCC('H', '2', '6', '3') )\r
+                frame_s = Size(704, 576);\r
+            /*else if( tag == CV_FOURCC('M', 'J', 'P', 'G') ||\r
+                     tag == CV_FOURCC('j', 'p', 'e', 'g') )\r
+                frame_s = Size(1920, 1080);*/\r
+            \r
+            if( tag == CV_FOURCC('M', 'P', 'E', 'G') )\r
+                fps = 25;\r
+            \r
+            VideoWriter writer(filename, tag, fps, frame_s);\r
 \r
             if (writer.isOpened() == false)\r
             {\r
                 ts->printf(ts->LOG, "\n\nFile name: %s\n", filename.c_str());\r
-                ts->printf(ts->LOG, "Codec id: %d   Codec tag: %d\n", j, codec_bmp_tags[j].tag);\r
+                ts->printf(ts->LOG, "Codec id: %d   Codec tag: %c%c%c%c\n", j,\r
+                           tag & 255, (tag >> 8) & 255, (tag >> 16) & 255, (tag >> 24) & 255);\r
                 ts->printf(ts->LOG, "Error: cannot create video file.");\r
                 ts->set_failed_test_info(ts->FAIL_INVALID_OUTPUT);\r
             }\r
-\r
             else\r
-\r
             {\r
+                Mat img(frame_s, CV_8UC3, Scalar::all(0));\r
+                const int coeff = cvRound(cv::min(frame_s.width, frame_s.height)/(fps0 * time_sec));\r
+\r
                 for (int i = 0 ; i < static_cast<int>(fps * time_sec); i++ )\r
                 {\r
                     //circle(img, Point2i(img_c / 2, img_r / 2), cv::min(img_r, img_c) / 2 * (i + 1), Scalar(255, 0, 0, 0), 2);\r
index cdf0590..1764c27 100644 (file)
@@ -55,7 +55,7 @@ public:
 
 void CV_FramecountTest::run(int)
 {
-#if defined WIN32 || (defined __linux__ && !defined ANDROID)
+#if defined WIN32 || (defined __linux__ && !defined ANDROID) || (defined __APPLE__ && defined HAVE_FFMPEG)
 #if !defined HAVE_GSTREAMER || defined HAVE_GSTREAMER_APP
 
     const int time_sec = 5, fps = 25;
index 358145a..87e42c9 100644 (file)
@@ -122,7 +122,7 @@ void CV_VideoPositioningTest::run_test(int method)
 
     ts->printf(cvtest::TS::LOG, "\n\nSource files directory: %s\n", (src_dir+"video/").c_str());
 
-    const string ext[] = {"mov", "avi", "mp4", "mpg", "wmv"};
+    const string ext[] = {"avi", "mp4", "wmv"};
 
     size_t n = sizeof(ext)/sizeof(ext[0]);
 
@@ -209,7 +209,7 @@ void CV_VideoPositioningTest::run_test(int method)
 
 void CV_VideoProgressivePositioningTest::run(int) 
 {
-#if defined WIN32 || (defined __linux__ && !defined ANDROID)
+#if defined WIN32 || (defined __linux__ && !defined ANDROID) || (defined __APPLE__ && defined HAVE_FFMPEG)
 #if !defined HAVE_GSTREAMER || defined HAVE_GSTREAMER_APP
 
        run_test(PROGRESSIVE);
@@ -220,7 +220,7 @@ void CV_VideoProgressivePositioningTest::run(int)
 
 void CV_VideoRandomPositioningTest::run(int)
 {
-#if defined WIN32 || (defined __linux__ && !defined ANDROID)
+#if defined WIN32 || (defined __linux__ && !defined ANDROID) || (defined __APPLE__ && defined HAVE_FFMPEG)
 #if !defined HAVE_GSTREAMER || defined HAVE_GSTREAMER_APP
 
        run_test(RANDOM);
index b4991b9..3910547 100644 (file)
@@ -377,29 +377,40 @@ void CV_HighGuiTest::SpecificImageTest(const string& dir)
 
 void CV_HighGuiTest::SpecificVideoFileTest(const string& dir, const char codecchars[4])
 {
-    const string ext[] = {"avi", "mov", "mp4", "mpg", "wmv"};
-
-    const size_t n = sizeof(ext)/sizeof(ext[0]);
-
+    const string exts[] = {"avi", "mov", "mpg", "wmv"};
+    const size_t n = sizeof(exts)/sizeof(exts[0]);
+    int fourcc0 = CV_FOURCC(codecchars[0], codecchars[1], codecchars[2], codecchars[3]);
+    
     for (size_t j = 0; j < n; ++j)
-        if ((ext[j]!="mp4")||(string(&codecchars[0], 4)!="IYUV"))
-    #if defined WIN32 || defined _WIN32
-        if (((ext[j]!="mov")||(string(&codecchars[0], 4)=="XVID"))&&(ext[j]!="mp4"))
-    #endif
     {
-        const string video_file = "video_" + string(&codecchars[0], 4) + "." + ext[j];
+        string ext = exts[j];
+        int fourcc = fourcc0;
+        
+        if( (ext == "mov" && fourcc != CV_FOURCC('M', 'J', 'P', 'G')) ||
+            (ext == "mpg" && fourcc != CV_FOURCC('m', 'p', 'e', 'g')) ||
+            (ext == "wmv" && fourcc != CV_FOURCC('M', 'J', 'P', 'G')))
+            continue;
+        if( ext == "mov" )
+            fourcc = CV_FOURCC('m', 'p', '4', 'v');
+        
+        string fourcc_str = format("%c%c%c%c", fourcc & 255, (fourcc >> 8) & 255, (fourcc >> 16) & 255, (fourcc >> 24) & 255);
+        const string video_file = "video_" + fourcc_str + "." + ext;
 
-        VideoWriter writer = cv::VideoWriter(video_file, CV_FOURCC(codecchars[0], codecchars[1], codecchars[2], codecchars[3]), 25, cv::Size(968, 757), true);
+        Size frame_size(968 & -2, 757 & -2);
+        //Size frame_size(968 & -16, 757 & -16);
+        //Size frame_size(640, 480);
+        VideoWriter writer(video_file, fourcc, 25, frame_size, true);
 
         if (!writer.isOpened())
         {
+            VideoWriter writer(video_file, fourcc, 25, frame_size, true);
             ts->printf(ts->LOG, "Creating a video in %s...\n", video_file.c_str());
-            ts->printf(ts->LOG, "Cannot create VideoWriter object with codec %s.\n", string(&codecchars[0], 4).c_str());
+            ts->printf(ts->LOG, "Cannot create VideoWriter object with codec %s.\n", fourcc_str.c_str());
             ts->set_failed_test_info(ts->FAIL_MISMATCH);
             continue;
         }
 
-         const size_t IMAGE_COUNT = 30;
+        const size_t IMAGE_COUNT = 30;
 
         for(size_t i = 0; i < IMAGE_COUNT; ++i)
         {
@@ -417,10 +428,10 @@ void CV_HighGuiTest::SpecificVideoFileTest(const string& dir, const char codecch
                 ts->printf(ts->LOG, "Error: cannot read frame from %s.\n", (ts->get_data_path()+"../python/images/QCIF_"+s_digit.str()+".bmp").c_str());
                 ts->printf(ts->LOG, "Continue creating the video file...\n");
                 ts->set_failed_test_info(ts->FAIL_INVALID_TEST_DATA);
-                continue;
+                break;//continue;
             }
 
-            cv::resize(img, img, Size(968, 757), 0.0, 0.0, cv::INTER_CUBIC);
+            cv::resize(img, img, frame_size, 0.0, 0.0, cv::INTER_CUBIC);
 
             for (int k = 0; k < img.rows; ++k)
                 for (int l = 0; l < img.cols; ++l)
@@ -433,32 +444,31 @@ void CV_HighGuiTest::SpecificVideoFileTest(const string& dir, const char codecch
             writer << img;
         }
 
-        writer.~VideoWriter();
-
+        writer.release();
         cv::VideoCapture cap(video_file);
 
         size_t FRAME_COUNT = (size_t)cap.get(CV_CAP_PROP_FRAME_COUNT);
 
-        if (FRAME_COUNT != IMAGE_COUNT)
+        if (FRAME_COUNT != IMAGE_COUNT && ext != "mpg" )
         {
-            ts->printf(ts->LOG, "\nFrame count checking for video_%s.%s...\n", string(&codecchars[0], 4).c_str(), ext[j].c_str());
-            ts->printf(ts->LOG, "Video codec: %s\n", string(&codecchars[0], 4).c_str());
+            ts->printf(ts->LOG, "\nFrame count checking for video_%s.%s...\n", fourcc_str.c_str(), ext.c_str());
+            ts->printf(ts->LOG, "Video codec: %s\n", fourcc_str.c_str());
             ts->printf(ts->LOG, "Required frame count: %d; Returned frame count: %d\n", IMAGE_COUNT, FRAME_COUNT);
             ts->printf(ts->LOG, "Error: Incorrect frame count in the video.\n");
             ts->printf(ts->LOG, "Continue checking...\n");
             ts->set_failed_test_info(ts->FAIL_BAD_ACCURACY);
         }
 
-        cap.set(CV_CAP_PROP_POS_FRAMES, -1);
+        //cap.set(CV_CAP_PROP_POS_FRAMES, -1);
 
-        for (int i = -1; i < (int)std::min<size_t>(FRAME_COUNT, IMAGE_COUNT)-1; i++)
+        for (int i = 0; i < (int)std::min<size_t>(FRAME_COUNT, IMAGE_COUNT)-1; i++)
         {
             cv::Mat frame; cap >> frame;
             if (frame.empty())
             {
                 ts->printf(ts->LOG, "\nVideo file directory: %s\n", ".");
-                ts->printf(ts->LOG, "File name: video_%s.%s\n", string(&codecchars[0], 4).c_str(), ext[j].c_str());
-                ts->printf(ts->LOG, "Video codec: %s\n", string(&codecchars[0], 4).c_str());
+                ts->printf(ts->LOG, "File name: video_%s.%s\n", fourcc_str.c_str(), ext.c_str());
+                ts->printf(ts->LOG, "Video codec: %s\n", fourcc_str.c_str());
                 ts->printf(ts->LOG, "Error: cannot read the next frame with index %d.\n", i+1);
                 ts->set_failed_test_info(ts->FAIL_MISSING_TEST_DATA);
                 break;
@@ -477,23 +487,20 @@ void CV_HighGuiTest::SpecificVideoFileTest(const string& dir, const char codecch
                 continue;
             }
 
-            const double thresDbell = 20;
+            const double thresDbell = 40;
 
             double psnr = PSNR(img, frame);
 
             if (psnr > thresDbell)
             {
-                ts->printf(ts->LOG, "\nReading frame from the file video_%s.%s...\n", string(&codecchars[0], 4).c_str(), ext[j].c_str());
+                ts->printf(ts->LOG, "\nReading frame from the file video_%s.%s...\n", fourcc_str.c_str(), ext.c_str());
                 ts->printf(ts->LOG, "Frame index: %d\n", i+1);
                 ts->printf(ts->LOG, "Difference between saved and original images: %g\n", psnr);
                 ts->printf(ts->LOG, "Maximum allowed difference: %g\n", thresDbell);
                 ts->printf(ts->LOG, "Error: too big difference between saved and original images.\n");
-                continue;
+                break;
             }
-
         }
-
-        cap.~VideoCapture();
     }
 }
 
@@ -556,9 +563,6 @@ void CV_HighGuiTest::SpecificVideoCameraTest(const string& dir, const char codec
             if (framecount == IMAGE_COUNT) break;
         }
 
-        frame.~Mat();
-        writer.~VideoWriter();
-
         cv::VideoCapture vcap(dir+"video_"+string(&codecchars[0], 4)+"."+ext[i]);
 
         if (!vcap.isOpened())
@@ -613,12 +617,7 @@ void CV_HighGuiTest::SpecificVideoCameraTest(const string& dir, const char codec
                 continue;
             }
         }
-
-        img.~Mat();
-        vcap.~VideoCapture();
     }
-
-    cap.~VideoCapture();
 }
 
 void CV_ImageTest::run(int)
@@ -633,12 +632,12 @@ void CV_SpecificImageTest::run(int)
 
 void CV_VideoTest::run(int)
 {
-#if defined WIN32 || (defined __linux__ && !defined ANDROID)
+#if defined WIN32 || (defined __linux__ && !defined ANDROID) || (defined __APPLE__ && defined HAVE_FFMPEG)
 #if !defined HAVE_GSTREAMER || defined HAVE_GSTREAMER_APP
 
     const char codecs[][4] = { {'I', 'Y', 'U', 'V'},
                                {'X', 'V', 'I', 'D'},
-                               {'M', 'P', 'G', '2'},
+                               {'m', 'p', 'e', 'g'},
                                {'M', 'J', 'P', 'G'} };
 
     printf("%s", ts->get_data_path().c_str());
@@ -656,10 +655,10 @@ void CV_VideoTest::run(int)
 
 void CV_SpecificVideoFileTest::run(int)
 {
-#if defined WIN32 || (defined __linux__ && !defined ANDROID)
+#if defined WIN32 || (defined __linux__ && !defined ANDROID) || (defined __APPLE__ && defined HAVE_FFMPEG)
 #if !defined HAVE_GSTREAMER || defined HAVE_GSTREAMER_APP
 
-    const char codecs[][4] = { {'M', 'P', 'G', '2'},
+    const char codecs[][4] = { {'m', 'p', 'e', 'g'},
                                {'X', 'V', 'I', 'D'},
                                {'M', 'J', 'P', 'G'},
                                {'I', 'Y', 'U', 'V'} };
@@ -680,7 +679,7 @@ void CV_SpecificVideoCameraTest::run(int)
 #if defined WIN32 || (defined __linux__ && !defined ANDROID)
 #if !defined HAVE_GSTREAMER || defined HAVE_GSTREAMER_APP
 
-    const char codecs[][4] = { {'M', 'P', 'G', '2'},
+    const char codecs[][4] = { {'m', 'p', 'e', 'g'},
                                {'X', 'V', 'I', 'D'},
                                {'M', 'J', 'P', 'G'},
                                {'I', 'Y', 'U', 'V'} };
index 012e578..2091f7c 100755 (executable)
@@ -61,6 +61,9 @@ void CV_PositioningTest::CreateTestVideo(const string& format, int codec, int fr
 {\r
  stringstream s; s << codec;\r
 \r
+ //if( format == "mov" && codec == CV_FOURCC('m', 'p', 'e', 'g')\r
+ //    putchar('$');\r
+\r
  cv::VideoWriter writer("test_video_"+s.str()+"."+format, codec, 25, cv::Size(640, 480), false);\r
 \r
  for (int i = 0; i < framecount; ++i)\r
@@ -95,19 +98,17 @@ void CV_PositioningTest::CreateTestVideo(const string& format, int codec, int fr
 \r
    writer << mat;\r
  }\r
-\r
- writer.~VideoWriter();\r
 }\r
 \r
 void CV_PositioningTest::run(int)\r
 {\r
-#if defined WIN32 || (defined __linux__ && !defined ANDROID)\r
+#if defined WIN32 || (defined __linux__ && !defined ANDROID) || (defined __APPLE__ && defined HAVE_FFMPEG)\r
 #if !defined HAVE_GSTREAMER || defined HAVE_GSTREAMER_APP\r
 \r
     const string format[] =  {"avi", "mov", "mp4", "mpg", "wmv", "3gp"};\r
 \r
     const char codec[][4] = { {'X', 'V', 'I', 'D'},\r
-                              {'M', 'P', 'G', '2'},\r
+                              {'m', 'p', 'e', 'g'},\r
                               {'M', 'J', 'P', 'G'} };\r
 \r
     size_t n_format = sizeof(format)/sizeof(format[0]),\r
index c0ca798..4e6b9fd 100644 (file)
@@ -55,7 +55,7 @@ Calculates eigenvalues and eigenvectors of image blocks for corner detection.
     :param borderType: Pixel extrapolation method. See  :ocv:func:`borderInterpolate` .
 
 For every pixel
-:math:`p` , the function ``cornerEigenValsAndVecs`` considers a ``blockSize`` :math:`\times` ``blockSize`` neigborhood
+:math:`p` , the function ``cornerEigenValsAndVecs`` considers a ``blockSize`` :math:`\times` ``blockSize`` neighborhood
 :math:`S(p)` . It calculates the covariation matrix of derivatives over the neighborhood as:
 
 .. math::
@@ -279,9 +279,6 @@ The function can be used to initialize a point-based tracker of an object.
     :ocv:func:`cornerHarris`, 
     :ocv:func:`calcOpticalFlowPyrLK`, 
     :ocv:func:`estimateRigidTransform`,
-    :ocv:class:`PlanarObjectDetector`, 
-    :ocv:class:`OneWayDescriptor`
-
 
 
 HoughCircles
@@ -544,4 +541,4 @@ The corners can be found as local maximums of the functions, as shown below: ::
 
 .. [Shi94] J. Shi and C. Tomasi. *Good Features to Track*. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 593-600, June 1994.
 
-.. [Yuen90] Yuen, H. K. and Princen, J. and Illingworth, J. and Kittler, J., *Comparative study of Hough transform methods for circle finding*. Image Vision Comput. 8 1, pp 71–77 (1990)
\ No newline at end of file
+.. [Yuen90] Yuen, H. K. and Princen, J. and Illingworth, J. and Kittler, J., *Comparative study of Hough transform methods for circle finding*. Image Vision Comput. 8 1, pp 71–77 (1990)
index 401120d..2bfc2d0 100644 (file)
@@ -418,7 +418,7 @@ Smoothes an image using the normalized box filter.
 
 .. ocv:pyfunction:: cv2.blur(src, ksize[, dst[, anchor[, borderType]]]) -> dst
 
-    :param src: Source image.
+    :param src: Source image. The image can have any number of channels, which are processed independently. The depth should be ``CV_8U``, ``CV_16U``, ``CV_16S``, ``CV_32F`` or ``CV_64F``.
 
     :param dst: Destination image of the same size and type as  ``src`` .
     
@@ -507,9 +507,7 @@ where
 
     \alpha = \fork{\frac{1}{\texttt{ksize.width*ksize.height}}}{when \texttt{normalize=true}}{1}{otherwise}
 
-Unnormalized box filter is useful for computing various integral characteristics over each pixel neighborhood, such as covariance matrices of image derivatives (used in dense optical flow algorithms,
-and so on). If you need to compute pixel sums over variable-size windows, use
-:ocv:func:`integral` .
+Unnormalized box filter is useful for computing various integral characteristics over each pixel neighborhood, such as covariance matrices of image derivatives (used in dense optical flow algorithms, and so on). If you need to compute pixel sums over variable-size windows, use :ocv:func:`integral` .
 
 .. seealso::
 
@@ -585,6 +583,10 @@ The function supports the mode when ``src`` is already in the middle of ``dst``
     ...
 
 
+.. note::
+
+    When the source image is a part (ROI) of a bigger image, the function will try to use the pixels outside of the ROI to form a border. To disable this feature and always do extrapolation, as if ``src`` was not a ROI, use ``borderType | BORDER_ISOLATED``.
+
 .. seealso::
 
     :ocv:func:`borderInterpolate`
@@ -713,13 +715,13 @@ Creates a non-separable linear filter engine.
 
     :param delta: Value added to the filtered results before storing them.
 
-    :param bits: Number of the fractional bits. the parameter is used when the kernel is an integer matrix representing fixed-point filter coefficients.
+    :param bits: Number of the fractional bits. The parameter is used when the kernel is an integer matrix representing fixed-point filter coefficients.
 
     :param rowBorderType: Pixel extrapolation method in the vertical direction. For details, see  :ocv:func:`borderInterpolate`.
     
     :param columnBorderType: Pixel extrapolation method in the horizontal direction.
     
-    :param borderValue: Border vaule used in case of a constant border.
+    :param borderValue: Border value used in case of a constant border.
 
 The function returns a pointer to a 2D linear filter for the specified kernel, the source array type, and the destination array type. The function is a higher-level function that calls ``getLinearFilter`` and passes the retrieved 2D filter to the
 :ocv:class:`FilterEngine` constructor.
@@ -737,17 +739,17 @@ Creates an engine for non-separable morphological operations.
 
 .. ocv:function:: Ptr<FilterEngine> createMorphologyFilter(int op, int type,    InputArray element, Point anchor=Point(-1,-1), int rowBorderType=BORDER_CONSTANT, int columnBorderType=-1, const Scalar& borderValue=morphologyDefaultBorderValue())
 
-.. ocv:function:: Ptr<BaseFilter> getMorphologyFilter(int op, int type, InputArray element,                                    Point anchor=Point(-1,-1))
+.. ocv:function:: Ptr<BaseFilter> getMorphologyFilter(int op, int type, InputArray element, Point anchor=Point(-1,-1))
 
-.. ocv:function:: Ptr<BaseRowFilter> getMorphologyRowFilter(int op, int type,                                          int esize, int anchor=-1)
+.. ocv:function:: Ptr<BaseRowFilter> getMorphologyRowFilter(int op, int type, int esize, int anchor=-1)
 
-.. ocv:function:: Ptr<BaseColumnFilter> getMorphologyColumnFilter(int op, int type,                                                int esize, int anchor=-1)
+.. ocv:function:: Ptr<BaseColumnFilter> getMorphologyColumnFilter(int op, int type, int esize, int anchor=-1)
 
 .. ocv:function:: Scalar morphologyDefaultBorderValue()
 
     :param op: Morphology operation ID,  ``MORPH_ERODE``  or  ``MORPH_DILATE`` .
-    
-    :param type: Input/output image type.
+
+    :param type: Input/output image type. The number of channels can be arbitrary. The depth should be one of ``CV_8U``, ``CV_16U``, ``CV_16S``,  ``CV_32F` or ``CV_64F``.
 
     :param element: 2D 8-bit structuring element for a morphological operation. Non-zero elements indicate the pixels that belong to the element.
 
@@ -836,7 +838,7 @@ Dilates an image by using a specific structuring element.
 .. ocv:cfunction:: void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 )
 .. ocv:pyoldfunction:: cv.Dilate(src, dst, element=None, iterations=1)-> None
 
-    :param src: Source image.
+    :param src: Source image. The number of channels can be arbitrary. The depth should be one of ``CV_8U``, ``CV_16U``, ``CV_16S``,  ``CV_32F` or ``CV_64F``.
 
     :param dst: Destination image of the same size and type as  ``src`` .
     
@@ -876,9 +878,9 @@ Erodes an image by using a specific structuring element.
 .. ocv:cfunction:: void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1)
 .. ocv:pyoldfunction:: cv.Erode(src, dst, element=None, iterations=1)-> None
 
-    :param src: Source image.
+    :param src: Source image. The number of channels can be arbitrary. The depth should be one of ``CV_8U``, ``CV_16U``, ``CV_16S``,  ``CV_32F` or ``CV_64F``.
 
-    :param dst: Destination image of the same size and type as  ``src`` .
+    :param dst: Destination image of the same size and type as ``src``.
     
     :param element: Structuring element used for erosion. If  ``element=Mat()`` , a  ``3 x 3``  rectangular structuring element is used.
 
@@ -921,7 +923,13 @@ Convolves an image with the kernel.
 
     :param dst: Destination image of the same size and the same number of channels as  ``src`` .
     
-    :param ddepth: Desired depth of the destination image. If it is negative, it will be the same as  ``src.depth()`` .
+    :param ddepth: Desired depth of the destination image. If it is negative, it will be the same as  ``src.depth()`` . The following combination of ``src.depth()`` and ``ddepth`` are supported:
+         * ``src.depth()`` = ``CV_8U``, ``ddepth`` = -1/``CV_16S``/``CV_32F``/``CV_64F``
+         * ``src.depth()`` = ``CV_16U``/``CV_16S``, ``ddepth`` = -1/``CV_32F``/``CV_64F``
+         * ``src.depth()`` = ``CV_32F``, ``ddepth`` = -1/``CV_32F``/``CV_64F``
+         * ``src.depth()`` = ``CV_64F``, ``ddepth`` = -1/``CV_64F``
+        
+        when ``ddepth=-1``, the destination image will have the same depth as the source.
     
     :param kernel: Convolution kernel (or rather a correlation kernel), a single-channel floating point matrix. If you want to apply different kernels to different channels, split the image into separate color planes using  :ocv:func:`split`  and process them individually.
 
@@ -961,7 +969,7 @@ Smoothes an image using a Gaussian filter.
 
 .. ocv:pyfunction:: cv2.GaussianBlur(src, ksize, sigma1[, dst[, sigma2[, borderType]]]) -> dst
 
-    :param src: Source image.
+    :param src: Source image. The image can have any number of channels, which are processed independently. The depth should be ``CV_8U``, ``CV_16U``, ``CV_16S``, ``CV_32F`` or ``CV_64F``.
 
     :param dst: Destination image of the same size and type as  ``src`` .
     
@@ -1169,7 +1177,7 @@ Performs advanced morphological transformations.
 .. ocv:cfunction:: void cvMorphologyEx( const CvArr* src, CvArr* dst, CvArr* temp, IplConvKernel* element, int operation, int iterations=1 )
 .. ocv:pyoldfunction:: cv.MorphologyEx(src, dst, temp, element, operation, iterations=1)-> None
 
-    :param src: Source image.
+    :param src: Source image. The number of channels can be arbitrary. The depth should be one of ``CV_8U``, ``CV_16U``, ``CV_16S``,  ``CV_32F` or ``CV_64F``.
 
     :param dst: Destination image of the same size and type as  ``src`` .
     
@@ -1225,7 +1233,7 @@ Morphological gradient:
 
     \texttt{dst} = \mathrm{blackhat} ( \texttt{src} , \texttt{element} )= \mathrm{close} ( \texttt{src} , \texttt{element} )- \texttt{src}
 
-Any of the operations can be done in-place.
+Any of the operations can be done in-place. In case of multi-channel images, each channel is processed independently.
 
 .. seealso::
 
@@ -1402,7 +1410,13 @@ Applies a separable linear filter to an image.
 
     :param dst: Destination image of the same size and the same number of channels as  ``src`` .
     
-    :param ddepth: Destination image depth.
+    :param ddepth: Destination image depth. The following combination of ``src.depth()`` and ``ddepth`` are supported:
+         * ``src.depth()`` = ``CV_8U``, ``ddepth`` = -1/``CV_16S``/``CV_32F``/``CV_64F``
+         * ``src.depth()`` = ``CV_16U``/``CV_16S``, ``ddepth`` = -1/``CV_32F``/``CV_64F``
+         * ``src.depth()`` = ``CV_32F``, ``ddepth`` = -1/``CV_32F``/``CV_64F``
+         * ``src.depth()`` = ``CV_64F``, ``ddepth`` = -1/``CV_64F``
+        
+        when ``ddepth=-1``, the destination image will have the same depth as the source.
 
     :param rowKernel: Coefficients for filtering each row.
 
@@ -1493,7 +1507,13 @@ Calculates the first, second, third, or mixed image derivatives using an extende
 
     :param dst: Destination image of the same size and the same number of channels as  ``src`` .
     
-    :param ddepth: Destination image depth.
+    :param ddepth: Destination image depth. The following combination of ``src.depth()`` and ``ddepth`` are supported:
+         * ``src.depth()`` = ``CV_8U``, ``ddepth`` = -1/``CV_16S``/``CV_32F``/``CV_64F``
+         * ``src.depth()`` = ``CV_16U``/``CV_16S``, ``ddepth`` = -1/``CV_32F``/``CV_64F``
+         * ``src.depth()`` = ``CV_32F``, ``ddepth`` = -1/``CV_32F``/``CV_64F``
+         * ``src.depth()`` = ``CV_64F``, ``ddepth`` = -1/``CV_64F``
+        
+        when ``ddepth=-1``, the destination image will have the same depth as the source. In the case of 8-bit input images it will result in truncated derivatives.
 
     :param xorder: Order of the derivative x.
 
@@ -1568,9 +1588,9 @@ Calculates the first x- or y- image derivative using Scharr operator.
 
     :param src: Source image.
 
-    :param dst: Destination image of the same size and the same number of channels as  ``src`` .
+    :param dst: Destination image of the same size and the same number of channels as ``src``.
     
-    :param ddepth: Destination image depth.
+    :param ddepth: Destination image depth. See :ocv:func:`Sobel` for the list of supported combination of ``src.depth()`` and ``ddepth``.
 
     :param xorder: Order of the derivative x.
 
@@ -1578,7 +1598,7 @@ Calculates the first x- or y- image derivative using Scharr operator.
 
     :param scale: Optional scale factor for the computed derivative values. By default, no scaling is applied. See  :ocv:func:`getDerivKernels` for details.
 
-    :param delta: Optional delta value that is added to the results prior to storing them in  ``dst`` .
+    :param delta: Optional delta value that is added to the results prior to storing them in  ``dst``.
     
     :param borderType: Pixel extrapolation method. See  :ocv:func:`borderInterpolate` for details.
     
index e8e91b5..268d12b 100644 (file)
@@ -34,7 +34,7 @@ Calculates a histogram of a set of arrays.
 
     :param ranges: Array of the ``dims``  arrays of the histogram bin boundaries in each dimension. When the histogram is uniform ( ``uniform`` =true), then for each dimension  ``i``  it is enough to specify the lower (inclusive) boundary  :math:`L_0`  of the 0-th histogram bin and the upper (exclusive) boundary  :math:`U_{\texttt{histSize}[i]-1}`  for the last histogram bin  ``histSize[i]-1`` . That is, in case of a uniform histogram each of  ``ranges[i]``  is an array of 2 elements. When the histogram is not uniform ( ``uniform=false`` ), then each of  ``ranges[i]``  contains  ``histSize[i]+1``  elements:  :math:`L_0, U_0=L_1, U_1=L_2, ..., U_{\texttt{histSize[i]}-2}=L_{\texttt{histSize[i]}-1}, U_{\texttt{histSize[i]}-1}` . The array elements, that are not between  :math:`L_0`  and  :math:`U_{\texttt{histSize[i]}-1}` , are not counted in the histogram.
 
-    :param uniform: Flag indicatinfg whether the histogram is uniform or not (see above).
+    :param uniform: Flag indicating whether the histogram is uniform or not (see above).
 
     :param accumulate: Accumulation flag. If it is set, the histogram is not cleared in the beginning when it is allocated. This feature enables you to compute a single histogram from several sets of arrays, or to update the histogram in time.
 
@@ -123,7 +123,7 @@ Calculates the back projection of a histogram.
 
     :param hist: Input histogram that can be dense or sparse.
 
-    :param backProject: Destination back projection aray that is a single-channel array of the same size and depth as  ``arrays[0]`` .
+    :param backProject: Destination back projection array that is a single-channel array of the same size and depth as  ``arrays[0]`` .
     
     :param ranges: Array of arrays of the histogram bin boundaries in each dimension. See  :ocv:func:`calcHist` .
     
@@ -405,8 +405,8 @@ Creates a histogram.
 The function creates a histogram of the specified size and returns a pointer to the created histogram. If the array ``ranges`` is 0, the histogram bin ranges must be specified later via the function  :ocv:cfunc:`SetHistBinRanges`. Though :ocv:cfunc:`CalcHist` and :ocv:cfunc:`CalcBackProject` may process 8-bit images without setting bin ranges, they assume they are equally spaced in 0 to 255 bins.
 
 
-GetHistValue_?D
----------------
+GetHistValue\_?D
+----------------
 Returns a pointer to the histogram bin.
 
 .. ocv:cfunction:: float cvGetHistValue_1D(CvHistogram hist, int idx0)
index 85288b0..a7cc79c 100644 (file)
@@ -436,7 +436,7 @@ The functions ``distanceTransform`` calculate the approximate or precise
 distance from every binary image pixel to the nearest zero pixel.
 For zero image pixels, the distance will obviously be zero.
 
-When ``maskSize == CV_DIST_MASK_PRECISE`` and ``distanceType == CV_DIST_L2`` , the function runs the algorithm described in [Felzenszwalb04]_.
+When ``maskSize == CV_DIST_MASK_PRECISE`` and ``distanceType == CV_DIST_L2`` , the function runs the algorithm described in [Felzenszwalb04]_. This algorithm is parallelized with the TBB library.
 
 In other cases, the algorithm
 [Borgefors86]_
@@ -449,7 +449,7 @@ basic distances. Since the distance function should be symmetric,
 all of the horizontal and vertical shifts must have the same cost (denoted as ``a`` ), all the diagonal shifts must have the
 same cost (denoted as ``b`` ), and all knight's moves must have
 the same cost (denoted as ``c`` ). For the ``CV_DIST_C`` and ``CV_DIST_L1`` types, the distance is calculated precisely,
-whereas for ``CV_DIST_L2`` (Euclidian distance) the distance
+whereas for ``CV_DIST_L2`` (Euclidean distance) the distance
 can be calculated only with a relative error (a
 :math:`5\times 5` mask
 gives more accurate results). For ``a``,``b`` , and ``c`` , OpenCV uses the values suggested in the original paper:
@@ -706,7 +706,8 @@ Also, the special value ``THRESH_OTSU`` may be combined with
 one of the above values. In this case, the function determines the optimal threshold
 value using the Otsu's algorithm and uses it instead of the specified ``thresh`` .
 The function returns the computed threshold value.
-Currently, the Otsu's method is implemented only for 8-bit images.
+Currently, the Otsu's method is implemented only for 8-bit images. 
+
 
 .. image:: pics/threshold.png
 
@@ -721,7 +722,7 @@ Currently, the Otsu's method is implemented only for 8-bit images.
 
 watershed
 -------------
-Performs a marker-based image segmentation using the watershed algrorithm.
+Performs a marker-based image segmentation using the watershed algorithm.
 
 .. ocv:function:: void watershed( InputArray image, InputOutputArray markers )
 
index f4f81cb..40ad850 100644 (file)
@@ -144,7 +144,7 @@ The function supports multi-channel images. Each channel is processed independen
 
 phaseCorrelate
 --------------
-The function is used to detect translational shifts that occur between two images. The operation takes advantage of the Fourier shift theorem for detecting the translational shift in the frequency domain. It can be used for fast image registration as well as motion esitimation. For more information please see http://en.wikipedia.org/wiki/Phase\_correlation .
+The function is used to detect translational shifts that occur between two images. The operation takes advantage of the Fourier shift theorem for detecting the translational shift in the frequency domain. It can be used for fast image registration as well as motion estimation. For more information please see http://en.wikipedia.org/wiki/Phase\_correlation .
 
 Calculates the cross-power spectrum of two supplied source arrays. The arrays are padded if needed with :ocv:func:`getOptimalDFTSize`.
 
index 2be890d..7cd8ee8 100644 (file)
@@ -109,7 +109,7 @@ Point of an original or dual subdivision.
 ..
 
 * id
-    This integer can be used to index auxillary data associated with each vertex of the planar subdivision.
+    This integer can be used to index auxiliary data associated with each vertex of the planar subdivision.
 
 CalcSubdivVoronoi2D
 -------------------
@@ -254,7 +254,7 @@ Returns the location of a point within a Delaunay triangulation.
 
     :param edge: Output edge that the point belongs to or is located to the right of it.
 
-    :param vertex: Optional output vertex double pointer the input point coinsides with.
+    :param vertex: Optional output vertex double pointer the input point coincides with.
 
 The function locates the input point within the subdivision. There are five cases:
 
@@ -280,7 +280,7 @@ The function locates the input point within the subdivision. There are five case
     will contain a pointer to the vertex.
 
 *
-    The point is outside the subdivsion reference rectangle. The function returns 
+    The point is outside the subdivision reference rectangle. The function returns 
     ``CV_PTLOC_OUTSIDE_RECT``
     and no pointers are filled.
 
index 84f80a3..31045df 100644 (file)
@@ -30,6 +30,14 @@ The function computes moments, up to the 3rd order, of a vector shape or a raste
                 double m02, double m30, double m21, double m12, double m03 );
         Moments( const CvMoments& moments );
         operator CvMoments() const;
+        
+        // spatial moments
+        double  m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;
+        // central moments
+        double  mu20, mu11, mu02, mu30, mu21, mu12, mu03;
+        // central normalized moments
+        double  nu20, nu11, nu02, nu30, nu21, nu12, nu03;
+    }
 
 In case of a raster image, the spatial moments :math:`\texttt{Moments::m}_{ji}` are computed as:
 
@@ -66,6 +74,10 @@ The normalized central moments
 
 The moments of a contour are defined in the same way but computed using the Green's formula (see http://en.wikipedia.org/wiki/Green_theorem). So, due to a limited raster resolution, the moments computed for a contour are slightly different from the moments computed for the same rasterized contour.
 
+.. note::
+
+     Since the contour moments are computed using Green formula, you may get seemingly odd results for contours with self-intersections, e.g. a zero area (``m00``) for butterfly-shaped contours.
+
 .. seealso::
 
     :ocv:func:`contourArea`,
@@ -112,6 +124,8 @@ Finds contours in a binary image.
 
 .. ocv:function:: void findContours( InputOutputArray image, OutputArrayOfArrays contours, int mode, int method, Point offset=Point())
 
+.. ocv:pyfunction:: cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy
+
 .. ocv:cfunction:: int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** firstContour, int headerSize=sizeof(CvContour), int mode=CV_RETR_LIST, int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0, 0) )
 
 .. ocv:pyoldfunction:: cv.FindContours(image, storage, mode=CV_RETR_LIST, method=CV_CHAIN_APPROX_SIMPLE, offset=(0, 0)) -> cvseq
@@ -122,7 +136,7 @@ Finds contours in a binary image.
 
     :param hierarchy: Optional output vector containing information about the image topology. It has as many elements as the number of contours. For each contour  ``contours[i]`` , the elements  ``hierarchy[i][0]`` ,  ``hiearchy[i][1]`` ,  ``hiearchy[i][2]`` , and  ``hiearchy[i][3]``  are set to 0-based indices in  ``contours``  of the next and previous contours at the same hierarchical level: the first child contour and the parent contour, respectively. If for a contour  ``i``  there are no next, previous, parent, or nested contours, the corresponding elements of  ``hierarchy[i]``  will be negative.
 
-    :param mode: Contour retrieval mode.
+    :param mode: Contour retrieval mode (if you use Python see also a note below).
 
             * **CV_RETR_EXTERNAL** retrieves only the extreme outer contours. It sets  ``hierarchy[i][2]=hierarchy[i][3]=-1``  for all the contours.
 
@@ -132,7 +146,7 @@ Finds contours in a binary image.
 
             * **CV_RETR_TREE** retrieves all of the contours and reconstructs a full hierarchy of nested contours. This full hierarchy is built and shown in the OpenCV  ``contours.c``  demo.
 
-    :param method: Contour approximation method.
+    :param method: Contour approximation method (if you use Python see also a note below).
 
             * **CV_CHAIN_APPROX_NONE** stores absolutely all the contour points. That is, any 2 subsequent points ``(x1,y1)`` and ``(x2,y2)`` of the contour will be either horizontal, vertical or diagonal neighbors, that is, ``max(abs(x1-x2),abs(y2-y1))==1``.
 
@@ -147,6 +161,7 @@ The function retrieves contours from the binary image using the algorithm
 
 .. note:: Source ``image`` is modified by this function.
 
+.. note:: If you use the new Python interface then the ``CV_`` prefix has to be omitted in contour retrieval mode and contour approximation method parameters (for example, use ``cv2.RETR_LIST`` and ``cv2.CHAIN_APPROX_NONE`` parameters). If you use the old Python interface then these parameters have the ``CV_`` prefix (for example, use ``cv.CV_RETR_LIST`` and ``cv.CV_CHAIN_APPROX_NONE``).
 
 drawContours
 ----------------
@@ -179,6 +194,12 @@ Draws contours outlines or filled contours.
 
     :param offset: Optional contour shift parameter. Shift all the drawn contours by the specified  :math:`\texttt{offset}=(dx,dy)` .
 
+    :param contour: Pointer to the first contour.
+
+    :param externalColor: Color of external contours.
+
+    :param holeColor: Color of internal contours (holes).
+
 The function draws contour outlines in the image if
 :math:`\texttt{thickness} \ge 0` or fills the area bounded by the contours if
 :math:`\texttt{thickness}<0` . The example below shows how to retrieve connected components from the binary image and label them: ::
@@ -342,6 +363,7 @@ The function computes a contour area. Similarly to
 :ocv:func:`moments` , the area is computed using the Green formula. Thus, the returned area and the number of non-zero pixels, if you draw the contour using
 :ocv:func:`drawContours` or
 :ocv:func:`fillPoly` , can be different.
+Also, the function will most certainly give a wrong results for contours with self-intersections.
 
 Example: ::
 
@@ -376,7 +398,7 @@ Finds the convex hull of a point set.
 
     :param points: Input 2D point set, stored in ``std::vector`` or ``Mat``.
 
-    :param hull: Output convex hull. It is either an integer vector of indices or vector of points. In the first case, the ``hull`` elements are 0-based indices of the convex hull points in the original array (since the set of convex hull points is a subset of the original point set). In the second case, ``hull`` elements aree the convex hull points themselves.
+    :param hull: Output convex hull. It is either an integer vector of indices or vector of points. In the first case, the ``hull`` elements are 0-based indices of the convex hull points in the original array (since the set of convex hull points is a subset of the original point set). In the second case, ``hull`` elements are the convex hull points themselves.
     
     :param storage: Output memory storage in the old API (``cvConvexHull2`` returns a sequence containing the convex hull points or their indices).
 
index 58992fe..5c27747 100644 (file)
@@ -1,4 +1,5 @@
 #include "perf_precomp.hpp"
+#include "opencv2/core/internal.hpp"
 
 using namespace std;
 using namespace cv;
@@ -62,7 +63,11 @@ PERF_TEST_P(Size_MatType_BorderType3x3, gaussianBlur3x3,
 
     TEST_CYCLE() GaussianBlur(src, dst, Size(3,3), 0, 0, btype);
 
+#if CV_SSE2
+    SANITY_CHECK(dst, 1);
+#else
     SANITY_CHECK(dst);
+#endif
 }
 
 PERF_TEST_P(Size_MatType_BorderType3x3, blur3x3,
index c7a30b5..b3dc760 100644 (file)
@@ -35,5 +35,5 @@ PERF_TEST_P(Img_BlockSize_ApertureSize_k_BorderType, cornerHarris,
 
     TEST_CYCLE() cornerHarris(src, dst, blockSize, apertureSize, k, borderType);
 
-    SANITY_CHECK(dst);
+    SANITY_CHECK(dst, 2e-6);
 }
\ No newline at end of file
index 75d1f5a..c4e20b5 100644 (file)
@@ -1767,26 +1767,26 @@ public:
             __m128i r1 = _mm_loadu_si128((const __m128i*)(bayer+bayer_step));
             __m128i r2 = _mm_loadu_si128((const __m128i*)(bayer+bayer_step*2));
             
-            __m128i b1 = _mm_add_epi16(_mm_srli_epi16(_mm_slli_epi16(r0, 8), 8),
-                                       _mm_srli_epi16(_mm_slli_epi16(r2, 8), 8));
+            __m128i b1 = _mm_add_epi16(_mm_srli_epi16(_mm_slli_epi16(r0, 8), 7),
+                                       _mm_srli_epi16(_mm_slli_epi16(r2, 8), 7));
             __m128i b0 = _mm_add_epi16(b1, _mm_srli_si128(b1, 2));
             b1 = _mm_slli_epi16(_mm_srli_si128(b1, 2), 1);
             
-            __m128i g0 = _mm_add_epi16(_mm_srli_epi16(r0, 8), _mm_srli_epi16(r2, 8));
-            __m128i g1 = _mm_srli_epi16(_mm_slli_epi16(r1, 8), 8);
+            __m128i g0 = _mm_add_epi16(_mm_srli_epi16(r0, 7), _mm_srli_epi16(r2, 7));
+            __m128i g1 = _mm_srli_epi16(_mm_slli_epi16(r1, 8), 7);
             g0 = _mm_add_epi16(g0, _mm_add_epi16(g1, _mm_srli_si128(g1, 2)));
             g1 = _mm_slli_epi16(_mm_srli_si128(g1, 2), 2);
             
             r0 = _mm_srli_epi16(r1, 8);
-            r1 = _mm_slli_epi16(_mm_add_epi16(r0, _mm_srli_si128(r0, 2)), 1);
-            r0 = _mm_slli_epi16(r0, 2);
-            
+            r1 = _mm_slli_epi16(_mm_add_epi16(r0, _mm_srli_si128(r0, 2)), 2);
+            r0 = _mm_slli_epi16(r0, 3);
+
             g0 = _mm_add_epi16(_mm_mulhi_epi16(b0, _b2y), _mm_mulhi_epi16(g0, _g2y));
             g1 = _mm_add_epi16(_mm_mulhi_epi16(b1, _b2y), _mm_mulhi_epi16(g1, _g2y));
             g0 = _mm_add_epi16(g0, _mm_mulhi_epi16(r0, _r2y));
             g1 = _mm_add_epi16(g1, _mm_mulhi_epi16(r1, _r2y));
-            g0 = _mm_srli_epi16(g0, 1);
-            g1 = _mm_srli_epi16(g1, 1);
+            g0 = _mm_srli_epi16(g0, 2);
+            g1 = _mm_srli_epi16(g1, 2);
             g0 = _mm_packus_epi16(g0, g0);
             g1 = _mm_packus_epi16(g1, g1);
             g0 = _mm_unpacklo_epi8(g0, g1);
@@ -2667,6 +2667,13 @@ static void Bayer2RGB_VNG_8u( const Mat& srcmat, Mat& dstmat, int code )
 
 ///////////////////////////////////// YUV420 -> RGB /////////////////////////////////////
 
+const int ITUR_BT_601_CY = 1220542;
+const int ITUR_BT_601_CUB = 2116026;
+const int ITUR_BT_601_CUG = -409993;
+const int ITUR_BT_601_CVG = -852492;
+const int ITUR_BT_601_CVR = 1673527;
+const int ITUR_BT_601_SHIFT = 20;
+
 template<int bIdx, int uIdx>
 struct YUV420sp2RGB888Invoker
 {
@@ -2690,13 +2697,6 @@ struct YUV420sp2RGB888Invoker
         //G = (1220542(Y - 16) - 852492(V - 128) - 409993(U - 128) + (1 << 19)) >> 20
         //B = (1220542(Y - 16)                  + 2116026(U - 128) + (1 << 19)) >> 20
 
-        const int cY = 1220542;
-        const int cUB = 2116026;
-        const int cUG = -409993;
-        const int cVG = -852492;
-        const int cVR = 1673527;
-        const int YUV420_SHIFT = 20;
-
         const uchar* y1 = my1 + rangeBegin * stride, *uv = muv + rangeBegin * stride / 2;
 
 #ifdef HAVE_TEGRA_OPTIMIZATION
@@ -2715,29 +2715,29 @@ struct YUV420sp2RGB888Invoker
                 int u = int(uv[i + 0 + uIdx]) - 128;
                 int v = int(uv[i + 1 - uIdx]) - 128;
 
-                int ruv = (1 << (YUV420_SHIFT - 1)) + cVR * v;
-                int guv = (1 << (YUV420_SHIFT - 1)) + cVG * v + cUG * u;
-                int buv = (1 << (YUV420_SHIFT - 1)) + cUB * u;
+                int ruv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVR * v;
+                int guv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVG * v + ITUR_BT_601_CUG * u;
+                int buv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CUB * u;
 
-                int y00 = std::max(0, int(y1[i]) - 16) * cY;
-                row1[2-bIdx] = saturate_cast<uchar>((y00 + ruv) >> YUV420_SHIFT);
-                row1[1]      = saturate_cast<uchar>((y00 + guv) >> YUV420_SHIFT);
-                row1[bIdx]   = saturate_cast<uchar>((y00 + buv) >> YUV420_SHIFT);
+                int y00 = std::max(0, int(y1[i]) - 16) * ITUR_BT_601_CY;
+                row1[2-bIdx] = saturate_cast<uchar>((y00 + ruv) >> ITUR_BT_601_SHIFT);
+                row1[1]      = saturate_cast<uchar>((y00 + guv) >> ITUR_BT_601_SHIFT);
+                row1[bIdx]   = saturate_cast<uchar>((y00 + buv) >> ITUR_BT_601_SHIFT);
 
-                int y01 = std::max(0, int(y1[i + 1]) - 16) * cY;
-                row1[5-bIdx] = saturate_cast<uchar>((y01 + ruv) >> YUV420_SHIFT);
-                row1[4]      = saturate_cast<uchar>((y01 + guv) >> YUV420_SHIFT);
-                row1[3+bIdx] = saturate_cast<uchar>((y01 + buv) >> YUV420_SHIFT);
+                int y01 = std::max(0, int(y1[i + 1]) - 16) * ITUR_BT_601_CY;
+                row1[5-bIdx] = saturate_cast<uchar>((y01 + ruv) >> ITUR_BT_601_SHIFT);
+                row1[4]      = saturate_cast<uchar>((y01 + guv) >> ITUR_BT_601_SHIFT);
+                row1[3+bIdx] = saturate_cast<uchar>((y01 + buv) >> ITUR_BT_601_SHIFT);
 
-                int y10 = std::max(0, int(y2[i]) - 16) * cY;
-                row2[2-bIdx] = saturate_cast<uchar>((y10 + ruv) >> YUV420_SHIFT);
-                row2[1]      = saturate_cast<uchar>((y10 + guv) >> YUV420_SHIFT);
-                row2[bIdx]   = saturate_cast<uchar>((y10 + buv) >> YUV420_SHIFT);
+                int y10 = std::max(0, int(y2[i]) - 16) * ITUR_BT_601_CY;
+                row2[2-bIdx] = saturate_cast<uchar>((y10 + ruv) >> ITUR_BT_601_SHIFT);
+                row2[1]      = saturate_cast<uchar>((y10 + guv) >> ITUR_BT_601_SHIFT);
+                row2[bIdx]   = saturate_cast<uchar>((y10 + buv) >> ITUR_BT_601_SHIFT);
 
-                int y11 = std::max(0, int(y2[i + 1]) - 16) * cY;
-                row2[5-bIdx] = saturate_cast<uchar>((y11 + ruv) >> YUV420_SHIFT);
-                row2[4]      = saturate_cast<uchar>((y11 + guv) >> YUV420_SHIFT);
-                row2[3+bIdx] = saturate_cast<uchar>((y11 + buv) >> YUV420_SHIFT);
+                int y11 = std::max(0, int(y2[i + 1]) - 16) * ITUR_BT_601_CY;
+                row2[5-bIdx] = saturate_cast<uchar>((y11 + ruv) >> ITUR_BT_601_SHIFT);
+                row2[4]      = saturate_cast<uchar>((y11 + guv) >> ITUR_BT_601_SHIFT);
+                row2[3+bIdx] = saturate_cast<uchar>((y11 + buv) >> ITUR_BT_601_SHIFT);
             }
         }
     }
@@ -2766,13 +2766,6 @@ struct YUV420sp2RGBA8888Invoker
         //G = (1220542(Y - 16) - 852492(V - 128) - 409993(U - 128) + (1 << 19)) >> 20
         //B = (1220542(Y - 16)                  + 2116026(U - 128) + (1 << 19)) >> 20
 
-        const int cY = 1220542;
-        const int cUB = 2116026;
-        const int cUG = -409993;
-        const int cVG = -852492;
-        const int cVR = 1673527;
-        const int YUV420_SHIFT = 20;
-
         const uchar* y1 = my1 + rangeBegin * stride, *uv = muv + rangeBegin * stride / 2;
 
 #ifdef HAVE_TEGRA_OPTIMIZATION
@@ -2791,32 +2784,32 @@ struct YUV420sp2RGBA8888Invoker
                 int u = int(uv[i + 0 + uIdx]) - 128;
                 int v = int(uv[i + 1 - uIdx]) - 128;
 
-                int ruv = (1 << (YUV420_SHIFT - 1)) + cVR * v;
-                int guv = (1 << (YUV420_SHIFT - 1)) + cVG * v + cUG * u;
-                int buv = (1 << (YUV420_SHIFT - 1)) + cUB * u;
+                int ruv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVR * v;
+                int guv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVG * v + ITUR_BT_601_CUG * u;
+                int buv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CUB * u;
 
-                int y00 = std::max(0, int(y1[i]) - 16) * cY;
-                row1[2-bIdx] = saturate_cast<uchar>((y00 + ruv) >> YUV420_SHIFT);
-                row1[1]      = saturate_cast<uchar>((y00 + guv) >> YUV420_SHIFT);
-                row1[bIdx]   = saturate_cast<uchar>((y00 + buv) >> YUV420_SHIFT);
+                int y00 = std::max(0, int(y1[i]) - 16) * ITUR_BT_601_CY;
+                row1[2-bIdx] = saturate_cast<uchar>((y00 + ruv) >> ITUR_BT_601_SHIFT);
+                row1[1]      = saturate_cast<uchar>((y00 + guv) >> ITUR_BT_601_SHIFT);
+                row1[bIdx]   = saturate_cast<uchar>((y00 + buv) >> ITUR_BT_601_SHIFT);
                 row1[3]      = uchar(0xff);
 
-                int y01 = std::max(0, int(y1[i + 1]) - 16) * cY;
-                row1[6-bIdx] = saturate_cast<uchar>((y01 + ruv) >> YUV420_SHIFT);
-                row1[5]      = saturate_cast<uchar>((y01 + guv) >> YUV420_SHIFT);
-                row1[4+bIdx] = saturate_cast<uchar>((y01 + buv) >> YUV420_SHIFT);
+                int y01 = std::max(0, int(y1[i + 1]) - 16) * ITUR_BT_601_CY;
+                row1[6-bIdx] = saturate_cast<uchar>((y01 + ruv) >> ITUR_BT_601_SHIFT);
+                row1[5]      = saturate_cast<uchar>((y01 + guv) >> ITUR_BT_601_SHIFT);
+                row1[4+bIdx] = saturate_cast<uchar>((y01 + buv) >> ITUR_BT_601_SHIFT);
                 row1[7]      = uchar(0xff);
 
-                int y10 = std::max(0, int(y2[i]) - 16) * cY;
-                row2[2-bIdx] = saturate_cast<uchar>((y10 + ruv) >> YUV420_SHIFT);
-                row2[1]      = saturate_cast<uchar>((y10 + guv) >> YUV420_SHIFT);
-                row2[bIdx]   = saturate_cast<uchar>((y10 + buv) >> YUV420_SHIFT);
+                int y10 = std::max(0, int(y2[i]) - 16) * ITUR_BT_601_CY;
+                row2[2-bIdx] = saturate_cast<uchar>((y10 + ruv) >> ITUR_BT_601_SHIFT);
+                row2[1]      = saturate_cast<uchar>((y10 + guv) >> ITUR_BT_601_SHIFT);
+                row2[bIdx]   = saturate_cast<uchar>((y10 + buv) >> ITUR_BT_601_SHIFT);
                 row2[3]      = uchar(0xff);
 
-                int y11 = std::max(0, int(y2[i + 1]) - 16) * cY;
-                row2[6-bIdx] = saturate_cast<uchar>((y11 + ruv) >> YUV420_SHIFT);
-                row2[5]      = saturate_cast<uchar>((y11 + guv) >> YUV420_SHIFT);
-                row2[4+bIdx] = saturate_cast<uchar>((y11 + buv) >> YUV420_SHIFT);
+                int y11 = std::max(0, int(y2[i + 1]) - 16) * ITUR_BT_601_CY;
+                row2[6-bIdx] = saturate_cast<uchar>((y11 + ruv) >> ITUR_BT_601_SHIFT);
+                row2[5]      = saturate_cast<uchar>((y11 + guv) >> ITUR_BT_601_SHIFT);
+                row2[4+bIdx] = saturate_cast<uchar>((y11 + buv) >> ITUR_BT_601_SHIFT);
                 row2[7]      = uchar(0xff);
             }
         }
@@ -2842,13 +2835,6 @@ struct YUV420p2RGB888Invoker
         size_t uvsteps[2] = {width/2, stride - width/2};
         int usIdx = ustepIdx, vsIdx = vstepIdx;
 
-        const int cY = 1220542;
-        const int cUB = 2116026;
-        const int cUG = -409993;
-        const int cVG = -852492;
-        const int cVR = 1673527;
-        const int YUV420_SHIFT = 20;
-
         const uchar* y1 = my1 + rangeBegin * stride;
         const uchar* u1 = mu + (range.begin() / 2) * stride;
         const uchar* v1 = mv + (range.begin() / 2) * stride;
@@ -2870,29 +2856,29 @@ struct YUV420p2RGB888Invoker
                 int u = int(u1[i]) - 128;
                 int v = int(v1[i]) - 128;
 
-                int ruv = (1 << (YUV420_SHIFT - 1)) + cVR * v;
-                int guv = (1 << (YUV420_SHIFT - 1)) + cVG * v + cUG * u;
-                int buv = (1 << (YUV420_SHIFT - 1)) + cUB * u;
+                int ruv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVR * v;
+                int guv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVG * v + ITUR_BT_601_CUG * u;
+                int buv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CUB * u;
 
-                int y00 = std::max(0, int(y1[2 * i]) - 16) * cY;
-                row1[2-bIdx] = saturate_cast<uchar>((y00 + ruv) >> YUV420_SHIFT);
-                row1[1]      = saturate_cast<uchar>((y00 + guv) >> YUV420_SHIFT);
-                row1[bIdx]   = saturate_cast<uchar>((y00 + buv) >> YUV420_SHIFT);
+                int y00 = std::max(0, int(y1[2 * i]) - 16) * ITUR_BT_601_CY;
+                row1[2-bIdx] = saturate_cast<uchar>((y00 + ruv) >> ITUR_BT_601_SHIFT);
+                row1[1]      = saturate_cast<uchar>((y00 + guv) >> ITUR_BT_601_SHIFT);
+                row1[bIdx]   = saturate_cast<uchar>((y00 + buv) >> ITUR_BT_601_SHIFT);
 
-                int y01 = std::max(0, int(y1[2 * i + 1]) - 16) * cY;
-                row1[5-bIdx] = saturate_cast<uchar>((y01 + ruv) >> YUV420_SHIFT);
-                row1[4]      = saturate_cast<uchar>((y01 + guv) >> YUV420_SHIFT);
-                row1[3+bIdx] = saturate_cast<uchar>((y01 + buv) >> YUV420_SHIFT);
+                int y01 = std::max(0, int(y1[2 * i + 1]) - 16) * ITUR_BT_601_CY;
+                row1[5-bIdx] = saturate_cast<uchar>((y01 + ruv) >> ITUR_BT_601_SHIFT);
+                row1[4]      = saturate_cast<uchar>((y01 + guv) >> ITUR_BT_601_SHIFT);
+                row1[3+bIdx] = saturate_cast<uchar>((y01 + buv) >> ITUR_BT_601_SHIFT);
 
-                int y10 = std::max(0, int(y2[2 * i]) - 16) * cY;
-                row2[2-bIdx] = saturate_cast<uchar>((y10 + ruv) >> YUV420_SHIFT);
-                row2[1]      = saturate_cast<uchar>((y10 + guv) >> YUV420_SHIFT);
-                row2[bIdx]   = saturate_cast<uchar>((y10 + buv) >> YUV420_SHIFT);
+                int y10 = std::max(0, int(y2[2 * i]) - 16) * ITUR_BT_601_CY;
+                row2[2-bIdx] = saturate_cast<uchar>((y10 + ruv) >> ITUR_BT_601_SHIFT);
+                row2[1]      = saturate_cast<uchar>((y10 + guv) >> ITUR_BT_601_SHIFT);
+                row2[bIdx]   = saturate_cast<uchar>((y10 + buv) >> ITUR_BT_601_SHIFT);
 
-                int y11 = std::max(0, int(y2[2 * i + 1]) - 16) * cY;
-                row2[5-bIdx] = saturate_cast<uchar>((y11 + ruv) >> YUV420_SHIFT);
-                row2[4]      = saturate_cast<uchar>((y11 + guv) >> YUV420_SHIFT);
-                row2[3+bIdx] = saturate_cast<uchar>((y11 + buv) >> YUV420_SHIFT);
+                int y11 = std::max(0, int(y2[2 * i + 1]) - 16) * ITUR_BT_601_CY;
+                row2[5-bIdx] = saturate_cast<uchar>((y11 + ruv) >> ITUR_BT_601_SHIFT);
+                row2[4]      = saturate_cast<uchar>((y11 + guv) >> ITUR_BT_601_SHIFT);
+                row2[3+bIdx] = saturate_cast<uchar>((y11 + buv) >> ITUR_BT_601_SHIFT);
             }
         }
     }
@@ -2914,13 +2900,6 @@ struct YUV420p2RGBA8888Invoker
         int rangeBegin = range.begin() * 2;
         int rangeEnd = range.end() * 2;
 
-        const int cY = 1220542;
-        const int cUB = 2116026;
-        const int cUG = -409993;
-        const int cVG = -852492;
-        const int cVR = 1673527;
-        const int YUV420_SHIFT = 20;
-        
         size_t uvsteps[2] = {width/2, stride - width/2};
         int usIdx = ustepIdx, vsIdx = vstepIdx;
 
@@ -2945,32 +2924,32 @@ struct YUV420p2RGBA8888Invoker
                 int u = int(u1[i]) - 128;
                 int v = int(v1[i]) - 128;
 
-                int ruv = (1 << (YUV420_SHIFT - 1)) + cVR * v;
-                int guv = (1 << (YUV420_SHIFT - 1)) + cVG * v + cUG * u;
-                int buv = (1 << (YUV420_SHIFT - 1)) + cUB * u;
+                int ruv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVR * v;
+                int guv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVG * v + ITUR_BT_601_CUG * u;
+                int buv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CUB * u;
 
-                int y00 = std::max(0, int(y1[2 * i]) - 16) * cY;
-                row1[2-bIdx] = saturate_cast<uchar>((y00 + ruv) >> YUV420_SHIFT);
-                row1[1]      = saturate_cast<uchar>((y00 + guv) >> YUV420_SHIFT);
-                row1[bIdx]   = saturate_cast<uchar>((y00 + buv) >> YUV420_SHIFT);
+                int y00 = std::max(0, int(y1[2 * i]) - 16) * ITUR_BT_601_CY;
+                row1[2-bIdx] = saturate_cast<uchar>((y00 + ruv) >> ITUR_BT_601_SHIFT);
+                row1[1]      = saturate_cast<uchar>((y00 + guv) >> ITUR_BT_601_SHIFT);
+                row1[bIdx]   = saturate_cast<uchar>((y00 + buv) >> ITUR_BT_601_SHIFT);
                 row1[3]      = uchar(0xff);
 
-                int y01 = std::max(0, int(y1[2 * i + 1]) - 16) * cY;
-                row1[6-bIdx] = saturate_cast<uchar>((y01 + ruv) >> YUV420_SHIFT);
-                row1[5]      = saturate_cast<uchar>((y01 + guv) >> YUV420_SHIFT);
-                row1[4+bIdx] = saturate_cast<uchar>((y01 + buv) >> YUV420_SHIFT);
+                int y01 = std::max(0, int(y1[2 * i + 1]) - 16) * ITUR_BT_601_CY;
+                row1[6-bIdx] = saturate_cast<uchar>((y01 + ruv) >> ITUR_BT_601_SHIFT);
+                row1[5]      = saturate_cast<uchar>((y01 + guv) >> ITUR_BT_601_SHIFT);
+                row1[4+bIdx] = saturate_cast<uchar>((y01 + buv) >> ITUR_BT_601_SHIFT);
                 row1[7]      = uchar(0xff);
 
-                int y10 = std::max(0, int(y2[2 * i]) - 16) * cY;
-                row2[2-bIdx] = saturate_cast<uchar>((y10 + ruv) >> YUV420_SHIFT);
-                row2[1]      = saturate_cast<uchar>((y10 + guv) >> YUV420_SHIFT);
-                row2[bIdx]   = saturate_cast<uchar>((y10 + buv) >> YUV420_SHIFT);
+                int y10 = std::max(0, int(y2[2 * i]) - 16) * ITUR_BT_601_CY;
+                row2[2-bIdx] = saturate_cast<uchar>((y10 + ruv) >> ITUR_BT_601_SHIFT);
+                row2[1]      = saturate_cast<uchar>((y10 + guv) >> ITUR_BT_601_SHIFT);
+                row2[bIdx]   = saturate_cast<uchar>((y10 + buv) >> ITUR_BT_601_SHIFT);
                 row2[3]      = uchar(0xff);
 
-                int y11 = std::max(0, int(y2[2 * i + 1]) - 16) * cY;
-                row2[6-bIdx] = saturate_cast<uchar>((y11 + ruv) >> YUV420_SHIFT);
-                row2[5]      = saturate_cast<uchar>((y11 + guv) >> YUV420_SHIFT);
-                row2[4+bIdx] = saturate_cast<uchar>((y11 + buv) >> YUV420_SHIFT);
+                int y11 = std::max(0, int(y2[2 * i + 1]) - 16) * ITUR_BT_601_CY;
+                row2[6-bIdx] = saturate_cast<uchar>((y11 + ruv) >> ITUR_BT_601_SHIFT);
+                row2[5]      = saturate_cast<uchar>((y11 + guv) >> ITUR_BT_601_SHIFT);
+                row2[4+bIdx] = saturate_cast<uchar>((y11 + buv) >> ITUR_BT_601_SHIFT);
                 row2[7]      = uchar(0xff);
             }
         }
@@ -3027,6 +3006,128 @@ inline void cvtYUV420p2RGBA(Mat& _dst, int _stride, const uchar* _y1, const ucha
         converter(BlockedRange(0, _dst.rows/2));
 }
 
+///////////////////////////////////// YUV422 -> RGB /////////////////////////////////////
+
+template<int bIdx, int uIdx, int yIdx>
+struct YUV422toRGB888Invoker
+{
+    Mat* dst;
+    const uchar* src;
+    int width, stride;
+
+    YUV422toRGB888Invoker(Mat* _dst, int _stride, const uchar* _yuv)
+        : dst(_dst), src(_yuv), width(_dst->cols), stride(_stride) {}
+
+    void operator()(const BlockedRange& range) const
+    {
+        int rangeBegin = range.begin();
+        int rangeEnd = range.end();
+
+        const int uidx = 1 - yIdx + uIdx * 2;
+        const int vidx = (2 + uidx) % 4;
+        const uchar* yuv_src = src + rangeBegin * stride;
+
+        for (int j = rangeBegin; j < rangeEnd; j++, yuv_src += stride)
+        {
+            uchar* row = dst->ptr<uchar>(j);
+
+            for (int i = 0; i < 2 * width; i += 4, row += 6)
+            {
+                int u = int(yuv_src[i + uidx]) - 128;
+                int v = int(yuv_src[i + vidx]) - 128;
+
+                int ruv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVR * v;
+                int guv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVG * v + ITUR_BT_601_CUG * u;
+                int buv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CUB * u;
+
+                int y00 = std::max(0, int(yuv_src[i + yIdx]) - 16) * ITUR_BT_601_CY;
+                row[2-bIdx] = saturate_cast<uchar>((y00 + ruv) >> ITUR_BT_601_SHIFT);
+                row[1]      = saturate_cast<uchar>((y00 + guv) >> ITUR_BT_601_SHIFT);
+                row[bIdx]   = saturate_cast<uchar>((y00 + buv) >> ITUR_BT_601_SHIFT);
+
+                int y01 = std::max(0, int(yuv_src[i + yIdx + 2]) - 16) * ITUR_BT_601_CY;
+                row[5-bIdx] = saturate_cast<uchar>((y01 + ruv) >> ITUR_BT_601_SHIFT);
+                row[4]      = saturate_cast<uchar>((y01 + guv) >> ITUR_BT_601_SHIFT);
+                row[3+bIdx] = saturate_cast<uchar>((y01 + buv) >> ITUR_BT_601_SHIFT);
+            }
+        }
+    }
+};
+
+template<int bIdx, int uIdx, int yIdx>
+struct YUV422toRGBA8888Invoker
+{
+    Mat* dst;
+    const uchar* src;
+    int width, stride;
+
+    YUV422toRGBA8888Invoker(Mat* _dst, int _stride, const uchar* _yuv)
+        : dst(_dst), src(_yuv), width(_dst->cols), stride(_stride) {}
+
+    void operator()(const BlockedRange& range) const
+    {
+        int rangeBegin = range.begin();
+        int rangeEnd = range.end();
+
+        const int uidx = 1 - yIdx + uIdx * 2;
+        const int vidx = (2 + uidx) % 4;
+        const uchar* yuv_src = src + rangeBegin * stride;
+
+        for (int j = rangeBegin; j < rangeEnd; j++, yuv_src += stride)
+        {
+            uchar* row = dst->ptr<uchar>(j);
+
+            for (int i = 0; i < 2 * width; i += 4, row += 8)
+            {
+                int u = int(yuv_src[i + uidx]) - 128;
+                int v = int(yuv_src[i + vidx]) - 128;
+
+                int ruv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVR * v;
+                int guv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVG * v + ITUR_BT_601_CUG * u;
+                int buv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CUB * u;
+
+                int y00 = std::max(0, int(yuv_src[i + yIdx]) - 16) * ITUR_BT_601_CY;
+                row[2-bIdx] = saturate_cast<uchar>((y00 + ruv) >> ITUR_BT_601_SHIFT);
+                row[1]      = saturate_cast<uchar>((y00 + guv) >> ITUR_BT_601_SHIFT);
+                row[bIdx]   = saturate_cast<uchar>((y00 + buv) >> ITUR_BT_601_SHIFT);
+                row[3]      = uchar(0xff);
+
+                int y01 = std::max(0, int(yuv_src[i + yIdx + 2]) - 16) * ITUR_BT_601_CY;
+                row[6-bIdx] = saturate_cast<uchar>((y01 + ruv) >> ITUR_BT_601_SHIFT);
+                row[5]      = saturate_cast<uchar>((y01 + guv) >> ITUR_BT_601_SHIFT);
+                row[4+bIdx] = saturate_cast<uchar>((y01 + buv) >> ITUR_BT_601_SHIFT);
+                row[7]      = uchar(0xff);
+            }
+        }
+    }
+};
+
+#define MIN_SIZE_FOR_PARALLEL_YUV422_CONVERSION (320*240)
+
+template<int bIdx, int uIdx, int yIdx>
+inline void cvtYUV422toRGB(Mat& _dst, int _stride, const uchar* _yuv)
+{
+    YUV422toRGB888Invoker<bIdx, uIdx, yIdx> converter(&_dst, _stride, _yuv);
+#ifdef HAVE_TBB
+    if (_dst.total() >= MIN_SIZE_FOR_PARALLEL_YUV422_CONVERSION)
+        parallel_for(BlockedRange(0, _dst.rows), converter);
+    else
+#endif
+        converter(BlockedRange(0, _dst.rows));
+}
+
+template<int bIdx, int uIdx, int yIdx>
+inline void cvtYUV422toRGBA(Mat& _dst, int _stride, const uchar* _yuv)
+{
+    YUV422toRGBA8888Invoker<bIdx, uIdx, yIdx> converter(&_dst, _stride, _yuv);
+#ifdef HAVE_TBB
+    if (_dst.total() >= MIN_SIZE_FOR_PARALLEL_YUV422_CONVERSION)
+        parallel_for(BlockedRange(0, _dst.rows), converter);
+    else
+#endif
+        converter(BlockedRange(0, _dst.rows));
+}
+
 }//namespace cv
 
 //////////////////////////////////////////////////////////////////////////////////////////
@@ -3484,11 +3585,56 @@ void cv::cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
                 src(Range(0, dstSz.height), Range::all()).copyTo(dst);
             }
             break;
-        case COLOR_YUV2RGB_UYVY: case COLOR_YUV2BGR_UYVY: case COLOR_YUV2RGBA_UYVY: case COLOR_YUV2BGRA_UYVY:
-        case COLOR_YUV2RGB_YUY2: case COLOR_YUV2BGR_YUY2: case COLOR_YUV2RGB_YVYU: case COLOR_YUV2BGR_YVYU:
-        case COLOR_YUV2RGBA_YUY2: case COLOR_YUV2BGRA_YUY2: case COLOR_YUV2RGBA_YVYU: case COLOR_YUV2BGRA_YVYU:
-        case COLOR_YUV2GRAY_UYVY: case COLOR_YUV2GRAY_YUY2:
-            CV_Error(CV_StsUnsupportedFormat, "This format is not supported yet");
+        case CV_YUV2RGB_UYVY: case CV_YUV2BGR_UYVY: case CV_YUV2RGBA_UYVY: case CV_YUV2BGRA_UYVY:
+        case CV_YUV2RGB_YUY2: case CV_YUV2BGR_YUY2: case CV_YUV2RGB_YVYU: case CV_YUV2BGR_YVYU:
+        case CV_YUV2RGBA_YUY2: case CV_YUV2BGRA_YUY2: case CV_YUV2RGBA_YVYU: case CV_YUV2BGRA_YVYU:
+            {
+                //http://www.fourcc.org/yuv.php#UYVY
+                //http://www.fourcc.org/yuv.php#YUY2
+                //http://www.fourcc.org/yuv.php#YVYU 
+                
+                if (dcn <= 0) dcn = (code==CV_YUV2RGBA_UYVY || code==CV_YUV2BGRA_UYVY || code==CV_YUV2RGBA_YUY2 || code==CV_YUV2BGRA_YUY2 || code==CV_YUV2RGBA_YVYU || code==CV_YUV2BGRA_YVYU) ? 4 : 3;
+                const int bidx = (code==CV_YUV2BGR_UYVY || code==CV_YUV2BGRA_UYVY || code==CV_YUV2BGR_YUY2 || code==CV_YUV2BGRA_YUY2 || code==CV_YUV2BGR_YVYU || code==CV_YUV2BGRA_YVYU) ? 0 : 2;
+                const int ycn = (code==CV_YUV2RGB_UYVY || code==CV_YUV2BGR_UYVY || code==CV_YUV2RGBA_UYVY || code==CV_YUV2BGRA_UYVY) ? 1 : 0;
+                const int uidx = (code==CV_YUV2RGB_YVYU || code==CV_YUV2BGR_YVYU || code==CV_YUV2RGBA_YVYU || code==CV_YUV2BGRA_YVYU) ? 1 : 0;
+                
+                CV_Assert( dcn == 3 || dcn == 4 );
+                CV_Assert( scn == 2 && depth == CV_8U );
+
+                _dst.create(sz, CV_8UC(dcn));
+                dst = _dst.getMat();
+                
+                switch(dcn*1000 + bidx*100 + uidx*10 + ycn)
+                {
+                    case 3000: cvtYUV422toRGB<0,0,0>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 3001: cvtYUV422toRGB<0,0,1>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 3010: cvtYUV422toRGB<0,1,0>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 3011: cvtYUV422toRGB<0,1,1>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 3200: cvtYUV422toRGB<2,0,0>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 3201: cvtYUV422toRGB<2,0,1>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 3210: cvtYUV422toRGB<2,1,0>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 3211: cvtYUV422toRGB<2,1,1>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 4000: cvtYUV422toRGBA<0,0,0>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 4001: cvtYUV422toRGBA<0,0,1>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 4010: cvtYUV422toRGBA<0,1,0>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 4011: cvtYUV422toRGBA<0,1,1>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 4200: cvtYUV422toRGBA<2,0,0>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 4201: cvtYUV422toRGBA<2,0,1>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 4210: cvtYUV422toRGBA<2,1,0>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    case 4211: cvtYUV422toRGBA<2,1,1>(dst, (int)src.step, src.ptr<uchar>()); break;
+                    default: CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" ); break;
+                };
+            }
+            break;
+        case CV_YUV2GRAY_UYVY: case CV_YUV2GRAY_YUY2:
+            {
+                if (dcn <= 0) dcn = 1;
+                
+                CV_Assert( dcn == 1 );
+                CV_Assert( scn == 2 && depth == CV_8U );
+
+                extractChannel(_src, _dst, code == CV_YUV2GRAY_UYVY ? 1 : 0);
+            }
             break;
         default:
             CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
index efe552a..6a998e5 100644 (file)
@@ -185,7 +185,8 @@ void FilterEngine::init( const Ptr<BaseFilter>& _filter2D,
     if( rowBorderType == BORDER_CONSTANT || columnBorderType == BORDER_CONSTANT )
     {
         constBorderValue.resize(srcElemSize*borderLength);
-        scalarToRawData(_borderValue, &constBorderValue[0], srcType,
+        int srcType1 = CV_MAKETYPE(CV_MAT_DEPTH(srcType), MIN(CV_MAT_CN(srcType), 4));
+        scalarToRawData(_borderValue, &constBorderValue[0], srcType1,
                         borderLength*CV_MAT_CN(srcType));
     }
 
@@ -2804,6 +2805,8 @@ cv::Ptr<cv::BaseRowFilter> cv::getLinearRowFilter( int srcType, int bufType,
     if( sdepth == CV_32F && ddepth == CV_32F )
         return Ptr<BaseRowFilter>(new RowFilter<float, float, RowVec_32f>
             (kernel, anchor, RowVec_32f(kernel)));
+    if( sdepth == CV_32F && ddepth == CV_64F )
+        return Ptr<BaseRowFilter>(new RowFilter<float, double, RowNoVec>(kernel, anchor));
     if( sdepth == CV_64F && ddepth == CV_64F )
         return Ptr<BaseRowFilter>(new RowFilter<double, double, RowNoVec>(kernel, anchor));
 
index beaa104..b1fc2f7 100644 (file)
@@ -2454,7 +2454,8 @@ void cv::remap( InputArray _src, OutputArray _dst,
     
     _dst.create( map1.size(), src.type() );
     Mat dst = _dst.getMat();
-    CV_Assert(dst.data != src.data);
+    if( dst.data == src.data )
+        src = src.clone();
 
     int depth = src.depth(), map_depth = map1.depth();
     RemapNNFunc nnfunc = 0;
@@ -2823,7 +2824,9 @@ void cv::warpAffine( InputArray _src, OutputArray _dst,
     Mat src = _src.getMat(), M0 = _M0.getMat();
     _dst.create( dsize.area() == 0 ? src.size() : dsize, src.type() );
     Mat dst = _dst.getMat();
-    CV_Assert( dst.data != src.data && src.cols > 0 && src.rows > 0 );
+    CV_Assert( src.cols > 0 && src.rows > 0 );
+    if( dst.data == src.data )
+        src = src.clone();
 
     const int BLOCK_SZ = 64;
     short XY[BLOCK_SZ*BLOCK_SZ*2], A[BLOCK_SZ*BLOCK_SZ];
@@ -2966,7 +2969,9 @@ void cv::warpPerspective( InputArray _src, OutputArray _dst, InputArray _M0,
     _dst.create( dsize.area() == 0 ? src.size() : dsize, src.type() );
     Mat dst = _dst.getMat();
     
-    CV_Assert( dst.data != src.data && src.cols > 0 && src.rows > 0 );
+    CV_Assert( src.cols > 0 && src.rows > 0 );
+    if( dst.data == src.data )
+        src = src.clone();
 
     const int BLOCK_SZ = 32;
     short XY[BLOCK_SZ*BLOCK_SZ*2], A[BLOCK_SZ*BLOCK_SZ];
index 4488bc4..801a2cd 100644 (file)
@@ -75,6 +75,23 @@ template<typename T> struct MaxOp
 template<> inline uchar MinOp<uchar>::operator ()(uchar a, uchar b) const { return CV_MIN_8U(a, b); }
 template<> inline uchar MaxOp<uchar>::operator ()(uchar a, uchar b) const { return CV_MAX_8U(a, b); }
 
+struct MorphRowNoVec
+{
+    MorphRowNoVec(int, int) {}
+    int operator()(const uchar*, uchar*, int, int) const { return 0; }
+};
+
+struct MorphColumnNoVec
+{
+    MorphColumnNoVec(int, int) {}
+    int operator()(const uchar**, uchar*, int, int, int) const { return 0; }
+};
+
+struct MorphNoVec
+{
+    int operator()(uchar**, int, uchar*, int) const { return 0; }
+};
+    
 #if CV_SSE2
 
 template<class VecUpdate> struct MorphRowIVec
@@ -567,23 +584,6 @@ typedef MorphFVec<VMax32f> DilateVec32f;
 
 #else
 
-struct MorphRowNoVec
-{
-    MorphRowNoVec(int, int) {}
-    int operator()(const uchar*, uchar*, int, int) const { return 0; }
-};
-
-struct MorphColumnNoVec
-{
-    MorphColumnNoVec(int, int) {}
-    int operator()(const uchar**, uchar*, int, int, int) const { return 0; }
-};
-
-struct MorphNoVec
-{
-    int operator()(uchar**, int, uchar*, int) const { return 0; }
-};
-
 #ifdef HAVE_TEGRA_OPTIMIZATION
 using tegra::ErodeRowVec8u;
 using tegra::DilateRowVec8u;
@@ -623,6 +623,13 @@ typedef MorphNoVec DilateVec32f;
 
 #endif
 
+typedef MorphRowNoVec ErodeRowVec64f;
+typedef MorphRowNoVec DilateRowVec64f;
+typedef MorphColumnNoVec ErodeColumnVec64f;
+typedef MorphColumnNoVec DilateColumnVec64f;
+typedef MorphNoVec ErodeVec64f;
+typedef MorphNoVec DilateVec64f;
+
 
 template<class Op, class VecOp> struct MorphRowFilter : public BaseRowFilter
 {
@@ -861,6 +868,9 @@ cv::Ptr<cv::BaseRowFilter> cv::getMorphologyRowFilter(int op, int type, int ksiz
         if( depth == CV_32F )
             return Ptr<BaseRowFilter>(new MorphRowFilter<MinOp<float>,
                                       ErodeRowVec32f>(ksize, anchor));
+        if( depth == CV_64F )
+            return Ptr<BaseRowFilter>(new MorphRowFilter<MinOp<double>,
+                                      ErodeRowVec64f>(ksize, anchor));
     }
     else
     {
@@ -876,6 +886,9 @@ cv::Ptr<cv::BaseRowFilter> cv::getMorphologyRowFilter(int op, int type, int ksiz
         if( depth == CV_32F )
             return Ptr<BaseRowFilter>(new MorphRowFilter<MaxOp<float>,
                                       DilateRowVec32f>(ksize, anchor));
+        if( depth == CV_64F )
+            return Ptr<BaseRowFilter>(new MorphRowFilter<MaxOp<double>,
+                                      DilateRowVec64f>(ksize, anchor));
     } 
 
     CV_Error_( CV_StsNotImplemented, ("Unsupported data type (=%d)", type));
@@ -902,6 +915,9 @@ cv::Ptr<cv::BaseColumnFilter> cv::getMorphologyColumnFilter(int op, int type, in
         if( depth == CV_32F )
             return Ptr<BaseColumnFilter>(new MorphColumnFilter<MinOp<float>,
                                          ErodeColumnVec32f>(ksize, anchor));
+        if( depth == CV_64F )
+            return Ptr<BaseColumnFilter>(new MorphColumnFilter<MinOp<double>,
+                                         ErodeColumnVec64f>(ksize, anchor));
     }
     else
     {
@@ -917,6 +933,9 @@ cv::Ptr<cv::BaseColumnFilter> cv::getMorphologyColumnFilter(int op, int type, in
         if( depth == CV_32F )
             return Ptr<BaseColumnFilter>(new MorphColumnFilter<MaxOp<float>,
                                          DilateColumnVec32f>(ksize, anchor));
+        if( depth == CV_64F )
+            return Ptr<BaseColumnFilter>(new MorphColumnFilter<MaxOp<double>,
+                                         DilateColumnVec64f>(ksize, anchor));
     }
 
     CV_Error_( CV_StsNotImplemented, ("Unsupported data type (=%d)", type));
@@ -940,6 +959,8 @@ cv::Ptr<cv::BaseFilter> cv::getMorphologyFilter(int op, int type, InputArray _ke
             return Ptr<BaseFilter>(new MorphFilter<MinOp<short>, ErodeVec16s>(kernel, anchor));
         if( depth == CV_32F )
             return Ptr<BaseFilter>(new MorphFilter<MinOp<float>, ErodeVec32f>(kernel, anchor));
+        if( depth == CV_64F )
+            return Ptr<BaseFilter>(new MorphFilter<MinOp<double>, ErodeVec64f>(kernel, anchor));
     }
     else
     {
@@ -951,6 +972,8 @@ cv::Ptr<cv::BaseFilter> cv::getMorphologyFilter(int op, int type, InputArray _ke
             return Ptr<BaseFilter>(new MorphFilter<MaxOp<short>, DilateVec16s>(kernel, anchor));
         if( depth == CV_32F )
             return Ptr<BaseFilter>(new MorphFilter<MaxOp<float>, DilateVec32f>(kernel, anchor));
+        if( depth == CV_64F )
+            return Ptr<BaseFilter>(new MorphFilter<MaxOp<double>, DilateVec64f>(kernel, anchor));
     }
 
     CV_Error_( CV_StsNotImplemented, ("Unsupported data type (=%d)", type));
@@ -983,14 +1006,18 @@ cv::Ptr<cv::FilterEngine> cv::createMorphologyFilter( int op, int type, InputArr
             borderValue == morphologyDefaultBorderValue() )
     {
         int depth = CV_MAT_DEPTH(type);
-        CV_Assert( depth == CV_8U || depth == CV_16U || depth == CV_16S || depth == CV_32F );
+        CV_Assert( depth == CV_8U || depth == CV_16U || depth == CV_16S ||
+                   depth == CV_32F || depth == CV_64F );
         if( op == MORPH_ERODE )
             borderValue = Scalar::all( depth == CV_8U ? (double)UCHAR_MAX :
-                                                        depth == CV_16U ? (double)USHRT_MAX :
-                                                        depth == CV_16S ? (double)SHRT_MAX : (double)FLT_MAX );
+                                       depth == CV_16U ? (double)USHRT_MAX :
+                                       depth == CV_16S ? (double)SHRT_MAX :
+                                       depth == CV_32F ? (double)FLT_MAX : DBL_MAX);
         else
-            borderValue = Scalar::all( depth == CV_8U || depth == CV_16U ? 0. :
-                                                         depth == CV_16S ? (double)SHRT_MIN : (double)-FLT_MAX );
+            borderValue = Scalar::all( depth == CV_8U || depth == CV_16U ?
+                                           0. :
+                                       depth == CV_16S ? (double)SHRT_MIN :
+                                       depth == CV_32F ? (double)-FLT_MAX : -DBL_MAX);
     }
 
     return Ptr<FilterEngine>(new FilterEngine(filter2D, rowFilter, columnFilter,
index 9bc66f6..81462a6 100644 (file)
@@ -308,7 +308,7 @@ pyrDown_( const Mat& _src, Mat& _dst, int borderType )
 
 
 template<class CastOp, class VecOp> void
-pyrUp_( const Mat& _src, Mat& _dst, int borderType )
+pyrUp_( const Mat& _src, Mat& _dst, int)
 {
     const int PU_SZ = 3;
     typedef typename CastOp::type1 WT;
index 0f445ef..28f04a2 100644 (file)
@@ -58,7 +58,6 @@ void crossCorr( const Mat& img, const Mat& _templ, Mat& corr,
     int cdepth = CV_MAT_DEPTH(ctype), ccn = CV_MAT_CN(ctype);
     
     CV_Assert( img.dims <= 2 && templ.dims <= 2 && corr.dims <= 2 );
-    CV_Assert( depth == CV_8U || depth == CV_16U || depth == CV_32F || depth == CV_64F );
     
     if( depth != tdepth && tdepth != std::max(CV_32F, depth) )
     {
@@ -74,7 +73,7 @@ void crossCorr( const Mat& img, const Mat& _templ, Mat& corr,
     
     corr.create(corrsize, ctype);
 
-    int maxDepth = depth > CV_8U ? CV_64F : std::max(std::max(CV_32F, tdepth), cdepth);
+    int maxDepth = depth > CV_8S ? CV_64F : std::max(std::max(CV_32F, tdepth), cdepth);
     Size blocksize, dftsize;
     
     blocksize.width = cvRound(templ.cols*blockScale);
@@ -228,14 +227,6 @@ void crossCorr( const Mat& img, const Mat& _templ, Mat& corr,
     }
 }
 
-/*void
-cv::crossCorr( const Mat& img, const Mat& templ, Mat& corr,
-           Point anchor, double delta, int borderType )
-{
-    CvMat _img = img, _templ = templ, _corr = corr;
-    icvCrossCorr( &_img, &_templ, &_corr, anchor, delta, borderType );
-}*/
-
 }
 
 /*****************************************************************************************/
index 68008b7..1422f4c 100644 (file)
@@ -1672,11 +1672,31 @@ TEST(Imgproc_ColorRGB, accuracy) { CV_ColorRGBTest test; test.safe_run(); }
 TEST(Imgproc_ColorBayer, accuracy) { CV_ColorBayerTest test; test.safe_run(); }
 
 
-TEST(Imgproc_ColorBayerVNG, accuracy)
+TEST(Imgproc_ColorBayer, regression)
 {
     cvtest::TS& ts = *cvtest::TS::ptr();
 
-    Mat given = imread(string(ts.get_data_path()) + "/cvtcolor/bayerVNG_input.png", CV_LOAD_IMAGE_GRAYSCALE);
+    Mat given = imread(string(ts.get_data_path()) + "/cvtcolor/bayer_input.png", CV_LOAD_IMAGE_GRAYSCALE);
+    Mat gold = imread(string(ts.get_data_path()) + "/cvtcolor/bayer_gold.png", CV_LOAD_IMAGE_UNCHANGED);
+    Mat result;
+
+    cvtColor(given, result, CV_BayerBG2GRAY);
+
+    EXPECT_EQ(gold.type(), result.type());
+    EXPECT_EQ(gold.cols, result.cols);
+    EXPECT_EQ(gold.rows, result.rows);
+
+    Mat diff;
+    absdiff(gold, result, diff);
+
+    EXPECT_EQ(0, countNonZero(diff.reshape(1) > 1));
+}
+
+TEST(Imgproc_ColorBayerVNG, regression)
+{
+    cvtest::TS& ts = *cvtest::TS::ptr();
+
+    Mat given = imread(string(ts.get_data_path()) + "/cvtcolor/bayer_input.png", CV_LOAD_IMAGE_GRAYSCALE);
     Mat gold = imread(string(ts.get_data_path()) + "/cvtcolor/bayerVNG_gold.png", CV_LOAD_IMAGE_UNCHANGED);
     Mat result;
 
index d399286..b790949 100644 (file)
@@ -477,10 +477,7 @@ INSTANTIATE_TEST_CASE_P(cvt420, Imgproc_ColorYUV,
                       (int)CV_YUV2RGBA_YV12, (int)CV_YUV2BGRA_YV12, (int)CV_YUV2RGBA_IYUV, (int)CV_YUV2BGRA_IYUV,\r
                       (int)CV_YUV2GRAY_420));\r
 \r
-INSTANTIATE_TEST_CASE_P(DISABLED_cvt888, Imgproc_ColorYUV,\r
-    ::testing::Values((int)CV_YUV2BGR, (int)CV_YUV2RGB));\r
-\r
-INSTANTIATE_TEST_CASE_P(DISABLED_cvt422, Imgproc_ColorYUV,\r
+INSTANTIATE_TEST_CASE_P(cvt422, Imgproc_ColorYUV,\r
     ::testing::Values((int)CV_YUV2RGB_UYVY, (int)CV_YUV2BGR_UYVY, (int)CV_YUV2RGBA_UYVY, (int)CV_YUV2BGRA_UYVY,\r
                       (int)CV_YUV2RGB_YUY2, (int)CV_YUV2BGR_YUY2, (int)CV_YUV2RGB_YVYU, (int)CV_YUV2BGR_YVYU,\r
                       (int)CV_YUV2RGBA_YUY2, (int)CV_YUV2BGRA_YUY2, (int)CV_YUV2RGBA_YVYU, (int)CV_YUV2BGRA_YVYU,\r
index 61d1e36..49f0f6b 100644 (file)
@@ -1775,3 +1775,107 @@ TEST(Imgproc_MinEigenVal, accuracy) { CV_MinEigenValTest test; test.safe_run();
 TEST(Imgproc_EigenValsVecs, accuracy) { CV_EigenValVecTest test; test.safe_run(); }
 TEST(Imgproc_PreCornerDetect, accuracy) { CV_PreCornerDetectTest test; test.safe_run(); }
 TEST(Imgproc_Integral, accuracy) { CV_IntegralTest test; test.safe_run(); }
+
+//////////////////////////////////////////////////////////////////////////////////
+
+class CV_FilterSupportedFormatsTest : public cvtest::BaseTest
+{
+public:
+    CV_FilterSupportedFormatsTest() {}
+    ~CV_FilterSupportedFormatsTest() {}   
+protected:
+    void run(int)
+    {
+        const int depths[][2] = 
+        {
+            {CV_8U, CV_8U},
+            {CV_8U, CV_16U},
+            {CV_8U, CV_16S},
+            {CV_8U, CV_32F},
+            {CV_8U, CV_64F},
+            {CV_16U, CV_16U},
+            {CV_16U, CV_32F},
+            {CV_16U, CV_64F},
+            {CV_16S, CV_16S},
+            {CV_16S, CV_32F},
+            {CV_16S, CV_64F},
+            {CV_32F, CV_32F},
+            {CV_64F, CV_64F},
+            {-1, -1}
+        };
+        
+        int i = 0;
+        volatile int fidx = -1;
+        try
+        {
+            // use some "odd" size to do yet another smoke
+            // testing of the non-SIMD loop tails
+            Size sz(163, 117);
+            Mat small_kernel(5, 5, CV_32F), big_kernel(21, 21, CV_32F);
+            Mat kernelX(11, 1, CV_32F), kernelY(7, 1, CV_32F);
+            Mat symkernelX(11, 1, CV_32F), symkernelY(7, 1, CV_32F);
+            randu(small_kernel, -10, 10);
+            randu(big_kernel, -1, 1);
+            randu(kernelX, -1, 1);
+            randu(kernelY, -1, 1);
+            flip(kernelX, symkernelX, 0);
+            symkernelX += kernelX;
+            flip(kernelY, symkernelY, 0);
+            symkernelY += kernelY;
+            
+            Mat elem_ellipse = getStructuringElement(MORPH_ELLIPSE, Size(7, 7));
+            Mat elem_rect = getStructuringElement(MORPH_RECT, Size(7, 7));
+            
+            for( i = 0; depths[i][0] >= 0; i++ )
+            {
+                int sdepth = depths[i][0];
+                int ddepth = depths[i][1];
+                Mat src(sz, CV_MAKETYPE(sdepth, 5)), dst;
+                randu(src, 0, 100);
+                // non-separable filtering with a small kernel
+                fidx = 0;
+                filter2D(src, dst, ddepth, small_kernel);
+                fidx++;
+                filter2D(src, dst, ddepth, big_kernel);
+                fidx++;
+                sepFilter2D(src, dst, ddepth, kernelX, kernelY);
+                fidx++;
+                sepFilter2D(src, dst, ddepth, symkernelX, symkernelY);
+                fidx++;
+                Sobel(src, dst, ddepth, 2, 0, 5);
+                fidx++;
+                Scharr(src, dst, ddepth, 0, 1);
+                if( sdepth != ddepth )
+                    continue;
+                fidx++;
+                GaussianBlur(src, dst, Size(5, 5), 1.2, 1.2);
+                fidx++;
+                blur(src, dst, Size(11, 11));
+                fidx++;
+                morphologyEx(src, dst, MORPH_GRADIENT, elem_ellipse);
+                fidx++;
+                morphologyEx(src, dst, MORPH_GRADIENT, elem_rect);
+            }
+        }
+        catch(...)
+        {
+            ts->printf(cvtest::TS::LOG, "Combination of depths %d => %d in %s is not supported (yet it should be)",
+                       depths[i][0], depths[i][1],
+                       fidx == 0 ? "filter2D (small kernel)" :
+                       fidx == 1 ? "filter2D (large kernel)" :
+                       fidx == 2 ? "sepFilter2D" :
+                       fidx == 3 ? "sepFilter2D (symmetrical/asymmetrical kernel)" :
+                       fidx == 4 ? "Sobel" :
+                       fidx == 5 ? "Scharr" :
+                       fidx == 6 ? "GaussianBlur" :
+                       fidx == 7 ? "blur" :
+                       fidx == 8 || fidx == 9 ? "morphologyEx" :
+                       "unknown???");
+                       
+            ts->set_failed_test_info(cvtest::TS::FAIL_MISMATCH);
+        }
+    }
+};
+
+TEST(Imgproc_Filtering, supportedFormats) { CV_FilterSupportedFormatsTest test; test.safe_run(); }
+
index ca53d8c..0152777 100644 (file)
@@ -391,3 +391,33 @@ void CV_HuMomentsTest::prepare_to_validation( int /*test_case_idx*/ )
 
 TEST(Imgproc_Moments, accuracy) { CV_MomentsTest test; test.safe_run(); }
 TEST(Imgproc_HuMoments, accuracy) { CV_HuMomentsTest test; test.safe_run(); }
+
+class CV_SmallContourMomentTest : public cvtest::BaseTest
+{
+public:
+    CV_SmallContourMomentTest() {}
+    ~CV_SmallContourMomentTest() {}   
+protected:
+    void run(int)
+    {
+        try
+        {
+            vector<Point> points;
+            points.push_back(Point(50, 56));
+            points.push_back(Point(53, 53));
+            points.push_back(Point(46, 54));
+            points.push_back(Point(49, 51));
+            
+            Moments m = moments(points, false);
+            double area = contourArea(points);
+            
+            CV_Assert( m.m00 == 0 && m.m01 == 0 && m.m10 == 0 && area == 0 );
+        }
+        catch(...)
+        {
+            ts->set_failed_test_info(cvtest::TS::FAIL_MISMATCH);
+        }
+    }
+};
+
+TEST(Imgproc_ContourMoment, small) { CV_SmallContourMomentTest test; test.safe_run(); }
index 97b71b6..1d0f02e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-       <name>OpenCV-2.3.1</name>
+       <name>OpenCV-2.4.beta</name>
        <comment></comment>
        <projects>
        </projects>
index 90978a5..e261e2d 100644 (file)
@@ -17,7 +17,7 @@
     the package of org.opencv.  To run the tests use the command:
     "adb shell am instrument -w org.opencv.test/android.test.InstrumentationTestRunner"
     -->
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
+    <instrumentation android:name="org.opencv.test.OpenCVTestRunner"
                      android:targetPackage="org.opencv.test"
                      android:label="Tests for org.opencv"/>
     
index fc00915..d9fdca3 100644 (file)
@@ -25,7 +25,10 @@ import org.opencv.highgui.Highgui;
 
 public class OpenCVTestCase extends TestCase {
 
-    protected static final int matSize = 10;
+       //change to 'true' to unblock fail on fail("Not yet implemented")
+       public static final boolean passNYI = true;
+    
+       protected static final int matSize = 10;
     protected static final double EPS = 0.001;
     protected static final double weakEPS = 0.5;
 
@@ -181,6 +184,12 @@ public class OpenCVTestCase extends TestCase {
         return m;
     }
 
+    public static void fail(String msg) {
+       if(msg == "Not yet implemented" && passNYI)
+               return;
+       TestCase.fail(msg);
+    }
+    
     public static <E extends Number> void assertListEquals(List<E> list1, List<E> list2) {
         if (list1.size() != list2.size()) {
             throw new UnsupportedOperationException();
@@ -205,6 +214,26 @@ public class OpenCVTestCase extends TestCase {
             assertTrue(Math.abs(list1.get(i).doubleValue() - list2.get(i).doubleValue()) <= epsilon);
     }
 
+    public static <E extends Number> void assertArrayEquals(E[] ar1, E[] ar2, double epsilon) {
+        if (ar1.length != ar2.length) {
+            fail("Arrays have different sizes.");
+        }
+
+        for (int i = 0; i < ar1.length; i++)
+               assertEquals(ar1[i].doubleValue(), ar2[i].doubleValue(), epsilon);
+            //assertTrue(Math.abs(ar1[i].doubleValue() - ar2[i].doubleValue()) <= epsilon);
+    }
+
+    public static void assertArrayEquals(double[] ar1, double[] ar2, double epsilon) {
+        if (ar1.length != ar2.length) {
+            fail("Arrays have different sizes.");
+        }
+
+        for (int i = 0; i < ar1.length; i++)
+               assertEquals(ar1[i], ar2[i], epsilon);
+            //assertTrue(Math.abs(ar1[i].doubleValue() - ar2[i].doubleValue()) <= epsilon);
+    }
+
     public static void assertListMatEquals(List<Mat> list1, List<Mat> list2, double epsilon) {
         if (list1.size() != list2.size()) {
             throw new UnsupportedOperationException();
@@ -223,6 +252,14 @@ public class OpenCVTestCase extends TestCase {
             assertPointEquals(list1.get(i), list2.get(i), epsilon);
     }
 
+    public static void assertArrayPointsEquals(Point[] vp1, Point[] vp2, double epsilon) {
+        if (vp1.length != vp2.length) {
+            fail("Arrays have different sizes.");
+        }
+
+        for (int i = 0; i < vp1.length; i++)
+            assertPointEquals(vp1[i], vp2[i], epsilon);
+    }
     public static void assertListPoint3Equals(List<Point3> list1, List<Point3> list2, double epsilon) {
         if (list1.size() != list2.size()) {
             throw new UnsupportedOperationException();
@@ -297,10 +334,16 @@ public class OpenCVTestCase extends TestCase {
         assertTrue(msg, Math.abs(expected.val[3] - actual.val[3]) < eps);
     }
 
+    public static void assertArrayDMatchEquals(DMatch[] expected, DMatch[] actual, double epsilon) {
+        assertEquals(expected.length, actual.length);
+        for (int i = 0; i < expected.length; i++)
+            assertDMatchEqual(expected[i], actual[i], epsilon);
+    }
+
     public static void assertListDMatchEquals(List<DMatch> expected, List<DMatch> actual, double epsilon) {
-        assertEquals(expected.size(), actual.size());
-        for (int i = 0; i < expected.size(); i++)
-            assertDMatchEqual(expected.get(i), actual.get(i), epsilon);
+       DMatch expectedArray[] = expected.toArray(new DMatch[0]);
+       DMatch actualArray[]   = actual.toArray(new DMatch[0]);
+       assertArrayDMatchEquals(expectedArray, actualArray, epsilon);
     }
 
     public static void assertPointEquals(Point expected, Point actual, double eps) {
index 0ea89a4..50057a3 100644 (file)
@@ -1,15 +1,19 @@
 package org.opencv.test;
 
-import android.content.Context;
-import android.test.AndroidTestRunner;
-import android.test.InstrumentationTestRunner;
-import android.util.Log;
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import junit.framework.TestCase;
+import junit.framework.Assert;
 
 import org.opencv.android.Utils;
 import org.opencv.core.Mat;
 
-import java.io.File;
-import java.io.IOException;
+import android.content.Context;
+import android.test.AndroidTestRunner;
+import android.test.InstrumentationTestRunner;
+import android.util.Log;
 
 /**
  * This only class is Android specific.
@@ -54,6 +58,7 @@ public class OpenCVTestRunner extends InstrumentationTestRunner {
     @Override
     public void onStart() {
         context = getContext();
+        Assert.assertTrue("Context can't be 'null'", context != null);
         LENA_PATH = Utils.exportResource(context, R.drawable.lena);
         CHESS_PATH = Utils.exportResource(context, R.drawable.chessboard);
         LBPCASCADE_FRONTALFACE_PATH = Utils.exportResource(context, R.raw.lbpcascade_frontalface);
@@ -62,8 +67,19 @@ public class OpenCVTestRunner extends InstrumentationTestRunner {
          * The original idea about test order randomization is from
          * marek.defecinski blog.
          */
-        // List<TestCase> testCases = androidTestRunner.getTestCases();
-        // Collections.shuffle(testCases); //shuffle the tests order
+        //List<TestCase> testCases = androidTestRunner.getTestCases();
+        //Collections.shuffle(testCases); //shuffle the tests order
+
+        if(OpenCVTestCase.passNYI) {
+            // turn off problematic camera tests
+            Iterator<TestCase> it = androidTestRunner.getTestCases().iterator();
+            while (it.hasNext()) {
+                String name = it.next().toString();
+                if (name.contains("VideoCaptureTest"))
+                    it.remove();
+            }
+        }
+
 
         super.onStart();
     }
index 9c917be..9779ef8 100644 (file)
@@ -1,14 +1,12 @@
 package org.opencv.test.calib3d;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.opencv.calib3d.Calib3d;
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfPoint2f;
+import org.opencv.core.MatOfPoint3f;
 import org.opencv.core.Point;
-import org.opencv.core.Point3;
 import org.opencv.core.Scalar;
 import org.opencv.core.Size;
 import org.opencv.test.OpenCVTestCase;
@@ -235,21 +233,21 @@ public class Calib3dTest extends OpenCVTestCase {
     }
 
     public void testFindFundamentalMatListOfPointListOfPoint() {
-        List<Point> pts1 = new ArrayList<Point>();
-        List<Point> pts2 = new ArrayList<Point>();
-
         int minFundamentalMatPoints = 8;
+
+       MatOfPoint2f pts = new MatOfPoint2f();
+       pts.alloc(minFundamentalMatPoints);
+
         for (int i = 0; i < minFundamentalMatPoints; i++) {
             double x = Math.random() * 100 - 50;
             double y = Math.random() * 100 - 50;
-            pts1.add(new Point(x, y));
-            pts2.add(new Point(x, y));
+            pts.put(i, 0, x, y); //add(new Point(x, y));
         }
 
-        Mat fm = Calib3d.findFundamentalMat(pts1, pts2);
+        Mat fm = Calib3d.findFundamentalMat(pts, pts);
 
         truth = new Mat(3, 3, CvType.CV_64F);
-        truth.put(0, 0, 0, -0.5, -0.5, 0.5, 0, 0, 0.5, 0, 0);
+        truth.put(0, 0, 0, -0.577, 0.288, 0.577, 0, 0.288, -0.288, -0.288, 0);
         assertMatEqual(truth, fm, EPS);
     }
 
@@ -270,14 +268,18 @@ public class Calib3dTest extends OpenCVTestCase {
     }
 
     public void testFindHomographyListOfPointListOfPoint() {
-        List<Point> originalPoints = new ArrayList<Point>();
-        List<Point> transformedPoints = new ArrayList<Point>();
-
-        for (int i = 0; i < 20; i++) {
+       final int NUM = 20;
+       
+       MatOfPoint2f originalPoints = new MatOfPoint2f();
+       originalPoints.alloc(NUM);
+       MatOfPoint2f transformedPoints = new MatOfPoint2f();
+       transformedPoints.alloc(NUM);
+
+        for (int i = 0; i < NUM; i++) {
             double x = Math.random() * 100 - 50;
             double y = Math.random() * 100 - 50;
-            originalPoints.add(new Point(x, y));
-            transformedPoints.add(new Point(y, x));
+            originalPoints.put(i, 0, x, y);
+            transformedPoints.put(i, 0, y, x);
         }
 
         Mat hmg = Calib3d.findHomography(originalPoints, transformedPoints);
@@ -497,15 +499,18 @@ public class Calib3dTest extends OpenCVTestCase {
         intrinsics.put(0, 2, 640 / 2);
         intrinsics.put(1, 2, 480 / 2);
 
-        List<Point3> points3d = new ArrayList<Point3>();
-        List<Point> points2d = new ArrayList<Point>();
-        int minPnpPointsNum = 4;
+        final int minPnpPointsNum = 4;
+        
+        MatOfPoint3f points3d = new MatOfPoint3f();
+        points3d.alloc(minPnpPointsNum);
+        MatOfPoint2f points2d = new MatOfPoint2f();
+        points2d.alloc(minPnpPointsNum);
 
         for (int i = 0; i < minPnpPointsNum; i++) {
             double x = Math.random() * 100 - 50;
             double y = Math.random() * 100 - 50;
-            points2d.add(new Point(x, y));
-            points3d.add(new Point3(0, y, x));
+            points2d.put(i, 0, x, y); //add(new Point(x, y));
+            points3d.put(i, 0, 0, y, x); // add(new Point3(0, y, x));
         }
 
         Mat rvec = new Mat();
index bbcb97a..21494a4 100644 (file)
@@ -1,10 +1,17 @@
 package org.opencv.test.core;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import org.opencv.core.Core;
 import org.opencv.core.Core.MinMaxLocResult;
 import org.opencv.core.CvException;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfDouble;
+import org.opencv.core.MatOfInt;
+import org.opencv.core.MatOfPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Rect;
 import org.opencv.core.RotatedRect;
@@ -13,10 +20,6 @@ import org.opencv.core.Size;
 import org.opencv.core.TermCriteria;
 import org.opencv.test.OpenCVTestCase;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
 public class CoreTest extends OpenCVTestCase {
 
     public void testAbsdiff() {
@@ -482,11 +485,11 @@ public class CoreTest extends OpenCVTestCase {
         int arcStart = 30;
         int arcEnd = 60;
         int delta = 2;
-        List<Point> pts = new ArrayList<Point>();
+        MatOfPoint pts = new MatOfPoint();
 
         Core.ellipse2Poly(center, axes, angle, arcStart, arcEnd, delta, pts);
 
-        List<Point> truth = Arrays.asList(
+        Point truth[] = {
                 new Point(5, 6),
                 new Point(5, 6),
                 new Point(5, 6),
@@ -502,8 +505,9 @@ public class CoreTest extends OpenCVTestCase {
                 new Point(4, 6),
                 new Point(4, 6),
                 new Point(4, 6),
-                new Point(4, 6));
-        assertListPointEquals(truth, pts, EPS);
+                new Point(4, 6)
+        };
+        assertArrayPointsEquals(truth, pts.toArray(), EPS);
     }
 
     public void testEllipseMatPointSizeDoubleDoubleDoubleScalar() {
@@ -617,7 +621,7 @@ public class CoreTest extends OpenCVTestCase {
     }
 
     public void testFillConvexPolyMatListOfPointScalar() {
-        List<Point> polyline = Arrays.asList(new Point(1, 1), new Point(5, 0), new Point(6, 8), new Point(0, 9));
+        MatOfPoint polyline = new MatOfPoint(new Point[]{new Point(1, 1), new Point(5, 0), new Point(6, 8), new Point(0, 9)});
 
         Core.fillConvexPoly(gray0, polyline, new Scalar(150));
 
@@ -626,8 +630,8 @@ public class CoreTest extends OpenCVTestCase {
     }
 
     public void testFillConvexPolyMatListOfPointScalarIntInt() {
-        List<Point> polyline1 = Arrays.asList(new Point(2, 1), new Point(5, 1), new Point(5, 7), new Point(2, 7));
-        List<Point> polyline2 = Arrays.asList(new Point(4, 2), new Point(10, 2), new Point(10, 14), new Point(4, 14));
+        MatOfPoint polyline1 = new MatOfPoint(new Point(2, 1), new Point(5, 1), new Point(5, 7), new Point(2, 7));
+        MatOfPoint polyline2 = new MatOfPoint(new Point(4, 2), new Point(10, 2), new Point(10, 14), new Point(4, 14));
 
         // current implementation of fixed-point version of fillConvexPoly
         // requires image to be at least 2-pixel wider in each direction than
@@ -645,8 +649,8 @@ public class CoreTest extends OpenCVTestCase {
     public void testFillPolyMatListOfListOfPointScalar() {
         int matSize = 10;
         Mat gray0 = Mat.zeros(matSize, matSize, CvType.CV_8U);
-        List<Point> polyline = Arrays.asList(new Point(1, 4), new Point(1, 8), new Point(4, 1), new Point(7, 8), new Point(7, 4));
-        List<List<Point>> polylines = new ArrayList<List<Point>>();
+        MatOfPoint polyline = new MatOfPoint(new Point(1, 4), new Point(1, 8), new Point(4, 1), new Point(7, 8), new Point(7, 4));
+        List<MatOfPoint> polylines = new ArrayList<MatOfPoint>();
         polylines.add(polyline);
 
         Core.fillPoly(gray0, polylines, new Scalar(1));
@@ -671,13 +675,13 @@ public class CoreTest extends OpenCVTestCase {
     }
 
     public void testFillPolyMatListOfListOfPointScalarIntIntPoint() {
-        List<Point> polyline1 = Arrays.asList(new Point(1, 4), new Point(1, 8), new Point(4, 1), new Point(7, 8), new Point(7, 4));
-        List<Point> polyline2 = Arrays.asList(new Point(0, 3), new Point(0, 7), new Point(3, 0), new Point(6, 7), new Point(6, 3));
+       MatOfPoint polyline1 = new MatOfPoint(new Point(1, 4), new Point(1, 8), new Point(4, 1), new Point(7, 8), new Point(7, 4));
+       MatOfPoint polyline2 = new MatOfPoint(new Point(0, 3), new Point(0, 7), new Point(3, 0), new Point(6, 7), new Point(6, 3));
 
-        List<List<Point>> polylines1 = new ArrayList<List<Point>>();
+        List<MatOfPoint> polylines1 = new ArrayList<MatOfPoint>();
         polylines1.add(polyline1);
 
-        List<List<Point>> polylines2 = new ArrayList<List<Point>>();
+        List<MatOfPoint> polylines2 = new ArrayList<MatOfPoint>();
         polylines2.add(polyline2);
 
         Core.fillPoly(gray0, polylines1, new Scalar(1), Core.LINE_8, 0, new Point(0, 0));
@@ -800,7 +804,7 @@ public class CoreTest extends OpenCVTestCase {
     public void testGetNumberOfCPUs() {
         int cpus = Core.getNumberOfCPUs();
 
-        assertEquals(Runtime.getRuntime().availableProcessors(), cpus);
+        assertTrue(Runtime.getRuntime().availableProcessors() <= cpus);
     }
 
     public void testGetOptimalDFTSize() {
@@ -1190,18 +1194,18 @@ public class CoreTest extends OpenCVTestCase {
     }
 
     public void testMeanStdDevMatMatMat() {
-        List<Double> mean   = new ArrayList<Double>();
-        List<Double> stddev = new ArrayList<Double>();
+       MatOfDouble mean   = new MatOfDouble();
+       MatOfDouble stddev = new MatOfDouble();
 
         Core.meanStdDev(rgbLena, mean, stddev);
 
-        List<Double> expectedMean = Arrays.asList( new Double[]
-               {105.3989906311035, 99.56269836425781, 179.7303047180176} );
-        List<Double> expectedDev = Arrays.asList( new Double[]
-            {33.74205485167219, 52.8734582803278, 49.01569488056406} );
+        double expectedMean[] = new double[]
+               {105.3989906311035, 99.56269836425781, 179.7303047180176};
+        double expectedDev[] = new double[]
+            {33.74205485167219, 52.8734582803278, 49.01569488056406};
         
-        assertListEquals(expectedMean, mean, EPS);
-        assertListEquals(expectedDev, stddev, EPS);
+        assertArrayEquals(expectedMean, mean.toArray(), EPS);
+        assertArrayEquals(expectedDev, stddev.toArray(), EPS);
     }
 
     public void testMeanStdDevMatMatMatMat() {
@@ -1210,16 +1214,16 @@ public class CoreTest extends OpenCVTestCase {
         Mat mask = gray0.clone();
         submat = mask.submat(0, mask.rows() / 2, 0, mask.cols() / 2);
         submat.setTo(new Scalar(1));
-        List<Double> mean   = new ArrayList<Double>();
-        List<Double> stddev = new ArrayList<Double>();
+       MatOfDouble mean   = new MatOfDouble();
+       MatOfDouble stddev = new MatOfDouble();
 
         Core.meanStdDev(grayRnd, mean, stddev, mask);
 
-        List<Double> expectedMean = Arrays.asList( new Double[] {33d} );
-        List<Double> expectedDev = Arrays.asList( new Double[] {0d} );
+        double expectedMean[] = new double[] {33d};
+        double expectedDev[]  = new double[] {0d};
                 
-        assertListEquals(expectedMean, mean, EPS);
-        assertListEquals(expectedDev, stddev, EPS);
+        assertArrayEquals(expectedMean, mean.toArray(), EPS);
+        assertArrayEquals(expectedDev, stddev.toArray(), EPS);
     }
 
     public void testMerge() {
@@ -1280,14 +1284,15 @@ public class CoreTest extends OpenCVTestCase {
         rgba0.setTo(new Scalar(10, 20, 30, 40));
         List<Mat> src = Arrays.asList(rgba0);
         List<Mat> dst = Arrays.asList(gray3, gray2, gray1, gray0, getMat(CvType.CV_8UC3, 0, 0, 0));
-        List<Integer> fromTo = Arrays.asList(
-                3, 0,
+        MatOfInt fromTo = new MatOfInt(1, new int[]
+                 { 3, 0,
                 3, 1,
                 2, 2,
                 0, 3,
                 2, 4,
                 1, 5,
-                0, 6);
+                0, 6 }
+        );
 
         Core.mixChannels(src, dst, fromTo);
 
@@ -1740,8 +1745,8 @@ public class CoreTest extends OpenCVTestCase {
 
     public void testPolylinesMatListOfListOfPointBooleanScalar() {
         Mat img = gray0;
-        List<List<Point>> polyline = new ArrayList<List<Point>>();
-        polyline.add(Arrays.asList(new Point(1, 1), new Point(7, 1), new Point(7, 6), new Point(1, 6)));
+        List<MatOfPoint> polyline = new ArrayList<MatOfPoint>();
+        polyline.add(new MatOfPoint(new Point(1, 1), new Point(7, 1), new Point(7, 6), new Point(1, 6)));
 
         Core.polylines(img, polyline, true, new Scalar(100));
 
@@ -1754,8 +1759,8 @@ public class CoreTest extends OpenCVTestCase {
 
     public void testPolylinesMatListOfListOfPointBooleanScalarInt() {
         Mat img = gray0;
-        List<List<Point>> polyline = new ArrayList<List<Point>>();
-        polyline.add(Arrays.asList(new Point(1, 1), new Point(7, 1), new Point(7, 6), new Point(1, 6)));
+        List<MatOfPoint> polyline = new ArrayList<MatOfPoint>();
+        polyline.add(new MatOfPoint(new Point(1, 1), new Point(7, 1), new Point(7, 6), new Point(1, 6)));
 
         Core.polylines(img, polyline, true, new Scalar(100), 2);
 
@@ -1764,10 +1769,10 @@ public class CoreTest extends OpenCVTestCase {
 
     public void testPolylinesMatListOfListOfPointBooleanScalarIntIntInt() {
         Mat img = gray0;
-        List<List<Point>> polyline1 = new ArrayList<List<Point>>();
-        polyline1.add(Arrays.asList(new Point(1, 1), new Point(7, 1), new Point(7, 6), new Point(1, 6)));
-        List<List<Point>> polyline2 = new ArrayList<List<Point>>();
-        polyline2.add(Arrays.asList(new Point(2, 2), new Point(14, 2), new Point(14, 12), new Point(2, 12)));
+        List<MatOfPoint> polyline1 = new ArrayList<MatOfPoint>();
+        polyline1.add(new MatOfPoint(new Point(1, 1), new Point(7, 1), new Point(7, 6), new Point(1, 6)));
+        List<MatOfPoint> polyline2 = new ArrayList<MatOfPoint>();
+        polyline2.add(new MatOfPoint(new Point(2, 2), new Point(14, 2), new Point(14, 12), new Point(2, 12)));
 
         Core.polylines(img, polyline1, true, new Scalar(100), 2, Core.LINE_8, 0);
 
index 284981d..ec4b82d 100644 (file)
@@ -3,6 +3,7 @@ package org.opencv.test.features2d;
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfKeyPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.features2d.DescriptorExtractor;
@@ -10,9 +11,6 @@ import org.opencv.features2d.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
-import java.util.Arrays;
-import java.util.List;
-
 public class BRIEFDescriptorExtractorTest extends OpenCVTestCase {
 
     DescriptorExtractor extractor;
@@ -40,7 +38,7 @@ public class BRIEFDescriptorExtractorTest extends OpenCVTestCase {
 
     public void testComputeMatListOfKeyPointMat() {
         KeyPoint point = new KeyPoint(55.775577545166016f, 44.224422454833984f, 16, 9.754629f, 8617.863f, 1, -1);
-        List<KeyPoint> keypoints = Arrays.asList(point);
+        MatOfKeyPoint keypoints = new MatOfKeyPoint(point);
         Mat img = getTestImg();
         Mat descriptors = new Mat();
 
@@ -48,8 +46,10 @@ public class BRIEFDescriptorExtractorTest extends OpenCVTestCase {
 
         Mat truth = new Mat(1, 32, CvType.CV_8UC1) {
             {
-                put(0, 0, 96, 0, 76, 24, 47, 182, 68, 137, 149, 195, 67, 16, 187, 224, 74, 8, 82, 169, 87, 70, 44, 4, 192, 56, 13, 128, 44, 106, 146, 72, 194,
-                        245);
+                put(0, 0, 96, 0, 76, 24, 47, 182, 68, 137, 
+                                 149, 195, 67, 16, 187, 224, 74, 8, 
+                                 82, 169, 87, 70, 44, 4, 192, 56, 
+                                 13, 128, 44, 106, 146, 72, 194, 245);
             }
         };
 
index 1c2d115..821c9a4 100644 (file)
@@ -7,6 +7,8 @@ import java.util.List;
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfDMatch;
+import org.opencv.core.MatOfKeyPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.features2d.DMatch;
@@ -17,6 +19,8 @@ import org.opencv.features2d.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
+import android.util.Log;
+
 public class BruteForceDescriptorMatcherTest extends OpenCVTestCase {
 
     DescriptorMatcher matcher;
@@ -33,7 +37,7 @@ public class BruteForceDescriptorMatcherTest extends OpenCVTestCase {
 
     private Mat getQueryDescriptors() {
         Mat img = getQueryImg();
-        List<KeyPoint> keypoints = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
         Mat descriptors = new Mat();
 
         FeatureDetector detector = FeatureDetector.create(FeatureDetector.SURF);
@@ -59,7 +63,7 @@ public class BruteForceDescriptorMatcherTest extends OpenCVTestCase {
 
     private Mat getTrainDescriptors() {
         Mat img = getTrainImg();
-        List<KeyPoint> keypoints = Arrays.asList(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));
+        MatOfKeyPoint keypoints = new MatOfKeyPoint(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));
         Mat descriptors = new Mat();
 
         DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.SURF);
@@ -82,11 +86,19 @@ public class BruteForceDescriptorMatcherTest extends OpenCVTestCase {
         matSize = 100;
 
         truth = new DMatch[] {
+                       /*
                 new DMatch(0, 0, 0, 0.643284f),
                 new DMatch(1, 1, 0, 0.92945856f),
                 new DMatch(2, 1, 0, 0.2841479f),
                 new DMatch(3, 1, 0, 0.9194034f),
-                new DMatch(4, 1, 0, 0.3006621f) };
+                new DMatch(4, 1, 0, 0.3006621f)
+                */
+                       new DMatch(0, 0, 0, 1.049694f), 
+                       new DMatch(1, 0, 0, 1.083795f), 
+                       new DMatch(2, 1, 0, 0.484352f), 
+                       new DMatch(3, 0, 0, 1.098605f), 
+                       new DMatch(4, 1, 0, 0.494587f)
+                };
 
         super.setUp();
     }
@@ -166,18 +178,21 @@ public class BruteForceDescriptorMatcherTest extends OpenCVTestCase {
        final int k = 3; 
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
-        List<List<DMatch>> matches = new ArrayList<List<DMatch>>();
+        List<MatOfDMatch> matches = new ArrayList<MatOfDMatch>();
         matcher.knnMatch(query, train, matches, k);
+        Log.d("knnMatch", "train = " + train);
+        Log.d("knnMatch", "query = " + query);
         /*
-        matcher.add(Arrays.asList(train));
+        matcher.add(train);
         matcher.knnMatch(query, matches, k);
         */
         assertEquals(query.rows(), matches.size());
         for(int i = 0; i<matches.size(); i++)
         {
-               List<DMatch> ldm = matches.get(i); 
-            assertEquals(Math.min(k, train.rows()), ldm.size());
-            for(DMatch dm : ldm)
+               MatOfDMatch vdm = matches.get(i); 
+               Log.d("knn", "vdm["+i+"]="+vdm.dump());
+            assertTrue(Math.min(k, train.rows()) >= vdm.total());
+            for(DMatch dm : vdm.toArray())
             {
                assertEquals(dm.queryIdx, i);
             }
@@ -195,34 +210,34 @@ public class BruteForceDescriptorMatcherTest extends OpenCVTestCase {
     public void testMatchMatListOfDMatch() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
         matcher.add(Arrays.asList(train));
 
         matcher.match(query, matches);
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertArrayDMatchEquals(truth, matches.toArray(), EPS);
     }
 
     public void testMatchMatListOfDMatchListOfMat() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
         Mat mask = getMaskImg();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
         matcher.add(Arrays.asList(train));
 
         matcher.match(query, matches, Arrays.asList(mask));
 
-        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches, EPS);
+        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
     }
 
     public void testMatchMatMatListOfDMatch() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
 
         matcher.match(query, train, matches);
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertArrayDMatchEquals(truth, matches.toArray(), EPS);
 
         // OpenCVTestRunner.Log("matches found: " + matches.size());
         // for (DMatch m : matches)
@@ -233,11 +248,11 @@ public class BruteForceDescriptorMatcherTest extends OpenCVTestCase {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
         Mat mask = getMaskImg();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
 
         matcher.match(query, train, matches, mask);
 
-        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches, EPS);
+        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
     }
 
     public void testRadiusMatchMatListOfListOfDMatchFloat() {
index 5a95d40..cd32bca 100644 (file)
@@ -1,22 +1,22 @@
 package org.opencv.test.features2d;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfDMatch;
+import org.opencv.core.MatOfKeyPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.features2d.DMatch;
 import org.opencv.features2d.DescriptorExtractor;
 import org.opencv.features2d.DescriptorMatcher;
 import org.opencv.features2d.FeatureDetector;
-import org.opencv.features2d.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
 public class BruteForceHammingDescriptorMatcherTest extends OpenCVTestCase {
 
     DescriptorMatcher matcher;
@@ -42,7 +42,7 @@ public class BruteForceHammingDescriptorMatcherTest extends OpenCVTestCase {
     }
 
     private Mat getTestDescriptors(Mat img) {
-        List<KeyPoint> keypoints = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
         Mat descriptors = new Mat();
 
         FeatureDetector detector = FeatureDetector.create(FeatureDetector.FAST);
@@ -162,45 +162,45 @@ public class BruteForceHammingDescriptorMatcherTest extends OpenCVTestCase {
     public void testMatchMatListOfDMatch() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
         matcher.add(Arrays.asList(train));
 
         matcher.match(query, matches);
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertListDMatchEquals(Arrays.asList(truth), matches.toList(), EPS);
     }
 
     public void testMatchMatListOfDMatchListOfMat() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
         Mat mask = getMaskImg();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
         matcher.add(Arrays.asList(train));
 
         matcher.match(query, matches, Arrays.asList(mask));
 
-        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches, EPS);
+        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
     }
 
     public void testMatchMatMatListOfDMatch() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
 
         matcher.match(query, train, matches);
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertListDMatchEquals(Arrays.asList(truth), matches.toList(), EPS);
     }
 
     public void testMatchMatMatListOfDMatchMat() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
         Mat mask = getMaskImg();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
 
         matcher.match(query, train, matches, mask);
 
-        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches, EPS);
+        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
     }
 
     public void testRadiusMatchMatListOfListOfDMatchFloat() {
index c364cd6..d8f8750 100644 (file)
@@ -1,22 +1,22 @@
 package org.opencv.test.features2d;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfDMatch;
+import org.opencv.core.MatOfKeyPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.features2d.DMatch;
 import org.opencv.features2d.DescriptorExtractor;
 import org.opencv.features2d.DescriptorMatcher;
 import org.opencv.features2d.FeatureDetector;
-import org.opencv.features2d.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
 public class BruteForceHammingLUTDescriptorMatcherTest extends OpenCVTestCase {
 
     DescriptorMatcher matcher;
@@ -42,7 +42,7 @@ public class BruteForceHammingLUTDescriptorMatcherTest extends OpenCVTestCase {
     }
 
     private Mat getTestDescriptors(Mat img) {
-        List<KeyPoint> keypoints = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
         Mat descriptors = new Mat();
 
         FeatureDetector detector = FeatureDetector.create(FeatureDetector.FAST);
@@ -162,49 +162,49 @@ public class BruteForceHammingLUTDescriptorMatcherTest extends OpenCVTestCase {
     public void testMatchMatListOfDMatch() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
         matcher.add(Arrays.asList(train));
 
         matcher.match(query, matches);
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertArrayDMatchEquals(truth, matches.toArray(), EPS);
     }
 
     public void testMatchMatListOfDMatchListOfMat() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
         Mat mask = getMaskImg();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
         matcher.add(Arrays.asList(train));
 
         matcher.match(query, matches, Arrays.asList(mask));
 
-        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches, EPS);
+        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
     }
 
     public void testMatchMatMatListOfDMatch() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
 
         matcher.match(query, train, matches);
 
         OpenCVTestRunner.Log("matches found: " + matches.size());
-        for (DMatch m : matches)
+        for (DMatch m : matches.toArray())
             OpenCVTestRunner.Log(m.toString());
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertArrayDMatchEquals(truth, matches.toArray(), EPS);
     }
 
     public void testMatchMatMatListOfDMatchMat() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
         Mat mask = getMaskImg();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
 
         matcher.match(query, train, matches, mask);
 
-        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches, EPS);
+        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
     }
 
     public void testRadiusMatchMatListOfListOfDMatchFloat() {
index 4be17e8..ba9f30a 100644 (file)
@@ -1,8 +1,13 @@
 package org.opencv.test.features2d;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfDMatch;
+import org.opencv.core.MatOfKeyPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.features2d.DMatch;
@@ -13,10 +18,6 @@ import org.opencv.features2d.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
 public class BruteForceL1DescriptorMatcherTest extends OpenCVTestCase {
 
     DescriptorMatcher matcher;
@@ -33,14 +34,15 @@ public class BruteForceL1DescriptorMatcherTest extends OpenCVTestCase {
 
     private Mat getQueryDescriptors() {
         Mat img = getQueryImg();
-        List<KeyPoint> keypoints = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
         Mat descriptors = new Mat();
 
         FeatureDetector detector = FeatureDetector.create(FeatureDetector.SURF);
         DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.SURF);
 
         String filename = OpenCVTestRunner.getTempFileName("yml");
-        writeFile(filename, "%YAML:1.0\nhessianThreshold: 8000.\noctaves: 3\noctaveLayers: 4\nupright: 0\n");
+        //writeFile(filename, "%YAML:1.0\nhessianThreshold: 8000.\noctaves: 3\noctaveLayers: 4\nupright: 0\n");
+        writeFile(filename, "%YAML:1.0\nname: \"Feature2D.SURF\"\nextended: 1\nhessianThreshold: 8000.\nnOctaveLayers: 2\nnOctaves: 3\nupright: 0\n");
         detector.read(filename);
 
         detector.detect(img, keypoints);
@@ -59,7 +61,7 @@ public class BruteForceL1DescriptorMatcherTest extends OpenCVTestCase {
 
     private Mat getTrainDescriptors() {
         Mat img = getTrainImg();
-        List<KeyPoint> keypoints = Arrays.asList(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));
+        MatOfKeyPoint keypoints = new MatOfKeyPoint(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));
         Mat descriptors = new Mat();
 
         DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.SURF);
@@ -82,11 +84,19 @@ public class BruteForceL1DescriptorMatcherTest extends OpenCVTestCase {
         matSize = 100;
 
         truth = new DMatch[] {
+                       /*
                 new DMatch(0, 0, 0, 3.175296f),
                 new DMatch(1, 1, 0, 3.5954158f),
                 new DMatch(2, 1, 0, 1.2537984f),
                 new DMatch(3, 1, 0, 3.5761614f),
-                new DMatch(4, 1, 0, 1.3250958f) };
+                new DMatch(4, 1, 0, 1.3250958f)
+                */
+                       new DMatch(0, 1, 0, 6.920234f), 
+                       new DMatch(1, 0, 0, 6.1294847f), 
+                       new DMatch(2, 1, 0, 2.6545324f), 
+                       new DMatch(3, 1, 0, 6.1675916f), 
+                       new DMatch(4, 1, 0, 2.679859f)
+                };
         super.setUp();
     }
 
@@ -176,45 +186,45 @@ public class BruteForceL1DescriptorMatcherTest extends OpenCVTestCase {
     public void testMatchMatListOfDMatch() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
         matcher.add(Arrays.asList(train));
 
         matcher.match(query, matches);
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertArrayDMatchEquals(truth, matches.toArray(), EPS);
     }
 
     public void testMatchMatListOfDMatchListOfMat() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
         Mat mask = getMaskImg();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
         matcher.add(Arrays.asList(train));
 
         matcher.match(query, matches, Arrays.asList(mask));
 
-        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches, EPS);
+        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
     }
 
     public void testMatchMatMatListOfDMatch() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
 
         matcher.match(query, train, matches);
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertArrayDMatchEquals(truth, matches.toArray(), EPS);
     }
 
     public void testMatchMatMatListOfDMatchMat() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
         Mat mask = getMaskImg();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
 
         matcher.match(query, train, matches, mask);
 
-        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches, EPS);
+        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
     }
 
     public void testRadiusMatchMatListOfListOfDMatchFloat() {
index 42433d7..99aea7a 100644 (file)
@@ -1,8 +1,13 @@
 package org.opencv.test.features2d;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfDMatch;
+import org.opencv.core.MatOfKeyPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.features2d.DMatch;
@@ -13,10 +18,6 @@ import org.opencv.features2d.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
 public class BruteForceSL2DescriptorMatcherTest extends OpenCVTestCase {
 
     DescriptorMatcher matcher;
@@ -31,13 +32,15 @@ public class BruteForceSL2DescriptorMatcherTest extends OpenCVTestCase {
         };
     }
     
+    /*
     private float sqr(float val){
         return val * val;
     }
+    */
 
     private Mat getQueryDescriptors() {
         Mat img = getQueryImg();
-        List<KeyPoint> keypoints = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
         Mat descriptors = new Mat();
 
         FeatureDetector detector = FeatureDetector.create(FeatureDetector.SURF);
@@ -63,7 +66,7 @@ public class BruteForceSL2DescriptorMatcherTest extends OpenCVTestCase {
 
     private Mat getTrainDescriptors() {
         Mat img = getTrainImg();
-        List<KeyPoint> keypoints = Arrays.asList(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));
+        MatOfKeyPoint keypoints = new MatOfKeyPoint(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));
         Mat descriptors = new Mat();
 
         DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.SURF);
@@ -86,11 +89,19 @@ public class BruteForceSL2DescriptorMatcherTest extends OpenCVTestCase {
         matSize = 100;
 
         truth = new DMatch[] {
+                       /*
                 new DMatch(0, 0, 0, sqr(0.643284f)),
                 new DMatch(1, 1, 0, sqr(0.92945856f)),
                 new DMatch(2, 1, 0, sqr(0.2841479f)),
                 new DMatch(3, 1, 0, sqr(0.9194034f)),
-                new DMatch(4, 1, 0, sqr(0.3006621f)) };
+                new DMatch(4, 1, 0, sqr(0.3006621f))
+                */
+                       new DMatch(0, 0, 0, 1.1018577f), 
+                       new DMatch(1, 0, 0, 1.1746116f), 
+                       new DMatch(2, 1, 0, 0.23459719f), 
+                       new DMatch(3, 0, 0, 1.2069331f), 
+                       new DMatch(4, 1, 0, 0.2446168f)
+                };
 
         super.setUp();
     }
@@ -181,34 +192,34 @@ public class BruteForceSL2DescriptorMatcherTest extends OpenCVTestCase {
     public void testMatchMatListOfDMatch() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
         matcher.add(Arrays.asList(train));
 
         matcher.match(query, matches);
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertArrayDMatchEquals(truth, matches.toArray(), EPS);
     }
 
     public void testMatchMatListOfDMatchListOfMat() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
         Mat mask = getMaskImg();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
         matcher.add(Arrays.asList(train));
 
         matcher.match(query, matches, Arrays.asList(mask));
 
-        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches, EPS);
+        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
     }
 
     public void testMatchMatMatListOfDMatch() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
 
         matcher.match(query, train, matches);
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertArrayDMatchEquals(truth, matches.toArray(), EPS);
 
         // OpenCVTestRunner.Log("matches found: " + matches.size());
         // for (DMatch m : matches)
@@ -219,11 +230,11 @@ public class BruteForceSL2DescriptorMatcherTest extends OpenCVTestCase {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
         Mat mask = getMaskImg();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
 
         matcher.match(query, train, matches, mask);
 
-        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches, EPS);
+        assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
     }
 
     public void testRadiusMatchMatListOfListOfDMatchFloat() {
index a5e7be5..cced3c8 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class DENSEFeatureDetectorTest extends TestCase {\r
+public class DENSEFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index bd1a7a5..56bb041 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class DynamicDENSEFeatureDetectorTest extends TestCase {\r
+public class DynamicDENSEFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 770d4a5..3b40f04 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class DynamicFASTFeatureDetectorTest extends TestCase {\r
+public class DynamicFASTFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 83194bf..70718c4 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class DynamicGFTTFeatureDetectorTest extends TestCase {\r
+public class DynamicGFTTFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 51fb0fb..22c6c29 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class DynamicHARRISFeatureDetectorTest extends TestCase {\r
+public class DynamicHARRISFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 202807c..ea9af1b 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class DynamicMSERFeatureDetectorTest extends TestCase {\r
+public class DynamicMSERFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index a0f1ab8..c20e678 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class DynamicORBFeatureDetectorTest extends TestCase {\r
+public class DynamicORBFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 56f5a7c..087e3df 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class DynamicSIFTFeatureDetectorTest extends TestCase {\r
+public class DynamicSIFTFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 942124e..7de2dbe 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class DynamicSIMPLEBLOBFeatureDetectorTest extends TestCase {\r
+public class DynamicSIMPLEBLOBFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index d4e687f..5dca31a 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class DynamicSTARFeatureDetectorTest extends TestCase {\r
+public class DynamicSTARFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 34a767c..d83fa7c 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class DynamicSURFFeatureDetectorTest extends TestCase {\r
+public class DynamicSURFFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 9159724..6c1bd83 100644 (file)
@@ -1,8 +1,11 @@
 package org.opencv.test.features2d;
 
+import java.util.Arrays;
+
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfKeyPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.features2d.FeatureDetector;
@@ -10,10 +13,6 @@ import org.opencv.features2d.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
 public class FASTFeatureDetectorTest extends OpenCVTestCase {
 
     FeatureDetector detector;
@@ -56,11 +55,11 @@ public class FASTFeatureDetectorTest extends OpenCVTestCase {
 
     public void testDetectMatListOfKeyPoint() {
         Mat img = getTestImg();
-        List<KeyPoint> keypoints = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
 
         detector.detect(img, keypoints);
 
-        assertListKeyPointEquals(Arrays.asList(truth), keypoints, EPS);
+        assertListKeyPointEquals(Arrays.asList(truth), keypoints.toList(), EPS);
 
         // OpenCVTestRunner.Log("points found: " + keypoints.size());
         // for (KeyPoint kp : keypoints)
@@ -70,11 +69,11 @@ public class FASTFeatureDetectorTest extends OpenCVTestCase {
     public void testDetectMatListOfKeyPointMat() {
         Mat img = getTestImg();
         Mat mask = getMaskImg();
-        List<KeyPoint> keypoints = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
 
         detector.detect(img, keypoints, mask);
 
-        assertListKeyPointEquals(Arrays.asList(truth[0], truth[1]), keypoints, EPS);
+        assertListKeyPointEquals(Arrays.asList(truth[0], truth[1]), keypoints.toList(), EPS);
     }
 
     public void testEmpty() {
@@ -87,18 +86,18 @@ public class FASTFeatureDetectorTest extends OpenCVTestCase {
         writeFile(filename, "%YAML:1.0\nthreshold: 130\nnonmaxSuppression: 1\n");
         detector.read(filename);
 
-        List<KeyPoint> keypoints1 = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
 
         detector.detect(grayChess, keypoints1);
 
         writeFile(filename, "%YAML:1.0\nthreshold: 150\nnonmaxSuppression: 1\n");
         detector.read(filename);
 
-        List<KeyPoint> keypoints2 = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
 
         detector.detect(grayChess, keypoints2);
 
-        assertTrue(keypoints2.size() <= keypoints1.size());
+        assertTrue(keypoints2.total() <= keypoints1.total());
     }
 
     public void testReadYml() {
@@ -108,7 +107,7 @@ public class FASTFeatureDetectorTest extends OpenCVTestCase {
                 "<?xml version=\"1.0\"?>\n<opencv_storage>\n<threshold>130</threshold>\n<nonmaxSuppression>1</nonmaxSuppression>\n</opencv_storage>\n");
         detector.read(filename);
 
-        List<KeyPoint> keypoints1 = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
 
         detector.detect(grayChess, keypoints1);
 
@@ -116,11 +115,11 @@ public class FASTFeatureDetectorTest extends OpenCVTestCase {
                 "<?xml version=\"1.0\"?>\n<opencv_storage>\n<threshold>150</threshold>\n<nonmaxSuppression>1</nonmaxSuppression>\n</opencv_storage>\n");
         detector.read(filename);
 
-        List<KeyPoint> keypoints2 = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
 
         detector.detect(grayChess, keypoints2);
 
-        assertTrue(keypoints2.size() <= keypoints1.size());
+        assertTrue(keypoints2.total() <= keypoints1.total());
     }
 
     public void testWrite() {
@@ -128,7 +127,7 @@ public class FASTFeatureDetectorTest extends OpenCVTestCase {
 
         detector.write(filename);
 
-        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<threshold>10</threshold>\n<nonmaxSuppression>1</nonmaxSuppression>\n</opencv_storage>\n";
+        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<name>Feature2D.FAST</name>\n<nonmaxSuppression>1</nonmaxSuppression>\n<threshold>10</threshold>\n</opencv_storage>\n";
         assertEquals(truth, readFile(filename));
     }
 
@@ -137,7 +136,7 @@ public class FASTFeatureDetectorTest extends OpenCVTestCase {
 
         detector.write(filename);
 
-        String truth = "%YAML:1.0\nthreshold: 10\nnonmaxSuppression: 1\n";
+        String truth = "%YAML:1.0\nname: \"Feature2D.FAST\"\nnonmaxSuppression: 1\nthreshold: 10\n";
         assertEquals(truth, readFile(filename));
     }
 
index 0d21961..5b815fd 100644 (file)
@@ -1,8 +1,15 @@
 package org.opencv.test.features2d;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import org.opencv.calib3d.Calib3d;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfDMatch;
+import org.opencv.core.MatOfKeyPoint;
+import org.opencv.core.MatOfPoint2f;
 import org.opencv.core.Point;
 import org.opencv.core.Range;
 import org.opencv.features2d.DMatch;
@@ -15,10 +22,6 @@ import org.opencv.highgui.Highgui;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
 public class Features2dTest extends OpenCVTestCase {
 
     public void testDrawKeypointsMatListOfKeyPointMat() {
@@ -93,8 +96,8 @@ public class Features2dTest extends OpenCVTestCase {
         Mat imgTrain = Highgui.imread(OpenCVTestRunner.LENA_PATH, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat imgQuery = imgTrain.submat(new Range(0, imgTrain.rows() - 100), Range.all());
 
-        List<KeyPoint> trainKeypoints = new ArrayList<KeyPoint>();
-        List<KeyPoint> queryKeypoints = new ArrayList<KeyPoint>();
+        MatOfKeyPoint trainKeypoints = new MatOfKeyPoint();
+        MatOfKeyPoint queryKeypoints = new MatOfKeyPoint();
 
         detector.detect(imgTrain, trainKeypoints);
         detector.detect(imgQuery, queryKeypoints);
@@ -108,22 +111,27 @@ public class Features2dTest extends OpenCVTestCase {
         extractor.compute(imgTrain, trainKeypoints, trainDescriptors);
         extractor.compute(imgQuery, queryKeypoints, queryDescriptors);
 
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
 
         matcher.add(Arrays.asList(trainDescriptors));
         matcher.match(queryDescriptors, matches);
 
         // OpenCVTestRunner.Log("Matches found: " + matches.size());
 
-        List<Point> points1 = new ArrayList<Point>();
-        List<Point> points2 = new ArrayList<Point>();
-
-        for (int i = 0; i < matches.size(); i++) {
-            DMatch match = matches.get(i);
-            points1.add(trainKeypoints.get(match.trainIdx).pt);
-            points2.add(queryKeypoints.get(match.queryIdx).pt);
+        DMatch adm[] = matches.toArray();
+        List<Point> lp1 = new ArrayList<Point>(adm.length);
+        List<Point> lp2 = new ArrayList<Point>(adm.length);
+        KeyPoint tkp[] = trainKeypoints.toArray();
+        KeyPoint qkp[] = queryKeypoints.toArray();
+        for (int i = 0; i < adm.length; i++) {
+            DMatch dm = adm[i];
+            lp1.add(tkp[dm.trainIdx].pt);
+            lp2.add(qkp[dm.queryIdx].pt);
         }
 
+        MatOfPoint2f points1 = new MatOfPoint2f(lp1.toArray(new Point[0]));
+        MatOfPoint2f points2 = new MatOfPoint2f(lp2.toArray(new Point[0]));
+
         Mat hmg = Calib3d.findHomography(points1, points2, Calib3d.RANSAC, 3);
 
         assertMatEqual(Mat.eye(3, 3, CvType.CV_64F), hmg, EPS);
index 21485b3..615d291 100644 (file)
@@ -1,9 +1,14 @@
 package org.opencv.test.features2d;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.opencv.core.Core;
 import org.opencv.core.CvException;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfDMatch;
+import org.opencv.core.MatOfKeyPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.features2d.DMatch;
@@ -14,10 +19,6 @@ import org.opencv.features2d.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
 public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase {
 
     static final String xmlParamsDefault = "<?xml version=\"1.0\"?>\n"
@@ -86,7 +87,7 @@ public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase {
             + "   -\n"
             + "      name: eps\n"
             + "      type: 5\n"
-            + "      value: 0.\n"
+            + "      value: 4.\n"// this line is changed!
             + "   -\n"
             + "      name: sorted\n"
             + "      type: 15\n"
@@ -98,39 +99,6 @@ public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase {
 
     DMatch[] truth;
 
-    private Mat getBriefQueryDescriptors() {
-        return getBriefTestDescriptors(getBriefQueryImg());
-    }
-
-    private Mat getBriefQueryImg() {
-        Mat img = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));
-        Core.line(img, new Point(40, matSize - 40), new Point(matSize - 50, 50), new Scalar(0), 8);
-        return img;
-    }
-
-    private Mat getBriefTestDescriptors(Mat img) {
-        List<KeyPoint> keypoints = new ArrayList<KeyPoint>();
-        Mat descriptors = new Mat();
-
-        FeatureDetector detector = FeatureDetector.create(FeatureDetector.FAST);
-        DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.BRIEF);
-
-        detector.detect(img, keypoints);
-        extractor.compute(img, keypoints, descriptors);
-
-        return descriptors;
-    }
-
-    private Mat getBriefTrainDescriptors() {
-        return getBriefTestDescriptors(getBriefTrainImg());
-    }
-
-    private Mat getBriefTrainImg() {
-        Mat img = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));
-        Core.line(img, new Point(40, 40), new Point(matSize - 40, matSize - 40), new Scalar(0), 8);
-        return img;
-    }
-
     private Mat getMaskImg() {
         return new Mat(5, 2, CvType.CV_8U, new Scalar(0)) {
             {
@@ -141,7 +109,7 @@ public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase {
 
     private Mat getQueryDescriptors() {
         Mat img = getQueryImg();
-        List<KeyPoint> keypoints = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
         Mat descriptors = new Mat();
 
         FeatureDetector detector = FeatureDetector.create(FeatureDetector.SURF);
@@ -167,7 +135,7 @@ public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase {
 
     private Mat getTrainDescriptors() {
         Mat img = getTrainImg();
-        List<KeyPoint> keypoints = Arrays.asList(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));
+        MatOfKeyPoint keypoints = new MatOfKeyPoint(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));
         Mat descriptors = new Mat();
 
         DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.SURF);
@@ -190,11 +158,19 @@ public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase {
         matSize = 100;
 
         truth = new DMatch[] {
+                       /*
                 new DMatch(0, 0, 0, 0.643284f),
                 new DMatch(1, 1, 0, 0.92945856f),
                 new DMatch(2, 1, 0, 0.2841479f),
                 new DMatch(3, 1, 0, 0.9194034f),
-                new DMatch(4, 1, 0, 0.3006621f) };
+                new DMatch(4, 1, 0, 0.3006621f)
+                */
+                       new DMatch(0, 0, 0, 1.049694f), 
+                       new DMatch(1, 0, 0, 1.083795f), 
+                       new DMatch(2, 1, 0, 0.484352f), 
+                       new DMatch(3, 0, 0, 1.098605f), 
+                       new DMatch(4, 1, 0, 0.494587f)
+                };
 
         super.setUp();
     }
@@ -283,36 +259,36 @@ public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase {
     public void testMatchMatListOfDMatch() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
         matcher.add(Arrays.asList(train));
         matcher.train();
 
         matcher.match(query, matches);
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertArrayDMatchEquals(truth, matches.toArray(), EPS);
     }
 
     public void testMatchMatListOfDMatchListOfMat() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
         Mat mask = getMaskImg();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
         matcher.add(Arrays.asList(train));
         matcher.train();
 
         matcher.match(query, matches, Arrays.asList(mask));
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertArrayDMatchEquals(truth, matches.toArray(), EPS);
     }
 
     public void testMatchMatMatListOfDMatch() {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
 
         matcher.match(query, train, matches);
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertArrayDMatchEquals(truth, matches.toArray(), EPS);
 
         // OpenCVTestRunner.Log("matches found: " + matches.size());
         // for (DMatch m : matches)
@@ -323,11 +299,11 @@ public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase {
         Mat train = getTrainDescriptors();
         Mat query = getQueryDescriptors();
         Mat mask = getMaskImg();
-        List<DMatch> matches = new ArrayList<DMatch>();
+        MatOfDMatch matches = new MatOfDMatch();
 
         matcher.match(query, train, matches, mask);
 
-        assertListDMatchEquals(Arrays.asList(truth), matches, EPS);
+        assertListDMatchEquals(Arrays.asList(truth), matches.toList(), EPS);
     }
 
     public void testRadiusMatchMatListOfListOfDMatchFloat() {
@@ -355,21 +331,14 @@ public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase {
     }
 
     public void testRead() {
-        String filename = OpenCVTestRunner.getTempFileName("yml");
-        writeFile(filename, ymlParamsModified);
-
-        matcher.read(filename);
-
-        Mat train = getBriefTrainDescriptors();
-        Mat query = getBriefQueryDescriptors();
-        List<DMatch> matches = new ArrayList<DMatch>();
-
-        matcher.match(query, train, matches);
-
-        assertListDMatchEquals(Arrays.asList(new DMatch(0, 0, 0, 0),
-                new DMatch(1, 2, 0, 0),
-                new DMatch(2, 1, 0, 0),
-                new DMatch(3, 3, 0, 0)), matches, EPS);
+        String filenameR = OpenCVTestRunner.getTempFileName("yml");
+        String filenameW = OpenCVTestRunner.getTempFileName("yml");
+        writeFile(filenameR, ymlParamsModified);
+
+        matcher.read(filenameR);
+        matcher.write(filenameW);
+        
+        assertEquals(ymlParamsModified, readFile(filenameW));
     }
 
     public void testTrain() {
index 09661c6..98b3a83 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class GFTTFeatureDetectorTest extends TestCase {\r
+public class GFTTFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 056d893..3a3200f 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class GridDENSEFeatureDetectorTest extends TestCase {\r
+public class GridDENSEFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index c4c6959..c826ef8 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class GridFASTFeatureDetectorTest extends TestCase {\r
+public class GridFASTFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 9181f97..a64da49 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class GridGFTTFeatureDetectorTest extends TestCase {\r
+public class GridGFTTFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 86c7677..7bbc57f 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class GridHARRISFeatureDetectorTest extends TestCase {\r
+public class GridHARRISFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index c761049..656c835 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class GridMSERFeatureDetectorTest extends TestCase {\r
+public class GridMSERFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index c987333..53f419d 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class GridORBFeatureDetectorTest extends TestCase {\r
+public class GridORBFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 46d2a08..d44881d 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class GridSIFTFeatureDetectorTest extends TestCase {\r
+public class GridSIFTFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 62a5dd3..b493235 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class GridSIMPLEBLOBFeatureDetectorTest extends TestCase {\r
+public class GridSIMPLEBLOBFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index d78dc24..36b99de 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class GridSTARFeatureDetectorTest extends TestCase {\r
+public class GridSTARFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 012d825..cc5a823 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class GridSURFFeatureDetectorTest extends TestCase {\r
+public class GridSURFFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 5e7fd7d..d8acb1f 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class HARRISFeatureDetectorTest extends TestCase {\r
+public class HARRISFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 98ae4d7..9655f1d 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class MSERFeatureDetectorTest extends TestCase {\r
+public class MSERFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 0e46a0d..5bd64d0 100644 (file)
@@ -3,6 +3,7 @@ package org.opencv.test.features2d;
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfKeyPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.features2d.DescriptorExtractor;
@@ -10,9 +11,6 @@ import org.opencv.features2d.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
-import java.util.Arrays;
-import java.util.List;
-
 public class ORBDescriptorExtractorTest extends OpenCVTestCase {
 
     DescriptorExtractor extractor;
@@ -40,7 +38,7 @@ public class ORBDescriptorExtractorTest extends OpenCVTestCase {
 
     public void testComputeMatListOfKeyPointMat() {
         KeyPoint point = new KeyPoint(55.775577545166016f, 44.224422454833984f, 16, 9.754629f, 8617.863f, 1, -1);
-        List<KeyPoint> keypoints = Arrays.asList(point);
+        MatOfKeyPoint keypoints = new MatOfKeyPoint(point);
         Mat img = getTestImg();
         Mat descriptors = new Mat();
 
@@ -48,8 +46,8 @@ public class ORBDescriptorExtractorTest extends OpenCVTestCase {
 
         Mat truth = new Mat(1, 32, CvType.CV_8UC1) {
             {
-                put(0, 0, 20, 51, 88, 22, 14, 181, 78, 111, 36, 144, 62, 0, 188, 196, 4, 8, 133, 80, 96, 18, 64, 29, 0,
-                        254, 230, 247, 12, 2, 78, 129, 70, 145);
+                put(0, 0,
+                               6, 74, 6, 129, 2, 130, 56, 0, 36, 132, 66, 165, 172, 6, 3, 72, 102, 61, 163, 214, 0, 144, 65, 232, 4, 32, 138, 129, 4, 21, 37, 88);
             }
         };
         assertMatEqual(truth, descriptors);
@@ -73,7 +71,7 @@ public class ORBDescriptorExtractorTest extends OpenCVTestCase {
 
     public void testRead() {
         KeyPoint point = new KeyPoint(55.775577545166016f, 44.224422454833984f, 16, 9.754629f, 8617.863f, 1, -1);
-        List<KeyPoint> keypoints = Arrays.asList(point);
+        MatOfKeyPoint keypoints = new MatOfKeyPoint(point);
         Mat img = getTestImg();
         Mat descriptors = new Mat();
 
@@ -85,8 +83,8 @@ public class ORBDescriptorExtractorTest extends OpenCVTestCase {
 
         Mat truth = new Mat(1, 32, CvType.CV_8UC1) {
             {
-                put(0, 0, 20, 55, 88, 20, 14, 49, 70, 111, 148, 144, 30, 16, 252, 133, 0, 8, 5, 85, 32, 0, 74, 25, 0,
-                        252, 119, 191, 4, 2, 66, 1, 66, 145);
+                put(0, 0,
+                               6, 10, 22, 5, 2, 130, 56, 0, 44, 164, 66, 165, 140, 6, 1, 72, 38, 61, 163, 210, 0, 208, 1, 104, 4, 32, 10, 131, 0, 37, 37, 67);
             }
         };
         assertMatEqual(truth, descriptors);
@@ -97,7 +95,7 @@ public class ORBDescriptorExtractorTest extends OpenCVTestCase {
 
         extractor.write(filename);
 
-        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<scaleFactor>1.2000000476837158e+00</scaleFactor>\n<nLevels>3</nLevels>\n<firstLevel>0</firstLevel>\n<edgeThreshold>31</edgeThreshold>\n<patchSize>31</patchSize>\n</opencv_storage>\n";
+        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<name>Feature2D.ORB</name>\n<WTA_K>2</WTA_K>\n<edgeThreshold>31</edgeThreshold>\n<firstLevel>0</firstLevel>\n<nFeatures>500</nFeatures>\n<nLevels>8</nLevels>\n<patchSize>31</patchSize>\n<scaleFactor>1.2000000476837158e+00</scaleFactor>\n<scoreType>0</scoreType>\n</opencv_storage>\n";
         assertEquals(truth, readFile(filename));
     }
 
@@ -106,7 +104,7 @@ public class ORBDescriptorExtractorTest extends OpenCVTestCase {
 
         extractor.write(filename);
 
-        String truth = "%YAML:1.0\nscaleFactor: 1.2000000476837158e+00\nnLevels: 3\nfirstLevel: 0\nedgeThreshold: 31\npatchSize: 31\n";
+        String truth = "%YAML:1.0\nname: \"Feature2D.ORB\"\nWTA_K: 2\nedgeThreshold: 31\nfirstLevel: 0\nnFeatures: 500\nnLevels: 8\npatchSize: 31\nscaleFactor: 1.2000000476837158e+00\nscoreType: 0\n";
         assertEquals(truth, readFile(filename));
     }
 
index b4c23d8..eedcc21 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class ORBFeatureDetectorTest extends TestCase {\r
+public class ORBFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index b158124..ade2f7d 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class OpponentBRIEFDescriptorExtractorTest extends TestCase {\r
+public class OpponentBRIEFDescriptorExtractorTest extends OpenCVTestCase {\r
 \r
     public void testComputeListOfMatListOfListOfKeyPointListOfMat() {\r
         fail("Not yet implemented");\r
index 1ee5432..88e2d9f 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class OpponentORBDescriptorExtractorTest extends TestCase {\r
+public class OpponentORBDescriptorExtractorTest extends OpenCVTestCase {\r
 \r
     public void testComputeListOfMatListOfListOfKeyPointListOfMat() {\r
         fail("Not yet implemented");\r
index de20c14..d473ad6 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class OpponentSIFTDescriptorExtractorTest extends TestCase {\r
+public class OpponentSIFTDescriptorExtractorTest extends OpenCVTestCase {\r
 \r
     public void testComputeListOfMatListOfListOfKeyPointListOfMat() {\r
         fail("Not yet implemented");\r
index e427128..db18095 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class OpponentSURFDescriptorExtractorTest extends TestCase {\r
+public class OpponentSURFDescriptorExtractorTest extends OpenCVTestCase {\r
 \r
     public void testComputeListOfMatListOfListOfKeyPointListOfMat() {\r
         fail("Not yet implemented");\r
index cadabed..5862f22 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class PyramidDENSEFeatureDetectorTest extends TestCase {\r
+public class PyramidDENSEFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 5527940..8c2f4ed 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class PyramidFASTFeatureDetectorTest extends TestCase {\r
+public class PyramidFASTFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 13c45f1..de529ea 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class PyramidGFTTFeatureDetectorTest extends TestCase {\r
+public class PyramidGFTTFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 94ef841..d287803 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class PyramidHARRISFeatureDetectorTest extends TestCase {\r
+public class PyramidHARRISFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index c8891f7..61f5593 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class PyramidMSERFeatureDetectorTest extends TestCase {\r
+public class PyramidMSERFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index a507e51..056601d 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class PyramidORBFeatureDetectorTest extends TestCase {\r
+public class PyramidORBFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 27aa5f6..922845e 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class PyramidSIFTFeatureDetectorTest extends TestCase {\r
+public class PyramidSIFTFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 9f640f0..2581876 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class PyramidSIMPLEBLOBFeatureDetectorTest extends TestCase {\r
+public class PyramidSIMPLEBLOBFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index ea82636..121235b 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class PyramidSTARFeatureDetectorTest extends TestCase {\r
+public class PyramidSTARFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index d212d0e..4fe70ed 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class PyramidSURFFeatureDetectorTest extends TestCase {\r
+public class PyramidSURFFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index b9d720c..09ff285 100644 (file)
@@ -3,6 +3,7 @@ package org.opencv.test.features2d;
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfKeyPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.features2d.DescriptorExtractor;
@@ -10,9 +11,6 @@ import org.opencv.features2d.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
-import java.util.Arrays;
-import java.util.List;
-
 public class SIFTDescriptorExtractorTest extends OpenCVTestCase {
 
     DescriptorExtractor extractor;
@@ -35,10 +33,12 @@ public class SIFTDescriptorExtractorTest extends OpenCVTestCase {
         matSize = 100;
         truth = new Mat(1, 128, CvType.CV_32FC1) {
             {
-                put(0, 0, 123, 0, 0, 1, 123, 0, 0, 1, 123, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                        0, 0, 0, 123, 0, 0, 2, 123, 0, 0, 2, 123, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 30,
-                        7, 31, 123, 0, 0, 0, 123, 52, 88, 0, 0, 0, 0, 0, 0, 2, 123, 0, 0, 0, 0, 0, 0, 1, 110, 0, 0, 0, 0, 0, 18, 37, 18, 34, 16,
-                        21, 12, 23, 12, 50, 123, 0, 0, 0, 90, 26, 0, 3, 123, 0, 0, 1, 122, 0, 0, 2, 123, 0, 0, 1, 93, 0);
+                put(0, 0,
+                               0, 0, 0, 0, 0, 0, 0, 0, 16, 12, 17, 28, 26, 0, 0, 2, 23, 14, 12, 9, 6, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                               14, 88, 23, 17, 24, 29, 0, 117, 54, 117, 116, 117, 22, 29, 27, 117, 59, 76, 19, 30, 2, 9, 26, 2, 7, 6, 0, 0,
+                               0, 0, 0, 0, 8, 50, 16, 30, 58, 89, 0, 117, 49, 95, 75, 117, 112, 117, 93, 81, 86, 117, 5, 5, 39, 117, 71, 20,
+                               20, 12, 0, 0, 1, 20, 19, 0, 0, 0, 2, 14, 4, 1, 0, 69, 0, 0, 14, 90, 31, 35, 56, 25, 0, 0, 0, 0, 2, 12, 16, 0,
+                               0, 0, 0, 0, 0, 2, 1);
             }
         };
 
@@ -50,7 +50,7 @@ public class SIFTDescriptorExtractorTest extends OpenCVTestCase {
     }
 
     public void testComputeMatListOfKeyPointMat() {
-        List<KeyPoint> keypoints = Arrays.asList(keypoint);
+        MatOfKeyPoint keypoints = new MatOfKeyPoint(keypoint);
         Mat img = getTestImg();
         Mat descriptors = new Mat();
 
@@ -76,7 +76,7 @@ public class SIFTDescriptorExtractorTest extends OpenCVTestCase {
     }
 
     public void testRead() {
-        List<KeyPoint> keypoints = Arrays.asList(keypoint);
+        MatOfKeyPoint keypoints =new MatOfKeyPoint(keypoint);
         Mat img = getTestImg();
         Mat descriptors = new Mat();
 
@@ -95,7 +95,7 @@ public class SIFTDescriptorExtractorTest extends OpenCVTestCase {
 
         extractor.write(filename);
 
-        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<magnification>3.</magnification>\n<isNormalize>1</isNormalize>\n<recalculateAngles>1</recalculateAngles>\n<nOctaves>4</nOctaves>\n<nOctaveLayers>3</nOctaveLayers>\n<firstOctave>-1</firstOctave>\n<angleMode>0</angleMode>\n</opencv_storage>\n";
+        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<name>Feature2D.SIFT</name>\n<contrastThreshold>4.0000000000000001e-02</contrastThreshold>\n<edgeThreshold>10.</edgeThreshold>\n<nFeatures>0</nFeatures>\n<nOctaveLayers>3</nOctaveLayers>\n<sigma>1.6000000000000001e+00</sigma>\n</opencv_storage>\n";
         assertEquals(truth, readFile(filename));
     }
 
@@ -104,7 +104,7 @@ public class SIFTDescriptorExtractorTest extends OpenCVTestCase {
 
         extractor.write(filename);
 
-        String truth = "%YAML:1.0\nmagnification: 3.\nisNormalize: 1\nrecalculateAngles: 1\nnOctaves: 4\nnOctaveLayers: 3\nfirstOctave: -1\nangleMode: 0\n";
+        String truth = "%YAML:1.0\nname: \"Feature2D.SIFT\"\ncontrastThreshold: 4.0000000000000001e-02\nedgeThreshold: 10.\nnFeatures: 0\nnOctaveLayers: 3\nsigma: 1.6000000000000001e+00\n";
         assertEquals(truth, readFile(filename));
     }
 
index dc381ca..6b02d7b 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class SIFTFeatureDetectorTest extends TestCase {\r
+public class SIFTFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index c27f8c3..98aca45 100644 (file)
@@ -1,8 +1,8 @@
 package org.opencv.test.features2d;\r
 \r
-import junit.framework.TestCase;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-public class SIMPLEBLOBFeatureDetectorTest extends TestCase {\r
+public class SIMPLEBLOBFeatureDetectorTest extends OpenCVTestCase {\r
 \r
     public void testCreate() {\r
         fail("Not yet implemented");\r
index 768bd89..1de5d33 100644 (file)
@@ -1,8 +1,11 @@
 package org.opencv.test.features2d;
 
+import java.util.Arrays;
+
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfKeyPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.features2d.FeatureDetector;
@@ -10,10 +13,6 @@ import org.opencv.features2d.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
 public class STARFeatureDetectorTest extends OpenCVTestCase {
 
     FeatureDetector detector;
@@ -48,6 +47,7 @@ public class STARFeatureDetectorTest extends OpenCVTestCase {
         matSize = 200;
 
         truth = new KeyPoint[] {
+                       /*
                 new KeyPoint(95, 80, 22, -1, 31.595734f, 0, -1),
                 new KeyPoint(105, 80, 22, -1, 31.595734f, 0, -1),
                 new KeyPoint(80, 95, 22, -1, 31.595734f, 0, -1),
@@ -56,7 +56,18 @@ public class STARFeatureDetectorTest extends OpenCVTestCase {
                 new KeyPoint(80, 105, 22, -1, 31.595734f, 0, -1),
                 new KeyPoint(120, 105, 22, -1, 31.595734f, 0, -1),
                 new KeyPoint(95, 120, 22, -1, 31.595734f, 0, -1),
-                new KeyPoint(105, 120, 22, -1, 31.595734f, 0, -1) };
+                new KeyPoint(105, 120, 22, -1, 31.595734f, 0, -1)
+                */
+                       new KeyPoint( 95,  80, 22, -1, 31.5957f, 0, -1), 
+                       new KeyPoint(105,  80, 22, -1, 31.5957f, 0, -1), 
+                       new KeyPoint( 80,  95, 22, -1, 31.5957f, 0, -1), 
+                       new KeyPoint(120,  95, 22, -1, 31.5957f, 0, -1), 
+                       new KeyPoint(100, 100,  8, -1, 30.f,     0, -1), 
+                       new KeyPoint( 80, 105, 22, -1, 31.5957f, 0, -1), 
+                       new KeyPoint(120, 105, 22, -1, 31.5957f, 0, -1), 
+                       new KeyPoint( 95, 120, 22, -1, 31.5957f, 0, -1), 
+                       new KeyPoint(105, 120, 22, -1, 31.5957f, 0, -1)
+            };
 
         super.setUp();
     }
@@ -75,21 +86,21 @@ public class STARFeatureDetectorTest extends OpenCVTestCase {
 
     public void testDetectMatListOfKeyPoint() {
         Mat img = getTestImg();
-        List<KeyPoint> keypoints = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
 
         detector.detect(img, keypoints);
 
-        assertListKeyPointEquals(Arrays.asList(truth), keypoints, EPS);
+        assertListKeyPointEquals(Arrays.asList(truth), keypoints.toList(), EPS);
     }
 
     public void testDetectMatListOfKeyPointMat() {
         Mat img = getTestImg();
         Mat mask = getMaskImg();
-        List<KeyPoint> keypoints = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
 
         detector.detect(img, keypoints, mask);
 
-        assertListKeyPointEquals(Arrays.asList(truth[0], truth[2], truth[5], truth[7]), keypoints, EPS);
+        assertListKeyPointEquals(Arrays.asList(truth[0], truth[2], truth[5], truth[7]), keypoints.toList(), EPS);
     }
 
     public void testEmpty() {
@@ -99,17 +110,17 @@ public class STARFeatureDetectorTest extends OpenCVTestCase {
     public void testRead() {
         Mat img = getTestImg();
 
-        List<KeyPoint> keypoints1 = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
         detector.detect(img, keypoints1);
 
         String filename = OpenCVTestRunner.getTempFileName("yml");
         writeFile(filename, "%YAML:1.0\nmaxSize: 45\nresponseThreshold: 150\nlineThresholdProjected: 10\nlineThresholdBinarized: 8\nsuppressNonmaxSize: 5\n");
         detector.read(filename);
 
-        List<KeyPoint> keypoints2 = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
         detector.detect(img, keypoints2);
 
-        assertTrue(keypoints2.size() <= keypoints1.size());
+        assertTrue(keypoints2.total() <= keypoints1.total());
     }
 
     public void testWrite() {
@@ -117,7 +128,7 @@ public class STARFeatureDetectorTest extends OpenCVTestCase {
 
         detector.write(filename);
 
-        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<maxSize>45</maxSize>\n<responseThreshold>30</responseThreshold>\n<lineThresholdProjected>10</lineThresholdProjected>\n<lineThresholdBinarized>8</lineThresholdBinarized>\n<suppressNonmaxSize>5</suppressNonmaxSize>\n</opencv_storage>\n";
+        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<name>Feature2D.STAR</name>\n<lineThresholdBinarized>8</lineThresholdBinarized>\n<lineThresholdProjected>10</lineThresholdProjected>\n<maxSize>45</maxSize>\n<responseThreshold>30</responseThreshold>\n<suppressNonmaxSize>5</suppressNonmaxSize>\n</opencv_storage>\n";
         assertEquals(truth, readFile(filename));
     }
 
@@ -126,7 +137,7 @@ public class STARFeatureDetectorTest extends OpenCVTestCase {
 
         detector.write(filename);
 
-        String truth = "%YAML:1.0\nmaxSize: 45\nresponseThreshold: 30\nlineThresholdProjected: 10\nlineThresholdBinarized: 8\nsuppressNonmaxSize: 5\n";
+        String truth = "%YAML:1.0\nname: \"Feature2D.STAR\"\nlineThresholdBinarized: 8\nlineThresholdProjected: 10\nmaxSize: 45\nresponseThreshold: 30\nsuppressNonmaxSize: 5\n";
         assertEquals(truth, readFile(filename));
     }
 
index f057ef0..e7d951f 100644 (file)
@@ -3,6 +3,7 @@ package org.opencv.test.features2d;
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfKeyPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.features2d.DescriptorExtractor;
@@ -10,9 +11,6 @@ import org.opencv.features2d.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
-import java.util.Arrays;
-import java.util.List;
-
 public class SURFDescriptorExtractorTest extends OpenCVTestCase {
 
     DescriptorExtractor extractor;
@@ -40,19 +38,35 @@ public class SURFDescriptorExtractorTest extends OpenCVTestCase {
 
     public void testComputeMatListOfKeyPointMat() {
         KeyPoint point = new KeyPoint(55.775577545166016f, 44.224422454833984f, 16, 9.754629f, 8617.863f, 1, -1);
-        List<KeyPoint> keypoints = Arrays.asList(point);
+        MatOfKeyPoint keypoints = new MatOfKeyPoint(point);
         Mat img = getTestImg();
         Mat descriptors = new Mat();
 
         extractor.compute(img, keypoints, descriptors);
 
-        Mat truth = new Mat(1, 64, CvType.CV_32FC1) {
+        Mat truth = new Mat(1, 128, CvType.CV_32FC1) {
             {
-                put(0, 0, 0, 0, 0, 0, 0.011540107, 0.0029440077, 0.095483348, 0.018144149, 0.00014820647, 0, 0.00014820647, 0, 0, 0, 0, 0, 0, -0.00014820647,
+                put(0, 0,
+                               /*
+                               0, 0, 0, 0, 0.011540107, 0.0029440077, 0.095483348, 0.018144149, 0.00014820647, 0, 0.00014820647, 0, 0, 0, 0, 0, 0, -0.00014820647,
                         0, 0.00014820647, 0.10196275, 0.0099145742, 0.57075155, 0.047922116, 0, 0, 0, 0, 0, 0, 0, 0, 0.0029440068, -0.011540107, 0.018144149,
                         0.095483348, 0.085385554, -0.054076977, 0.34105155, 0.47911066, 0.023395451, -0.11012388, 0.088196531, 0.50863767, 0.0031790689,
                         -0.019882837, 0.0089476965, 0.054817006, -0.0033560959, -0.0011770058, 0.0033560959, 0.0011770058, 0.019882834, 0.0031790687,
-                        0.054817006, 0.0089476984, 0, 0, 0, 0, -0.0011770058, 0.0033560959, 0.0011770058, 0.0033560959);
+                        0.054817006, 0.0089476984, 0, 0, 0, 0, -0.0011770058, 0.0033560959, 0.0011770058, 0.0033560959
+                        */
+                               0, 0, 0, 0, 0, 0, 0, 0, 0.045382127, 0.075976953, -0.031969212, 0.035002094, 0.012224297, 0.012286193,
+                               -0.0088025155, 0.0088025155, 0.00017225844, 0.00017225844, 0, 0, 8.2743405e-05, 8.2743405e-05, 0, 0, 0,
+                               0, 0, 0, 0, 0, 0, 0, 0, 0, 8.2743405e-05, 8.2743405e-05, -0.00017225844, 0.00017225844, 0, 0, 0.31723264,
+                               0.42715758, -0.19872268, 0.23621935, 0.033304065, 0.033918764, -0.021780485, 0.021780485, 0, 0, 0, 0, 0,
+                               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.0088025145, 0.0088025145, 0.012224296, 0.012286192, -0.045382123,
+                               0.075976953, 0.031969212, 0.035002094, 0.10047197, 0.21463872, -0.0012294546, 0.18176091, -0.075555265,
+                               0.35627601, 0.01270232, 0.20058797, -0.037658721, 0.037658721, 0.064850949, 0.064850949, -0.27688536,
+                               0.44229308, 0.14888979, 0.14888979, -0.0031531656, 0.0031531656, 0.0068481555, 0.0072466261, -0.034193151,
+                               0.040314503, 0.01108359, 0.023398584, -0.00071876607, 0.00071876607, -0.0031819802, 0.0031819802, 0, 0,
+                               -0.0013680183, 0.0013680183, 0.034193147, 0.040314503, -0.01108359, 0.023398584, 0.006848156, 0.0072466265,
+                               -0.0031531656, 0.0031531656, 0, 0, 0, 0, 0, 0, 0, 0, -0.0013680183, 0.0013680183, 0, 0, 0.00071876607,
+                               0.00071876607, 0.0031819802, 0.0031819802
+                        );
             }
         };
 
@@ -64,7 +78,7 @@ public class SURFDescriptorExtractorTest extends OpenCVTestCase {
     }
 
     public void testDescriptorSize() {
-        assertEquals(64, extractor.descriptorSize());
+        assertEquals(128, extractor.descriptorSize());
     }
 
     public void testDescriptorType() {
@@ -89,7 +103,7 @@ public class SURFDescriptorExtractorTest extends OpenCVTestCase {
 
         extractor.write(filename);
 
-        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<nOctaves>4</nOctaves>\n<nOctaveLayers>2</nOctaveLayers>\n<extended>0</extended>\n<upright>0</upright>\n</opencv_storage>\n";
+        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<name>Feature2D.SURF</name>\n<extended>1</extended>\n<hessianThreshold>100.</hessianThreshold>\n<nOctaveLayers>2</nOctaveLayers>\n<nOctaves>4</nOctaves>\n<upright>0</upright>\n</opencv_storage>\n";
         assertEquals(truth, readFile(filename));
     }
 
@@ -98,7 +112,7 @@ public class SURFDescriptorExtractorTest extends OpenCVTestCase {
 
         extractor.write(filename);
 
-        String truth = "%YAML:1.0\nnOctaves: 4\nnOctaveLayers: 2\nextended: 0\nupright: 0\n";
+        String truth = "%YAML:1.0\nname: \"Feature2D.SURF\"\nextended: 1\nhessianThreshold: 100.\nnOctaveLayers: 2\nnOctaves: 4\nupright: 0\n";
         assertEquals(truth, readFile(filename));
     }
 
index 03bcd8b..ca91765 100644 (file)
@@ -1,8 +1,15 @@
 package org.opencv.test.features2d;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfKeyPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
 import org.opencv.features2d.FeatureDetector;
@@ -10,12 +17,6 @@ import org.opencv.features2d.KeyPoint;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
 public class SURFFeatureDetectorTest extends OpenCVTestCase {
 
     FeatureDetector detector;
@@ -55,10 +56,18 @@ public class SURFFeatureDetectorTest extends OpenCVTestCase {
 
         matSize = 100;
 
-        truth = new KeyPoint[] { new KeyPoint(55.775577545166016f, 44.224422454833984f, 16, 9.754629f, 8617.863f, 1, -1),
+        truth = new KeyPoint[] {
+                       /*
+                       new KeyPoint(55.775577545166016f, 44.224422454833984f, 16, 9.754629f, 8617.863f, 1, -1),
                 new KeyPoint(44.224422454833984f, 44.224422454833984f, 16, 99.75463f, 8617.863f, 1, -1),
                 new KeyPoint(44.224422454833984f, 55.775577545166016f, 16, 189.7546f, 8617.863f, 1, -1),
-                new KeyPoint(55.775577545166016f, 55.775577545166016f, 16, 279.75464f, 8617.863f, 1, -1) };
+                new KeyPoint(55.775577545166016f, 55.775577545166016f, 16, 279.75464f, 8617.863f, 1, -1)
+                */
+                       new KeyPoint(55.7755f, 44.2244f, 16,   9.754f, 8617.863f, 0, -1), 
+                       new KeyPoint(44.2244f, 44.2244f, 16,  99.754f, 8617.863f, 0, -1), 
+                       new KeyPoint(44.2244f, 55.7755f, 16, 189.754f, 8617.863f, 0, -1), 
+                       new KeyPoint(55.7755f, 55.7755f, 16, 279.754f, 8617.863f, 0, -1)
+               };
 
         super.setUp();
     }
@@ -72,7 +81,7 @@ public class SURFFeatureDetectorTest extends OpenCVTestCase {
         writeFile(filename, "%YAML:1.0\nhessianThreshold: 8000.\noctaves: 3\noctaveLayers: 4\nupright: 0\n");
         detector.read(filename);
 
-        List<List<KeyPoint>> keypoints = new ArrayList<List<KeyPoint>>();
+        List<MatOfKeyPoint> keypoints = new ArrayList<MatOfKeyPoint>();
         Mat cross = getTestImg();
         List<Mat> crosses = new ArrayList<Mat>(3);
         crosses.add(cross);
@@ -83,7 +92,8 @@ public class SURFFeatureDetectorTest extends OpenCVTestCase {
 
         assertEquals(3, keypoints.size());
 
-        for (List<KeyPoint> lkp : keypoints) {
+        for (MatOfKeyPoint mkp : keypoints) {
+               List<KeyPoint> lkp = mkp.toList();
             order(lkp);
             assertListKeyPointEquals(Arrays.asList(truth), lkp, EPS);
         }
@@ -98,13 +108,14 @@ public class SURFFeatureDetectorTest extends OpenCVTestCase {
         writeFile(filename, "%YAML:1.0\nhessianThreshold: 8000.\noctaves: 3\noctaveLayers: 4\nupright: 0\n");
         detector.read(filename);
 
-        List<KeyPoint> keypoints = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
         Mat cross = getTestImg();
 
         detector.detect(cross, keypoints);
 
-        order(keypoints);
-        assertListKeyPointEquals(Arrays.asList(truth), keypoints, EPS);
+        List<KeyPoint> lkp = keypoints.toList();
+        order(lkp);
+        assertListKeyPointEquals(Arrays.asList(truth), lkp, EPS);
     }
 
     public void testDetectMatListOfKeyPointMat() {
@@ -114,12 +125,13 @@ public class SURFFeatureDetectorTest extends OpenCVTestCase {
 
         Mat img = getTestImg();
         Mat mask = getMaskImg();
-        List<KeyPoint> keypoints = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
 
         detector.detect(img, keypoints, mask);
 
-        order(keypoints);
-        assertListKeyPointEquals(Arrays.asList(truth[1], truth[2]), keypoints, EPS);
+        List<KeyPoint> lkp = keypoints.toList();
+        order(lkp);
+        assertListKeyPointEquals(Arrays.asList(truth[1], truth[2]), lkp, EPS);
     }
 
     public void testEmpty() {
@@ -129,17 +141,17 @@ public class SURFFeatureDetectorTest extends OpenCVTestCase {
     public void testRead() {
         Mat cross = getTestImg();
 
-        List<KeyPoint> keypoints1 = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
         detector.detect(cross, keypoints1);
 
         String filename = OpenCVTestRunner.getTempFileName("yml");
         writeFile(filename, "%YAML:1.0\nhessianThreshold: 8000.\noctaves: 3\noctaveLayers: 4\nupright: 0\n");
         detector.read(filename);
 
-        List<KeyPoint> keypoints2 = new ArrayList<KeyPoint>();
+        MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
         detector.detect(cross, keypoints2);
 
-        assertTrue(keypoints2.size() <= keypoints1.size());
+        assertTrue(keypoints2.total() <= keypoints1.total());
     }
 
     public void testWrite() {
@@ -147,7 +159,7 @@ public class SURFFeatureDetectorTest extends OpenCVTestCase {
 
         detector.write(filename);
 
-        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<hessianThreshold>400.</hessianThreshold>\n<octaves>3</octaves>\n<octaveLayers>4</octaveLayers>\n<upright>0</upright>\n</opencv_storage>\n";
+        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<name>Feature2D.SURF</name>\n<extended>1</extended>\n<hessianThreshold>100.</hessianThreshold>\n<nOctaveLayers>2</nOctaveLayers>\n<nOctaves>4</nOctaves>\n<upright>0</upright>\n</opencv_storage>\n";
         assertEquals(truth, readFile(filename));
     }
 
@@ -156,7 +168,7 @@ public class SURFFeatureDetectorTest extends OpenCVTestCase {
 
         detector.write(filename);
 
-        String truth = "%YAML:1.0\nhessianThreshold: 400.\noctaves: 3\noctaveLayers: 4\nupright: 0\n";
+        String truth = "%YAML:1.0\nname: \"Feature2D.SURF\"\nextended: 1\nhessianThreshold: 100.\nnOctaveLayers: 2\nnOctaves: 4\nupright: 0\n";
         assertEquals(truth, readFile(filename));
     }
 
index ed55bac..d45272b 100644 (file)
@@ -1,8 +1,6 @@
 package org.opencv.test.highgui;
 
-import java.util.ArrayList;
-import java.util.List;
-
+import org.opencv.core.MatOfByte;
 import org.opencv.highgui.Highgui;
 import org.opencv.test.OpenCVTestCase;
 import org.opencv.test.OpenCVTestRunner;
@@ -14,10 +12,10 @@ public class HighguiTest extends OpenCVTestCase {
     }
 
     public void testImencodeStringMatListOfByte() {
-        List<Byte> buf = new ArrayList<Byte>();
-        assertEquals(0, buf.size());
-        assertTrue( Highgui.imencode(".jpg", gray127, buf) );
-        assertFalse(0 == buf.size());
+        MatOfByte buff = new MatOfByte();
+        assertEquals(0, buff.total());
+        assertTrue( Highgui.imencode(".jpg", gray127, buff) );
+        assertFalse(0 == buff.total());
     }
 
     public void testImencodeStringMatListOfByteListOfInteger() {
index 8f1b6f8..5fecf27 100644 (file)
@@ -7,6 +7,10 @@ import java.util.List;
 import org.opencv.core.Core;
 import org.opencv.core.CvType;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfFloat;
+import org.opencv.core.MatOfInt;
+import org.opencv.core.MatOfPoint;
+import org.opencv.core.MatOfPoint2f;
 import org.opencv.core.Point;
 import org.opencv.core.Rect;
 import org.opencv.core.RotatedRect;
@@ -141,14 +145,9 @@ public class ImgprocTest extends OpenCVTestCase {
     }
 
     public void testApproxPolyDP() {
-       List<Point> curve = new ArrayList<Point>(5);
-       curve.add(new Point(1, 3));
-       curve.add(new Point(2, 4));
-       curve.add(new Point(3, 5));
-       curve.add(new Point(4, 4));
-       curve.add(new Point(5, 3));
+       MatOfPoint2f curve = new MatOfPoint2f(new Point(1, 3), new Point(2, 4), new Point(3, 5), new Point(4, 4), new Point(5, 3));
        
-       List<Point> approxCurve = new ArrayList<Point>();
+       MatOfPoint2f approxCurve = new MatOfPoint2f();
 
         Imgproc.approxPolyDP(curve, approxCurve, EPS, true);
 
@@ -157,11 +156,11 @@ public class ImgprocTest extends OpenCVTestCase {
         approxCurveGold.add(new Point(3, 5));
         approxCurveGold.add(new Point(5, 3));
 
-        assertListPointEquals(approxCurve, approxCurveGold, EPS);
+        assertListPointEquals(approxCurve.toList(), approxCurveGold, EPS);
     }
 
     public void testArcLength() {
-        List<Point> curve = Arrays.asList(new Point(1, 3), new Point(2, 4), new Point(3, 5), new Point(4, 4), new Point(5, 3));
+        MatOfPoint2f curve = new MatOfPoint2f(new Point(1, 3), new Point(2, 4), new Point(3, 5), new Point(4, 4), new Point(5, 3));
 
         double arcLength = Imgproc.arcLength(curve, false);
 
@@ -212,7 +211,7 @@ public class ImgprocTest extends OpenCVTestCase {
     }
 
     public void testBoundingRect() {
-        List<Point> points = Arrays.asList(new Point(0, 0), new Point(0, 4), new Point(4, 0), new Point(4, 4));
+        MatOfPoint points = new MatOfPoint(new Point(0, 0), new Point(0, 4), new Point(4, 0), new Point(4, 4));
         Point p1 = new Point(1, 1);
         Point p2 = new Point(-5, -2);
 
@@ -243,9 +242,9 @@ public class ImgprocTest extends OpenCVTestCase {
 
     public void testCalcBackProject() {
         List<Mat> images = Arrays.asList(grayChess);
-        List<Integer> channels = Arrays.asList(0);
-        List<Integer> histSize = Arrays.asList(10);
-        List<Float> ranges = Arrays.asList(0f, 256f);
+        MatOfInt channels = new MatOfInt(1, new int[]{0});
+        MatOfInt histSize = new MatOfInt(1, new int[]{10});
+        MatOfFloat ranges = new MatOfFloat(1, 0f, 256f);
 
         Mat hist = new Mat();
         Imgproc.calcHist(images, channels, new Mat(), hist, histSize, ranges);
@@ -260,9 +259,9 @@ public class ImgprocTest extends OpenCVTestCase {
 
     public void testCalcHistListOfMatListOfIntegerMatMatListOfIntegerListOfFloat() {
         List<Mat> images = Arrays.asList(gray128);
-        List<Integer> channels = Arrays.asList(0);
-        List<Integer> histSize = Arrays.asList(10);
-        List<Float> ranges = Arrays.asList(0f, 256f);
+        MatOfInt channels = new MatOfInt(1, new int[]{0});
+        MatOfInt histSize = new MatOfInt(1, new int[]{10});
+        MatOfFloat ranges = new MatOfFloat(1, 0f, 256f);
         Mat hist = new Mat();
 
         Imgproc.calcHist(images, channels, new Mat(), hist, histSize, ranges);
@@ -277,9 +276,9 @@ public class ImgprocTest extends OpenCVTestCase {
 
     public void testCalcHistListOfMatListOfIntegerMatMatListOfIntegerListOfFloat2d() {
         List<Mat> images = Arrays.asList(gray255, gray128);
-        List<Integer> channels = Arrays.asList(0, 1);
-        List<Integer> histSize = Arrays.asList(10, 10);
-        List<Float> ranges = Arrays.asList(0f, 256f, 0f, 256f);
+        MatOfInt channels = new MatOfInt(1, 0, 1);
+        MatOfInt histSize = new MatOfInt(1, 10, 10);
+        MatOfFloat ranges = new MatOfFloat(1, 0f, 256f, 0f, 256f);
         Mat hist = new Mat();
 
         Imgproc.calcHist(images, channels, new Mat(), hist, histSize, ranges);
@@ -294,9 +293,9 @@ public class ImgprocTest extends OpenCVTestCase {
 
     public void testCalcHistListOfMatListOfIntegerMatMatListOfIntegerListOfFloatBoolean() {
         List<Mat> images = Arrays.asList(gray255, gray128);
-        List<Integer> channels = Arrays.asList(0, 1);
-        List<Integer> histSize = Arrays.asList(10, 10);
-        List<Float> ranges = Arrays.asList(0f, 256f, 0f, 256f);
+        MatOfInt channels = new MatOfInt(1, 0, 1);
+        MatOfInt histSize = new MatOfInt(1, 10, 10);
+        MatOfFloat ranges = new MatOfFloat(1, 0f, 256f, 0f, 256f);
         Mat hist = new Mat();
 
         Imgproc.calcHist(images, channels, new Mat(), hist, histSize, ranges, true);
@@ -542,15 +541,14 @@ public class ImgprocTest extends OpenCVTestCase {
 
         Rect r = new Rect(new Point(0, 0), truthPosition);
         Core.rectangle(img, r.tl(), r.br(), new Scalar(0), Core.FILLED);
-        List<Point> corners = new ArrayList<Point>();
-        corners.add(new Point(truthPosition.x + 1, truthPosition.y + 1));
+        MatOfPoint2f corners = new MatOfPoint2f(new Point(truthPosition.x + 1, truthPosition.y + 1));
         Size winSize = new Size(2, 2);
         Size zeroZone = new Size(-1, -1);
         TermCriteria criteria = new TermCriteria(TermCriteria.EPS, 0, 0.01);
 
         Imgproc.cornerSubPix(img, corners, winSize, zeroZone, criteria);
-
-        assertPointEquals(truthPosition, corners.get(0), weakEPS);
+        
+        assertPointEquals(truthPosition, corners.toList().get(0), weakEPS);
     }
 
     public void testCvtColorMatMatInt() {
@@ -602,7 +600,7 @@ public class ImgprocTest extends OpenCVTestCase {
 
     public void testDrawContoursMatListOfMatIntScalar() {
         Core.rectangle(gray0, new Point(1, 2), new Point(7, 8), new Scalar(100));
-        List<Mat> contours = new ArrayList<Mat>();
+        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
         Imgproc.findContours(gray0, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
 
         Imgproc.drawContours(gray0, contours, -1, new Scalar(0));
@@ -612,7 +610,7 @@ public class ImgprocTest extends OpenCVTestCase {
 
     public void testDrawContoursMatListOfMatIntScalarInt() {
         Core.rectangle(gray0, new Point(1, 2), new Point(7, 8), new Scalar(100));
-        List<Mat> contours = new ArrayList<Mat>();
+        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
         Imgproc.findContours(gray0, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
 
         Imgproc.drawContours(gray0, contours, -1, new Scalar(0), Core.FILLED);
@@ -707,7 +705,7 @@ public class ImgprocTest extends OpenCVTestCase {
 
     public void testFindContoursMatListOfMatMatIntInt() {
         Mat img = new Mat(50, 50, CvType.CV_8UC1, new Scalar(0));
-        List<Mat> contours = new ArrayList<Mat>(5);
+        List<MatOfPoint> contours = new ArrayList<MatOfPoint>(5);
         Mat hierarchy = new Mat();
 
         Imgproc.findContours(img, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
@@ -729,8 +727,8 @@ public class ImgprocTest extends OpenCVTestCase {
     public void testFindContoursMatListOfMatMatIntIntPoint() {
         Mat img = new Mat(50, 50, CvType.CV_8UC1, new Scalar(0));
         Mat img2 = img.submat(5, 50, 3, 50);
-        List<Mat> contours = new ArrayList<Mat>();
-        List<Mat> contours2 = new ArrayList<Mat>();
+        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
+        List<MatOfPoint> contours2 = new ArrayList<MatOfPoint>();
         Mat hierarchy = new Mat();
 
         Core.rectangle(img, new Point(10, 20), new Point(20, 30), new Scalar(100), 3, Core.LINE_AA, 0);
@@ -750,14 +748,14 @@ public class ImgprocTest extends OpenCVTestCase {
     }
 
     public void testFitEllipse() {
-        List<Point> points = Arrays.asList(new Point(0, 0), new Point(-1, 1), new Point(1, 1), new Point(1, -1), new Point(-1, -1));
+        MatOfPoint2f points = new MatOfPoint2f(new Point(0, 0), new Point(-1, 1), new Point(1, 1), new Point(1, -1), new Point(-1, -1));
         RotatedRect rrect = new RotatedRect();
 
         rrect = Imgproc.fitEllipse(points);
 
         assertPointEquals(new Point(0, 0), rrect.center, EPS);
-        assertEquals(2.53, rrect.size.width, EPS);
-        assertEquals(2.53, rrect.size.height, EPS);
+        assertEquals(2.828, rrect.size.width, EPS);
+        assertEquals(2.828, rrect.size.height, EPS);
     }
 
     public void testFitLine() {
@@ -835,8 +833,8 @@ public class ImgprocTest extends OpenCVTestCase {
     }
 
     public void testGetAffineTransform() {
-        List<Point> src = Arrays.asList(new Point(2, 3), new Point(3, 1), new Point(1, 4));
-        List<Point> dst = Arrays.asList(new Point(3, 3), new Point(7, 4), new Point(5, 6));
+       MatOfPoint2f src = new MatOfPoint2f(new Point(2, 3), new Point(3, 1), new Point(1, 4));
+       MatOfPoint2f dst = new MatOfPoint2f(new Point(3, 3), new Point(7, 4), new Point(5, 6));
 
         Mat transform = Imgproc.getAffineTransform(src, dst);
 
@@ -979,21 +977,21 @@ public class ImgprocTest extends OpenCVTestCase {
     public void testGoodFeaturesToTrackMatListOfPointIntDoubleDouble() {
         Mat src = gray0;
         Core.rectangle(src, new Point(2, 2), new Point(8, 8), new Scalar(100), -1);
-        List<Point> lp = new ArrayList<Point>();
+        MatOfPoint lp = new MatOfPoint();
 
         Imgproc.goodFeaturesToTrack(src, lp, 100, 0.01, 3);
 
-        assertEquals(4, lp.size());
+        assertEquals(4, lp.total());
     }
 
     public void testGoodFeaturesToTrackMatListOfPointIntDoubleDoubleMatIntBooleanDouble() {
         Mat src = gray0;
         Core.rectangle(src, new Point(2, 2), new Point(8, 8), new Scalar(100), -1);
-        List<Point> lp = new ArrayList<Point>();
+        MatOfPoint lp = new MatOfPoint();
 
         Imgproc.goodFeaturesToTrack(src, lp, 100, 0.01, 3, gray1, 4, true, 0);
 
-        assertEquals(4, lp.size());
+        assertEquals(4, lp.total());
     }
 
     public void testGrabCutMatMatRectMatMatInt() {
@@ -1279,11 +1277,11 @@ public class ImgprocTest extends OpenCVTestCase {
     }
 
     public void testIsContourConvex() {
-        List<Point> contour1 = Arrays.asList(new Point(0, 0), new Point(10, 0), new Point(10, 10), new Point(5, 4));
+        MatOfPoint2f contour1 = new MatOfPoint2f(new Point(0, 0), new Point(10, 0), new Point(10, 10), new Point(5, 4));
 
         assertFalse(Imgproc.isContourConvex(contour1));
 
-        List<Point> contour2 = Arrays.asList(new Point(0, 0), new Point(10, 0), new Point(10, 10), new Point(5, 6));
+        MatOfPoint2f contour2 = new MatOfPoint2f(new Point(0, 0), new Point(10, 0), new Point(10, 10), new Point(5, 6));
 
         assertTrue(Imgproc.isContourConvex(contour2));
     }
@@ -1355,7 +1353,7 @@ public class ImgprocTest extends OpenCVTestCase {
     }
 
     public void testMinAreaRect() {
-        List<Point> points = Arrays.asList(new Point(1, 1), new Point(5, 1), new Point(4, 3), new Point(6, 2));
+        MatOfPoint2f points = new MatOfPoint2f(new Point(1, 1), new Point(5, 1), new Point(4, 3), new Point(6, 2));
 
         RotatedRect rrect = Imgproc.minAreaRect(points);
 
@@ -1365,12 +1363,7 @@ public class ImgprocTest extends OpenCVTestCase {
     }
 
     public void testMinEnclosingCircle() {
-        List<Point> points = new ArrayList<Point>();
-        points.add(new Point(0, 0));
-        points.add(new Point(-1, 0));
-        points.add(new Point(0, -1));
-        points.add(new Point(1, 0));
-        points.add(new Point(0, 1));
+        MatOfPoint2f points = new MatOfPoint2f(new Point(0, 0), new Point(-1, 0), new Point(0, -1), new Point(1, 0), new Point(0, 1));
         Point actualCenter = new Point();
         float[] radius = new float[1];
 
@@ -1430,8 +1423,7 @@ public class ImgprocTest extends OpenCVTestCase {
     }
 
     public void testPointPolygonTest() {
-        List<Point> contour = Arrays.asList(new Point(0, 0), new Point(1, 3), new Point(3, 4), new Point(4, 3), new Point(2, 1));
-
+       MatOfPoint2f contour = new MatOfPoint2f(new Point(0, 0), new Point(1, 3), new Point(3, 4), new Point(4, 3), new Point(2, 1));
         double sign1 = Imgproc.pointPolygonTest(contour, new Point(2, 2), false);
         assertEquals(1.0, sign1);
 
@@ -1763,18 +1755,17 @@ public class ImgprocTest extends OpenCVTestCase {
 
     //undistortPoints(List<Point> src, List<Point> dst, Mat cameraMatrix, Mat distCoeffs)
     public void testUndistortPointsListOfPointListOfPointMatMat() {
-        List<Point> src = new ArrayList<Point>(3);
-        src.add( new Point(1, 2) );
-        src.add( new Point(3, 4) );
-        src.add( new Point(-1, -1) );
-        List<Point> dst = new ArrayList<Point>();
+       MatOfPoint2f src = new MatOfPoint2f(new Point(1, 2), new Point(3, 4), new Point(-1, -1));
+       MatOfPoint2f dst = new MatOfPoint2f();
         Mat cameraMatrix = Mat.eye(3, 3, CvType.CV_64FC1);
         Mat distCoeffs = new Mat(8, 1, CvType.CV_64FC1, new Scalar(0));
+
         Imgproc.undistortPoints(src, dst, cameraMatrix, distCoeffs);
+        
         assertEquals(src.size(), dst.size());
-        for(int i=0; i<src.size(); i++) {
+        for(int i=0; i<src.toList().size(); i++) {
                //Log.d("UndistortPoints", "s="+src.get(i)+", d="+dst.get(i));
-               assertTrue(src.get(i).equals(dst.get(i)));
+               assertTrue(src.toList().get(i).equals(dst.toList().get(i)));
         }
     }
     
index 5ce838c..2b176b7 100644 (file)
@@ -1,6 +1,6 @@
 package org.opencv.test.imgproc;
 
-import org.opencv.core.Mat;
+import org.opencv.core.MatOfFloat;
 import org.opencv.core.Point;
 import org.opencv.core.Rect;
 import org.opencv.imgproc.Subdiv2D;
@@ -50,7 +50,7 @@ public class Subdiv2DTest extends OpenCVTestCase {
        s2d.insert( new Point(20, 10) );
        s2d.insert( new Point(20, 20) );
        s2d.insert( new Point(10, 20) );
-       Mat triangles = new Mat();
+       MatOfFloat triangles = new MatOfFloat();
        s2d.getTriangleList(triangles);
        assertEquals(10, triangles.rows());
        /*
index 709b631..f046d2d 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvANN_MLP;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvANN_MLPTest extends TestCase {\r
+public class CvANN_MLPTest extends OpenCVTestCase {\r
 \r
     public void testClear() {\r
         fail("Not yet implemented");\r
index dd4a8f3..7c5beca 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvANN_MLP_TrainParams;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvANN_MLP_TrainParamsTest extends TestCase {\r
+public class CvANN_MLP_TrainParamsTest extends OpenCVTestCase {\r
 \r
     public void testCvANN_MLP_TrainParams() {\r
         new CvANN_MLP_TrainParams();\r
index 3d815bc..6cd9205 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvBoostParams;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvBoostParamsTest extends TestCase {\r
+public class CvBoostParamsTest extends OpenCVTestCase {\r
 \r
     public void testCvBoostParams() {\r
         new CvBoostParams();\r
index 466d64a..9895c95 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvBoost;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvBoostTest extends TestCase {\r
+public class CvBoostTest extends OpenCVTestCase {\r
 \r
     public void testClear() {\r
         fail("Not yet implemented");\r
index e767aae..c7bbda0 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvDTreeParams;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvDTreeParamsTest extends TestCase {\r
+public class CvDTreeParamsTest extends OpenCVTestCase {\r
 \r
     public void testCvDTreeParams() {\r
         new CvDTreeParams();\r
index f6a5baa..df6da72 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvDTree;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvDTreeTest extends TestCase {\r
+public class CvDTreeTest extends OpenCVTestCase {\r
 \r
     public void testClear() {\r
         fail("Not yet implemented");\r
diff --git a/modules/java/android_test/src/org/opencv/test/ml/CvEMParamsTest.java b/modules/java/android_test/src/org/opencv/test/ml/CvEMParamsTest.java
deleted file mode 100644 (file)
index 2b2b9f0..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.opencv.test.ml;\r
-\r
-import org.opencv.ml.CvEMParams;\r
-\r
-import junit.framework.TestCase;\r
-\r
-public class CvEMParamsTest extends TestCase {\r
-\r
-    public void testCvEMParams() {\r
-        new CvEMParams();\r
-    }\r
-\r
-    public void testGet_cov_mat_type() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testGet_nclusters() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testGet_start_step() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testSet_cov_mat_type() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testSet_nclusters() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testSet_start_step() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-}\r
diff --git a/modules/java/android_test/src/org/opencv/test/ml/CvEMTest.java b/modules/java/android_test/src/org/opencv/test/ml/CvEMTest.java
deleted file mode 100644 (file)
index b649653..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.opencv.test.ml;\r
-\r
-import org.opencv.ml.CvEM;\r
-\r
-import junit.framework.TestCase;\r
-\r
-public class CvEMTest extends TestCase {\r
-\r
-    public void testCalcLikelihood() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testClear() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testCvEM() {\r
-        new CvEM();\r
-    }\r
-\r
-    public void testCvEMMat() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testCvEMMatMat() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testCvEMMatMatCvEMParams() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testGetCovs() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testGetLikelihood() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testGetLikelihoodDelta() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testGetMeans() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testGetNClusters() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testGetProbs() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testGetWeights() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testPredictMat() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testPredictMatMat() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testTrainMat() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testTrainMatMat() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testTrainMatMatCvEMParams() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-    public void testTrainMatMatCvEMParamsMat() {\r
-        fail("Not yet implemented");\r
-    }\r
-\r
-}\r
index 0a59dfe..9b5e645 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvERTrees;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvERTreesTest extends TestCase {\r
+public class CvERTreesTest extends OpenCVTestCase {\r
 \r
     public void testCvERTrees() {\r
         new CvERTrees();\r
index ca266d1..ff6b54e 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvGBTreesParams;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvGBTreesParamsTest extends TestCase {\r
+public class CvGBTreesParamsTest extends OpenCVTestCase {\r
 \r
     public void testCvGBTreesParams() {\r
         new CvGBTreesParams();\r
index 2bbb38d..e45b4ed 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvGBTrees;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvGBTreesTest extends TestCase {\r
+public class CvGBTreesTest extends OpenCVTestCase {\r
 \r
     public void testClear() {\r
         fail("Not yet implemented");\r
index 1f7bd37..46a2ca5 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvKNearest;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvKNearestTest extends TestCase {\r
+public class CvKNearestTest extends OpenCVTestCase {\r
 \r
     public void testCvKNearest() {\r
         new CvKNearest();\r
index d184a79..ca818cd 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvNormalBayesClassifier;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvNormalBayesClassifierTest extends TestCase {\r
+public class CvNormalBayesClassifierTest extends OpenCVTestCase {\r
 \r
     public void testClear() {\r
         fail("Not yet implemented");\r
index 39334d1..09a1304 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvParamGrid;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvParamGridTest extends TestCase {\r
+public class CvParamGridTest extends OpenCVTestCase {\r
 \r
     public void testCvParamGrid() {\r
         new CvParamGrid();\r
index fb12e9a..2b7ca4a 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvRTParams;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvRTParamsTest extends TestCase {\r
+public class CvRTParamsTest extends OpenCVTestCase {\r
 \r
     public void testCvRTParams() {\r
         new CvRTParams();\r
index dcb88ef..d98a279 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvRTrees;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvRTreesTest extends TestCase {\r
+public class CvRTreesTest extends OpenCVTestCase {\r
 \r
     public void testClear() {\r
         fail("Not yet implemented");\r
index a1b4c92..c59f1ac 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvSVMParams;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvSVMParamsTest extends TestCase {\r
+public class CvSVMParamsTest extends OpenCVTestCase {\r
 \r
     public void testCvSVMParams() {\r
         new CvSVMParams();\r
index 4982ee8..7ea7dc3 100644 (file)
@@ -1,10 +1,9 @@
 package org.opencv.test.ml;\r
 \r
 import org.opencv.ml.CvSVM;\r
+import org.opencv.test.OpenCVTestCase;\r
 \r
-import junit.framework.TestCase;\r
-\r
-public class CvSVMTest extends TestCase {\r
+public class CvSVMTest extends OpenCVTestCase {\r
 \r
     public void testClear() {\r
         fail("Not yet implemented");\r
index ae21aac..5304fac 100644 (file)
@@ -1,9 +1,7 @@
 package org.opencv.test.objdetect;
 
-import java.util.ArrayList;
-
 import org.opencv.core.Mat;
-import org.opencv.core.Rect;
+import org.opencv.core.MatOfRect;
 import org.opencv.core.Size;
 import org.opencv.imgproc.Imgproc;
 import org.opencv.objdetect.CascadeClassifier;
@@ -34,14 +32,14 @@ public class CascadeClassifierTest extends OpenCVTestCase {
 
     public void testDetectMultiScaleMatListOfRect() {
         CascadeClassifier cc = new CascadeClassifier(OpenCVTestRunner.LBPCASCADE_FRONTALFACE_PATH);
-        ArrayList<Rect> faces = new ArrayList<Rect>();
+        MatOfRect faces = new MatOfRect();
 
         Mat greyLena = new Mat();
         Imgproc.cvtColor(rgbLena, greyLena, Imgproc.COLOR_RGB2GRAY);
 
         // TODO: doesn't detect with 1.1 scale
         cc.detectMultiScale(greyLena, faces, 1.09, 3, Objdetect.CASCADE_SCALE_IMAGE, new Size(30, 30), new Size());
-        assertEquals(1, faces.size());
+        assertEquals(1, faces.total());
     }
 
     public void testDetectMultiScaleMatListOfRectDouble() {
index 4fe33d1..aaf2075 100644 (file)
@@ -1,40 +1,42 @@
 package org.opencv.test.objdetect;
 
-import java.util.ArrayList;
-
-import org.opencv.core.Rect;
-import org.opencv.objdetect.Objdetect;
 import org.opencv.test.OpenCVTestCase;
 
 public class ObjdetectTest extends OpenCVTestCase {
 
     public void testGroupRectanglesListOfRectListOfIntegerInt() {
         fail("Not yet implemented");
-        Rect r = new Rect(10, 10, 20, 20);
-        ArrayList<Rect> rects = new ArrayList<Rect>();
+        /*
+        final int NUM = 10;
+        MatOfRect rects = new MatOfRect();
+        rects.alloc(NUM);
 
-        for (int i = 0; i < 10; i++)
-            rects.add(r);
+        for (int i = 0; i < NUM; i++)
+            rects.put(i, 0, 10, 10, 20, 20);
 
         int groupThreshold = 1;
         Objdetect.groupRectangles(rects, null, groupThreshold);//TODO: second parameter should not be null
-        assertEquals(1, rects.size());
+        assertEquals(1, rects.total());
+        */
     }
 
     public void testGroupRectanglesListOfRectListOfIntegerIntDouble() {
         fail("Not yet implemented");
-        Rect r1 = new Rect(10, 10, 20, 20);
-        Rect r2 = new Rect(10, 10, 25, 25);
-        ArrayList<Rect> rects = new ArrayList<Rect>();
+        /*
+        final int NUM = 10;
+        MatOfRect rects = new MatOfRect();
+        rects.alloc(NUM);
 
-        for (int i = 0; i < 10; i++)
-            rects.add(r1);
-        for (int i = 0; i < 10; i++)
-            rects.add(r2);
+        for (int i = 0; i < NUM; i++)
+            rects.put(i, 0, 10, 10, 20, 20);
+        
+        for (int i = 0; i < NUM; i++)
+            rects.put(i, 0, 10, 10, 25, 25);
 
         int groupThreshold = 1;
         double eps = 0.2;
         Objdetect.groupRectangles(rects, null, groupThreshold, eps);//TODO: second parameter should not be null
         assertEquals(2, rects.size());
+        */
     }
 }
index 59c397c..0874281 100644 (file)
@@ -44,7 +44,8 @@ public class ConvertersTest extends OpenCVTestCase {
         truth.add(new DMatch(2, 3, 5, 6));\r
         truth.add(new DMatch(3, 1, 8, 12));\r
         truth.add(new DMatch(4, 9, 5, 15));\r
-        assertListDMatchEquals(truth, matches, EPS);\r
+        //assertListDMatchEquals(truth, matches, EPS);\r
+        fail("Not yet implemented");\r
     }\r
 \r
     public void testMat_to_vector_float() {\r
index c6fa4de..198d065 100644 (file)
@@ -1,18 +1,12 @@
 package org.opencv.test.video;
 
-import org.opencv.core.Core;
-import org.opencv.core.CvType;
-import org.opencv.core.Mat;
-import org.opencv.core.Point;
-import org.opencv.core.Scalar;
-import org.opencv.highgui.Highgui;
 import org.opencv.test.OpenCVTestCase;
-import org.opencv.video.BackgroundSubtractorMOG;
 
 public class BackgroundSubtractorMOGTest extends OpenCVTestCase {
 
     public void testApplyMatMat() {
         fail("Not yet implemented");
+        /*
         BackgroundSubtractorMOG backGroundSubtract = new BackgroundSubtractorMOG();
 
         Point bottomRight = new Point(rgbLena.cols() / 2, rgbLena.rows() / 2);
@@ -26,10 +20,8 @@ public class BackgroundSubtractorMOGTest extends OpenCVTestCase {
 
         Mat truth = new Mat(rgbLena.size(), rgbLena.type(), new Scalar(0));
         Core.rectangle(truth, bottomRight, topLeft, color, Core.FILLED);
-        // OpenCVTestRunner.Log(dst.dump());
-        // OpenCVTestRunner.Log(rgbLena.dump());
-        Highgui.imwrite("/mnt/sdcard/lena1.png", rgbLena);
         assertMatEqual(truth, rgbLena);
+        */
     }
 
     public void testApplyMatMatDouble() {
index 8e1cc80..cb549bb 100644 (file)
@@ -2,26 +2,25 @@ package org.opencv.test.video;
 
 import org.opencv.core.Core;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfByte;
+import org.opencv.core.MatOfFloat;
+import org.opencv.core.MatOfPoint2f;
 import org.opencv.core.Point;
 import org.opencv.core.Size;
 import org.opencv.test.OpenCVTestCase;
-import org.opencv.utils.Converters;
 import org.opencv.video.Video;
 
-import java.util.ArrayList;
-import java.util.List;
-
 public class VideoTest extends OpenCVTestCase {
 
-    private List<Float> err = null;
+    private MatOfFloat err = null;
     private int h;
-    private List<Point> nextPts = null;
-    List<Point> prevPts = null;
+    private MatOfPoint2f nextPts = null;
+    private MatOfPoint2f prevPts = null;
 
     private int shift1;
     private int shift2;
 
-    private List<Byte> status = null;
+    private MatOfByte status = null;
     private Mat subLena1 = null;
     private Mat subLena2 = null;
     private int w;
@@ -38,14 +37,11 @@ public class VideoTest extends OpenCVTestCase {
         subLena1 = rgbLena.submat(shift1, h + shift1, shift1, w + shift1);
         subLena2 = rgbLena.submat(shift2, h + shift2, shift2, w + shift2);
 
-        prevPts = new ArrayList<Point>();
-        prevPts.add(new Point(11.0, 8.0));
-        prevPts.add(new Point(5.0, 5.0));
-        prevPts.add(new Point(10.0, 10.0));
+        prevPts = new MatOfPoint2f(new Point(11d, 8d), new Point(5d, 5d), new Point(10d, 10d));
 
-        nextPts = new ArrayList<Point>();
-        status = new ArrayList<Byte>();
-        err = new ArrayList<Float>();
+        nextPts = new MatOfPoint2f();
+        status = new MatOfByte();
+        err = new MatOfFloat();
     }
 
     public void testCalcGlobalOrientation() {
@@ -66,13 +62,13 @@ public class VideoTest extends OpenCVTestCase {
 
     public void testCalcOpticalFlowPyrLKMatMatListOfPointListOfPointListOfByteListOfFloat() {
         Video.calcOpticalFlowPyrLK(subLena1, subLena2, prevPts, nextPts, status, err);
-        assertEquals(3, Core.countNonZero(Converters.vector_uchar_to_Mat(status)));
+        assertEquals(3, Core.countNonZero(status));
     }
 
     public void testCalcOpticalFlowPyrLKMatMatListOfPointListOfPointListOfByteListOfFloatSize() {
         Size sz = new Size(3, 3);
         Video.calcOpticalFlowPyrLK(subLena1, subLena2, prevPts, nextPts, status, err, sz, 3);
-        assertEquals(0, Core.countNonZero(Converters.vector_uchar_to_Mat(status)));
+        assertEquals(0, Core.countNonZero(status));
     }
 
 
index 89d4c32..2b4fa5a 100644 (file)
@@ -13,6 +13,8 @@ class_ignore_list = (
     "VideoWriter", "VideoCapture",\r
     #features2d\r
     #"KeyPoint", "MSER", "StarDetector", "SURF", "DMatch",\r
+    #ml\r
+    "EM",\r
 )\r
 \r
 const_ignore_list = (\r
@@ -193,34 +195,36 @@ type_dict = {
 \r
 # "complex" : { j_type : "?", jn_args : (("", ""),), jn_name : "", jni_var : "", jni_name : "", "suffix" : "?" },\r
 \r
-    "vector_Point"    : { "j_type" : "List<Point>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Point> %(n)s", "suffix" : "J" },\r
-    "vector_Point2f"  : { "j_type" : "List<Point>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Point2f> %(n)s", "suffix" : "J" },\r
-    "vector_Point2d"  : { "j_type" : "List<Point>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Point2d> %(n)s", "suffix" : "J" },\r
-    "vector_Point3i"  : { "j_type" : "List<Point3>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Point3i> %(n)s", "suffix" : "J" },\r
-    "vector_Point3f"  : { "j_type" : "List<Point3>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Point3f> %(n)s", "suffix" : "J" },\r
-    "vector_Point3d"  : { "j_type" : "List<Point3>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Point3d> %(n)s", "suffix" : "J" },\r
+    "vector_Point"    : { "j_type" : "MatOfPoint", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Point> %(n)s", "suffix" : "J" },\r
+    "vector_Point2f"  : { "j_type" : "MatOfPoint2f", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Point2f> %(n)s", "suffix" : "J" },\r
+    #"vector_Point2d"  : { "j_type" : "MatOfPoint2d", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Point2d> %(n)s", "suffix" : "J" },\r
+    "vector_Point3i"  : { "j_type" : "MatOfPoint3", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Point3i> %(n)s", "suffix" : "J" },\r
+    "vector_Point3f"  : { "j_type" : "MatOfPoint3f", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Point3f> %(n)s", "suffix" : "J" },\r
+    #"vector_Point3d"  : { "j_type" : "MatOfPoint3d", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Point3d> %(n)s", "suffix" : "J" },\r
+    "vector_KeyPoint" : { "j_type" : "MatOfKeyPoint", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<KeyPoint> %(n)s", "suffix" : "J" },\r
+    "vector_DMatch"   : { "j_type" : "MatOfDMatch", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<DMatch> %(n)s", "suffix" : "J" },\r
+    "vector_Rect"     : { "j_type" : "MatOfRect", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Rect> %(n)s", "suffix" : "J" },\r
+    "vector_uchar"    : { "j_type" : "MatOfByte", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<uchar> %(n)s", "suffix" : "J" },\r
+    "vector_char"     : { "j_type" : "MatOfByte", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<char> %(n)s", "suffix" : "J" },\r
+    "vector_int"      : { "j_type" : "MatOfInt", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<int> %(n)s", "suffix" : "J" },\r
+    "vector_float"    : { "j_type" : "MatOfFloat", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<float> %(n)s", "suffix" : "J" },\r
+    "vector_double"   : { "j_type" : "MatOfDouble", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<double> %(n)s", "suffix" : "J" },\r
+    "vector_Vec4f"    : { "j_type" : "MatOfFloat", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Vec4f> %(n)s", "suffix" : "J" },\r
+    "vector_Vec6f"    : { "j_type" : "MatOfFloat", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Vec6f> %(n)s", "suffix" : "J" },\r
+\r
     "vector_Mat"      : { "j_type" : "List<Mat>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Mat> %(n)s", "suffix" : "J" },\r
-    "vector_KeyPoint" : { "j_type" : "List<KeyPoint>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<KeyPoint> %(n)s", "suffix" : "J" },\r
-    "vector_DMatch"   : { "j_type" : "List<DMatch>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<DMatch> %(n)s", "suffix" : "J" },\r
-    "vector_Rect"     : { "j_type" : "List<Rect>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Rect> %(n)s", "suffix" : "J" },\r
-    "vector_uchar"    : { "j_type" : "List<Byte>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<uchar> %(n)s", "suffix" : "J" },\r
-    "vector_char"     : { "j_type" : "List<Byte>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<char> %(n)s", "suffix" : "J" },\r
-    "vector_int"      : { "j_type" : "List<Integer>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<int> %(n)s", "suffix" : "J" },\r
-    "vector_float"    : { "j_type" : "List<Float>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<float> %(n)s", "suffix" : "J" },\r
-    "vector_double"   : { "j_type" : "List<Double>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<double> %(n)s", "suffix" : "J" },\r
-    "vector_Vec4f"    : { "j_type" : "Mat", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Vec4f> %(n)s", "suffix" : "J" },\r
-    "vector_Vec6f"    : { "j_type" : "Mat", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector<Vec6f> %(n)s", "suffix" : "J" },\r
-\r
-    "vector_vector_KeyPoint": { "j_type" : "List<List<KeyPoint>>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector<KeyPoint> > %(n)s" },\r
-    "vector_vector_DMatch"  : { "j_type" : "List<List<DMatch>>",   "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector<DMatch> > %(n)s" },\r
-    "vector_vector_char"    : { "j_type" : "List<List<Byte>>",     "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector<char> > %(n)s" },\r
-    "vector_vector_Point"   : { "j_type" : "List<List<Point>>",    "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector<Point> > %(n)s" },\r
-    "vector_vector_Point2f" : { "j_type" : "List<List<Point>>",    "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector<Point2f> > %(n)s" },\r
+\r
+    "vector_vector_KeyPoint": { "j_type" : "List<MatOfKeyPoint>", "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector<KeyPoint> > %(n)s" },\r
+    "vector_vector_DMatch"  : { "j_type" : "List<MatOfDMatch>",   "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector<DMatch> > %(n)s" },\r
+    "vector_vector_char"    : { "j_type" : "List<MatOfByte>",     "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector<char> > %(n)s" },\r
+    "vector_vector_Point"   : { "j_type" : "List<MatOfPoint>",    "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector<Point> > %(n)s" },\r
+    "vector_vector_Point2f" : { "j_type" : "List<MatOfPoint2f>",    "jn_type" : "long", "jni_type" : "jlong", "jni_var" : "vector< vector<Point2f> > %(n)s" },\r
 \r
     "Mat"     : { "j_type" : "Mat", "jn_type" : "long", "jn_args" : (("__int64", ".nativeObj"),),\r
                   "jni_var" : "Mat& %(n)s = *((Mat*)%(n)s_nativeObj)",\r
                   "jni_type" : "jlong", #"jni_name" : "*%(n)s",\r
                   "suffix" : "J" },\r
+\r
     "Point"   : { "j_type" : "Point", "jn_args" : (("double", ".x"), ("double", ".y")),\r
                   "jni_var" : "Point %(n)s((int)%(n)s_x, (int)%(n)s_y)", "jni_type" : "jdoubleArray",\r
                   "suffix" : "DD"},\r
@@ -484,6 +488,8 @@ JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Core_n_1getTextSize
         "setTrackbarPos"    : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
         "imshow"            : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
         "waitKey"           : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "moveWindow"        : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
+        "resizeWindow"      : {'j_code' : '', 'jn_code' : '', 'cpp_code' : '' },\r
     }, # Highgui\r
 \r
 }\r
@@ -495,7 +501,7 @@ func_arg_fix = {
         'randn'    : { 'mean'    : 'double', 'stddev' : 'double', },\r
         'inRange'  : { 'lowerb'  : 'Scalar', 'upperb' : 'Scalar', },\r
         'goodFeaturesToTrack' : { 'corners' : 'vector_Point', },\r
-        'findFundamentalMat' : { 'points1' : 'vector_Point2d', 'points2' : 'vector_Point2d', },\r
+        'findFundamentalMat' : { 'points1' : 'vector_Point2f', 'points2' : 'vector_Point2f', },\r
         'cornerSubPix' : { 'corners' : 'vector_Point2f', },\r
         'minEnclosingCircle' : { 'points' : 'vector_Point2f', },\r
         'findHomography' : { 'srcPoints' : 'vector_Point2f', 'dstPoints' : 'vector_Point2f', },\r
@@ -510,15 +516,18 @@ func_arg_fix = {
         'boundingRect' : { 'points' : 'vector_Point', },\r
         'approxPolyDP' : { 'curve' : 'vector_Point2f', 'approxCurve' : 'vector_Point2f', },\r
         'arcLength' : { 'curve' : 'vector_Point2f', },\r
-        'isContourConvex' : { 'contour' : 'vector_Point2f', },\r
         'pointPolygonTest' : { 'contour' : 'vector_Point2f', },\r
         'minAreaRect' : { 'points' : 'vector_Point2f', },\r
         'getAffineTransform' : { 'src' : 'vector_Point2f', 'dst' : 'vector_Point2f', },\r
         'hconcat' : { 'src' : 'vector_Mat', },\r
         'vconcat' : { 'src' : 'vector_Mat', },\r
-        'undistortPoints' : { 'src' : 'vector_Point2d', 'dst' : 'vector_Point2d' },\r
+        'undistortPoints' : { 'src' : 'vector_Point2f', 'dst' : 'vector_Point2f' },\r
         'checkRange' : {'pos' : '*'},\r
         'meanStdDev' : {'mean' : 'vector_double', 'stddev' : 'vector_double'},\r
+        'drawContours' : {'contours' : 'vector_vector_Point'},\r
+        'findContours' : {'contours' : 'vector_vector_Point'},\r
+        'convexityDefects' : {'contour' : 'vector_Point'},\r
+        'isContourConvex' : { 'contour' : 'vector_Point2f', },\r
     }, # '', i.e. no class\r
 } # func_arg_fix\r
 \r
@@ -565,6 +574,10 @@ class ArgInfo(object):
         if ctype.endswith("*"):\r
             ctype = ctype[:-1]\r
             self.pointer = True\r
+        if ctype == 'vector_Point2d':\r
+            ctype = 'vector_Point2f'\r
+        elif ctype == 'vector_Point3d':\r
+            ctype = 'vector_Point3f'\r
         self.ctype = ctype\r
         self.name = arg_tuple[1]\r
         self.defval = arg_tuple[2]\r
@@ -891,9 +904,13 @@ extern "C" {
     def get_imports(self, scope_classname, ctype):\r
         imports = self.classes[scope_classname or self.Module].imports\r
         if ctype.startswith('vector'):\r
-            imports.add("java.util.List")\r
             imports.add("org.opencv.core.Mat")\r
-            imports.add("org.opencv.utils.Converters")\r
+            if type_dict[ctype]['j_type'].startswith('MatOf'):\r
+                imports.add("org.opencv.core." + type_dict[ctype]['j_type'])\r
+                return #TMP\r
+            else:\r
+                imports.add("java.util.List")\r
+                imports.add("org.opencv.utils.Converters")\r
             ctype = ctype.replace('vector_', '')\r
         j_type = ''\r
         if ctype in type_dict:\r
@@ -992,15 +1009,18 @@ extern "C" {
                             j_prologue.append( "List<Mat> %(n)s_tmplm = new ArrayList<Mat>((%(n)s != null) ? %(n)s.size() : 0);" % {"n" : a.name } )\r
                             j_prologue.append( "Mat %(n)s_mat = Converters.%(t)s_to_Mat(%(n)s, %(n)s_tmplm);" % {"n" : a.name, "t" : a.ctype} )\r
                         else:\r
-                            j_prologue.append( "Mat %(n)s_mat = Converters.%(t)s_to_Mat(%(n)s);" % {"n" : a.name, "t" : a.ctype} )\r
+                            if not type_dict[a.ctype]["j_type"].startswith("MatOf"):\r
+                                j_prologue.append( "Mat %(n)s_mat = Converters.%(t)s_to_Mat(%(n)s);" % {"n" : a.name, "t" : a.ctype} )\r
+                            else:\r
+                                j_prologue.append( "Mat %s_mat = %s;" % (a.name, a.name) )\r
                         c_prologue.append( "Mat_to_%(t)s( %(n)s_mat, %(n)s );" % {"n" : a.name, "t" : a.ctype} )\r
                     else:\r
-                        if type_dict[a.ctype]["j_type"] != "Mat":\r
+                        if not type_dict[a.ctype]["j_type"].startswith("MatOf"):\r
                             j_prologue.append( "Mat %s_mat = new Mat();" % a.name )\r
                         else:\r
                             j_prologue.append( "Mat %s_mat = %s;" % (a.name, a.name) )\r
                     if "O" in a.out:\r
-                        if type_dict[a.ctype]["j_type"] != "Mat":\r
+                        if not type_dict[a.ctype]["j_type"].startswith("MatOf"):\r
                             j_epilogue.append("Converters.Mat_to_%(t)s(%(n)s_mat, %(n)s);" % {"t" : a.ctype, "n" : a.name})\r
                         c_epilogue.append( "%(t)s_to_Mat( %(n)s, %(n)s_mat );" % {"n" : a.name, "t" : a.ctype} )\r
                 else:\r
@@ -1060,12 +1080,21 @@ extern "C" {
             tail = ""\r
             ret = "return retVal;"\r
             if ret_type.startswith('vector'):\r
-                ret_val = "Mat retValMat = new Mat("\r
                 tail = ")"\r
                 j_type = type_dict[ret_type]["j_type"]\r
-                j_prologue.append( j_type + ' retVal = new Array' + j_type+'();')\r
-                self.classes[fi.classname or self.Module].imports.add('java.util.ArrayList')\r
-                j_epilogue.append('Converters.Mat_to_' + ret_type + '(retValMat, retVal);')\r
+                if j_type.startswith('MatOf'):\r
+                    ret_val += "new " + j_type + "("\r
+                    m_t  = re.match('vector_(\w+)', ret_type)\r
+                    m_ch = re.match('vector_Vec(\d+)', ret_type)\r
+                    if m_ch:\r
+                        ret_val += m_ch.group(1) +  ', '\r
+                    elif m_t.group(1) in ('char', 'uchar', 'int', 'float', 'double'):\r
+                        ret_val += '1, '\r
+                else:\r
+                    ret_val = "Mat retValMat = new Mat("\r
+                    j_prologue.append( j_type + ' retVal = new Array' + j_type+'();')\r
+                    self.classes[fi.classname or self.Module].imports.add('java.util.ArrayList')\r
+                    j_epilogue.append('Converters.Mat_to_' + ret_type + '(retValMat, retVal);')\r
             elif ret_type == "void":\r
                 ret_val = ""\r
                 ret = "return;"\r
index 7e1f4cf..7d7b092 100644 (file)
@@ -185,11 +185,11 @@ void vector_Point3d_to_Mat(vector<Point3d>& v_point, Mat& mat)
 void Mat_to_vector_KeyPoint(Mat& mat, vector<KeyPoint>& v_kp)\r
 {\r
     v_kp.clear();\r
-    CHECK_MAT(mat.type()==CV_64FC(7) && mat.cols==1);\r
+    CHECK_MAT(mat.type()==CV_32FC(7) && mat.cols==1);\r
     for(int i=0; i<mat.rows; i++)\r
     {\r
-        Vec<double, 7> v = mat.at< Vec<double, 7> >(i, 0);\r
-        KeyPoint kp((float)v[0], (float)v[1], (float)v[2], (float)v[3], (float)v[4], (int)v[5], (int)v[6]);\r
+        Vec<float, 7> v = mat.at< Vec<float, 7> >(i, 0);\r
+        KeyPoint kp(v[0], v[1], v[2], v[3], v[4], (int)v[5], (int)v[6]);\r
         v_kp.push_back(kp);\r
     }\r
     return;\r
@@ -199,11 +199,11 @@ void Mat_to_vector_KeyPoint(Mat& mat, vector<KeyPoint>& v_kp)
 void vector_KeyPoint_to_Mat(vector<KeyPoint>& v_kp, Mat& mat)\r
 {\r
     int count = v_kp.size();\r
-    mat.create(count, 1, CV_64FC(7));\r
+    mat.create(count, 1, CV_32FC(7));\r
     for(int i=0; i<count; i++)\r
     {\r
         KeyPoint kp = v_kp[i];\r
-        mat.at< Vec<double, 7> >(i, 0) = Vec<double, 7>(kp.pt.x, kp.pt.y, kp.size, kp.angle, kp.response, kp.octave, kp.class_id);\r
+        mat.at< Vec<float, 7> >(i, 0) = Vec<float, 7>(kp.pt.x, kp.pt.y, kp.size, kp.angle, kp.response, kp.octave, kp.class_id);\r
     }\r
 }\r
 #endif\r
@@ -245,11 +245,11 @@ void vector_Mat_to_Mat(std::vector<cv::Mat>& v_mat, cv::Mat& mat)
 void Mat_to_vector_DMatch(Mat& mat, vector<DMatch>& v_dm)\r
 {\r
     v_dm.clear();\r
-    CHECK_MAT(mat.type()==CV_64FC4 && mat.cols==1);\r
+    CHECK_MAT(mat.type()==CV_32FC4 && mat.cols==1);\r
     for(int i=0; i<mat.rows; i++)\r
     {\r
-        Vec<double, 4> v = mat.at< Vec<double, 4> >(i, 0);\r
-        DMatch dm((int)v[0], (int)v[1], (int)v[2], (float)v[3]);\r
+        Vec<float, 4> v = mat.at< Vec<float, 4> >(i, 0);\r
+        DMatch dm((int)v[0], (int)v[1], (int)v[2], v[3]);\r
         v_dm.push_back(dm);\r
     }\r
     return;\r
@@ -259,11 +259,11 @@ void Mat_to_vector_DMatch(Mat& mat, vector<DMatch>& v_dm)
 void vector_DMatch_to_Mat(vector<DMatch>& v_dm, Mat& mat)\r
 {\r
     int count = v_dm.size();\r
-    mat.create(count, 1, CV_64FC4);\r
+    mat.create(count, 1, CV_32FC4);\r
     for(int i=0; i<count; i++)\r
     {\r
         DMatch dm = v_dm[i];\r
-        mat.at< Vec<double, 4> >(i, 0) = Vec<double, 4>(dm.queryIdx, dm.trainIdx, dm.imgIdx, dm.distance);\r
+        mat.at< Vec<float, 4> >(i, 0) = Vec<float, 4>(dm.queryIdx, dm.trainIdx, dm.imgIdx, dm.distance);\r
     }\r
 }\r
 #endif\r
@@ -374,6 +374,19 @@ void vector_vector_Point2f_to_Mat(vector< vector< Point2f > >& vv_pt, Mat& mat)
     vector_Mat_to_Mat(vm, mat);\r
 }\r
 \r
+void vector_vector_Point_to_Mat(vector< vector< Point > >& vv_pt, Mat& mat)\r
+{\r
+    vector<Mat> vm;\r
+    vm.reserve( vv_pt.size() );\r
+    for(size_t i=0; i<vv_pt.size(); i++)\r
+    {\r
+        Mat m;\r
+        vector_Point_to_Mat(vv_pt[i], m);\r
+        vm.push_back(m);\r
+    }\r
+    vector_Mat_to_Mat(vm, mat);\r
+}\r
+\r
 void vector_Vec4f_to_Mat(vector<Vec4f>& v_vec, Mat& mat)\r
 {\r
     mat = Mat(v_vec, true);\r
index e1118e9..b1105ca 100644 (file)
@@ -64,4 +64,5 @@ void vector_vector_char_to_Mat(std::vector< std::vector< char > >& vv_ch, cv::Ma
 \r
 void Mat_to_vector_vector_Point(cv::Mat& mat, std::vector< std::vector< cv::Point > >& vv_pt);\r
 void vector_vector_Point2f_to_Mat(std::vector< std::vector< cv::Point2f > >& vv_pt, cv::Mat& mat);\r
+void vector_vector_Point_to_Mat(std::vector< std::vector< cv::Point > >& vv_pt, cv::Mat& mat);\r
 \r
diff --git a/modules/java/src/java/core+MatOfByte.java b/modules/java/src/java/core+MatOfByte.java
new file mode 100644 (file)
index 0000000..dbd489e
--- /dev/null
@@ -0,0 +1,81 @@
+package org.opencv.core;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+public class MatOfByte extends Mat {\r
+       // 8UC(x)\r
+       private static final int _depth = CvType.CV_8U;\r
+       private final int _channels;\r
+\r
+    public MatOfByte(int channels) {\r
+        super();\r
+        _channels = channels;\r
+    }\r
+\r
+    public MatOfByte() {\r
+        this(1);\r
+    }\r
+\r
+    public MatOfByte(int channels, long addr) {\r
+        super(addr);\r
+        _channels = channels;\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfByte(int channels, Mat m) {\r
+       super(m, Range.all());\r
+        _channels = channels;\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfByte(int channels, byte...a) {\r
+        super();\r
+        _channels = channels;\r
+        fromArray(a);\r
+    }\r
+\r
+    public void alloc(int elemNumber) {\r
+        if(elemNumber>0)\r
+            super.create(elemNumber, 1, CvType.makeType(_depth, _channels));\r
+    }\r
+\r
+    public void fromArray(byte...a) {\r
+        if(a==null || a.length==0)\r
+            return;\r
+        int num = a.length / _channels;\r
+        alloc(num);\r
+        put(0, 0, a); //TODO: check ret val!\r
+    }\r
+    \r
+    public byte[] toArray() {\r
+        int num = (int) total();\r
+        byte[] a = new byte[num * _channels];\r
+        if(num == 0)\r
+            return a;\r
+        get(0, 0, a); //TODO: check ret val!\r
+        return a;\r
+    }\r
+\r
+    public void fromList(List<Byte> lb) {\r
+       if(lb==null || lb.size()==0)\r
+               return;\r
+       Byte ab[] = lb.toArray(null);\r
+       byte a[] = new byte[ab.length];\r
+       for(int i=0; i<ab.length; i++)\r
+               a[i] = ab[i];\r
+       fromArray(a);\r
+    }\r
+    \r
+    public List<Byte> toList() {\r
+       byte[] a = toArray();\r
+       Byte ab[] = new Byte[a.length];\r
+       for(int i=0; i<a.length; i++)\r
+               ab[i] = a[i];\r
+       return Arrays.asList(ab); \r
+    }\r
+}\r
diff --git a/modules/java/src/java/core+MatOfDMatch.java b/modules/java/src/java/core+MatOfDMatch.java
new file mode 100644 (file)
index 0000000..9a4ace3
--- /dev/null
@@ -0,0 +1,79 @@
+package org.opencv.core;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import org.opencv.features2d.DMatch;\r
+\r
+public class MatOfDMatch extends Mat {\r
+       // 32FC4\r
+       private static final int _depth = CvType.CV_32F;\r
+       private static final int _channels = 4;\r
+\r
+    public MatOfDMatch() {\r
+        super();\r
+    }\r
+\r
+    public MatOfDMatch(long addr) {\r
+        super(addr);\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfDMatch(Mat m) {\r
+       super(m, Range.all());\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfDMatch(DMatch...ap) {\r
+        super();\r
+        fromArray(ap);\r
+    }\r
+    \r
+    public void alloc(int elemNumber) {\r
+        if(elemNumber>0)\r
+            super.create(elemNumber, 1, CvType.makeType(_depth, _channels));\r
+    }\r
+\r
+\r
+    public void fromArray(DMatch...a) {\r
+        if(a==null || a.length==0)\r
+            return;\r
+        int num = a.length;\r
+        alloc(num);\r
+        float buff[] = new float[num * _channels];\r
+        for(int i=0; i<num; i++) {\r
+            DMatch m = a[i];\r
+            buff[_channels*i+0] = m.queryIdx;\r
+            buff[_channels*i+1] = m.trainIdx;\r
+            buff[_channels*i+2] = m.imgIdx;\r
+            buff[_channels*i+3] = m.distance;\r
+        }\r
+        put(0, 0, buff); //TODO: check ret val!\r
+    }\r
+\r
+    public DMatch[] toArray() {\r
+        int num = (int) total();\r
+        DMatch[] a = new DMatch[num];\r
+        if(num == 0)\r
+            return a;\r
+        float buff[] = new float[num * _channels];\r
+        get(0, 0, buff); //TODO: check ret val!\r
+        for(int i=0; i<num; i++)\r
+            a[i] = new DMatch((int) buff[_channels*i+0], (int) buff[_channels*i+1], (int) buff[_channels*i+2], buff[_channels*i+3]);\r
+        return a;\r
+    }\r
+\r
+    public void fromList(List<DMatch> ldm) {\r
+       DMatch adm[] = ldm.toArray(null);\r
+       fromArray(adm);\r
+    }\r
+    \r
+    public List<DMatch> toList() {\r
+       DMatch[] adm = toArray();\r
+       return Arrays.asList(adm); \r
+    }\r
+}\r
diff --git a/modules/java/src/java/core+MatOfDouble.java b/modules/java/src/java/core+MatOfDouble.java
new file mode 100644 (file)
index 0000000..165b9db
--- /dev/null
@@ -0,0 +1,81 @@
+package org.opencv.core;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+public class MatOfDouble extends Mat {\r
+       // 64FC(x)\r
+       private static final int _depth = CvType.CV_64F;\r
+       private final int _channels;\r
+\r
+    public MatOfDouble(int channels) {\r
+        super();\r
+        _channels = channels;\r
+    }\r
+\r
+    public MatOfDouble() {\r
+        this(1);\r
+    }\r
+\r
+    public MatOfDouble(int channels, long addr) {\r
+        super(addr);\r
+        _channels = channels;\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfDouble(int channels, Mat m) {\r
+       super(m, Range.all());\r
+        _channels = channels;\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfDouble(int channels, double...a) {\r
+        super();\r
+        _channels = channels;\r
+        fromArray(a);\r
+    }\r
+\r
+    public void alloc(int elemNumber) {\r
+        if(elemNumber>0)\r
+            super.create(elemNumber, 1, CvType.makeType(_depth, _channels));\r
+    }\r
+\r
+    public void fromArray(double...a) {\r
+        if(a==null || a.length==0)\r
+            return;\r
+        int num = a.length / _channels;\r
+        alloc(num);\r
+        put(0, 0, a); //TODO: check ret val!\r
+    }\r
+    \r
+    public double[] toArray() {\r
+        int num = (int) total();\r
+        double[] a = new double[num * _channels];\r
+        if(num == 0)\r
+            return a;\r
+        get(0, 0, a); //TODO: check ret val!\r
+        return a;\r
+    }\r
+\r
+    public void fromList(List<Double> lb) {\r
+       if(lb==null || lb.size()==0)\r
+               return;\r
+       Double ab[] = lb.toArray(null);\r
+       double a[] = new double[ab.length];\r
+       for(int i=0; i<ab.length; i++)\r
+               a[i] = ab[i];\r
+       fromArray(a);\r
+    }\r
+    \r
+    public List<Double> toList() {\r
+       double[] a = toArray();\r
+       Double ab[] = new Double[a.length];\r
+       for(int i=0; i<a.length; i++)\r
+               ab[i] = a[i];\r
+       return Arrays.asList(ab); \r
+    }\r
+}\r
diff --git a/modules/java/src/java/core+MatOfFloat.java b/modules/java/src/java/core+MatOfFloat.java
new file mode 100644 (file)
index 0000000..809a0de
--- /dev/null
@@ -0,0 +1,81 @@
+package org.opencv.core;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+public class MatOfFloat extends Mat {\r
+       // 32FC(x)\r
+       private static final int _depth = CvType.CV_32F;\r
+       private final int _channels;\r
+\r
+    public MatOfFloat(int channels) {\r
+        super();\r
+        _channels = channels;\r
+    }\r
+\r
+    public MatOfFloat() {\r
+        this(1);\r
+    }\r
+\r
+    public MatOfFloat(int channels, long addr) {\r
+        super(addr);\r
+        _channels = channels;\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfFloat(int channels, Mat m) {\r
+       super(m, Range.all());\r
+        _channels = channels;\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfFloat(int channels, float...a) {\r
+        super();\r
+        _channels = channels;\r
+        fromArray(a);\r
+    }\r
+\r
+    public void alloc(int elemNumber) {\r
+        if(elemNumber>0)\r
+            super.create(elemNumber, 1, CvType.makeType(_depth, _channels));\r
+    }\r
+\r
+    public void fromArray(float...a) {\r
+        if(a==null || a.length==0)\r
+            return;\r
+        int num = a.length / _channels;\r
+        alloc(num);\r
+        put(0, 0, a); //TODO: check ret val!\r
+    }\r
+    \r
+    public float[] toArray() {\r
+        int num = (int) total();\r
+        float[] a = new float[num * _channels];\r
+        if(num == 0)\r
+            return a;\r
+        get(0, 0, a); //TODO: check ret val!\r
+        return a;\r
+    }\r
+\r
+    public void fromList(List<Float> lb) {\r
+       if(lb==null || lb.size()==0)\r
+               return;\r
+       Float ab[] = lb.toArray(null);\r
+       float a[] = new float[ab.length];\r
+       for(int i=0; i<ab.length; i++)\r
+               a[i] = ab[i];\r
+       fromArray(a);\r
+    }\r
+    \r
+    public List<Float> toList() {\r
+       float[] a = toArray();\r
+       Float ab[] = new Float[a.length];\r
+       for(int i=0; i<a.length; i++)\r
+               ab[i] = a[i];\r
+       return Arrays.asList(ab); \r
+    }\r
+}\r
diff --git a/modules/java/src/java/core+MatOfInt.java b/modules/java/src/java/core+MatOfInt.java
new file mode 100644 (file)
index 0000000..d019438
--- /dev/null
@@ -0,0 +1,82 @@
+package org.opencv.core;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+\r
+public class MatOfInt extends Mat {\r
+       // 32SC(x)\r
+       private static final int _depth = CvType.CV_32S;\r
+       private final int _channels;\r
+\r
+    public MatOfInt(int channels) {\r
+        super();\r
+        _channels = channels;\r
+    }\r
+\r
+    public MatOfInt() {\r
+        this(1);\r
+    }\r
+\r
+    public MatOfInt(int channels, long addr) {\r
+        super(addr);\r
+        _channels = channels;\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfInt(int channels, Mat m) {\r
+       super(m, Range.all());\r
+        _channels = channels;\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfInt(int channels, int...a) {\r
+        super();\r
+        _channels = channels;\r
+        fromArray(a);\r
+    }\r
+\r
+    public void alloc(int elemNumber) {\r
+        if(elemNumber>0)\r
+            super.create(elemNumber, 1, CvType.makeType(_depth, _channels));\r
+    }\r
+\r
+    public void fromArray(int...a) {\r
+        if(a==null || a.length==0)\r
+            return;\r
+        int num = a.length / _channels;\r
+        alloc(num);\r
+        put(0, 0, a); //TODO: check ret val!\r
+    }\r
+    \r
+    public int[] toArray() {\r
+        int num = (int) total();\r
+        int[] a = new int[num * _channels];\r
+        if(num == 0)\r
+            return a;\r
+        get(0, 0, a); //TODO: check ret val!\r
+        return a;\r
+    }\r
+\r
+    public void fromList(List<Integer> lb) {\r
+       if(lb==null || lb.size()==0)\r
+               return;\r
+       Integer ab[] = lb.toArray(null);\r
+       int a[] = new int[ab.length];\r
+       for(int i=0; i<ab.length; i++)\r
+               a[i] = ab[i];\r
+       fromArray(a);\r
+    }\r
+    \r
+    public List<Integer> toList() {\r
+       int[] a = toArray();\r
+       Integer ab[] = new Integer[a.length];\r
+       for(int i=0; i<a.length; i++)\r
+               ab[i] = a[i];\r
+       return Arrays.asList(ab); \r
+    }\r
+}\r
diff --git a/modules/java/src/java/core+MatOfKeyPoint.java b/modules/java/src/java/core+MatOfKeyPoint.java
new file mode 100644 (file)
index 0000000..e310be2
--- /dev/null
@@ -0,0 +1,82 @@
+package org.opencv.core;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import org.opencv.features2d.KeyPoint;\r
+\r
+public class MatOfKeyPoint extends Mat {\r
+       // 32FC7\r
+       private static final int _depth = CvType.CV_32F;\r
+       private static final int _channels = 7;\r
+\r
+    public MatOfKeyPoint() {\r
+        super();\r
+    }\r
+\r
+    public MatOfKeyPoint(long addr) {\r
+        super(addr);\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfKeyPoint(Mat m) {\r
+       super(m, Range.all());\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfKeyPoint(KeyPoint...a) {\r
+        super();\r
+        fromArray(a);\r
+    }\r
+    \r
+    public void alloc(int elemNumber) {\r
+        if(elemNumber>0)\r
+            super.create(elemNumber, 1, CvType.makeType(_depth, _channels));\r
+    }\r
+\r
+    public void fromArray(KeyPoint...a) {\r
+        if(a==null || a.length==0)\r
+            return;\r
+        int num = a.length;\r
+        alloc(num);\r
+        float buff[] = new float[num * _channels];\r
+        for(int i=0; i<num; i++) {\r
+            KeyPoint kp = a[i];\r
+            buff[_channels*i+0] = (float) kp.pt.x;\r
+            buff[_channels*i+1] = (float) kp.pt.y;\r
+            buff[_channels*i+2] = kp.size;\r
+            buff[_channels*i+3] = kp.angle;\r
+            buff[_channels*i+4] = kp.response;\r
+            buff[_channels*i+5] = kp.octave;\r
+            buff[_channels*i+6] = kp.class_id;\r
+        }\r
+        put(0, 0, buff); //TODO: check ret val!\r
+    }\r
+\r
+    public KeyPoint[] toArray() {\r
+        int num = (int) total();\r
+        KeyPoint[] a = new KeyPoint[num];\r
+        if(num == 0)\r
+            return a;\r
+        float buff[] = new float[num * _channels];\r
+        get(0, 0, buff); //TODO: check ret val!\r
+        for(int i=0; i<num; i++)\r
+            a[i] = new KeyPoint( buff[_channels*i+0], buff[_channels*i+1], buff[_channels*i+2], buff[_channels*i+3],\r
+                                 buff[_channels*i+4], (int) buff[_channels*i+5], (int) buff[_channels*i+6] );\r
+        return a;\r
+    }\r
+\r
+    public void fromList(List<KeyPoint> lkp) {\r
+       KeyPoint akp[] = lkp.toArray(null);\r
+       fromArray(akp);\r
+    }\r
+    \r
+    public List<KeyPoint> toList() {\r
+       KeyPoint[] akp = toArray();\r
+       return Arrays.asList(akp); \r
+    }\r
+}\r
diff --git a/modules/java/src/java/core+MatOfPoint.java b/modules/java/src/java/core+MatOfPoint.java
new file mode 100644 (file)
index 0000000..b0dc449
--- /dev/null
@@ -0,0 +1,74 @@
+package org.opencv.core;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+public class MatOfPoint extends Mat {\r
+       // 32SC2\r
+       private static final int _depth = CvType.CV_32S;\r
+       private static final int _channels = 2;\r
+\r
+    public MatOfPoint() {\r
+        super();\r
+    }\r
+\r
+    public MatOfPoint(long addr) {\r
+        super(addr);\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfPoint(Mat m) {\r
+       super(m, Range.all());\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfPoint(Point...a) {\r
+        super();\r
+        fromArray(a);\r
+    }\r
+    \r
+    public void alloc(int elemNumber) {\r
+        if(elemNumber>0)\r
+            super.create(elemNumber, 1, CvType.makeType(_depth, _channels));\r
+    }\r
+\r
+    public void fromArray(Point...a) {\r
+        if(a==null || a.length==0)\r
+            return;\r
+        int num = a.length;\r
+        alloc(num);\r
+        int buff[] = new int[num * _channels];\r
+        for(int i=0; i<num; i++) {\r
+            Point p = a[i];\r
+            buff[_channels*i+0] = (int) p.x;\r
+            buff[_channels*i+1] = (int) p.y;\r
+        }\r
+        put(0, 0, buff); //TODO: check ret val!\r
+    }\r
+    \r
+    public Point[] toArray() {\r
+        int num = (int) total();\r
+        Point[] ap = new Point[num];\r
+        if(num == 0)\r
+            return ap;\r
+        int buff[] = new int[num * _channels];\r
+        get(0, 0, buff); //TODO: check ret val!\r
+        for(int i=0; i<num; i++)\r
+            ap[i] = new Point(buff[i*_channels], buff[i*_channels+1]);\r
+        return ap;\r
+    }\r
+\r
+    public void fromList(List<Point> lp) {\r
+       Point ap[] = lp.toArray(null);\r
+       fromArray(ap);\r
+    }\r
+    \r
+    public List<Point> toList() {\r
+       Point[] ap = toArray();\r
+       return Arrays.asList(ap); \r
+    }\r
+}\r
diff --git a/modules/java/src/java/core+MatOfPoint2f.java b/modules/java/src/java/core+MatOfPoint2f.java
new file mode 100644 (file)
index 0000000..d866769
--- /dev/null
@@ -0,0 +1,74 @@
+package org.opencv.core;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+public class MatOfPoint2f extends Mat {\r
+       // 32FC2\r
+       private static final int _depth = CvType.CV_32F;\r
+       private static final int _channels = 2;\r
+\r
+    public MatOfPoint2f() {\r
+        super();\r
+    }\r
+\r
+    public MatOfPoint2f(long addr) {\r
+        super(addr);\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfPoint2f(Mat m) {\r
+       super(m, Range.all());\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfPoint2f(Point...a) {\r
+        super();\r
+        fromArray(a);\r
+    }\r
+    \r
+    public void alloc(int elemNumber) {\r
+        if(elemNumber>0)\r
+            super.create(elemNumber, 1, CvType.makeType(_depth, _channels));\r
+    }\r
+\r
+    public void fromArray(Point...a) {\r
+        if(a==null || a.length==0)\r
+            return;\r
+        int num = a.length;\r
+        alloc(num);\r
+        float buff[] = new float[num * _channels];\r
+        for(int i=0; i<num; i++) {\r
+            Point p = a[i];\r
+            buff[_channels*i+0] = (float) p.x;\r
+            buff[_channels*i+1] = (float) p.y;\r
+        }\r
+        put(0, 0, buff); //TODO: check ret val!\r
+    }\r
+    \r
+    public Point[] toArray() {\r
+        int num = (int) total();\r
+        Point[] ap = new Point[num];\r
+        if(num == 0)\r
+            return ap;\r
+        float buff[] = new float[num * _channels];\r
+        get(0, 0, buff); //TODO: check ret val!\r
+        for(int i=0; i<num; i++)\r
+            ap[i] = new Point(buff[i*_channels], buff[i*_channels+1]);\r
+        return ap;\r
+    }\r
+\r
+    public void fromList(List<Point> lp) {\r
+       Point ap[] = lp.toArray(null);\r
+       fromArray(ap);\r
+    }\r
+    \r
+    public List<Point> toList() {\r
+       Point[] ap = toArray();\r
+       return Arrays.asList(ap); \r
+    }\r
+}\r
diff --git a/modules/java/src/java/core+MatOfPoint3.java b/modules/java/src/java/core+MatOfPoint3.java
new file mode 100644 (file)
index 0000000..71a6082
--- /dev/null
@@ -0,0 +1,75 @@
+package org.opencv.core;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+public class MatOfPoint3 extends Mat {\r
+       // 32SC3\r
+       private static final int _depth = CvType.CV_32S;\r
+       private static final int _channels = 3;\r
+\r
+    public MatOfPoint3() {\r
+        super();\r
+    }\r
+\r
+    public MatOfPoint3(long addr) {\r
+        super(addr);\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfPoint3(Mat m) {\r
+       super(m, Range.all());\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfPoint3(Point3...a) {\r
+        super();\r
+        fromArray(a);\r
+    }\r
+    \r
+    public void alloc(int elemNumber) {\r
+        if(elemNumber>0)\r
+            super.create(elemNumber, 1, CvType.makeType(_depth, _channels));\r
+    }\r
+\r
+    public void fromArray(Point3...a) {\r
+        if(a==null || a.length==0)\r
+            return;\r
+        int num = a.length;\r
+        alloc(num);\r
+        int buff[] = new int[num * _channels];\r
+        for(int i=0; i<num; i++) {\r
+            Point3 p = a[i];\r
+            buff[_channels*i+0] = (int) p.x;\r
+            buff[_channels*i+1] = (int) p.y;\r
+            buff[_channels*i+2] = (int) p.z;\r
+        }\r
+        put(0, 0, buff); //TODO: check ret val!\r
+    }\r
+    \r
+    public Point3[] toArray() {\r
+        int num = (int) total();\r
+        Point3[] ap = new Point3[num];\r
+        if(num == 0)\r
+            return ap;\r
+        int buff[] = new int[num * _channels];\r
+        get(0, 0, buff); //TODO: check ret val!\r
+        for(int i=0; i<num; i++)\r
+            ap[i] = new Point3(buff[i*_channels], buff[i*_channels+1], buff[i*_channels+2]);\r
+        return ap;\r
+    }\r
+\r
+    public void fromList(List<Point3> lp) {\r
+       Point3 ap[] = lp.toArray(null);\r
+       fromArray(ap);\r
+    }\r
+    \r
+    public List<Point3> toList() {\r
+       Point3[] ap = toArray();\r
+       return Arrays.asList(ap); \r
+    }\r
+}\r
diff --git a/modules/java/src/java/core+MatOfPoint3f.java b/modules/java/src/java/core+MatOfPoint3f.java
new file mode 100644 (file)
index 0000000..76e180b
--- /dev/null
@@ -0,0 +1,75 @@
+package org.opencv.core;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+public class MatOfPoint3f extends Mat {\r
+       // 32FC3\r
+       private static final int _depth = CvType.CV_32F;\r
+       private static final int _channels = 3;\r
+\r
+    public MatOfPoint3f() {\r
+        super();\r
+    }\r
+\r
+    public MatOfPoint3f(long addr) {\r
+        super(addr);\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfPoint3f(Mat m) {\r
+       super(m, Range.all());\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfPoint3f(Point3...a) {\r
+        super();\r
+        fromArray(a);\r
+    }\r
+    \r
+    public void alloc(int elemNumber) {\r
+        if(elemNumber>0)\r
+            super.create(elemNumber, 1, CvType.makeType(_depth, _channels));\r
+    }\r
+\r
+    public void fromArray(Point3...a) {\r
+        if(a==null || a.length==0)\r
+            return;\r
+        int num = a.length;\r
+        alloc(num);\r
+        float buff[] = new float[num * _channels];\r
+        for(int i=0; i<num; i++) {\r
+            Point3 p = a[i];\r
+            buff[_channels*i+0] = (float) p.x;\r
+            buff[_channels*i+1] = (float) p.y;\r
+            buff[_channels*i+2] = (float) p.z;\r
+        }\r
+        put(0, 0, buff); //TODO: check ret val!\r
+    }\r
+    \r
+    public Point3[] toArray() {\r
+        int num = (int) total();\r
+        Point3[] ap = new Point3[num];\r
+        if(num == 0)\r
+            return ap;\r
+        float buff[] = new float[num * _channels];\r
+        get(0, 0, buff); //TODO: check ret val!\r
+        for(int i=0; i<num; i++)\r
+            ap[i] = new Point3(buff[i*_channels], buff[i*_channels+1], buff[i*_channels+2]);\r
+        return ap;\r
+    }\r
+\r
+    public void fromList(List<Point3> lp) {\r
+       Point3 ap[] = lp.toArray(null);\r
+       fromArray(ap);\r
+    }\r
+    \r
+    public List<Point3> toList() {\r
+       Point3[] ap = toArray();\r
+       return Arrays.asList(ap); \r
+    }\r
+}\r
diff --git a/modules/java/src/java/core+MatOfRect.java b/modules/java/src/java/core+MatOfRect.java
new file mode 100644 (file)
index 0000000..2688b56
--- /dev/null
@@ -0,0 +1,77 @@
+package org.opencv.core;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+\r
+public class MatOfRect extends Mat {\r
+       // 32SC4\r
+       private static final int _depth = CvType.CV_32S;\r
+       private static final int _channels = 4;\r
+\r
+    public MatOfRect() {\r
+        super();\r
+    }\r
+\r
+    public MatOfRect(long addr) {\r
+        super(addr);\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfRect(Mat m) {\r
+       super(m, Range.all());\r
+        if(checkVector(_channels, _depth) < 0 )\r
+            throw new IllegalArgumentException("Incomatible Mat");\r
+        //FIXME: do we need release() here?\r
+    }\r
+\r
+    public MatOfRect(Rect...a) {\r
+        super();\r
+        fromArray(a);\r
+    }\r
+    \r
+    public void alloc(int elemNumber) {\r
+        if(elemNumber>0)\r
+            super.create(elemNumber, 1, CvType.makeType(_depth, _channels));\r
+    }\r
+\r
+    public void fromArray(Rect...a) {\r
+        if(a==null || a.length==0)\r
+            return;\r
+        int num = a.length;\r
+        alloc(num);\r
+        int buff[] = new int[num * _channels];\r
+        for(int i=0; i<num; i++) {\r
+               Rect r = a[i];\r
+            buff[_channels*i+0] = (int) r.x;\r
+            buff[_channels*i+1] = (int) r.y;\r
+            buff[_channels*i+2] = (int) r.width;\r
+            buff[_channels*i+3] = (int) r.height;\r
+        }\r
+        put(0, 0, buff); //TODO: check ret val!\r
+    }\r
+    \r
+\r
+    public Rect[] toArray() {\r
+        int num = (int) total();\r
+        Rect[] a = new Rect[num];\r
+        if(num == 0)\r
+            return a;\r
+        int buff[] = new int[num * _channels];\r
+        get(0, 0, buff); //TODO: check ret val!\r
+        for(int i=0; i<num; i++)\r
+            a[i] = new Rect(buff[i*_channels], buff[i*_channels+1], buff[i*_channels+2], buff[i*_channels+3]);\r
+        return a;\r
+    }\r
+    public void fromList(List<Rect> lr) {\r
+       Rect ap[] = lr.toArray(null);\r
+       fromArray(ap);\r
+    }\r
+    \r
+    public List<Rect> toList() {\r
+       Rect[] ar = toArray();\r
+       return Arrays.asList(ar); \r
+    }\r
+}\r
index 4ebbd1b..20c8a71 100644 (file)
@@ -3,8 +3,13 @@ package org.opencv.utils;
 import java.util.ArrayList;\r
 import java.util.List;\r
 \r
-import org.opencv.core.Mat;\r
 import org.opencv.core.CvType;\r
+import org.opencv.core.Mat;\r
+import org.opencv.core.MatOfByte;\r
+import org.opencv.core.MatOfDMatch;\r
+import org.opencv.core.MatOfKeyPoint;\r
+import org.opencv.core.MatOfPoint;\r
+import org.opencv.core.MatOfPoint2f;\r
 import org.opencv.core.Point;\r
 import org.opencv.core.Point3;\r
 import org.opencv.core.Rect;\r
@@ -468,14 +473,14 @@ public class Converters {
                     (float) buff[7 * i + 4], (int) buff[7 * i + 5], (int) buff[7 * i + 6]));\r
         }\r
     }\r
-       \r
+\r
     // vector_vector_Point\r
-    public static Mat vector_vector_Point_to_Mat(List<List<Point>> pts, List<Mat> mats) {\r
+    public static Mat vector_vector_Point_to_Mat(List<MatOfPoint> pts, List<Mat> mats) {\r
         Mat res;\r
         int lCount = (pts != null) ? pts.size() : 0;\r
         if (lCount > 0) {\r
-            for (List<Point> lpt : pts)\r
-                mats.add(vector_Point_to_Mat(lpt));\r
+            for (MatOfPoint vpt : pts)\r
+                mats.add(vpt);\r
             res = vector_Mat_to_Mat(mats);\r
         } else {\r
             res = new Mat();\r
@@ -483,8 +488,23 @@ public class Converters {
         return res;\r
     }\r
 \r
+    public static void Mat_to_vector_vector_Point(Mat m, List<MatOfPoint> pts) {\r
+        if (pts == null)\r
+            throw new java.lang.IllegalArgumentException("Output List can't be null");\r
+\r
+        if (m == null)\r
+            throw new java.lang.IllegalArgumentException("Input Mat can't be null");\r
+\r
+        List<Mat> mats = new ArrayList<Mat>(m.rows());\r
+        Mat_to_vector_Mat(m, mats);\r
+        for (Mat mi : mats) {\r
+            MatOfPoint pt = new MatOfPoint(mi);\r
+            pts.add(pt);\r
+        }\r
+    }\r
+\r
     // vector_vector_Point2f\r
-    public static void Mat_to_vector_vector_Point2f(Mat m, List<List<Point>> pts) {\r
+    public static void Mat_to_vector_vector_Point2f(Mat m, List<MatOfPoint2f> pts) {\r
         if (pts == null)\r
             throw new java.lang.IllegalArgumentException("Output List can't be null");\r
 \r
@@ -494,19 +514,18 @@ public class Converters {
         List<Mat> mats = new ArrayList<Mat>(m.rows());\r
         Mat_to_vector_Mat(m, mats);\r
         for (Mat mi : mats) {\r
-            List<Point> pt = new ArrayList<Point>();\r
-            Mat_to_vector_Point2f(mi, pt);\r
+            MatOfPoint2f pt = new MatOfPoint2f(mi);\r
             pts.add(pt);\r
         }\r
     }\r
 \r
     // vector_vector_KeyPoint\r
-    public static Mat vector_vector_KeyPoint_to_Mat(List<List<KeyPoint>> kps, List<Mat> mats) {\r
+    public static Mat vector_vector_KeyPoint_to_Mat(List<MatOfKeyPoint> kps, List<Mat> mats) {\r
         Mat res;\r
         int lCount = (kps != null) ? kps.size() : 0;\r
         if (lCount > 0) {\r
-            for (List<KeyPoint> lkp : kps)\r
-                mats.add(vector_KeyPoint_to_Mat(lkp));\r
+            for (MatOfKeyPoint vkp : kps)\r
+                mats.add(vkp);\r
             res = vector_Mat_to_Mat(mats);\r
         } else {\r
             res = new Mat();\r
@@ -514,7 +533,7 @@ public class Converters {
         return res;\r
     }\r
 \r
-    public static void Mat_to_vector_vector_KeyPoint(Mat m, List<List<KeyPoint>> kps) {\r
+    public static void Mat_to_vector_vector_KeyPoint(Mat m, List<MatOfKeyPoint> kps) {\r
         if (kps == null)\r
             throw new java.lang.IllegalArgumentException("Output List can't be null");\r
 \r
@@ -524,9 +543,8 @@ public class Converters {
         List<Mat> mats = new ArrayList<Mat>(m.rows());\r
         Mat_to_vector_Mat(m, mats);\r
         for (Mat mi : mats) {\r
-            List<KeyPoint> lkp = new ArrayList<KeyPoint>();\r
-            Mat_to_vector_KeyPoint(mi, lkp);\r
-            kps.add(lkp);\r
+            MatOfKeyPoint vkp = new MatOfKeyPoint(mi);\r
+            kps.add(vkp);\r
         }\r
     }\r
 \r
@@ -600,12 +618,12 @@ public class Converters {
     }\r
 \r
     // vector_vector_DMatch\r
-    public static Mat vector_vector_DMatch_to_Mat(List<List<DMatch>> lldm, List<Mat> mats) {\r
+    public static Mat vector_vector_DMatch_to_Mat(List<MatOfDMatch> lvdm, List<Mat> mats) {\r
         Mat res;\r
-        int lCount = (lldm != null) ? lldm.size() : 0;\r
+        int lCount = (lvdm != null) ? lvdm.size() : 0;\r
         if (lCount > 0) {\r
-            for (List<DMatch> ldm : lldm)\r
-                mats.add(vector_DMatch_to_Mat(ldm));\r
+            for (MatOfDMatch vdm : lvdm)\r
+                mats.add(vdm);\r
             res = vector_Mat_to_Mat(mats);\r
         } else {\r
             res = new Mat();\r
@@ -613,8 +631,8 @@ public class Converters {
         return res;\r
     }\r
 \r
-    public static void Mat_to_vector_vector_DMatch(Mat m, List<List<DMatch>> lldm) {\r
-        if (lldm == null)\r
+    public static void Mat_to_vector_vector_DMatch(Mat m, List<MatOfDMatch> lvdm) {\r
+        if (lvdm == null)\r
             throw new java.lang.IllegalArgumentException("Output List can't be null");\r
 \r
         if (m == null)\r
@@ -622,20 +640,20 @@ public class Converters {
 \r
         List<Mat> mats = new ArrayList<Mat>(m.rows());\r
         Mat_to_vector_Mat(m, mats);\r
+        lvdm.clear();\r
         for (Mat mi : mats) {\r
-            List<DMatch> ldm = new ArrayList<DMatch>();\r
-            Mat_to_vector_DMatch(mi, ldm);\r
-            lldm.add(ldm);\r
+            MatOfDMatch vdm = new MatOfDMatch(mi);\r
+            lvdm.add(vdm);\r
         }\r
     }\r
 \r
     // vector_vector_char\r
-    public static Mat vector_vector_char_to_Mat(List<List<Byte>> llb, List<Mat> mats) {\r
+    public static Mat vector_vector_char_to_Mat(List<MatOfByte> lvb, List<Mat> mats) {\r
         Mat res;\r
-        int lCount = (llb != null) ? llb.size() : 0;\r
+        int lCount = (lvb != null) ? lvb.size() : 0;\r
         if (lCount > 0) {\r
-            for (List<Byte> lb : llb)\r
-                mats.add(vector_char_to_Mat(lb));\r
+            for (MatOfByte vb : lvb)\r
+                mats.add(vb);\r
             res = vector_Mat_to_Mat(mats);\r
         } else {\r
             res = new Mat();\r
index 8c9af52..9600710 100644 (file)
@@ -1 +1 @@
-ocv_define_module(legacy opencv_calib3d opencv_highgui opencv_video)
+ocv_define_module(legacy opencv_calib3d opencv_highgui opencv_video opencv_ml)
index 8eec455..8df5a23 100644 (file)
@@ -46,6 +46,7 @@
 #include "opencv2/imgproc/imgproc_c.h"
 #include "opencv2/features2d/features2d.hpp"
 #include "opencv2/calib3d/calib3d.hpp"
+#include "opencv2/ml/ml.hpp"
 
 #ifdef __cplusplus
 extern "C" {
@@ -1761,10 +1762,106 @@ protected:
     IplImage*  m_mask;
 };
 
+/****************************************************************************************\
+*                              Expectation - Maximization                                *
+\****************************************************************************************/
+struct CV_EXPORTS_W_MAP CvEMParams
+{
+    CvEMParams();
+    CvEMParams( int nclusters, int cov_mat_type=1/*CvEM::COV_MAT_DIAGONAL*/,
+                int start_step=0/*CvEM::START_AUTO_STEP*/,
+                CvTermCriteria term_crit=cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, FLT_EPSILON),
+                const CvMat* probs=0, const CvMat* weights=0, const CvMat* means=0, const CvMat** covs=0 );
+
+    CV_PROP_RW int nclusters;
+    CV_PROP_RW int cov_mat_type;
+    CV_PROP_RW int start_step;
+    const CvMat* probs;
+    const CvMat* weights;
+    const CvMat* means;
+    const CvMat** covs;
+    CV_PROP_RW CvTermCriteria term_crit;
+};
+
+
+class CV_EXPORTS_W CvEM : public CvStatModel
+{
+public:
+    // Type of covariation matrices
+    enum { COV_MAT_SPHERICAL=cv::EM::COV_MAT_SPHERICAL,
+           COV_MAT_DIAGONAL =cv::EM::COV_MAT_DIAGONAL,
+           COV_MAT_GENERIC  =cv::EM::COV_MAT_GENERIC };
+
+    // The initial step
+    enum { START_E_STEP=cv::EM::START_E_STEP,
+           START_M_STEP=cv::EM::START_M_STEP,
+           START_AUTO_STEP=cv::EM::START_AUTO_STEP };
+
+    CV_WRAP CvEM();
+    CvEM( const CvMat* samples, const CvMat* sampleIdx=0,
+          CvEMParams params=CvEMParams(), CvMat* labels=0 );
+
+    virtual ~CvEM();
+
+    virtual bool train( const CvMat* samples, const CvMat* sampleIdx=0,
+                        CvEMParams params=CvEMParams(), CvMat* labels=0 );
+
+    virtual float predict( const CvMat* sample, CV_OUT CvMat* probs ) const;
+
+#ifndef SWIG
+    CV_WRAP CvEM( const cv::Mat& samples, const cv::Mat& sampleIdx=cv::Mat(),
+                  CvEMParams params=CvEMParams() );
+
+    CV_WRAP virtual bool train( const cv::Mat& samples,
+                                const cv::Mat& sampleIdx=cv::Mat(),
+                                CvEMParams params=CvEMParams(),
+                                CV_OUT cv::Mat* labels=0 );
+
+    CV_WRAP virtual float predict( const cv::Mat& sample, CV_OUT cv::Mat* probs=0 ) const;
+    CV_WRAP virtual double calcLikelihood( const cv::Mat &sample ) const;
+
+    CV_WRAP int getNClusters() const;
+    CV_WRAP cv::Mat getMeans() const;
+    CV_WRAP void getCovs(CV_OUT std::vector<cv::Mat>& covs) const;
+    CV_WRAP cv::Mat getWeights() const;
+    CV_WRAP cv::Mat getProbs() const;
+
+    CV_WRAP inline double getLikelihood() const { return emObj.isTrained() ? likelihood : DBL_MAX; }
+#endif
+
+    CV_WRAP virtual void clear();
+
+    int get_nclusters() const;
+    const CvMat* get_means() const;
+    const CvMat** get_covs() const;
+    const CvMat* get_weights() const;
+    const CvMat* get_probs() const;
+
+    inline double get_log_likelihood() const { return getLikelihood(); }
+
+    virtual void read( CvFileStorage* fs, CvFileNode* node );
+    virtual void write( CvFileStorage* fs, const char* name ) const;
+
+protected:
+    void set_mat_hdrs();
+
+    cv::EM emObj;
+    cv::Mat probs;
+    double likelihood;
+
+    CvMat meansHdr;
+    std::vector<CvMat> covsHdrs;
+    std::vector<CvMat*> covsPtrs;
+    CvMat weightsHdr;
+    CvMat probsHdr;
+};
 
 namespace cv
 {
 
+typedef CvEMParams EMParams;
+typedef CvEM ExpectationMaximization;
+
 /*!
  The Patch Generator class 
  */
index 78d29f0..4d608bb 100644 (file)
@@ -734,7 +734,8 @@ bool CvCalibFilter::LoadCameraParams( const char* filename )
     {
         for( j = 0; j < (int)(sizeof(cameraParams[i])/sizeof(float)); j++ )
         {
-            fscanf( f, "%f", &((float*)(cameraParams + i))[j] );
+            int values_read = fscanf( f, "%f", &((float*)(cameraParams + i))[j] );
+            CV_Assert(values_read == 1);
         }
     }
 
@@ -746,8 +747,10 @@ bool CvCalibFilter::LoadCameraParams( const char* filename )
     {
         for( j = 0; j < 4; j++ )
         {
-            fscanf(f, "%f ", &(stereo.quad[i][j].x) );
-            fscanf(f, "%f ", &(stereo.quad[i][j].y) );
+            int values_read = fscanf(f, "%f ", &(stereo.quad[i][j].x) );
+            CV_Assert(values_read == 1);
+            values_read = fscanf(f, "%f ", &(stereo.quad[i][j].y) );
+            CV_Assert(values_read == 1);
         }
     }
 
@@ -756,7 +759,8 @@ bool CvCalibFilter::LoadCameraParams( const char* filename )
     {
         for( j = 0; j < 9; j++ )
         {
-            fscanf(f, "%lf ", &(stereo.coeffs[i][j/3][j%3]) );
+            int values_read = fscanf(f, "%lf ", &(stereo.coeffs[i][j/3][j%3]) );
+            CV_Assert(values_read == 1);
         }
     }
     
diff --git a/modules/legacy/src/em.cpp b/modules/legacy/src/em.cpp
new file mode 100644 (file)
index 0000000..543df09
--- /dev/null
@@ -0,0 +1,268 @@
+/*M///////////////////////////////////////////////////////////////////////////////////////
+//
+//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
+//
+//  By downloading, copying, installing or using the software you agree to this license.
+//  If you do not agree to this license, do not download, install,
+//  copy or use the software.
+//
+//
+//                        Intel License Agreement
+//                For Open Source Computer Vision Library
+//
+// Copyright( C) 2000, Intel Corporation, all rights reserved.
+// Third party copyrights are property of their respective owners.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+//   * Redistribution's of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//
+//   * Redistribution's in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//
+//   * The name of Intel Corporation may not be used to endorse or promote products
+//     derived from this software without specific prior written permission.
+//
+// This software is provided by the copyright holders and contributors "as is" and
+// any express or implied warranties, including, but not limited to, the implied
+// warranties of merchantability and fitness for a particular purpose are disclaimed.
+// In no event shall the Intel Corporation or contributors be liable for any direct,
+// indirect, incidental, special, exemplary, or consequential damages
+//(including, but not limited to, procurement of substitute goods or services;
+// loss of use, data, or profits; or business interruption) however caused
+// and on any theory of liability, whether in contract, strict liability,
+// or tort(including negligence or otherwise) arising in any way out of
+// the use of this software, even ifadvised of the possibility of such damage.
+//
+//M*/
+
+#include "precomp.hpp"
+
+using namespace cv;
+
+CvEMParams::CvEMParams() : nclusters(10), cov_mat_type(CvEM::COV_MAT_DIAGONAL),
+    start_step(CvEM::START_AUTO_STEP), probs(0), weights(0), means(0), covs(0)
+{
+    term_crit=cvTermCriteria( CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, FLT_EPSILON );
+}
+
+CvEMParams::CvEMParams( int _nclusters, int _cov_mat_type, int _start_step,
+                        CvTermCriteria _term_crit, const CvMat* _probs,
+                        const CvMat* _weights, const CvMat* _means, const CvMat** _covs ) :
+                        nclusters(_nclusters), cov_mat_type(_cov_mat_type), start_step(_start_step),
+                        probs(_probs), weights(_weights), means(_means), covs(_covs), term_crit(_term_crit)
+{}
+
+CvEM::CvEM() : likelihood(DBL_MAX)
+{
+}
+
+CvEM::CvEM( const CvMat* samples, const CvMat* sample_idx,
+            CvEMParams params, CvMat* labels ) : likelihood(DBL_MAX)
+{
+    train(samples, sample_idx, params, labels);
+}
+
+CvEM::~CvEM()
+{
+    clear();
+}
+
+void CvEM::clear()
+{
+    emObj.clear();
+}
+
+void CvEM::read( CvFileStorage* fs, CvFileNode* node )
+{
+    FileNode fn(fs, node);
+    emObj.read(fn);
+    set_mat_hdrs();
+}
+
+void CvEM::write( CvFileStorage* _fs, const char* name ) const
+{
+    FileStorage fs = _fs;
+    if(name)
+        fs << name << "{";
+    emObj.write(fs);
+    if(name)
+        fs << "}";
+    fs.fs.obj = 0;
+}
+
+double CvEM::calcLikelihood( const Mat &input_sample ) const
+{
+    double likelihood;
+    emObj.predict(input_sample, noArray(), &likelihood);
+    return likelihood;
+}
+
+float
+CvEM::predict( const CvMat* _sample, CvMat* _probs ) const
+{
+    Mat prbs0 = cvarrToMat(_probs), prbs = prbs0, sample = cvarrToMat(_sample);
+       int cls = emObj.predict(sample, _probs ? _OutputArray(prbs) : cv::noArray());
+    if(_probs)
+    {
+        if( prbs.data != prbs0.data )
+        {
+            CV_Assert( prbs.size == prbs0.size );
+            prbs.convertTo(prbs0, prbs0.type());
+        }
+    }
+    return (float)cls;
+}
+
+void CvEM::set_mat_hdrs()
+{
+    if(emObj.isTrained())
+    {
+        meansHdr = emObj.get<Mat>("means");
+        int K = emObj.get<int>("nclusters");
+        covsHdrs.resize(K);
+        covsPtrs.resize(K);
+        const std::vector<Mat>& covs = emObj.get<vector<Mat> >("covs");
+        for(size_t i = 0; i < covsHdrs.size(); i++)
+        {
+            covsHdrs[i] = covs[i];
+            covsPtrs[i] = &covsHdrs[i];
+        }
+        weightsHdr = emObj.get<Mat>("weights");
+        probsHdr = probs;
+    }
+}
+
+static
+void init_params(const CvEMParams& src,
+                 Mat& prbs, Mat& weights,
+                 Mat& means, vector<Mat>& covsHdrs)
+{
+    prbs = src.probs;
+    weights = src.weights;
+    means = src.means;
+
+    if(src.covs)
+    {
+        covsHdrs.resize(src.nclusters);
+        for(size_t i = 0; i < covsHdrs.size(); i++)
+            covsHdrs[i] = src.covs[i];
+    }
+}
+
+bool CvEM::train( const CvMat* _samples, const CvMat* _sample_idx,
+                  CvEMParams _params, CvMat* _labels )
+{
+    CV_Assert(_sample_idx == 0);
+    Mat samples = cvarrToMat(_samples), labels0, labels;
+    if( _labels )
+        labels0 = labels = cvarrToMat(_labels);
+    
+    bool isOk = train(samples, Mat(), _params, _labels ? &labels : 0);
+    CV_Assert( labels0.data == labels.data );
+
+    return isOk;
+}
+
+int CvEM::get_nclusters() const
+{
+    return emObj.get<int>("nclusters");
+}
+
+const CvMat* CvEM::get_means() const
+{
+    return emObj.isTrained() ? &meansHdr : 0;
+}
+
+const CvMat** CvEM::get_covs() const
+{
+    return emObj.isTrained() ? (const CvMat**)&covsPtrs[0] : 0;
+}
+
+const CvMat* CvEM::get_weights() const
+{
+    return emObj.isTrained() ? &weightsHdr : 0;
+}
+
+const CvMat* CvEM::get_probs() const
+{
+    return emObj.isTrained() ? &probsHdr : 0;
+}
+
+using namespace cv;
+
+CvEM::CvEM( const Mat& samples, const Mat& sample_idx, CvEMParams params )
+{
+    train(samples, sample_idx, params, 0);
+}
+
+bool CvEM::train( const Mat& _samples, const Mat& _sample_idx,
+                 CvEMParams _params, Mat* _labels )
+{
+    CV_Assert(_sample_idx.empty());
+    Mat prbs, weights, means, likelihoods;
+    std::vector<Mat> covsHdrs;
+    init_params(_params, prbs, weights, means, covsHdrs);
+
+    emObj = EM(_params.nclusters, _params.cov_mat_type, _params.term_crit);
+    bool isOk = false;
+    if( _params.start_step == EM::START_AUTO_STEP )
+               isOk = emObj.train(_samples, _labels ? _OutputArray(*_labels) : cv::noArray(),
+                    probs, likelihoods);
+    else if( _params.start_step == EM::START_E_STEP )
+        isOk = emObj.trainE(_samples, means, covsHdrs, weights,
+                                        _labels ? _OutputArray(*_labels) : cv::noArray(),
+                     probs, likelihoods);
+    else if( _params.start_step == EM::START_M_STEP )
+        isOk = emObj.trainM(_samples, prbs,
+                                       _labels ? _OutputArray(*_labels) : cv::noArray(),
+                    probs, likelihoods);
+    else
+        CV_Error(CV_StsBadArg, "Bad start type of EM algorithm");
+    
+    if(isOk)
+    {
+        likelihoods = sum(likelihoods).val[0];
+        set_mat_hdrs();
+    }
+
+    return isOk;
+}
+
+float
+CvEM::predict( const Mat& _sample, Mat* _probs ) const
+{
+       int cls = emObj.predict(_sample, _probs ? _OutputArray(*_probs) : cv::noArray());
+    return (float)cls;
+}
+
+int CvEM::getNClusters() const
+{
+    return emObj.get<int>("nclusters");
+}
+
+Mat CvEM::getMeans() const
+{
+    return emObj.get<Mat>("means");
+}
+
+void CvEM::getCovs(vector<Mat>& _covs) const
+{
+    _covs = emObj.get<vector<Mat> >("covs");
+}
+
+Mat CvEM::getWeights() const
+{
+    return emObj.get<Mat>("weights");
+}
+
+Mat CvEM::getProbs() const
+{
+    return probs;
+}
+
+
+/* End of file. */
diff --git a/modules/legacy/test/test_em.cpp b/modules/legacy/test/test_em.cpp
new file mode 100644 (file)
index 0000000..411fc9e
--- /dev/null
@@ -0,0 +1,444 @@
+/*M///////////////////////////////////////////////////////////////////////////////////////
+//
+//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
+//
+//  By downloading, copying, installing or using the software you agree to this license.
+//  If you do not agree to this license, do not download, install,
+//  copy or use the software.
+//
+//
+//                        Intel License Agreement
+//                For Open Source Computer Vision Library
+//
+// Copyright (C) 2000, Intel Corporation, all rights reserved.
+// Third party copyrights are property of their respective owners.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+//   * Redistribution's of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//
+//   * Redistribution's in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//
+//   * The name of Intel Corporation may not be used to endorse or promote products
+//     derived from this software without specific prior written permission.
+//
+// This software is provided by the copyright holders and contributors "as is" and
+// any express or implied warranties, including, but not limited to, the implied
+// warranties of merchantability and fitness for a particular purpose are disclaimed.
+// In no event shall the Intel Corporation or contributors be liable for any direct,
+// indirect, incidental, special, exemplary, or consequential damages
+// (including, but not limited to, procurement of substitute goods or services;
+// loss of use, data, or profits; or business interruption) however caused
+// and on any theory of liability, whether in contract, strict liability,
+// or tort (including negligence or otherwise) arising in any way out of
+// the use of this software, even if advised of the possibility of such damage.
+//
+//M*/
+
+#include "test_precomp.hpp"
+
+using namespace std;
+using namespace cv;
+
+static
+void defaultDistribs( Mat& means, vector<Mat>& covs )
+{
+    float mp0[] = {0.0f, 0.0f}, cp0[] = {0.67f, 0.0f, 0.0f, 0.67f};
+    float mp1[] = {5.0f, 0.0f}, cp1[] = {1.0f, 0.0f, 0.0f, 1.0f};
+    float mp2[] = {1.0f, 5.0f}, cp2[] = {1.0f, 0.0f, 0.0f, 1.0f};
+    means.create(3, 2, CV_32FC1);
+    Mat m0( 1, 2, CV_32FC1, mp0 ), c0( 2, 2, CV_32FC1, cp0 );
+    Mat m1( 1, 2, CV_32FC1, mp1 ), c1( 2, 2, CV_32FC1, cp1 );
+    Mat m2( 1, 2, CV_32FC1, mp2 ), c2( 2, 2, CV_32FC1, cp2 );
+    means.resize(3), covs.resize(3);
+
+    Mat mr0 = means.row(0);
+    m0.copyTo(mr0);
+    c0.copyTo(covs[0]);
+
+    Mat mr1 = means.row(1);
+    m1.copyTo(mr1);
+    c1.copyTo(covs[1]);
+
+    Mat mr2 = means.row(2);
+    m2.copyTo(mr2);
+    c2.copyTo(covs[2]);
+}
+
+// generate points sets by normal distributions
+static
+void generateData( Mat& data, Mat& labels, const vector<int>& sizes, const Mat& _means, const vector<Mat>& covs, int labelType )
+{
+    vector<int>::const_iterator sit = sizes.begin();
+    int total = 0;
+    for( ; sit != sizes.end(); ++sit )
+        total += *sit;
+    assert( _means.rows == (int)sizes.size() && covs.size() == sizes.size() );
+    assert( !data.empty() && data.rows == total );
+    assert( data.type() == CV_32FC1 );
+    
+    labels.create( data.rows, 1, labelType );
+
+    randn( data, Scalar::all(0.0), Scalar::all(1.0) );
+    vector<Mat> means(sizes.size());
+    for(int i = 0; i < _means.rows; i++)
+        means[i] = _means.row(i);
+    vector<Mat>::const_iterator mit = means.begin(), cit = covs.begin();
+    int bi, ei = 0;
+    sit = sizes.begin();
+    for( int p = 0, l = 0; sit != sizes.end(); ++sit, ++mit, ++cit, l++ )
+    {
+        bi = ei;
+        ei = bi + *sit;
+        assert( mit->rows == 1 && mit->cols == data.cols );
+        assert( cit->rows == data.cols && cit->cols == data.cols );
+        for( int i = bi; i < ei; i++, p++ )
+        {
+            Mat r(1, data.cols, CV_32FC1, data.ptr<float>(i));
+            r =  r * (*cit) + *mit; 
+            if( labelType == CV_32FC1 )
+                labels.at<float>(p, 0) = (float)l;
+            else if( labelType == CV_32SC1 )
+                labels.at<int>(p, 0) = l;
+            else
+                CV_DbgAssert(0);
+        }
+    }
+}
+
+static
+int maxIdx( const vector<int>& count )
+{
+    int idx = -1;
+    int maxVal = -1;
+    vector<int>::const_iterator it = count.begin();
+    for( int i = 0; it != count.end(); ++it, i++ )
+    {
+        if( *it > maxVal)
+        {
+            maxVal = *it;
+            idx = i;
+        }
+    }
+    assert( idx >= 0);
+    return idx;
+}
+
+static
+bool getLabelsMap( const Mat& labels, const vector<int>& sizes, vector<int>& labelsMap )
+{
+    size_t total = 0, nclusters = sizes.size();
+    for(size_t i = 0; i < sizes.size(); i++)
+        total += sizes[i];
+
+    assert( !labels.empty() );
+    assert( labels.total() == total && (labels.cols == 1 || labels.rows == 1));
+    assert( labels.type() == CV_32SC1 || labels.type() == CV_32FC1 );
+
+    bool isFlt = labels.type() == CV_32FC1;
+
+    labelsMap.resize(nclusters);
+
+    vector<bool> buzy(nclusters, false);
+    int startIndex = 0;
+    for( size_t clusterIndex = 0; clusterIndex < sizes.size(); clusterIndex++ )
+    {
+        vector<int> count( nclusters, 0 );
+        for( int i = startIndex; i < startIndex + sizes[clusterIndex]; i++)
+        {
+            int lbl = isFlt ? (int)labels.at<float>(i) : labels.at<int>(i);
+            CV_Assert(lbl < (int)nclusters);
+            count[lbl]++;
+            CV_Assert(count[lbl] < (int)total);
+        }
+        startIndex += sizes[clusterIndex];
+
+        int cls = maxIdx( count );
+        CV_Assert( !buzy[cls] );
+
+        labelsMap[clusterIndex] = cls;
+
+        buzy[cls] = true;
+    }
+    for(size_t i = 0; i < buzy.size(); i++)
+        if(!buzy[i])
+            return false;
+
+    return true;
+}
+
+static
+bool calcErr( const Mat& labels, const Mat& origLabels, const vector<int>& sizes, float& err, bool labelsEquivalent = true )
+{
+    err = 0;
+    CV_Assert( !labels.empty() && !origLabels.empty() );
+    CV_Assert( labels.rows == 1 || labels.cols == 1 );
+    CV_Assert( origLabels.rows == 1 || origLabels.cols == 1 );
+    CV_Assert( labels.total() == origLabels.total() );
+    CV_Assert( labels.type() == CV_32SC1 || labels.type() == CV_32FC1 );
+    CV_Assert( origLabels.type() == labels.type() );
+
+    vector<int> labelsMap;
+    bool isFlt = labels.type() == CV_32FC1;
+    if( !labelsEquivalent )
+    {
+        if( !getLabelsMap( labels, sizes, labelsMap ) )
+            return false;
+
+        for( int i = 0; i < labels.rows; i++ )
+            if( isFlt )
+                err += labels.at<float>(i) != labelsMap[(int)origLabels.at<float>(i)] ? 1.f : 0.f;
+            else
+                err += labels.at<int>(i) != labelsMap[origLabels.at<int>(i)] ? 1.f : 0.f;
+    }
+    else
+    {
+        for( int i = 0; i < labels.rows; i++ )
+            if( isFlt )
+                err += labels.at<float>(i) != origLabels.at<float>(i) ? 1.f : 0.f;
+            else
+                err += labels.at<int>(i) != origLabels.at<int>(i) ? 1.f : 0.f;
+    }
+    err /= (float)labels.rows;
+    return true;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+class CV_CvEMTest : public cvtest::BaseTest
+{
+public:
+    CV_CvEMTest() {}
+protected:
+    virtual void run( int start_from );
+    int runCase( int caseIndex, const CvEMParams& params,
+                  const cv::Mat& trainData, const cv::Mat& trainLabels,
+                  const cv::Mat& testData, const cv::Mat& testLabels,
+                  const vector<int>& sizes);
+};
+
+int CV_CvEMTest::runCase( int caseIndex, const CvEMParams& params,
+                        const cv::Mat& trainData, const cv::Mat& trainLabels,
+                        const cv::Mat& testData, const cv::Mat& testLabels,
+                        const vector<int>& sizes )
+{
+    int code = cvtest::TS::OK;
+
+    cv::Mat labels;
+    float err;
+
+    CvEM em;
+    em.train( trainData, Mat(), params, &labels );
+
+    // check train error
+    if( !calcErr( labels, trainLabels, sizes, err , false ) )
+    {
+        ts->printf( cvtest::TS::LOG, "Case index %i : Bad output labels.\n", caseIndex );
+        code = cvtest::TS::FAIL_INVALID_OUTPUT;
+    }
+    else if( err > 0.006f )
+    {
+        ts->printf( cvtest::TS::LOG, "Case index %i : Bad accuracy (%f) on train data.\n", caseIndex, err );
+        code = cvtest::TS::FAIL_BAD_ACCURACY;
+    }
+
+    // check test error
+    labels.create( testData.rows, 1, CV_32SC1 );
+    for( int i = 0; i < testData.rows; i++ )
+    {
+        Mat sample = testData.row(i);
+        labels.at<int>(i,0) = (int)em.predict( sample, 0 );
+    }
+    if( !calcErr( labels, testLabels, sizes, err, false ) )
+    {
+        ts->printf( cvtest::TS::LOG, "Case index %i : Bad output labels.\n", caseIndex );
+        code = cvtest::TS::FAIL_INVALID_OUTPUT;
+    }
+    else if( err > 0.006f )
+    {
+        ts->printf( cvtest::TS::LOG, "Case index %i : Bad accuracy (%f) on test data.\n", caseIndex, err );
+        code = cvtest::TS::FAIL_BAD_ACCURACY;
+    }
+
+    return code;
+}
+
+void CV_CvEMTest::run( int /*start_from*/ )
+{
+    int sizesArr[] = { 500, 700, 800 };
+    int pointsCount = sizesArr[0]+ sizesArr[1] + sizesArr[2];
+
+    // Points distribution
+    Mat means;
+    vector<Mat> covs;
+    defaultDistribs( means, covs );
+
+    // train data
+    Mat trainData( pointsCount, 2, CV_32FC1 ), trainLabels;
+    vector<int> sizes( sizesArr, sizesArr + sizeof(sizesArr) / sizeof(sizesArr[0]) );
+    generateData( trainData, trainLabels, sizes, means, covs, CV_32SC1 );
+
+    // test data
+    Mat testData( pointsCount, 2, CV_32FC1 ), testLabels;
+    generateData( testData, testLabels, sizes, means, covs, CV_32SC1 );
+
+    CvEMParams params;
+    params.nclusters = 3;
+    Mat probs(trainData.rows, params.nclusters, CV_32FC1, cv::Scalar(1));
+    CvMat probsHdr = probs;
+    params.probs = &probsHdr;
+    Mat weights(1, params.nclusters, CV_32FC1, cv::Scalar(1));
+    CvMat weightsHdr = weights;
+    params.weights = &weightsHdr;
+    CvMat meansHdr = means;
+    params.means = &meansHdr;
+    std::vector<CvMat> covsHdrs(params.nclusters);
+    std::vector<const CvMat*> covsPtrs(params.nclusters);
+    for(int i = 0; i < params.nclusters; i++)
+    {
+        covsHdrs[i] = covs[i];
+        covsPtrs[i] = &covsHdrs[i];
+    }
+    params.covs = &covsPtrs[0];
+
+    int code = cvtest::TS::OK;
+    int caseIndex = 0;
+    {
+        params.start_step = cv::EM::START_AUTO_STEP;
+        params.cov_mat_type = cv::EM::COV_MAT_GENERIC;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.start_step = cv::EM::START_AUTO_STEP;
+        params.cov_mat_type = cv::EM::COV_MAT_DIAGONAL;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.start_step = cv::EM::START_AUTO_STEP;
+        params.cov_mat_type = cv::EM::COV_MAT_SPHERICAL;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.start_step = cv::EM::START_M_STEP;
+        params.cov_mat_type = cv::EM::COV_MAT_GENERIC;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.start_step = cv::EM::START_M_STEP;
+        params.cov_mat_type = cv::EM::COV_MAT_DIAGONAL;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.start_step = cv::EM::START_M_STEP;
+        params.cov_mat_type = cv::EM::COV_MAT_SPHERICAL;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.start_step = cv::EM::START_E_STEP;
+        params.cov_mat_type = cv::EM::COV_MAT_GENERIC;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.start_step = cv::EM::START_E_STEP;
+        params.cov_mat_type = cv::EM::COV_MAT_DIAGONAL;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.start_step = cv::EM::START_E_STEP;
+        params.cov_mat_type = cv::EM::COV_MAT_SPHERICAL;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    
+    ts->set_failed_test_info( code );
+}
+
+class CV_CvEMTest_SaveLoad : public cvtest::BaseTest {
+public:
+    CV_CvEMTest_SaveLoad() {}
+protected:
+    virtual void run( int /*start_from*/ )
+    {
+        int code = cvtest::TS::OK;
+
+        Mat samples = Mat(3,1,CV_32F);
+        samples.at<float>(0,0) = 1;
+        samples.at<float>(1,0) = 2;
+        samples.at<float>(2,0) = 3;
+        
+        Mat labels(samples.rows, 1, CV_32S);
+
+        CvEMParams params;
+        params.nclusters = 2;
+
+        CvMat samples_c = samples, labels_c = labels;
+
+        CvEM em(&samples_c, 0, params, &labels_c);
+
+        Mat firstResult(samples.rows, 1, CV_32FC1);
+        for( int i = 0; i < samples.rows; i++)
+            firstResult.at<float>(i) = em.predict( samples.row(i) );
+
+        // Write out
+
+        string filename = tempfile() + ".xml";
+        {
+            FileStorage fs = FileStorage(filename, FileStorage::WRITE);
+            try
+            {
+                em.write(fs.fs, "em");
+            }
+            catch(...)
+            {
+                ts->printf( cvtest::TS::LOG, "Crash in write method.\n" );
+                ts->set_failed_test_info( cvtest::TS::FAIL_EXCEPTION );
+            }
+        }
+
+        em.clear();
+
+        // Read in
+        {
+            FileStorage fs = FileStorage(filename, FileStorage::READ);
+            CV_Assert(fs.isOpened());
+            FileNode fn = fs["em"];
+            try
+            {
+                em.read(fs.fs, (CvFileNode*)fn.node);
+            }
+            catch(...)
+            {
+                ts->printf( cvtest::TS::LOG, "Crash in read method.\n" );
+                ts->set_failed_test_info( cvtest::TS::FAIL_EXCEPTION );
+            }
+        }
+
+        remove( filename.c_str() );
+
+        int errCaseCount = 0;
+        for( int i = 0; i < samples.rows; i++)
+            errCaseCount = std::abs(em.predict(samples.row(i)) - firstResult.at<float>(i)) < FLT_EPSILON ? 0 : 1;
+
+        if( errCaseCount > 0 )
+        {
+            ts->printf( cvtest::TS::LOG, "Different prediction results before writeing and after reading (errCaseCount=%d).\n", errCaseCount );
+            code = cvtest::TS::FAIL_BAD_ACCURACY;
+        }
+
+        ts->set_failed_test_info( code );
+    }
+};
+
+TEST(ML_CvEM, accuracy) { CV_CvEMTest test; test.safe_run(); }
+TEST(ML_CvEM, save_load) { CV_CvEMTest_SaveLoad test; test.safe_run(); }
index 27264e4..c6355a1 100644 (file)
@@ -83,7 +83,7 @@ The constructors.
 
     :param boost_type: Type of the boosting algorithm. Possible values are:
         
-        * **CvBoost::DISCRETE** Discrete AbaBoost.
+        * **CvBoost::DISCRETE** Discrete AdaBoost.
         * **CvBoost::REAL** Real AdaBoost. It is a technique that utilizes confidence-rated predictions and works well with categorical data.
         * **CvBoost::LOGIT** LogitBoost. It can produce good regression fits.
         * **CvBoost::GENTLE** Gentle AdaBoost. It puts less weight on outlier data points and for that reason is often good with regression data. 
index fdb74c2..bf72ddc 100644 (file)
@@ -159,9 +159,9 @@ The constructors.
 
     :param max_depth: The maximum possible depth of the tree. That is the training algorithms attempts to split a node while its depth is less than ``max_depth``. The actual depth may be smaller if the other termination criteria are met (see the outline of the training procedure in the beginning of the section), and/or if the tree is pruned. 
     
-    :param min_sample_count: If the number of samples in a node is less than this parameter then the node will not be splitted.
+    :param min_sample_count: If the number of samples in a node is less than this parameter then the node will not be split.
 
-    :param regression_accuracy: Termination criteria for regression trees. If all absolute differences between an estimated value in a node and values of train samples in this node are less than this parameter then the node will not be splitted.
+    :param regression_accuracy: Termination criteria for regression trees. If all absolute differences between an estimated value in a node and values of train samples in this node are less than this parameter then the node will not be split.
  
     :param use_surrogates: If true then surrogate splits will be built. These splits allow to work with missing data and compute variable importance correctly.
 
@@ -239,6 +239,8 @@ There are four ``train`` methods in :ocv:class:`CvDTree`:
 
 * The **last** method ``train`` is mostly used for building tree ensembles. It takes the pre-constructed :ocv:class:`CvDTreeTrainData` instance and an optional subset of the training set. The indices in ``subsampleIdx`` are counted relatively to the ``_sample_idx`` , passed to the ``CvDTreeTrainData`` constructor. For example, if ``_sample_idx=[1, 5, 7, 100]`` , then ``subsampleIdx=[0,3]`` means that the samples ``[1, 100]`` of the original training set are used.
 
+The function is parallelized with the TBB library.
+
 
 
 CvDTree::predict
@@ -273,7 +275,7 @@ Returns error of the decision tree.
 
         * **CV_TRAIN_ERROR** Error on train samples.
 
-        * **CV_TEST_ERROR** Erron on test samples.
+        * **CV_TEST_ERROR** Error on test samples.
 
     :param resp: If it is not null then size of this vector will be set to the number of samples and each element will be set to result of prediction on the corresponding sample.
 
index 29f581c..9e289e6 100644 (file)
@@ -5,11 +5,11 @@ Extremely randomized trees have been introduced by Pierre Geurts, Damien Ernst a
 
 #. Extremely randomized trees don't apply the bagging procedure to constract the training samples for each tree. The same input training set is used to train all trees.
 
-#. Extremely randomized trees pick a node split very extremely (both a variable index and variable spliting value are chosen randomly), whereas Random Forest finds the best split (optimal one by variable index and variable spliting value) among random subset of variables.
+#. Extremely randomized trees pick a node split very extremely (both a variable index and variable splitting value are chosen randomly), whereas Random Forest finds the best split (optimal one by variable index and variable splitting value) among random subset of variables.
 
 
 CvERTrees
 ----------
 .. ocv:class:: CvERTrees
 
-    The class implements the Extremely randomized trees algorithm. ``CvERTrees`` is inherited from :ocv:class:`CvRTrees` and has the same interface, so see description of :ocv:class:`CvRTrees` class to get detailes. To set the training parameters of Extremely randomized trees the same class :ocv:class:`CvRTParams` is used.
+    The class implements the Extremely randomized trees algorithm. ``CvERTrees`` is inherited from :ocv:class:`CvRTrees` and has the same interface, so see description of :ocv:class:`CvRTrees` class to get details. To set the training parameters of Extremely randomized trees the same class :ocv:class:`CvRTParams` is used.
index 820583a..7de8373 100644 (file)
@@ -61,7 +61,7 @@ At the second step (Maximization step or M-step), the mixture parameter estimate
 Alternatively, the algorithm may start with the M-step when the initial values for
 :math:`p_{i,k}` can be provided. Another alternative when
 :math:`p_{i,k}` are unknown is to use a simpler clustering algorithm to pre-cluster the input samples and thus obtain initial
-:math:`p_{i,k}` . Often (including macnine learning) the
+:math:`p_{i,k}` . Often (including machine learning) the
 :ocv:func:`kmeans` algorithm is used for that purpose.
 
 One of the main problems of the EM algorithm is a large number
@@ -115,7 +115,7 @@ The constructors
     :param start_step: The start step of the EM algorithm: 
 
         * **CvEM::START_E_STEP** Start with Expectation step. You need to provide means :math:`a_k` of mixture components to use this option. Optionally you can pass weights :math:`\pi_k` and covariance matrices :math:`S_k` of mixture components.
-        * **CvEM::START_M_STEP** Start with Maximization step. You need to provide initial probabilites :math:`p_{i,k}` to use this option.
+        * **CvEM::START_M_STEP** Start with Maximization step. You need to provide initial probabilities :math:`p_{i,k}` to use this option.
         * **CvEM::START_AUTO_STEP** Start with Expectation step. You need not provide any parameters because they will be estimated by the k-means algorithm.
 
     :param term_crit: The termination criteria of the EM algorithm. The EM algorithm can be terminated by the number of iterations ``term_crit.max_iter`` (number of M-steps) or when relative change of likelihood logarithm is less than ``term_crit.epsilon``.
@@ -139,7 +139,7 @@ The default constructor represents a rough rule-of-the-thumb:
     }
 
 
-With another contstructor it is possible to override a variety of parameters from a single number of mixtures (the only essential problem-dependent parameter) to initial values for the mixture parameters.
+With another constructor it is possible to override a variety of parameters from a single number of mixtures (the only essential problem-dependent parameter) to initial values for the mixture parameters.
 
 
 CvEM
@@ -250,7 +250,7 @@ Returns vectors of probabilities for each training sample.
 
 .. ocv:pyfunction:: cv2.EM.getProbs() -> probs
 
-For each training sample :math:`i` (that have been passed to the constructor or to :ocv:func:`CvEM::train`) returns probabilites :math:`p_{i,k}` to belong to a mixture component :math:`k`.
+For each training sample :math:`i` (that have been passed to the constructor or to :ocv:func:`CvEM::train`) returns probabilities :math:`p_{i,k}` to belong to a mixture component :math:`k`.
 
 
 CvEM::getLikelihood
index 4916655..4f0b381 100644 (file)
@@ -19,10 +19,10 @@ Training the GBT model
 ----------------------\r
 \r
 Gradient Boosted Trees model represents an ensemble of single regression trees\r
-built in a greedy fashion. Training procedure is an iterative proccess\r
+built in a greedy fashion. Training procedure is an iterative process\r
 similar to the numerical optimization via the gradient descent method. Summary loss\r
 on the training set depends only on the current model predictions for the\r
-thaining samples,  in other words\r
+training samples,  in other words\r
 :math:`\sum^N_{i=1}L(y_i, F(x_i)) \equiv \mathcal{L}(F(x_1), F(x_2), ... , F(x_N))\r
 \equiv \mathcal{L}(F)`. And the :math:`\mathcal{L}(F)`\r
 gradient can be computed as follows:\r
@@ -37,7 +37,7 @@ antigradient vector components. Step length is computed corresponding to the
 loss function and separately for every region determined by the tree leaf. It\r
 can be eliminated by changing values of the leaves  directly.\r
 \r
-See below the main scheme of the training proccess:\r
+See below the main scheme of the training process:\r
 \r
 #.\r
     Find the best constant model.\r
@@ -86,7 +86,7 @@ As a result, you get the following model:
 .. math:: f(x) = f_0 + \nu\cdot\sum^M_{i=1}T_i(x) ,\r
 \r
 where :math:`f_0` is the initial guess (the best constant model) and :math:`\nu`\r
-is a regularization parameter from the interval :math:`(0,1]`, futher called\r
+is a regularization parameter from the interval :math:`(0,1]`, further called\r
 *shrinkage*.\r
 \r
 .. _Predicting with GBT:\r
@@ -94,7 +94,7 @@ is a regularization parameter from the interval :math:`(0,1]`, futher called
 Predicting with the GBT Model\r
 -----------------------------\r
 \r
-To get the GBT model prediciton, you need to compute the sum of responses of\r
+To get the GBT model prediction, you need to compute the sum of responses of\r
 all the trees in the ensemble. For regression problems, it is the answer.\r
 For classification problems, the result is :math:`\arg\max_{i=1..K}(f_i(x))`.\r
 \r
@@ -108,7 +108,7 @@ CvGBTreesParams
 \r
 GBT training parameters.\r
 \r
-The structure contains parameters for each sigle decision tree in the ensemble,\r
+The structure contains parameters for each single decision tree in the ensemble,\r
 as well as the whole model characteristics. The structure is derived from\r
 :ocv:class:`CvDTreeParams` but not all of the decision tree parameters are supported:\r
 cross-validation, pruning, and class priorities are not used.\r
@@ -205,10 +205,10 @@ Predicts a response for an input sample.
 .. ocv:pyfunction:: cv2.GBTrees.predict(sample[, missing[, slice[, k]]]) -> retval\r
 \r
    :param sample: Input feature vector that has the same format as every training set\r
-    element. If not all the variables were actualy used during training,\r
+    element. If not all the variables were actually used during training,\r
     ``sample`` contains forged values at the appropriate places.\r
     \r
-   :param missing: Missing values mask, which is a dimentional matrix of the same size as\r
+   :param missing: Missing values mask, which is a dimensional matrix of the same size as\r
     ``sample`` having the ``CV_8U`` type. ``1`` corresponds to the missing value\r
     in the same position in the ``sample`` vector. If there are no missing values\r
     in the feature vector, an empty matrix can be passed instead of the missing mask.\r
@@ -225,7 +225,7 @@ Predicts a response for an input sample.
     \r
    :param k: Number of tree ensembles built in case of the classification problem\r
     (see :ref:`Training GBT`). Use this\r
-    parameter to change the ouput to sum of the trees' predictions in the\r
+    parameter to change the output to sum of the trees' predictions in the\r
     ``k``-th ensemble only. To get the total GBT model prediction, ``k`` value\r
     must be -1. For regression problems, ``k`` is also equal to -1.\r
  \r
index 40059d9..6e72119 100644 (file)
@@ -79,6 +79,8 @@ In case of C++ interface you can use output pointers to empty matrices and the f
 
 If only a single input vector is passed, all output matrices are optional and the predicted value is returned by the method.
 
+The function is parallelized with the TBB library.
+
 CvKNearest::get_max_k
 ---------------------
 Returns the number of maximum neighbors that may be passed to the method :ocv:func:`CvKNearest::find_nearest`.
index 8c5d470..a72e7ec 100644 (file)
@@ -62,9 +62,9 @@ Reads the data set from a ``.csv``-like ``filename`` file and stores all read va
 
     :param filename: The input file name
 
-While reading the data, the method tries to define the type of variables (predictors and responses): ordered or categorical. If a value of the variable is not numerical (except for the label for a missing value), the type of the variable is set to ``CV_VAR_CATEGORICAL``. If all existing values of the variable are numerical, the type of the variable is set to ``CV_VAR_ORDERED``. So, the default definition of variables types works correctly for all cases except the case of a categorical variable with numerical class labeles. In this case, the type ``CV_VAR_ORDERED`` is set. You should change the type to ``CV_VAR_CATEGORICAL`` using the method :ocv:func:`CvMLData::change_var_type`. For categorical variables, a common map is built to convert a string class label to the numerical class label. Use :ocv:func:`CvMLData::get_class_labels_map` to obtain this map. 
+While reading the data, the method tries to define the type of variables (predictors and responses): ordered or categorical. If a value of the variable is not numerical (except for the label for a missing value), the type of the variable is set to ``CV_VAR_CATEGORICAL``. If all existing values of the variable are numerical, the type of the variable is set to ``CV_VAR_ORDERED``. So, the default definition of variables types works correctly for all cases except the case of a categorical variable with numerical class labels. In this case, the type ``CV_VAR_ORDERED`` is set. You should change the type to ``CV_VAR_CATEGORICAL`` using the method :ocv:func:`CvMLData::change_var_type`. For categorical variables, a common map is built to convert a string class label to the numerical class label. Use :ocv:func:`CvMLData::get_class_labels_map` to obtain this map. 
 
-Also, when reading the data, the method constructs the mask of missing values. For example, values are egual to `'?'`.
+Also, when reading the data, the method constructs the mask of missing values. For example, values are equal to `'?'`.
 
 CvMLData::get_values
 --------------------
index 7546dc7..f0250f0 100644 (file)
@@ -74,7 +74,7 @@ using
 :ocv:funcx:`PCA::operator()` or similar technique, and train a smaller network
 on only essential features.
 
-Another MPL feature is an inability to handle categorical
+Another MLP feature is an inability to handle categorical
 data as is. However, there is a workaround. If a certain feature in the
 input or output (in case of ``n`` -class classifier for
 :math:`n>2` ) layer is categorical and can take
@@ -238,6 +238,9 @@ Trains/updates MLP.
 
 This method applies the specified training algorithm to computing/adjusting the network weights. It returns the number of done iterations.
 
+The RPROP training algorithm is parallelized with the TBB library.
+
+
 CvANN_MLP::predict
 ------------------
 Predicts responses for input samples.
@@ -275,4 +278,4 @@ Returns neurons weights of the particular layer.
 .. ocv:function:: double* CvANN_MLP::get_weights(int layer)
 
     :param layer: Index of the particular layer.
-    
\ No newline at end of file
+    
index 6e21958..5c0d1b1 100644 (file)
@@ -60,3 +60,4 @@ Predicts the response for sample(s).
 
 The method estimates the most probable classes for input vectors. Input vectors (one or more) are stored as rows of the matrix ``samples``. In case of multiple input vectors, there should be one output vector ``results``. The predicted class for a single input vector is returned by the method.
 
+The function is parallelized with the TBB library.
index 5d389c6..7845121 100644 (file)
@@ -9,7 +9,7 @@ Random trees have been introduced by Leo Breiman and Adele Cutler:
 http://www.stat.berkeley.edu/users/breiman/RandomForests/
 . The algorithm can deal with both classification and regression problems. Random trees is a collection (ensemble) of tree predictors that is called
 *forest*
-further in this section (the term has been also introduced by L. Breiman). The classification works as follows: the random trees classifier takes the input feature vector, classifies it with every tree in the forest, and outputs the class label that recieved the majority of "votes". In case of a regression, the classifier response is the average of the responses over all the trees in the forest.
+further in this section (the term has been also introduced by L. Breiman). The classification works as follows: the random trees classifier takes the input feature vector, classifies it with every tree in the forest, and outputs the class label that received the majority of "votes". In case of a regression, the classifier response is the average of the responses over all the trees in the forest.
 
 All the trees are trained with the same parameters but on different training sets. These sets are generated from the original training set using the bootstrap procedure: for each training set, you randomly select the same number of vectors as in the original set ( ``=N`` ). The vectors are chosen with replacement. That is, some vectors will occur more than once and some will be absent. At each node of each trained tree,  not all the variables are used to find the best split, but a random subset of them. With each node a new subset is generated. However, its size is fixed for all the nodes and all the trees. It is a training parameter set to
 :math:`\sqrt{number\_of\_variables}` by default. None of the built trees are pruned.
@@ -67,7 +67,7 @@ The constructors.
 
     :param nactive_vars: The size of the randomly selected subset of features at each tree node and that are used to find the best split(s). If you set it to 0 then the size will be set to the square root of the total number of features.
 
-    :param max_num_of_trees_in_the_forest: The maximum number of trees in the forest (suprise, suprise). Typically the more trees you have the better the accuracy. However, the improvement in accuracy generally diminishes and asymptotes pass a certain number of trees. Also to keep in mind, the number of tree increases the prediction time linearly.
+    :param max_num_of_trees_in_the_forest: The maximum number of trees in the forest (surprise, surprise). Typically the more trees you have the better the accuracy. However, the improvement in accuracy generally diminishes and asymptotes pass a certain number of trees. Also to keep in mind, the number of tree increases the prediction time linearly.
 
     :param forest_accuracy: Sufficient accuracy (OOB error).
 
@@ -77,7 +77,7 @@ The constructors.
         
         * **CV_TERMCRIT_EPS** Terminate learning by the ``forest_accuracy``;
 
-        * **CV_TERMCRIT_ITER | CV_TERMCRIT_EPS** Use both termination criterias.
+        * **CV_TERMCRIT_ITER | CV_TERMCRIT_EPS** Use both termination criteria.
 
 For meaning of other parameters see :ocv:func:`CvDTreeParams::CvDTreeParams`.
 
@@ -112,6 +112,8 @@ Trains the Random Trees model.
 
 The method :ocv:func:`CvRTrees::train` is very similar to the method :ocv:func:`CvDTree::train` and follows the generic method :ocv:func:`CvStatModel::train` conventions. All the parameters specific to the algorithm training are passed as a :ocv:class:`CvRTParams` instance. The estimate of the training error (``oob-error``) is stored in the protected class member ``oob_error``.
 
+The function is parallelized with the TBB library.
+
 CvRTrees::predict
 -----------------
 Predicts the output for an input sample.
index cb5465d..d79b50d 100644 (file)
@@ -42,7 +42,7 @@ In this declaration, some methods are commented off. These are methods for which
 
 CvStatModel::CvStatModel
 ------------------------
-The default constuctor.
+The default constructor.
 
 .. ocv:function:: CvStatModel::CvStatModel()
 
index 555b929..8fcac03 100644 (file)
@@ -121,7 +121,7 @@ The constructors.
 
     :param coef0: Parameter ``coef0`` of a kernel function (POLY / SIGMOID).
 
-    :param Cvalue: Parameter ``C`` of a SVM optimiazation problem (C_SVC / EPS_SVR / NU_SVR).
+    :param Cvalue: Parameter ``C`` of a SVM optimization problem (C_SVC / EPS_SVR / NU_SVR).
 
     :param nu: Parameter :math:`\nu` of a SVM optimization problem (NU_SVC / ONE_CLASS / NU_SVR).
 
@@ -242,6 +242,9 @@ Predicts the response for input sample(s).
 
 If you pass one sample then prediction result is returned. If you want to get responses for several samples then you should pass the ``results`` matrix where prediction results will be stored.
 
+The function is parallelized with the TBB library.
+
+
 CvSVM::get_default_grid
 -----------------------
 Generates a grid for SVM parameters.
index 867da61..36f86c4 100644 (file)
 
 #ifdef __cplusplus
 
+#include <map>
+#include <string>
+#include <iostream>
+
 // Apple defines a check() macro somewhere in the debug headers
 // that interferes with a method definiton in this header
 #undef check
@@ -121,6 +125,7 @@ CV_INLINE CvParamLattice cvDefaultParamLattice( void )
 #define CV_TYPE_NAME_ML_ANN_MLP     "opencv-ml-ann-mlp"
 #define CV_TYPE_NAME_ML_CNN         "opencv-ml-cnn"
 #define CV_TYPE_NAME_ML_RTREES      "opencv-ml-random-trees"
+#define CV_TYPE_NAME_ML_ERTREES     "opencv-ml-extremely-randomized-trees"
 #define CV_TYPE_NAME_ML_GBT         "opencv-ml-gradient-boosting-trees"
 
 #define CV_TRAIN_ERROR  0
@@ -549,114 +554,99 @@ protected:
 /****************************************************************************************\
 *                              Expectation - Maximization                                *
 \****************************************************************************************/
-
-struct CV_EXPORTS_W_MAP CvEMParams
+namespace cv
 {
-    CvEMParams();
-    CvEMParams( int nclusters, int cov_mat_type=1/*CvEM::COV_MAT_DIAGONAL*/,
-                int start_step=0/*CvEM::START_AUTO_STEP*/,
-                CvTermCriteria term_crit=cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, FLT_EPSILON),
-                const CvMat* probs=0, const CvMat* weights=0, const CvMat* means=0, const CvMat** covs=0 );
-
-    CV_PROP_RW int nclusters;
-    CV_PROP_RW int cov_mat_type;
-    CV_PROP_RW int start_step;
-    const CvMat* probs;
-    const CvMat* weights;
-    const CvMat* means;
-    const CvMat** covs;
-    CV_PROP_RW CvTermCriteria term_crit;
-};
-
-
-class CV_EXPORTS_W CvEM : public CvStatModel
+class CV_EXPORTS_W EM : public Algorithm
 {
 public:
     // Type of covariation matrices
-    enum { COV_MAT_SPHERICAL=0, COV_MAT_DIAGONAL=1, COV_MAT_GENERIC=2 };
+    enum {COV_MAT_SPHERICAL=0, COV_MAT_DIAGONAL=1, COV_MAT_GENERIC=2, COV_MAT_DEFAULT=COV_MAT_DIAGONAL};
 
+    // Default parameters
+    enum {DEFAULT_NCLUSTERS=10, DEFAULT_MAX_ITERS=100};
+    
     // The initial step
-    enum { START_E_STEP=1, START_M_STEP=2, START_AUTO_STEP=0 };
-
-    CV_WRAP CvEM();
-    CvEM( const CvMat* samples, const CvMat* sampleIdx=0,
-          CvEMParams params=CvEMParams(), CvMat* labels=0 );
-    //CvEM (CvEMParams params, CvMat * means, CvMat ** covs, CvMat * weights,
-    // CvMat * probs, CvMat * log_weight_div_det, CvMat * inv_eigen_values, CvMat** cov_rotate_mats);
-
-    virtual ~CvEM();
-
-    virtual bool train( const CvMat* samples, const CvMat* sampleIdx=0,
-                        CvEMParams params=CvEMParams(), CvMat* labels=0 );
-
-    virtual float predict( const CvMat* sample, CV_OUT CvMat* probs ) const;
+    enum {START_E_STEP=1, START_M_STEP=2, START_AUTO_STEP=0};
 
-#ifndef SWIG
-    CV_WRAP CvEM( const cv::Mat& samples, const cv::Mat& sampleIdx=cv::Mat(),
-                  CvEMParams params=CvEMParams() );
-    
-    CV_WRAP virtual bool train( const cv::Mat& samples,
-                                const cv::Mat& sampleIdx=cv::Mat(),
-                                CvEMParams params=CvEMParams(),
-                                CV_OUT cv::Mat* labels=0 );
+    CV_WRAP EM(int nclusters=EM::DEFAULT_NCLUSTERS, int covMatType=EM::COV_MAT_DIAGONAL,
+       const TermCriteria& termcrit=TermCriteria(TermCriteria::COUNT+
+                                                 TermCriteria::EPS,
+                                                 EM::DEFAULT_MAX_ITERS, FLT_EPSILON));
     
-    CV_WRAP virtual float predict( const cv::Mat& sample, CV_OUT cv::Mat* probs=0 ) const;
-    CV_WRAP virtual double calcLikelihood( const cv::Mat &sample ) const;
+    virtual ~EM();
+    CV_WRAP virtual void clear();
+
+    CV_WRAP virtual bool train(InputArray samples,
+                       OutputArray labels=noArray(),
+                       OutputArray probs=noArray(),
+                       OutputArray logLikelihoods=noArray());
     
-    CV_WRAP int  getNClusters() const;
-    CV_WRAP cv::Mat  getMeans()     const;
-    CV_WRAP void getCovs(CV_OUT std::vector<cv::Mat>& covs)      const;
-    CV_WRAP cv::Mat  getWeights()   const;
-    CV_WRAP cv::Mat  getProbs()     const;
+    CV_WRAP virtual bool trainE(InputArray samples,
+                        InputArray means0,
+                        InputArray covs0=noArray(),
+                        InputArray weights0=noArray(),
+                        OutputArray labels=noArray(),
+                        OutputArray probs=noArray(),
+                        OutputArray logLikelihoods=noArray());
     
-    CV_WRAP inline double getLikelihood() const { return log_likelihood; }
-    CV_WRAP inline double getLikelihoodDelta() const { return log_likelihood_delta; }
-#endif
+    CV_WRAP virtual bool trainM(InputArray samples,
+                        InputArray probs0,
+                        OutputArray labels=noArray(),
+                        OutputArray probs=noArray(),
+                        OutputArray logLikelihoods=noArray());
     
-    CV_WRAP virtual void clear();
+    CV_WRAP int predict(InputArray sample,
+                OutputArray probs=noArray(),
+                CV_OUT double* logLikelihood=0) const;
+
+    CV_WRAP bool isTrained() const;
 
-    int           get_nclusters() const;
-    const CvMat*  get_means()     const;
-    const CvMat** get_covs()      const;
-    const CvMat*  get_weights()   const;
-    const CvMat*  get_probs()     const;
+    AlgorithmInfo* info() const;
+    virtual void read(const FileNode& fn);
 
-    inline double get_log_likelihood() const { return log_likelihood; }
-    inline double get_log_likelihood_delta() const { return log_likelihood_delta; }
+protected:
     
-//    inline const CvMat *  get_log_weight_div_det () const { return log_weight_div_det; };
-//    inline const CvMat *  get_inv_eigen_values   () const { return inv_eigen_values;   };
-//    inline const CvMat ** get_cov_rotate_mats    () const { return cov_rotate_mats;    };
+    virtual void setTrainData(int startStep, const Mat& samples,
+                              const Mat* probs0,
+                              const Mat* means0,
+                              const vector<Mat>* covs0,
+                              const Mat* weights0);
 
-    virtual void read( CvFileStorage* fs, CvFileNode* node );
-    virtual void write( CvFileStorage* fs, const char* name ) const;
+    bool doTrain(int startStep,
+                 OutputArray labels,
+                 OutputArray probs,
+                 OutputArray logLikelihoods);
+    virtual void eStep();
+    virtual void mStep();
 
-    virtual void write_params( CvFileStorage* fs ) const;
-    virtual void read_params( CvFileStorage* fs, CvFileNode* node );
+    void clusterTrainSamples();
+    void decomposeCovs();
+    void computeLogWeightDivDet();
 
-protected:
+    void computeProbabilities(const Mat& sample, int& label, Mat* probs, double* logLikelihood) const;
 
-    virtual void set_params( const CvEMParams& params,
-                             const CvVectors& train_data );
-    virtual void init_em( const CvVectors& train_data );
-    virtual double run_em( const CvVectors& train_data );
-    virtual void init_auto( const CvVectors& samples );
-    virtual void kmeans( const CvVectors& train_data, int nclusters,
-                         CvMat* labels, CvTermCriteria criteria,
-                         const CvMat* means );
-    CvEMParams params;
-    double log_likelihood;
-    double log_likelihood_delta;
-
-    CvMat* means;
-    CvMat** covs;
-    CvMat* weights;
-    CvMat* probs;
-
-    CvMat* log_weight_div_det;
-    CvMat* inv_eigen_values;
-    CvMat** cov_rotate_mats;
+    // all inner matrices have type CV_64FC1
+    CV_PROP_RW int nclusters;
+    CV_PROP_RW int covMatType;
+    CV_PROP_RW int maxIters;
+    CV_PROP_RW double epsilon;
+
+    Mat trainSamples;
+    Mat trainProbs;
+    Mat trainLogLikelihoods;
+    Mat trainLabels;
+    Mat trainCounts;
+
+    CV_PROP Mat weights;
+    CV_PROP Mat means;
+    CV_PROP vector<Mat> covs;
+
+    vector<Mat> covsEigenValues;
+    vector<Mat> covsRotateMats;
+    vector<Mat> invCovsEigenValues;
+    Mat logWeightDivDet;
 };
+} // namespace cv
 
 /****************************************************************************************\
 *                                      Decision Tree                                     *
@@ -1052,6 +1042,7 @@ public:
     CvForestTree* get_tree(int i) const;
 
 protected:
+    virtual std::string getName() const;
 
     virtual bool grow_forest( const CvTermCriteria term_crit );
 
@@ -1125,6 +1116,7 @@ public:
 #endif
     virtual bool train( CvMLData* data, CvRTParams params=CvRTParams() );
 protected:
+    virtual std::string getName() const;
     virtual bool grow_forest( const CvTermCriteria term_crit );
 };
 
@@ -2012,17 +2004,10 @@ CVAPI(void) cvCreateTestSet( int type, CvMat** samples,
                  CvMat** responses,
                  int num_classes, ... );
 
-
-#endif
-
 /****************************************************************************************\
 *                                      Data                                             *
 \****************************************************************************************/
 
-#include <map>
-#include <string>
-#include <iostream>
-
 #define CV_COUNT     0
 #define CV_PORTION   1
 
@@ -2133,8 +2118,6 @@ typedef CvSVMParams SVMParams;
 typedef CvSVMKernel SVMKernel;
 typedef CvSVMSolver SVMSolver;
 typedef CvSVM SVM;
-typedef CvEMParams EMParams;
-typedef CvEM ExpectationMaximization;
 typedef CvDTreeParams DTreeParams;
 typedef CvMLData TrainData;
 typedef CvDTree DecisionTree;
@@ -2156,5 +2139,7 @@ template<> CV_EXPORTS void Ptr<CvDTreeSplit>::delete_obj();
     
 }
 
-#endif
+#endif // __cplusplus
+#endif // __OPENCV_ML_HPP__
+
 /* End of file. */
index d52b358..9639265 100644 (file)
@@ -161,8 +161,21 @@ int CvMLData::read_csv(const char* filename)
         fclose(file);
         return -1;
     }
-    for( ptr = buf; *ptr != '\0'; ptr++ )
-        cols_count += (*ptr == delimiter);
+
+    ptr = buf;
+    while( *ptr == ' ' )
+        ptr++;
+    for( ; *ptr != '\0'; )
+    {
+        if(*ptr == delimiter || *ptr == ' ')
+        {
+            cols_count++;
+            ptr++;
+            while( *ptr == ' ' ) ptr++;
+        }
+        else
+            ptr++;
+    }
 
     if ( cols_count == 0)
     {
@@ -606,7 +619,7 @@ void CvMLData::set_train_test_split( const CvTrainTestSplit * spl)
             CV_ERROR( CV_StsBadArg, "train samples count is not correct" );
         train_sample_portion = train_sample_portion <= FLT_EPSILON || 
             1 - train_sample_portion <= FLT_EPSILON ? 1 : train_sample_portion;
-        train_sample_count = cvFloor( train_sample_portion * sample_count );
+        train_sample_count = std::max(1, cvFloor( train_sample_portion * sample_count ));
     }
 
     if ( train_sample_count == sample_count )
@@ -625,8 +638,10 @@ void CvMLData::set_train_test_split( const CvTrainTestSplit * spl)
         for (int i = 0; i < sample_count; i++ )
             sample_idx[i] = i;
         train_sample_idx = cvCreateMatHeader( 1, train_sample_count, CV_32SC1 );
-        test_sample_idx = cvCreateMatHeader( 1, test_sample_count, CV_32SC1 );
         *train_sample_idx = cvMat( 1, train_sample_count, CV_32SC1, &sample_idx[0] );
+
+        CV_Assert(test_sample_count > 0);
+        test_sample_idx = cvCreateMatHeader( 1, test_sample_count, CV_32SC1 );
         *test_sample_idx = cvMat( 1, test_sample_count, CV_32SC1, &sample_idx[train_sample_count] );
     }
     
index 9ec262d..95eda5b 100644 (file)
 
 #include "precomp.hpp"
 
-
-/*
-   CvEM:
- * params.nclusters    - number of clusters to cluster samples to.
- * means               - calculated by the EM algorithm set of gaussians' means.
- * log_weight_div_det - auxilary vector that k-th component is equal to
-                        (-2)*ln(weights_k/det(Sigma_k)^0.5),
-                        where <weights_k> is the weight,
-                        <Sigma_k> is the covariation matrice of k-th cluster.
- * inv_eigen_values   - set of 1*dims matrices, <inv_eigen_values>[k] contains
-                        inversed eigen values of covariation matrice of the k-th cluster.
-                        In the case of <cov_mat_type> == COV_MAT_DIAGONAL,
-                        inv_eigen_values[k] = Sigma_k^(-1).
- * covs_rotate_mats   - used only if cov_mat_type == COV_MAT_GENERIC, in all the
-                        other cases it is NULL. <covs_rotate_mats>[k] is the orthogonal
-                        matrice, obtained by the SVD-decomposition of Sigma_k.
-   Both <inv_eigen_values> and <covs_rotate_mats> fields are used for representation of
-   covariation matrices and simplifying EM calculations.
-   For fixed k denote
-   u = covs_rotate_mats[k],
-   v = inv_eigen_values[k],
-   w = v^(-1);
-   if <cov_mat_type> == COV_MAT_GENERIC, then Sigma_k = u w u',
-   else                                       Sigma_k = w.
-   Symbol ' means transposition.
- */
-
-CvEMParams::CvEMParams() : nclusters(10), cov_mat_type(1/*CvEM::COV_MAT_DIAGONAL*/),
-    start_step(0/*CvEM::START_AUTO_STEP*/), probs(0), weights(0), means(0), covs(0)
+namespace cv
 {
-    term_crit=cvTermCriteria( CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, FLT_EPSILON );
-}
 
-CvEMParams::CvEMParams( int _nclusters, int _cov_mat_type, int _start_step,
-                        CvTermCriteria _term_crit, const CvMat* _probs,
-                        const CvMat* _weights, const CvMat* _means, const CvMat** _covs ) :
-                        nclusters(_nclusters), cov_mat_type(_cov_mat_type), start_step(_start_step),
-                        probs(_probs), weights(_weights), means(_means), covs(_covs), term_crit(_term_crit)
-{}
+const double minEigenValue = DBL_MIN;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
 
-CvEM::CvEM()
+EM::EM(int _nclusters, int _covMatType, const TermCriteria& _criteria)
 {
-    means = weights = probs = inv_eigen_values = log_weight_div_det = 0;
-    covs = cov_rotate_mats = 0;
+    nclusters = _nclusters;
+    covMatType = _covMatType;
+    maxIters = (_criteria.type & TermCriteria::MAX_ITER) ? _criteria.maxCount : DEFAULT_MAX_ITERS;
+    epsilon = (_criteria.type & TermCriteria::EPS) ? _criteria.epsilon : 0;
 }
 
-CvEM::CvEM( const CvMat* samples, const CvMat* sample_idx,
-            CvEMParams params, CvMat* labels )
+EM::~EM()
 {
-    means = weights = probs = inv_eigen_values = log_weight_div_det = 0;
-    covs = cov_rotate_mats = 0;
-
-    // just invoke the train() method
-    train(samples, sample_idx, params, labels);
+    //clear();
 }
 
-CvEM::~CvEM()
+void EM::clear()
 {
-    clear();
-}
+    trainSamples.release();
+    trainProbs.release();
+    trainLogLikelihoods.release();
+    trainLabels.release();
+    trainCounts.release();
 
+    weights.release();
+    means.release();
+    covs.clear();
 
-void CvEM::clear()
-{
-    int i;
+    covsEigenValues.clear();
+    invCovsEigenValues.clear();
+    covsRotateMats.clear();
 
-    cvReleaseMat( &means );
-    cvReleaseMat( &weights );
-    cvReleaseMat( &probs );
-    cvReleaseMat( &inv_eigen_values );
-    cvReleaseMat( &log_weight_div_det );
+    logWeightDivDet.release();
+}
 
-    if( covs || cov_rotate_mats )
-    {
-        for( i = 0; i < params.nclusters; i++ )
-        {
-            if( covs )
-                cvReleaseMat( &covs[i] );
-            if( cov_rotate_mats )
-                cvReleaseMat( &cov_rotate_mats[i] );
-        }
-        cvFree( &covs );
-        cvFree( &cov_rotate_mats );
-    }
+    
+bool EM::train(InputArray samples,
+               OutputArray labels,
+               OutputArray probs,
+               OutputArray logLikelihoods)
+{
+    Mat samplesMat = samples.getMat();
+    setTrainData(START_AUTO_STEP, samplesMat, 0, 0, 0, 0);
+    return doTrain(START_AUTO_STEP, labels, probs, logLikelihoods);
 }
 
-void CvEM::read( CvFileStorage* fs, CvFileNode* node )
+bool EM::trainE(InputArray samples,
+                InputArray _means0,
+                InputArray _covs0,
+                InputArray _weights0,
+                OutputArray labels,
+                OutputArray probs,
+                OutputArray logLikelihoods)
 {
-    bool ok = false;
-    CV_FUNCNAME( "CvEM::read" );
+    Mat samplesMat = samples.getMat();
+    vector<Mat> covs0;
+    _covs0.getMatVector(covs0);
+    
+    Mat means0 = _means0.getMat(), weights0 = _weights0.getMat();
+
+    setTrainData(START_E_STEP, samplesMat, 0, !_means0.empty() ? &means0 : 0,
+                 !_covs0.empty() ? &covs0 : 0, _weights0.empty() ? &weights0 : 0);
+    return doTrain(START_E_STEP, labels, probs, logLikelihoods);
+}
 
-    __BEGIN__;
+bool EM::trainM(InputArray samples,
+                InputArray _probs0,
+                OutputArray labels,
+                OutputArray probs,
+                OutputArray logLikelihoods)
+{
+    Mat samplesMat = samples.getMat();
+    Mat probs0 = _probs0.getMat();
+    
+    setTrainData(START_M_STEP, samplesMat, !_probs0.empty() ? &probs0 : 0, 0, 0, 0);
+    return doTrain(START_M_STEP, labels, probs, logLikelihoods);
+}
 
-    clear();
+    
+int EM::predict(InputArray _sample, OutputArray _probs, double* logLikelihood) const
+{
+    Mat sample = _sample.getMat();
+    CV_Assert(isTrained());
 
-    size_t data_size;
-    CvSeqReader reader;
-    CvFileNode* em_node = 0;
-    CvFileNode* tmp_node = 0;
-    CvSeq* seq = 0;
-
-    read_params( fs, node );
-
-    em_node = cvGetFileNodeByName( fs, node, "cvEM" );
-    if( !em_node )
-        CV_ERROR( CV_StsBadArg, "cvEM tag not found" );
-
-    CV_CALL( weights = (CvMat*)cvReadByName( fs, em_node, "weights" ));
-    CV_CALL( means = (CvMat*)cvReadByName( fs, em_node, "means" ));
-    CV_CALL( log_weight_div_det = (CvMat*)cvReadByName( fs, em_node, "log_weight_div_det" ));
-    CV_CALL( inv_eigen_values = (CvMat*)cvReadByName( fs, em_node, "inv_eigen_values" ));
-
-    // Size of all the following data
-    data_size = params.nclusters*sizeof(CvMat*);
-
-    CV_CALL( covs = (CvMat**)cvAlloc( data_size ));
-    memset( covs, 0, data_size );
-    CV_CALL( tmp_node = cvGetFileNodeByName( fs, em_node, "covs" ));
-    seq = tmp_node->data.seq;
-    if( !CV_NODE_IS_SEQ(tmp_node->tag) || seq->total != params.nclusters)
-        CV_ERROR( CV_StsParseError, "Missing or invalid sequence of covariance matrices" );
-    CV_CALL( cvStartReadSeq( seq, &reader, 0 ));
-    for( int i = 0; i < params.nclusters; i++ )
+    CV_Assert(!sample.empty());
+    if(sample.type() != CV_64FC1)
     {
-        CV_CALL( covs[i] = (CvMat*)cvRead( fs, (CvFileNode*)reader.ptr ));
-        CV_NEXT_SEQ_ELEM( seq->elem_size, reader );
+        Mat tmp;
+        sample.convertTo(tmp, CV_64FC1);
+        sample = tmp;
     }
 
-    CV_CALL( cov_rotate_mats = (CvMat**)cvAlloc( data_size ));
-    memset( cov_rotate_mats, 0, data_size );
-    CV_CALL( tmp_node = cvGetFileNodeByName( fs, em_node, "cov_rotate_mats" ));
-    seq = tmp_node->data.seq;
-    if( !CV_NODE_IS_SEQ(tmp_node->tag) || seq->total != params.nclusters)
-        CV_ERROR( CV_StsParseError, "Missing or invalid sequence of covariance matrices" );
-    CV_CALL( cvStartReadSeq( seq, &reader, 0 ));
-    for( int i = 0; i < params.nclusters; i++ )
+    int label;
+    Mat probs;
+    if( _probs.needed() )
     {
-        CV_CALL( cov_rotate_mats[i] = (CvMat*)cvRead( fs, (CvFileNode*)reader.ptr ));
-        CV_NEXT_SEQ_ELEM( seq->elem_size, reader );
+        _probs.create(1, nclusters, CV_64FC1);
+        probs = _probs.getMat();
     }
+    computeProbabilities(sample, label, !probs.empty() ? &probs : 0, logLikelihood);
 
-    ok = true;
-    __END__;
-
-    if (!ok)
-        clear();
+    return label;
 }
 
-void CvEM::read_params( CvFileStorage *fs, CvFileNode *node)
+bool EM::isTrained() const
 {
-    CV_FUNCNAME( "CvEM::read_params");
-
-    __BEGIN__;
-
-    size_t data_size;
-    CvEMParams _params;
-    CvSeqReader reader;
-    CvFileNode* param_node = 0;
-    CvFileNode* tmp_node = 0;
-    CvSeq* seq = 0;
-
-    const char * start_step_name = 0;
-    const char * cov_mat_type_name = 0;
-
-    param_node = cvGetFileNodeByName( fs, node, "params" );
-    if( !param_node )
-        CV_ERROR( CV_StsBadArg, "params tag not found" );
-
-    CV_CALL( start_step_name = cvReadStringByName( fs, param_node, "start_step", 0 ) );
-    CV_CALL( cov_mat_type_name = cvReadStringByName( fs, param_node, "cov_mat_type", 0 ) );
-
-    if( start_step_name )
-        _params.start_step = strcmp( start_step_name, "START_E_STEP" ) == 0 ? START_E_STEP :
-                     strcmp( start_step_name, "START_M_STEP" ) == 0 ? START_M_STEP :
-                     strcmp( start_step_name, "START_AUTO_STEP" ) == 0 ? START_AUTO_STEP : 0;
-    else
-        CV_CALL( _params.start_step = cvReadIntByName( fs, param_node, "start_step", -1 ) );
-
-
-     if( cov_mat_type_name )
-        _params.cov_mat_type = strcmp( cov_mat_type_name, "COV_MAT_SPHERICAL" ) == 0 ? COV_MAT_SPHERICAL :
-                       strcmp( cov_mat_type_name, "COV_MAT_DIAGONAL" ) == 0 ? COV_MAT_DIAGONAL :
-                       strcmp( cov_mat_type_name, "COV_MAT_GENERIC" ) == 0 ? COV_MAT_GENERIC : 0;
-    else
-        CV_CALL( _params.cov_mat_type = cvReadIntByName( fs, param_node, "cov_mat_type", -1) );
-
-    CV_CALL( _params.nclusters = cvReadIntByName( fs, param_node, "nclusters", -1 ));
-    CV_CALL( _params.weights = (CvMat*)cvReadByName( fs, param_node, "weights" ));
-    CV_CALL( _params.means = (CvMat*)cvReadByName( fs, param_node, "means" ));
-
-    data_size = _params.nclusters*sizeof(CvMat*);
-    CV_CALL( _params.covs = (const CvMat**)cvAlloc( data_size ));
-    memset( _params.covs, 0, data_size );
-    CV_CALL( tmp_node = cvGetFileNodeByName( fs, param_node, "covs" ));
-    seq = tmp_node->data.seq;
-    if( !CV_NODE_IS_SEQ(tmp_node->tag) || seq->total != _params.nclusters)
-        CV_ERROR( CV_StsParseError, "Missing or invalid sequence of covariance matrices" );
-    CV_CALL( cvStartReadSeq( seq, &reader, 0 ));
-    for( int i = 0; i < _params.nclusters; i++ )
-    {
-        CV_CALL( _params.covs[i] = (CvMat*)cvRead( fs, (CvFileNode*)reader.ptr ));
-        CV_NEXT_SEQ_ELEM( seq->elem_size, reader );
-    }
-    params = _params;
-
-    __END__;
+    return !means.empty();
 }
 
-void CvEM::write_params( CvFileStorage* fs ) const
-{
-    CV_FUNCNAME( "CvEM::write_params" );
-
-    __BEGIN__;
 
-    const char* cov_mat_type_name =
-        (params.cov_mat_type == COV_MAT_SPHERICAL) ? "COV_MAT_SPHERICAL" :
-        (params.cov_mat_type == COV_MAT_DIAGONAL) ? "COV_MAT_DIAGONAL" :
-        (params.cov_mat_type == COV_MAT_GENERIC) ? "COV_MAT_GENERIC" : 0;
-
-    const char* start_step_name =
-        (params.start_step == START_E_STEP) ? "START_E_STEP" :
-        (params.start_step == START_M_STEP) ? "START_M_STEP" :
-        (params.start_step == START_AUTO_STEP) ? "START_AUTO_STEP" : 0;
-
-    CV_CALL( cvStartWriteStruct( fs, "params", CV_NODE_MAP ) );
-
-    if( cov_mat_type_name )
-    {
-        CV_CALL( cvWriteString( fs, "cov_mat_type", cov_mat_type_name) );
-    }
-    else
+static
+void checkTrainData(int startStep, const Mat& samples,
+                    int nclusters, int covMatType, const Mat* probs, const Mat* means,
+                    const vector<Mat>* covs, const Mat* weights)
+{
+    // Check samples.
+    CV_Assert(!samples.empty());
+    CV_Assert(samples.channels() == 1);
+
+    int nsamples = samples.rows;
+    int dim = samples.cols;
+
+    // Check training params.
+    CV_Assert(nclusters > 0);
+    CV_Assert(nclusters <= nsamples);
+    CV_Assert(startStep == EM::START_AUTO_STEP ||
+              startStep == EM::START_E_STEP ||
+              startStep == EM::START_M_STEP);
+    CV_Assert(covMatType == EM::COV_MAT_GENERIC ||
+              covMatType == EM::COV_MAT_DIAGONAL ||
+              covMatType == EM::COV_MAT_SPHERICAL);
+
+    CV_Assert(!probs ||
+        (!probs->empty() &&
+         probs->rows == nsamples && probs->cols == nclusters &&
+         (probs->type() == CV_32FC1 || probs->type() == CV_64FC1)));
+
+    CV_Assert(!weights ||
+        (!weights->empty() &&
+         (weights->cols == 1 || weights->rows == 1) && static_cast<int>(weights->total()) == nclusters &&
+         (weights->type() == CV_32FC1 || weights->type() == CV_64FC1)));
+
+    CV_Assert(!means ||
+        (!means->empty() &&
+         means->rows == nclusters && means->cols == dim &&
+         means->channels() == 1));
+
+    CV_Assert(!covs ||
+        (!covs->empty() &&
+         static_cast<int>(covs->size()) == nclusters));
+    if(covs)
     {
-        CV_CALL( cvWriteInt( fs, "cov_mat_type", params.cov_mat_type ) );
+        const Size covSize(dim, dim);
+        for(size_t i = 0; i < covs->size(); i++)
+        {
+            const Mat& m = (*covs)[i];
+            CV_Assert(!m.empty() && m.size() == covSize && (m.channels() == 1));
+        }
     }
 
-    if( start_step_name )
+    if(startStep == EM::START_E_STEP)
     {
-        CV_CALL( cvWriteString( fs, "start_step", start_step_name) );
+        CV_Assert(means);
     }
-    else
+    else if(startStep == EM::START_M_STEP)
     {
-        CV_CALL( cvWriteInt( fs, "cov_mat_type", params.start_step ) );
+        CV_Assert(probs);
     }
-
-    CV_CALL( cvWriteInt( fs, "nclusters", params.nclusters ));
-    CV_CALL( cvWrite( fs, "weights", weights ));
-    CV_CALL( cvWrite( fs, "means", means ));
-
-    CV_CALL( cvStartWriteStruct( fs, "covs", CV_NODE_SEQ ));
-    for( int i = 0; i < params.nclusters; i++ )
-        CV_CALL( cvWrite( fs, NULL, covs[i] ));
-    CV_CALL( cvEndWriteStruct( fs ) );
-
-    // Close params struct
-    CV_CALL( cvEndWriteStruct( fs ) );
-
-    __END__;
 }
 
-void CvEM::write( CvFileStorage* fs, const char* name ) const
+static
+void preprocessSampleData(const Mat& src, Mat& dst, int dstType, bool isAlwaysClone)
 {
-    CV_FUNCNAME( "CvEM::write" );
-
-    __BEGIN__;
-
-    CV_CALL( cvStartWriteStruct( fs, name, CV_NODE_MAP, CV_TYPE_NAME_ML_EM ) );
-
-    write_params(fs);
-
-    CV_CALL( cvStartWriteStruct( fs, "cvEM", CV_NODE_MAP ) );
-
-    CV_CALL( cvWrite( fs, "means", means ) );
-    CV_CALL( cvWrite( fs, "weights", weights ) );
-    CV_CALL( cvWrite( fs, "log_weight_div_det", log_weight_div_det ) );
-    CV_CALL( cvWrite( fs, "inv_eigen_values", inv_eigen_values ) );
-
-    CV_CALL( cvStartWriteStruct( fs, "covs", CV_NODE_SEQ ));
-    for( int i = 0; i < params.nclusters; i++ )
-        CV_CALL( cvWrite( fs, NULL, covs[i] ));
-    CV_CALL( cvEndWriteStruct( fs ));
-
-    CV_CALL( cvStartWriteStruct( fs, "cov_rotate_mats", CV_NODE_SEQ ));
-    for( int i = 0; i < params.nclusters; i++ )
-        CV_CALL( cvWrite( fs, NULL, cov_rotate_mats[i] ));
-    CV_CALL( cvEndWriteStruct( fs ) );
+    if(src.type() == dstType && !isAlwaysClone)
+        dst = src;
+    else
+        src.convertTo(dst, dstType);
+}
 
-    // close cvEM
-    CV_CALL( cvEndWriteStruct( fs ) );
+static
+void preprocessProbability(Mat& probs)
+{
+    max(probs, 0., probs);
 
-    // close top level
-    CV_CALL( cvEndWriteStruct( fs ) );
+    const double uniformProbability = (double)(1./probs.cols);
+    for(int y = 0; y < probs.rows; y++)
+    {
+        Mat sampleProbs = probs.row(y);
 
-    __END__;
+        double maxVal = 0;
+        minMaxLoc(sampleProbs, 0, &maxVal);
+        if(maxVal < FLT_EPSILON)
+            sampleProbs.setTo(uniformProbability);
+        else
+            normalize(sampleProbs, sampleProbs, 1, 0, NORM_L1);
+    }
 }
 
-void CvEM::set_params( const CvEMParams& _params, const CvVectors& train_data )
+void EM::setTrainData(int startStep, const Mat& samples,
+                      const Mat* probs0,
+                      const Mat* means0,
+                      const vector<Mat>* covs0,
+                      const Mat* weights0)
 {
-    CV_FUNCNAME( "CvEM::set_params" );
-
-    __BEGIN__;
-
-    int k;
+    clear();
 
-    params = _params;
-    params.term_crit = cvCheckTermCriteria( params.term_crit, 1e-6, 10000 );
+    checkTrainData(startStep, samples, nclusters, covMatType, probs0, means0, covs0, weights0);
 
-    if( params.cov_mat_type != COV_MAT_SPHERICAL &&
-        params.cov_mat_type != COV_MAT_DIAGONAL &&
-        params.cov_mat_type != COV_MAT_GENERIC )
-        CV_ERROR( CV_StsBadArg, "Unknown covariation matrix type" );
+    bool isKMeansInit = (startStep == EM::START_AUTO_STEP) || (startStep == EM::START_E_STEP && (covs0 == 0 || weights0 == 0));
+    // Set checked data
+    preprocessSampleData(samples, trainSamples, isKMeansInit ? CV_32FC1 : CV_64FC1, false);
 
-    switch( params.start_step )
+    // set probs
+    if(probs0 && startStep == EM::START_M_STEP)
     {
-    case START_M_STEP:
-        if( !params.probs )
-            CV_ERROR( CV_StsNullPtr, "Probabilities must be specified when EM algorithm starts with M-step" );
-        break;
-    case START_E_STEP:
-        if( !params.means )
-            CV_ERROR( CV_StsNullPtr, "Mean's must be specified when EM algorithm starts with E-step" );
-        break;
-    case START_AUTO_STEP:
-        break;
-    default:
-        CV_ERROR( CV_StsBadArg, "Unknown start_step" );
+        preprocessSampleData(*probs0, trainProbs, CV_64FC1, true);
+        preprocessProbability(trainProbs);
     }
 
-    if( params.nclusters < 1 )
-        CV_ERROR( CV_StsOutOfRange, "The number of clusters (mixtures) should be > 0" );
-
-    if( params.probs )
+    // set weights
+    if(weights0 && (startStep == EM::START_E_STEP && covs0))
     {
-        const CvMat* p = params.probs;
-        if( !CV_IS_MAT(p) ||
-            (CV_MAT_TYPE(p->type) != CV_32FC1  &&
-            CV_MAT_TYPE(p->type) != CV_64FC1) ||
-            p->rows != train_data.count ||
-            p->cols != params.nclusters )
-            CV_ERROR( CV_StsBadArg, "The array of probabilities must be a valid "
-            "floating-point matrix (CvMat) of 'nsamples' x 'nclusters' size" );
+        weights0->convertTo(weights, CV_64FC1);
+        weights.reshape(1,1);
+        preprocessProbability(weights);
     }
 
-    if( params.means )
-    {
-        const CvMat* m = params.means;
-        if( !CV_IS_MAT(m) ||
-            (CV_MAT_TYPE(m->type) != CV_32FC1  &&
-            CV_MAT_TYPE(m->type) != CV_64FC1) ||
-            m->rows != params.nclusters ||
-            m->cols != train_data.dims )
-            CV_ERROR( CV_StsBadArg, "The array of mean's must be a valid "
-            "floating-point matrix (CvMat) of 'nsamples' x 'dims' size" );
-    }
+    // set means
+    if(means0 && (startStep == EM::START_E_STEP/* || startStep == EM::START_AUTO_STEP*/))
+        means0->convertTo(means, isKMeansInit ? CV_32FC1 : CV_64FC1);
 
-    if( params.weights )
+    // set covs
+    if(covs0 && (startStep == EM::START_E_STEP && weights0))
     {
-        const CvMat* w = params.weights;
-        if( !CV_IS_MAT(w) ||
-            (CV_MAT_TYPE(w->type) != CV_32FC1  &&
-            CV_MAT_TYPE(w->type) != CV_64FC1) ||
-            (w->rows != 1 && w->cols != 1) ||
-            w->rows + w->cols - 1 != params.nclusters )
-            CV_ERROR( CV_StsBadArg, "The array of weights must be a valid "
-            "1d floating-point vector (CvMat) of 'nclusters' elements" );
+        covs.resize(nclusters);
+        for(size_t i = 0; i < covs0->size(); i++)
+            (*covs0)[i].convertTo(covs[i], CV_64FC1);
     }
-
-    if( params.covs )
-        for( k = 0; k < params.nclusters; k++ )
-        {
-            const CvMat* cov = params.covs[k];
-            if( !CV_IS_MAT(cov) ||
-                (CV_MAT_TYPE(cov->type) != CV_32FC1  &&
-                CV_MAT_TYPE(cov->type) != CV_64FC1) ||
-                cov->rows != cov->cols || cov->cols != train_data.dims )
-                CV_ERROR( CV_StsBadArg,
-                "Each of covariation matrices must be a valid square "
-                "floating-point matrix (CvMat) of 'dims' x 'dims'" );
-        }
-
-    __END__;
 }
 
-/****************************************************************************************/
-double CvEM::calcLikelihood( const cv::Mat &input_sample ) const
+void EM::decomposeCovs()
 {
-    const CvMat _input_sample = input_sample;
-    const CvMat* _sample = &_input_sample ;
-
-    float* sample_data = 0;
-    int cov_mat_type = params.cov_mat_type;
-    int i, dims = means->cols;
-    int nclusters = params.nclusters;
-
-    cvPreparePredictData( _sample, dims, 0, params.nclusters, 0, &sample_data );
+    CV_Assert(!covs.empty());
+    covsEigenValues.resize(nclusters);
+    if(covMatType == EM::COV_MAT_GENERIC)
+        covsRotateMats.resize(nclusters);
+    invCovsEigenValues.resize(nclusters);
+    for(int clusterIndex = 0; clusterIndex < nclusters; clusterIndex++)
+    {
+        CV_Assert(!covs[clusterIndex].empty());
 
-    // allocate memory and initializing headers for calculating
-    cv::AutoBuffer<double> buffer(nclusters + dims);
-    CvMat expo = cvMat(1, nclusters, CV_64F, &buffer[0] );
-    CvMat diff = cvMat(1, dims, CV_64F, &buffer[nclusters] );
+        SVD svd(covs[clusterIndex], SVD::MODIFY_A + SVD::FULL_UV);
 
-    // calculate the probabilities
-    for( int k = 0; k < nclusters; k++ )
-    {
-        const double* mean_k = (const double*)(means->data.ptr + means->step*k);
-        const double* w = (const double*)(inv_eigen_values->data.ptr + inv_eigen_values->step*k);
-        double cur = log_weight_div_det->data.db[k];
-        CvMat* u = cov_rotate_mats[k];
-        // cov = u w u'  -->  cov^(-1) = u w^(-1) u'
-        if( cov_mat_type == COV_MAT_SPHERICAL )
+        if(covMatType == EM::COV_MAT_SPHERICAL)
         {
-            double w0 = w[0];
-            for( i = 0; i < dims; i++ )
-            {
-                double val = sample_data[i] - mean_k[i];
-                cur += val*val*w0;
-            }
+            double maxSingularVal = svd.w.at<double>(0);
+            covsEigenValues[clusterIndex] = Mat(1, 1, CV_64FC1, Scalar(maxSingularVal));
         }
-        else
+        else if(covMatType == EM::COV_MAT_DIAGONAL)
         {
-            for( i = 0; i < dims; i++ )
-                diff.data.db[i] = sample_data[i] - mean_k[i];
-            if( cov_mat_type == COV_MAT_GENERIC )
-                cvGEMM( &diff, u, 1, 0, 0, &diff, CV_GEMM_B_T );
-            for( i = 0; i < dims; i++ )
-            {
-                double val = diff.data.db[i];
-                cur += val*val*w[i];
-            }
+            covsEigenValues[clusterIndex] = svd.w;
         }
-        expo.data.db[k] = cur;
+        else //EM::COV_MAT_GENERIC
+        {
+            covsEigenValues[clusterIndex] = svd.w;
+            covsRotateMats[clusterIndex] = svd.u;
+        }
+        max(covsEigenValues[clusterIndex], minEigenValue, covsEigenValues[clusterIndex]);
+        invCovsEigenValues[clusterIndex] = 1./covsEigenValues[clusterIndex];
     }
-
-    // probability = (2*pi)^(-dims/2)*exp( -0.5 * cur )
-    cvConvertScale( &expo, &expo, -0.5 );
-    double factor = -double(dims)/2.0 * log(2.0*CV_PI);
-    cvAndS( &expo, cvScalar(factor), &expo );
-
-    // Calculate the log-likelihood of the given sample -
-    // see Alex Smola's blog http://blog.smola.org/page/2 for
-    // details on the log-sum-exp trick
-    double mini,maxi,retval;
-    cvMinMaxLoc( &expo, &mini, &maxi, 0, 0 );
-    CvMat *flp = cvCloneMat(&expo);
-    cvSubS( &expo, cvScalar(maxi), flp);
-    cvExp( flp, flp );
-    CvScalar ss = cvSum( flp );
-    retval = log(ss.val[0]) + maxi;
-    cvReleaseMat(&flp);
-
-    if( sample_data != _sample->data.fl )
-        cvFree( &sample_data );
-
-    return retval;
 }
 
-/****************************************************************************************/
-float
-CvEM::predict( const CvMat* _sample, CvMat* _probs ) const
+void EM::clusterTrainSamples()
 {
-    float* sample_data   = 0;
-    int cls = 0;
+    int nsamples = trainSamples.rows;
 
-    int cov_mat_type = params.cov_mat_type;
-    double opt = FLT_MAX;
+    // Cluster samples, compute/update means
 
-    int i, dims = means->cols;
-    int nclusters = params.nclusters;
+    // Convert samples and means to 32F, because kmeans requires this type.
+    Mat trainSamplesFlt, meansFlt;
+    if(trainSamples.type() != CV_32FC1)
+        trainSamples.convertTo(trainSamplesFlt, CV_32FC1);
+    else
+        trainSamplesFlt = trainSamples;
+    if(!means.empty())
+    {
+        if(means.type() != CV_32FC1)
+            means.convertTo(meansFlt, CV_32FC1);
+        else
+            meansFlt = means;
+    }
 
-    cvPreparePredictData( _sample, dims, 0, params.nclusters, _probs, &sample_data );
+    Mat labels;
+    kmeans(trainSamplesFlt, nclusters, labels,  TermCriteria(TermCriteria::COUNT, means.empty() ? 10 : 1, 0.5), 10, KMEANS_PP_CENTERS, meansFlt);
 
-    // allocate memory and initializing headers for calculating
-    cv::AutoBuffer<double> buffer(nclusters + dims);
-    CvMat expo = cvMat(1, nclusters, CV_64F, &buffer[0] );
-    CvMat diff = cvMat(1, dims, CV_64F, &buffer[nclusters] );
+    // Convert samples and means back to 64F.
+    CV_Assert(meansFlt.type() == CV_32FC1);
+    if(trainSamples.type() != CV_64FC1)
+    {
+        Mat trainSamplesBuffer;
+        trainSamplesFlt.convertTo(trainSamplesBuffer, CV_64FC1);
+        trainSamples = trainSamplesBuffer;
+    }
+    meansFlt.convertTo(means, CV_64FC1);
 
-    // calculate the probabilities
-    for( int k = 0; k < nclusters; k++ )
+    // Compute weights and covs
+    weights = Mat(1, nclusters, CV_64FC1, Scalar(0));
+    covs.resize(nclusters);
+    for(int clusterIndex = 0; clusterIndex < nclusters; clusterIndex++)
     {
-        const double* mean_k = (const double*)(means->data.ptr + means->step*k);
-        const double* w = (const double*)(inv_eigen_values->data.ptr + inv_eigen_values->step*k);
-        double cur = log_weight_div_det->data.db[k];
-        CvMat* u = cov_rotate_mats[k];
-        // cov = u w u'  -->  cov^(-1) = u w^(-1) u'
-        if( cov_mat_type == COV_MAT_SPHERICAL )
+        Mat clusterSamples;
+        for(int sampleIndex = 0; sampleIndex < nsamples; sampleIndex++)
         {
-            double w0 = w[0];
-            for( i = 0; i < dims; i++ )
+            if(labels.at<int>(sampleIndex) == clusterIndex)
             {
-                double val = sample_data[i] - mean_k[i];
-                cur += val*val*w0;
+                const Mat sample = trainSamples.row(sampleIndex);
+                clusterSamples.push_back(sample);
             }
         }
-        else
-        {
-            for( i = 0; i < dims; i++ )
-                diff.data.db[i] = sample_data[i] - mean_k[i];
-            if( cov_mat_type == COV_MAT_GENERIC )
-                cvGEMM( &diff, u, 1, 0, 0, &diff, CV_GEMM_B_T );
-            for( i = 0; i < dims; i++ )
-            {
-                double val = diff.data.db[i];
-                cur += val*val*w[i];
-            }
-        }
-
-        expo.data.db[k] = cur;
-        if( cur < opt )
-        {
-            cls = k;
-            opt = cur;
-        }
-    }
-
-    // probability = (2*pi)^(-dims/2)*exp( -0.5 * cur )
-    cvConvertScale( &expo, &expo, -0.5 );
-    double factor = -double(dims)/2.0 * log(2.0*CV_PI);
-    cvAndS( &expo, cvScalar(factor), &expo );
+        CV_Assert(!clusterSamples.empty());
 
-    // Calculate the posterior probability of each component
-    // given the sample data.
-    if( _probs )
-    {
-        cvExp( &expo, &expo );
-        if( _probs->cols == 1 )
-            cvReshape( &expo, &expo, 0, nclusters );
-        cvConvertScale( &expo, _probs, 1./cvSum( &expo ).val[0] );
+        calcCovarMatrix(clusterSamples, covs[clusterIndex], means.row(clusterIndex),
+            CV_COVAR_NORMAL + CV_COVAR_ROWS + CV_COVAR_USE_AVG + CV_COVAR_SCALE, CV_64FC1);
+        weights.at<double>(clusterIndex) = static_cast<double>(clusterSamples.rows)/static_cast<double>(nsamples);
     }
 
-    if( sample_data != _sample->data.fl )
-        cvFree( &sample_data );
-
-    return (float)cls;
+    decomposeCovs();
 }
 
-
-
-bool CvEM::train( const CvMat* _samples, const CvMat* _sample_idx,
-                  CvEMParams _params, CvMat* labels )
+void EM::computeLogWeightDivDet()
 {
-    bool result = false;
-    CvVectors train_data;
-    CvMat* sample_idx = 0;
-
-    train_data.data.fl = 0;
-    train_data.count = 0;
+    CV_Assert(!covsEigenValues.empty());
 
-    CV_FUNCNAME("cvEM");
+    Mat logWeights;
+    cv::max(weights, DBL_MIN, weights);
+    log(weights, logWeights);
 
-    __BEGIN__;
+    logWeightDivDet.create(1, nclusters, CV_64FC1);
+    // note: logWeightDivDet = log(weight_k) - 0.5 * log(|det(cov_k)|)
 
-    int i, nsamples, nclusters, dims;
-
-    clear();
-
-    CV_CALL( cvPrepareTrainData( "cvEM",
-        _samples, CV_ROW_SAMPLE, 0, CV_VAR_CATEGORICAL,
-        0, _sample_idx, false, (const float***)&train_data.data.fl,
-        &train_data.count, &train_data.dims, &train_data.dims,
-        0, 0, 0, &sample_idx ));
-
-    CV_CALL( set_params( _params, train_data ));
-    nsamples = train_data.count;
-    nclusters = params.nclusters;
-    dims = train_data.dims;
-
-    if( labels && (!CV_IS_MAT(labels) || CV_MAT_TYPE(labels->type) != CV_32SC1 ||
-        (labels->cols != 1 && labels->rows != 1) || labels->cols + labels->rows - 1 != nsamples ))
-        CV_ERROR( CV_StsBadArg,
-        "labels array (when passed) must be a valid 1d integer vector of <sample_count> elements" );
-
-    if( nsamples <= nclusters )
-        CV_ERROR( CV_StsOutOfRange,
-        "The number of samples should be greater than the number of clusters" );
-
-    CV_CALL( log_weight_div_det = cvCreateMat( 1, nclusters, CV_64FC1 ));
-    CV_CALL( probs  = cvCreateMat( nsamples, nclusters, CV_64FC1 ));
-    CV_CALL( means = cvCreateMat( nclusters, dims, CV_64FC1 ));
-    CV_CALL( weights = cvCreateMat( 1, nclusters, CV_64FC1 ));
-    CV_CALL( inv_eigen_values = cvCreateMat( nclusters,
-        params.cov_mat_type == COV_MAT_SPHERICAL ? 1 : dims, CV_64FC1 ));
-    CV_CALL( covs = (CvMat**)cvAlloc( nclusters * sizeof(*covs) ));
-    CV_CALL( cov_rotate_mats = (CvMat**)cvAlloc( nclusters * sizeof(cov_rotate_mats[0]) ));
-
-    for( i = 0; i < nclusters; i++ )
+    for(int clusterIndex = 0; clusterIndex < nclusters; clusterIndex++)
     {
-        CV_CALL( covs[i] = cvCreateMat( dims, dims, CV_64FC1 ));
-        CV_CALL( cov_rotate_mats[i]  = cvCreateMat( dims, dims, CV_64FC1 ));
-        cvZero( cov_rotate_mats[i] );
-    }
+        double logDetCov = 0.;
+        for(int di = 0; di < covsEigenValues[clusterIndex].cols; di++)
+            logDetCov += std::log(covsEigenValues[clusterIndex].at<double>(covMatType != EM::COV_MAT_SPHERICAL ? di : 0));
 
-    init_em( train_data );
-    log_likelihood = run_em( train_data );
-
-    if( log_likelihood <= -DBL_MAX/10000. )
-        EXIT;
+        logWeightDivDet.at<double>(clusterIndex) = logWeights.at<double>(clusterIndex) - 0.5 * logDetCov;
+    }
+}
 
-    if( labels )
+bool EM::doTrain(int startStep, OutputArray labels, OutputArray probs, OutputArray logLikelihoods)
+{
+    int dim = trainSamples.cols;
+    // Precompute the empty initial train data in the cases of EM::START_E_STEP and START_AUTO_STEP
+    if(startStep != EM::START_M_STEP)
     {
-        if( nclusters == 1 )
-            cvZero( labels );
-        else
+        if(covs.empty())
         {
-            CvMat sample = cvMat( 1, dims, CV_32F );
-            CvMat prob = cvMat( 1, nclusters, CV_64F );
-            int lstep = CV_IS_MAT_CONT(labels->type) ? 1 : labels->step/sizeof(int);
-
-            for( i = 0; i < nsamples; i++ )
-            {
-                int idx = sample_idx ? sample_idx->data.i[i] : i;
-                sample.data.ptr = _samples->data.ptr + _samples->step*idx;
-                prob.data.ptr = probs->data.ptr + probs->step*i;
-
-                labels->data.i[i*lstep] = cvRound(predict(&sample, &prob));
-            }
+            CV_Assert(weights.empty());
+            clusterTrainSamples();
         }
     }
 
-    result = true;
-
-    __END__;
-
-    if( sample_idx != _sample_idx )
-        cvReleaseMat( &sample_idx );
-
-    cvFree( &train_data.data.ptr );
-
-    return result;
-}
+    if(!covs.empty() && covsEigenValues.empty() )
+    {
+        CV_Assert(invCovsEigenValues.empty());
+        decomposeCovs();
+    }
 
+    if(startStep == EM::START_M_STEP)
+        mStep();
 
-void CvEM::init_em( const CvVectors& train_data )
-{
-    CvMat *w = 0, *u = 0, *tcov = 0;
+    double trainLogLikelihood, prevTrainLogLikelihood = 0.;
+    for(int iter = 0; ; iter++)
+    {
+        eStep();
+        trainLogLikelihood = sum(trainLogLikelihoods)[0];
 
-    CV_FUNCNAME( "CvEM::init_em" );
+        if(iter >= maxIters - 1)
+            break;
 
-    __BEGIN__;
+        double trainLogLikelihoodDelta = trainLogLikelihood - prevTrainLogLikelihood;
+        if( iter != 0 &&
+            (trainLogLikelihoodDelta < -DBL_EPSILON ||
+             trainLogLikelihoodDelta < epsilon * std::fabs(trainLogLikelihood)))
+            break;
 
-    double maxval = 0;
-    int i, force_symm_plus = 0;
-    int nclusters = params.nclusters, nsamples = train_data.count, dims = train_data.dims;
+        mStep();
 
-    if( params.start_step == START_AUTO_STEP || nclusters == 1 || nclusters == nsamples )
-        init_auto( train_data );
-    else if( params.start_step == START_M_STEP )
-    {
-        for( i = 0; i < nsamples; i++ )
-        {
-            CvMat prob;
-            cvGetRow( params.probs, &prob, i );
-            cvMaxS( &prob, 0., &prob );
-            cvMinMaxLoc( &prob, 0, &maxval );
-            if( maxval < FLT_EPSILON )
-                cvSet( &prob, cvScalar(1./nclusters) );
-            else
-                cvNormalize( &prob, &prob, 1., 0, CV_L1 );
-        }
-        EXIT; // do not preprocess covariation matrices,
-              // as in this case they are initialized at the first iteration of EM
+        prevTrainLogLikelihood = trainLogLikelihood;
     }
-    else
+
+    if( trainLogLikelihood <= -DBL_MAX/10000. )
     {
-        CV_ASSERT( params.start_step == START_E_STEP && params.means );
-        if( params.weights && params.covs )
-        {
-            cvConvert( params.means, means );
-            cvReshape( weights, weights, 1, params.weights->rows );
-            cvConvert( params.weights, weights );
-            cvReshape( weights, weights, 1, 1 );
-            cvMaxS( weights, 0., weights );
-            cvMinMaxLoc( weights, 0, &maxval );
-            if( maxval < FLT_EPSILON )
-                cvSet( weights, cvScalar(1./nclusters) );
-            cvNormalize( weights, weights, 1., 0, CV_L1 );
-            for( i = 0; i < nclusters; i++ )
-                CV_CALL( cvConvert( params.covs[i], covs[i] ));
-            force_symm_plus = 1;
-        }
-        else
-            init_auto( train_data );
+        clear();
+        return false;
     }
 
-    CV_CALL( tcov = cvCreateMat( dims, dims, CV_64FC1 ));
-    CV_CALL( w = cvCreateMat( dims, dims, CV_64FC1 ));
-    if( params.cov_mat_type != COV_MAT_SPHERICAL )
-        CV_CALL( u = cvCreateMat( dims, dims, CV_64FC1 ));
-
-    for( i = 0; i < nclusters; i++ )
+    // postprocess covs
+    covs.resize(nclusters);
+    for(int clusterIndex = 0; clusterIndex < nclusters; clusterIndex++)
     {
-        if( force_symm_plus )
+        if(covMatType == EM::COV_MAT_SPHERICAL)
         {
-            cvTranspose( covs[i], tcov );
-            cvAddWeighted( covs[i], 0.5, tcov, 0.5, 0, tcov );
+            covs[clusterIndex].create(dim, dim, CV_64FC1);
+            setIdentity(covs[clusterIndex], Scalar(covsEigenValues[clusterIndex].at<double>(0)));
         }
-        else
-            cvCopy( covs[i], tcov );
-        cvSVD( tcov, w, u, 0, CV_SVD_MODIFY_A + CV_SVD_U_T + CV_SVD_V_T );
-        if( params.cov_mat_type == COV_MAT_SPHERICAL )
-            cvSetIdentity( covs[i], cvScalar(cvTrace(w).val[0]/dims) );
-        /*else if( params.cov_mat_type == COV_MAT_DIAGONAL )
-            cvCopy( w, covs[i] );*/
-        else
+        else if(covMatType == EM::COV_MAT_DIAGONAL)
         {
-            // generic case: covs[i] = (u')'*max(w,0)*u'
-            cvGEMM( u, w, 1, 0, 0, tcov, CV_GEMM_A_T );
-            cvGEMM( tcov, u, 1, 0, 0, covs[i], 0 );
+            covs[clusterIndex] = Mat::diag(covsEigenValues[clusterIndex]);
         }
     }
-
-    __END__;
-
-    cvReleaseMat( &w );
-    cvReleaseMat( &u );
-    cvReleaseMat( &tcov );
+    
+    if(labels.needed())
+        trainLabels.copyTo(labels);
+    if(probs.needed())
+        trainProbs.copyTo(probs);
+    if(logLikelihoods.needed())
+        trainLogLikelihoods.copyTo(logLikelihoods);
+    
+    trainSamples.release();
+    trainProbs.release();
+    trainLabels.release();
+    trainLogLikelihoods.release();
+    trainCounts.release();
+
+    return true;
 }
 
-
-void CvEM::init_auto( const CvVectors& train_data )
+void EM::computeProbabilities(const Mat& sample, int& label, Mat* probs, double* logLikelihood) const
 {
-    CvMat* hdr = 0;
-    const void** vec = 0;
-    CvMat* class_ranges = 0;
-    CvMat* labels = 0;
-
-    CV_FUNCNAME( "CvEM::init_auto" );
+    // L_ik = log(weight_k) - 0.5 * log(|det(cov_k)|) - 0.5 *(x_i - mean_k)' cov_k^(-1) (x_i - mean_k)]
+    // q = arg(max_k(L_ik))
+    // probs_ik = exp(L_ik - L_iq) / (1 + sum_j!=q (exp(L_ij - L_iq))
+    // see Alex Smola's blog http://blog.smola.org/page/2 for
+    // details on the log-sum-exp trick
 
-    __BEGIN__;
+    CV_Assert(!means.empty());
+    CV_Assert(sample.type() == CV_64FC1);
+    CV_Assert(sample.rows == 1);
+    CV_Assert(sample.cols == means.cols);
 
-    int nclusters = params.nclusters, nsamples = train_data.count, dims = train_data.dims;
-    int i, j;
+    int dim = sample.cols;
 
-    if( nclusters == nsamples )
+    Mat L(1, nclusters, CV_64FC1);
+    label = 0;
+    for(int clusterIndex = 0; clusterIndex < nclusters; clusterIndex++)
     {
-        CvMat src = cvMat( 1, dims, CV_32F );
-        CvMat dst = cvMat( 1, dims, CV_64F );
-        for( i = 0; i < nsamples; i++ )
-        {
-            src.data.ptr = train_data.data.ptr[i];
-            dst.data.ptr = means->data.ptr + means->step*i;
-            cvConvert( &src, &dst );
-            cvZero( covs[i] );
-            cvSetIdentity( cov_rotate_mats[i] );
-        }
-        cvSetIdentity( probs );
-        cvSet( weights, cvScalar(1./nclusters) );
-    }
-    else
-    {
-        int max_count = 0;
+        const Mat centeredSample = sample - means.row(clusterIndex);
 
-        CV_CALL( class_ranges = cvCreateMat( 1, nclusters+1, CV_32SC1 ));
-        if( nclusters > 1 )
-        {
-            CV_CALL( labels = cvCreateMat( 1, nsamples, CV_32SC1 ));
-
-            // Not fully executed in case means are already given
-            kmeans( train_data, nclusters, labels, cvTermCriteria( CV_TERMCRIT_ITER,
-                    params.means ? 1 : 10, 0.5 ), params.means );
+        Mat rotatedCenteredSample = covMatType != EM::COV_MAT_GENERIC ?
+                centeredSample : centeredSample * covsRotateMats[clusterIndex];
 
-            CV_CALL( cvSortSamplesByClasses( (const float**)train_data.data.fl,
-                                            labels, class_ranges->data.i ));
-        }
-        else
+        double Lval = 0;
+        for(int di = 0; di < dim; di++)
         {
-            class_ranges->data.i[0] = 0;
-            class_ranges->data.i[1] = nsamples;
+            double w = invCovsEigenValues[clusterIndex].at<double>(covMatType != EM::COV_MAT_SPHERICAL ? di : 0);
+            double val = rotatedCenteredSample.at<double>(di);
+            Lval += w * val * val;
         }
+        CV_DbgAssert(!logWeightDivDet.empty());
+        Lval = logWeightDivDet.at<double>(clusterIndex) - 0.5 * Lval;
+        L.at<double>(clusterIndex) = Lval;
 
-        for( i = 0; i < nclusters; i++ )
-        {
-            int left = class_ranges->data.i[i], right = class_ranges->data.i[i+1];
-            max_count = MAX( max_count, right - left );
-        }
-        CV_CALL( hdr = (CvMat*)cvAlloc( max_count*sizeof(hdr[0]) ));
-        CV_CALL( vec = (const void**)cvAlloc( max_count*sizeof(vec[0]) ));
-        hdr[0] = cvMat( 1, dims, CV_32F );
-        for( i = 0; i < max_count; i++ )
-        {
-            vec[i] = hdr + i;
-            hdr[i] = hdr[0];
-        }
-
-        for( i = 0; i < nclusters; i++ )
-        {
-            int left = class_ranges->data.i[i], right = class_ranges->data.i[i+1];
-            int cluster_size = right - left;
-            CvMat avg;
+        if(Lval > L.at<double>(label))
+            label = clusterIndex;
+    }
 
-            if( cluster_size <= 0 )
-                continue;
+    if(!probs && !logLikelihood)
+        return;
 
-            for( j = left; j < right; j++ )
-                hdr[j - left].data.fl = train_data.data.fl[j];
+    double maxLVal = L.at<double>(label);
+    Mat expL_Lmax = L; // exp(L_ij - L_iq)
+    for(int i = 0; i < L.cols; i++)
+        expL_Lmax.at<double>(i) = std::exp(L.at<double>(i) - maxLVal);
+    double expDiffSum = sum(expL_Lmax)[0]; // sum_j(exp(L_ij - L_iq))
 
-            CV_CALL( cvGetRow( means, &avg, i ));
-            CV_CALL( cvCalcCovarMatrix( vec, cluster_size, covs[i],
-                &avg, CV_COVAR_NORMAL | CV_COVAR_SCALE ));
-            weights->data.db[i] = (double)cluster_size/(double)nsamples;
-        }
+    if(probs)
+    {
+        probs->create(1, nclusters, CV_64FC1);
+        double factor = 1./expDiffSum;
+        expL_Lmax *= factor;
+        expL_Lmax.copyTo(*probs);
     }
 
-    __END__;
-
-    cvReleaseMat( &class_ranges );
-    cvReleaseMat( &labels );
-    cvFree( &hdr );
-    cvFree( &vec );
+    if(logLikelihood)
+        *logLikelihood = std::log(expDiffSum)  + maxLVal - 0.5 * dim * CV_LOG2PI;
 }
 
-
-void CvEM::kmeans( const CvVectors& train_data, int nclusters, CvMat* labels,
-                   CvTermCriteria termcrit, const CvMat* /*centers0*/ )
+void EM::eStep()
 {
-    int i, nsamples = train_data.count, dims = train_data.dims;
-    cv::Ptr<CvMat> temp_mat = cvCreateMat(nsamples, dims, CV_32F);
-
-    for( i = 0; i < nsamples; i++ )
-        memcpy( temp_mat->data.ptr + temp_mat->step*i, train_data.data.fl[i], dims*sizeof(float));
-
-    cvKMeans2(temp_mat, nclusters, labels, termcrit, 10);
-}
-
+    // Compute probs_ik from means_k, covs_k and weights_k.
+    trainProbs.create(trainSamples.rows, nclusters, CV_64FC1);
+    trainLabels.create(trainSamples.rows, 1, CV_32SC1);
+    trainLogLikelihoods.create(trainSamples.rows, 1, CV_64FC1);
 
-/****************************************************************************************/
-/* log_weight_div_det[k] = -2*log(weights_k) + log(det(Sigma_k)))
+    computeLogWeightDivDet();
 
-   covs[k] = cov_rotate_mats[k] * cov_eigen_values[k] * (cov_rotate_mats[k])'
-   cov_rotate_mats[k] are orthogonal matrices of eigenvectors and
-   cov_eigen_values[k] are diagonal matrices (represented by 1D vectors) of eigen values.
+    CV_DbgAssert(trainSamples.type() == CV_64FC1);
+    CV_DbgAssert(means.type() == CV_64FC1);
 
-   The <alpha_ik> is the probability of the vector x_i to belong to the k-th cluster:
-   <alpha_ik> ~ weights_k * exp{ -0.5[ln(det(Sigma_k)) + (x_i - mu_k)' Sigma_k^(-1) (x_i - mu_k)] }
-   We calculate these probabilities here by the equivalent formulae:
-   Denote
-   S_ik = -0.5(log(det(Sigma_k)) + (x_i - mu_k)' Sigma_k^(-1) (x_i - mu_k)) + log(weights_k),
-   M_i = max_k S_ik = S_qi, so that the q-th class is the one where maximum reaches. Then
-   alpha_ik = exp{ S_ik - M_i } / ( 1 + sum_j!=q exp{ S_ji - M_i })
-*/
-double CvEM::run_em( const CvVectors& train_data )
-{
-    CvMat* centered_sample = 0;
-    CvMat* covs_item = 0;
-    CvMat* log_det = 0;
-    CvMat* log_weights = 0;
-    CvMat* cov_eigen_values = 0;
-    CvMat* samples = 0;
-    CvMat* sum_probs = 0;
-    log_likelihood = -DBL_MAX;
-
-    CV_FUNCNAME( "CvEM::run_em" );
-    __BEGIN__;
-
-    int nsamples = train_data.count, dims = train_data.dims, nclusters = params.nclusters;
-    double min_variation = FLT_EPSILON;
-    double min_det_value = MAX( DBL_MIN, pow( min_variation, dims ));
-    double _log_likelihood = -DBL_MAX;
-    int start_step = params.start_step;
-    double sum_max_val;
-
-    int i, j, k, n;
-    int is_general = 0, is_diagonal = 0, is_spherical = 0;
-    double prev_log_likelihood = -DBL_MAX / 1000., det, d;
-    CvMat whdr, iwhdr, diag, *w, *iw;
-    double* w_data;
-    double* sp_data;
-
-    if( nclusters == 1 )
+    for(int sampleIndex = 0; sampleIndex < trainSamples.rows; sampleIndex++)
     {
-        double log_weight;
-        CV_CALL( cvSet( probs, cvScalar(1.)) );
-
-        if( params.cov_mat_type == COV_MAT_SPHERICAL )
-        {
-            d = cvTrace(*covs).val[0]/dims;
-            d = MAX( d, FLT_EPSILON );
-            inv_eigen_values->data.db[0] = 1./d;
-            log_weight = pow( d, dims*0.5 );
-        }
-        else
-        {
-            w_data = inv_eigen_values->data.db;
-
-            if( params.cov_mat_type == COV_MAT_GENERIC )
-                cvSVD( *covs, inv_eigen_values, *cov_rotate_mats, 0, CV_SVD_U_T );
-            else
-                cvTranspose( cvGetDiag(*covs, &diag), inv_eigen_values );
-
-            cvMaxS( inv_eigen_values, FLT_EPSILON, inv_eigen_values );
-            for( j = 0, det = 1.; j < dims; j++ )
-                det *= w_data[j];
-            log_weight = sqrt(det);
-            cvDiv( 0, inv_eigen_values, inv_eigen_values );
-        }
-
-        log_weight_div_det->data.db[0] = -2*log(weights->data.db[0]/log_weight);
-        log_likelihood = DBL_MAX/1000.;
-        EXIT;
+        Mat sampleProbs = trainProbs.row(sampleIndex);
+        computeProbabilities(trainSamples.row(sampleIndex), trainLabels.at<int>(sampleIndex),
+                             &sampleProbs, &trainLogLikelihoods.at<double>(sampleIndex));
     }
+}
 
-    if( params.cov_mat_type == COV_MAT_GENERIC )
-        is_general  = 1;
-    else if( params.cov_mat_type == COV_MAT_DIAGONAL )
-        is_diagonal = 1;
-    else if( params.cov_mat_type == COV_MAT_SPHERICAL )
-        is_spherical  = 1;
-    /* In the case of <cov_mat_type> == COV_MAT_DIAGONAL, the k-th row of cov_eigen_values
-    contains the diagonal elements (variations). In the case of
-    <cov_mat_type> == COV_MAT_SPHERICAL - the 0-ths elements of the vectors cov_eigen_values[k]
-    are to be equal to the mean of the variations over all the dimensions. */
-
-    CV_CALL( log_det = cvCreateMat( 1, nclusters, CV_64FC1 ));
-    CV_CALL( log_weights = cvCreateMat( 1, nclusters, CV_64FC1 ));
-    CV_CALL( covs_item = cvCreateMat( dims, dims, CV_64FC1 ));
-    CV_CALL( centered_sample = cvCreateMat( 1, dims, CV_64FC1 ));
-    CV_CALL( cov_eigen_values = cvCreateMat( inv_eigen_values->rows, inv_eigen_values->cols, CV_64FC1 ));
-    CV_CALL( samples = cvCreateMat( nsamples, dims, CV_64FC1 ));
-    CV_CALL( sum_probs = cvCreateMat( 1, nclusters, CV_64FC1 ));
-    sp_data = sum_probs->data.db;
-
-    // copy the training data into double-precision matrix
-    for( i = 0; i < nsamples; i++ )
-    {
-        const float* src = train_data.data.fl[i];
-        double* dst = (double*)(samples->data.ptr + samples->step*i);
+void EM::mStep()
+{
+    trainCounts.create(1, nclusters, CV_32SC1);
+    trainCounts = Scalar(0);
 
-        for( j = 0; j < dims; j++ )
-            dst[j] = src[j];
-    }
+    for(int sampleIndex = 0; sampleIndex < trainLabels.rows; sampleIndex++)
+        trainCounts.at<int>(trainLabels.at<int>(sampleIndex))++;
 
-    if( start_step != START_M_STEP )
+    if(countNonZero(trainCounts) != (int)trainCounts.total())
     {
-        for( k = 0; k < nclusters; k++ )
-        {
-            if( is_general || is_diagonal )
-            {
-                w = cvGetRow( cov_eigen_values, &whdr, k );
-                if( is_general )
-                    cvSVD( covs[k], w, cov_rotate_mats[k], 0, CV_SVD_U_T );
-                else
-                    cvTranspose( cvGetDiag( covs[k], &diag ), w );
-                w_data = w->data.db;
-                for( j = 0, det = 0.; j < dims; j++ )
-                    det += std::log(w_data[j]);
-                if( det < std::log(min_det_value) )
-                {
-                    if( start_step == START_AUTO_STEP )
-                        det = std::log(min_det_value);
-                    else
-                        EXIT;
-                }
-                log_det->data.db[k] = det;
-            }
-            else // spherical
-            {
-                d = cvTrace(covs[k]).val[0]/(double)dims;
-                if( d < min_variation )
-                {
-                    if( start_step == START_AUTO_STEP )
-                        d = min_variation;
-                    else
-                        EXIT;
-                }
-                cov_eigen_values->data.db[k] = d;
-                log_det->data.db[k] = d;
-            }
-        }
-
-        if( is_spherical )
-        {
-            cvLog( log_det, log_det );
-            cvScale( log_det, log_det, dims );
-        }
+        clusterTrainSamples();
     }
-
-    for( n = 0; n < params.term_crit.max_iter; n++ )
+    else
     {
-        if( n > 0 || start_step != START_M_STEP )
-        {
-            // e-step: compute probs_ik from means_k, covs_k and weights_k.
-            CV_CALL(cvLog( weights, log_weights ));
-
-            sum_max_val = 0.;
-            // S_ik = -0.5[log(det(Sigma_k)) + (x_i - mu_k)' Sigma_k^(-1) (x_i - mu_k)] + log(weights_k)
-            for( k = 0; k < nclusters; k++ )
-            {
-                CvMat* u = cov_rotate_mats[k];
-                const double* mean = (double*)(means->data.ptr + means->step*k);
-                w = cvGetRow( cov_eigen_values, &whdr, k );
-                iw = cvGetRow( inv_eigen_values, &iwhdr, k );
-                cvDiv( 0, w, iw );
+        // Update means_k, covs_k and weights_k from probs_ik
+        int dim = trainSamples.cols;
 
-                w_data = (double*)(inv_eigen_values->data.ptr + inv_eigen_values->step*k);
+        // Update weights
+        // not normalized first
+        reduce(trainProbs, weights, 0, CV_REDUCE_SUM);
 
-                for( i = 0; i < nsamples; i++ )
-                {
-                    double *csample = centered_sample->data.db, p = log_det->data.db[k];
-                    const double* sample = (double*)(samples->data.ptr + samples->step*i);
-                    double* pp = (double*)(probs->data.ptr + probs->step*i);
-                    for( j = 0; j < dims; j++ )
-                        csample[j] = sample[j] - mean[j];
-                    if( is_general )
-                        cvGEMM( centered_sample, u, 1, 0, 0, centered_sample, CV_GEMM_B_T );
-                    for( j = 0; j < dims; j++ )
-                        p += csample[j]*csample[j]*w_data[is_spherical ? 0 : j];
-                    //pp[k] = -0.5*p + log_weights->data.db[k];
-                    pp[k] = -0.5*(p+CV_LOG2PI * (double)dims) + log_weights->data.db[k];
-
-                    // S_ik <- S_ik - max_j S_ij
-                    if( k == nclusters - 1 )
-                    {
-                        double max_val = pp[0];
-                        for( j = 1; j < nclusters; j++ )
-                            max_val = MAX( max_val, pp[j] );
-                        sum_max_val += max_val;
-                        for( j = 0; j < nclusters; j++ )
-                            pp[j] -= max_val;
-                    }
-                }
-            }
-
-            CV_CALL(cvExp( probs, probs )); // exp( S_ik )
-            cvZero( sum_probs );
-
-            // alpha_ik = exp( S_ik ) / sum_j exp( S_ij ),
-            // log_likelihood = sum_i log (sum_j exp(S_ij))
-            for( i = 0, _log_likelihood = 0; i < nsamples; i++ )
-            {
-                double* pp = (double*)(probs->data.ptr + probs->step*i), sum = 0;
-                for( j = 0; j < nclusters; j++ )
-                    sum += pp[j];
-                sum = 1./MAX( sum, DBL_EPSILON );
-                for( j = 0; j < nclusters; j++ )
-                {
-                    double p = pp[j] *= sum;
-                    sp_data[j] += p;
-                }
-                _log_likelihood -= log( sum );
-            }
-            _log_likelihood+=sum_max_val;
-
-            // Check termination criteria. Use the same termination criteria as it is used in MATLAB
-            log_likelihood_delta = _log_likelihood - prev_log_likelihood;
-//            if( n>0 )
-//                fprintf(stderr, "iter=%d, ll=%0.5f (delta=%0.5f, goal=%0.5f)\n",
-//                     n, _log_likelihood, delta,   params.term_crit.epsilon * fabs( _log_likelihood));
-             if ( log_likelihood_delta > 0 && log_likelihood_delta < params.term_crit.epsilon * std::fabs( _log_likelihood) )
-                 break;
-            prev_log_likelihood = _log_likelihood;
+        // Update means
+        means.create(nclusters, dim, CV_64FC1);
+        means = Scalar(0);
+        for(int clusterIndex = 0; clusterIndex < nclusters; clusterIndex++)
+        {
+            Mat clusterMean = means.row(clusterIndex);
+            for(int sampleIndex = 0; sampleIndex < trainSamples.rows; sampleIndex++)
+                clusterMean += trainProbs.at<double>(sampleIndex, clusterIndex) * trainSamples.row(sampleIndex);
+            clusterMean /= weights.at<double>(clusterIndex);
         }
 
-        // m-step: update means_k, covs_k and weights_k from probs_ik
-        cvGEMM( probs, samples, 1, 0, 0, means, CV_GEMM_A_T );
-
-        for( k = 0; k < nclusters; k++ )
+        // Update covsEigenValues and invCovsEigenValues
+        covs.resize(nclusters);
+        covsEigenValues.resize(nclusters);
+        if(covMatType == EM::COV_MAT_GENERIC)
+            covsRotateMats.resize(nclusters);
+        invCovsEigenValues.resize(nclusters);
+        for(int clusterIndex = 0; clusterIndex < nclusters; clusterIndex++)
         {
-            double sum = sp_data[k], inv_sum = 1./sum;
-            CvMat* cov = covs[k], _mean, _sample;
-
-            w = cvGetRow( cov_eigen_values, &whdr, k );
-            w_data = w->data.db;
-            cvGetRow( means, &_mean, k );
-            cvGetRow( samples, &_sample, k );
+            if(covMatType != EM::COV_MAT_SPHERICAL)
+                covsEigenValues[clusterIndex].create(1, dim, CV_64FC1);
+            else
+                covsEigenValues[clusterIndex].create(1, 1, CV_64FC1);
 
-            // update weights_k
-            weights->data.db[k] = sum;
+            if(covMatType == EM::COV_MAT_GENERIC)
+                covs[clusterIndex].create(dim, dim, CV_64FC1);
 
-            // update means_k
-            cvScale( &_mean, &_mean, inv_sum );
+            Mat clusterCov = covMatType != EM::COV_MAT_GENERIC ?
+                covsEigenValues[clusterIndex] : covs[clusterIndex];
 
-            // compute covs_k
-            cvZero( cov );
-            cvZero( w );
+            clusterCov = Scalar(0);
 
-            for( i = 0; i < nsamples; i++ )
+            Mat centeredSample;
+            for(int sampleIndex = 0; sampleIndex < trainSamples.rows; sampleIndex++)
             {
-                double p = probs->data.db[i*nclusters + k]*inv_sum;
-                _sample.data.db = (double*)(samples->data.ptr + samples->step*i);
+                centeredSample = trainSamples.row(sampleIndex) - means.row(clusterIndex);
 
-                if( is_general )
-                {
-                    cvMulTransposed( &_sample, covs_item, 1, &_mean );
-                    cvScaleAdd( covs_item, cvRealScalar(p), cov, cov );
-                }
+                if(covMatType == EM::COV_MAT_GENERIC)
+                    clusterCov += trainProbs.at<double>(sampleIndex, clusterIndex) * centeredSample.t() * centeredSample;
                 else
-                    for( j = 0; j < dims; j++ )
+                {
+                    double p = trainProbs.at<double>(sampleIndex, clusterIndex);
+                    for(int di = 0; di < dim; di++ )
                     {
-                        double val = _sample.data.db[j] - _mean.data.db[j];
-                        w_data[is_spherical ? 0 : j] += p*val*val;
+                        double val = centeredSample.at<double>(di);
+                        clusterCov.at<double>(covMatType != EM::COV_MAT_SPHERICAL ? di : 0) += p*val*val;
                     }
+                }
             }
 
-            if( is_spherical )
-            {
-                d = w_data[0]/(double)dims;
-                d = MAX( d, min_variation );
-                w->data.db[0] = d;
-                log_det->data.db[k] = d;
-            }
-            else
+            if(covMatType == EM::COV_MAT_SPHERICAL)
+                clusterCov /= dim;
+
+            clusterCov /= weights.at<double>(clusterIndex);
+
+            // Update covsRotateMats for EM::COV_MAT_GENERIC only
+            if(covMatType == EM::COV_MAT_GENERIC)
             {
-                // Det. of general NxN cov. matrix is the prod. of the eig. vals
-                if( is_general )
-                    cvSVD( cov, w, cov_rotate_mats[k], 0, CV_SVD_U_T );
-                cvMaxS( w, min_variation, w );
-                for( j = 0, det = 0.; j < dims; j++ )
-                    det += std::log( w_data[j] );
-                log_det->data.db[k] = det;
+                SVD svd(covs[clusterIndex], SVD::MODIFY_A + SVD::FULL_UV);
+                covsEigenValues[clusterIndex] = svd.w;
+                covsRotateMats[clusterIndex] = svd.u;
             }
-        }
 
-        cvConvertScale( weights, weights, 1./(double)nsamples, 0 );
-        cvMaxS( weights, DBL_MIN, weights );
+            max(covsEigenValues[clusterIndex], minEigenValue, covsEigenValues[clusterIndex]);
 
-        if( is_spherical )
-        {
-            cvLog( log_det, log_det );
-            cvScale( log_det, log_det, dims );
+            // update invCovsEigenValues
+            invCovsEigenValues[clusterIndex] = 1./covsEigenValues[clusterIndex];
         }
-    } // end of iteration process
 
-    //log_weight_div_det[k] = -2*log(weights_k/det(Sigma_k))^0.5) = -2*log(weights_k) + log(det(Sigma_k)))
-    if( log_weight_div_det )
-    {
-        cvScale( log_weights, log_weight_div_det, -2 );
-        cvAdd( log_weight_div_det, log_det, log_weight_div_det );
-    }
-
-    /* Now finalize all the covariation matrices:
-    1) if <cov_mat_type> == COV_MAT_DIAGONAL we used array of <w> as diagonals.
-       Now w[k] should be copied back to the diagonals of covs[k];
-    2) if <cov_mat_type> == COV_MAT_SPHERICAL we used the 0-th element of w[k]
-       as an average variation in each cluster. The value of the 0-th element of w[k]
-       should be copied to the all of the diagonal elements of covs[k]. */
-    if( is_spherical )
-    {
-        for( k = 0; k < nclusters; k++ )
-            cvSetIdentity( covs[k], cvScalar(cov_eigen_values->data.db[k]));
+        // Normalize weights
+        weights /= trainSamples.rows;
     }
-    else if( is_diagonal )
-    {
-        for( k = 0; k < nclusters; k++ )
-            cvTranspose( cvGetRow( cov_eigen_values, &whdr, k ),
-                         cvGetDiag( covs[k], &diag ));
-    }
-    cvDiv( 0, cov_eigen_values, inv_eigen_values );
-
-    log_likelihood = _log_likelihood;
-
-    __END__;
-
-    cvReleaseMat( &log_det );
-    cvReleaseMat( &log_weights );
-    cvReleaseMat( &covs_item );
-    cvReleaseMat( &centered_sample );
-    cvReleaseMat( &cov_eigen_values );
-    cvReleaseMat( &samples );
-    cvReleaseMat( &sum_probs );
-
-    return log_likelihood;
 }
 
-
-int CvEM::get_nclusters() const
+void EM::read(const FileNode& fn)
 {
-    return params.nclusters;
-}
+    Algorithm::read(fn);
 
-const CvMat* CvEM::get_means() const
-{
-    return means;
+    decomposeCovs();
+    computeLogWeightDivDet();
 }
 
-const CvMat** CvEM::get_covs() const
+static Algorithm* createEM()
 {
-    return (const CvMat**)covs;
+    return new EM;
 }
+static AlgorithmInfo em_info("StatModel.EM", createEM);
 
-const CvMat* CvEM::get_weights() const
+AlgorithmInfo* EM::info() const
 {
-    return weights;
-}
-
-const CvMat* CvEM::get_probs() const
-{
-    return probs;
-}
-
-using namespace cv;
-
-CvEM::CvEM( const Mat& samples, const Mat& sample_idx, CvEMParams params )
-{
-    means = weights = probs = inv_eigen_values = log_weight_div_det = 0;
-    covs = cov_rotate_mats = 0;
-
-    // just invoke the train() method
-    train(samples, sample_idx, params);
-}
-
-bool CvEM::train( const Mat& _samples, const Mat& _sample_idx,
-                 CvEMParams _params, Mat* _labels )
-{
-    CvMat samples = _samples, sidx = _sample_idx, labels, *plabels = 0;
-
-    if( _labels )
+    static volatile bool initialized = false;
+    if( !initialized )
     {
-        int nsamples = sidx.data.ptr ? sidx.rows : samples.rows;
+        EM obj;
+        em_info.addParam(obj, "nclusters", obj.nclusters);
+        em_info.addParam(obj, "covMatType", obj.covMatType);
 
-        if( !(_labels->data && _labels->type() == CV_32SC1 &&
-              (_labels->cols == 1 || _labels->rows == 1) &&
-              _labels->cols + _labels->rows - 1 == nsamples) )
-            _labels->create(nsamples, 1, CV_32SC1);
-        plabels = &(labels = *_labels);
-    }
-    return train(&samples, sidx.data.ptr ? &sidx : 0, _params, plabels);
-}
-
-float
-CvEM::predict( const Mat& _sample, Mat* _probs ) const
-{
-    CvMat sample = _sample, probs, *pprobs = 0;
+        em_info.addParam(obj, "weights", obj.weights);
+        em_info.addParam(obj, "means", obj.means);
+        em_info.addParam(obj, "covs", obj.covs);
 
-    if( _probs )
-    {
-        int nclusters = params.nclusters;
-        if(!(_probs->data && (_probs->type() == CV_32F || _probs->type()==CV_64F) &&
-             (_probs->cols == 1 || _probs->rows == 1) &&
-             _probs->cols + _probs->rows - 1 == nclusters))
-            _probs->create(nclusters, 1, _sample.type());
-        pprobs = &(probs = *_probs);
+        initialized = true;
     }
-    return predict(&sample, pprobs);
+    return &em_info;
 }
-
-int CvEM::getNClusters() const
-{
-    return params.nclusters;
-}
-
-Mat CvEM::getMeans() const
-{
-    return Mat(means);
-}
-
-void CvEM::getCovs(vector<Mat>& _covs) const
-{
-    int i, n = params.nclusters;
-    _covs.resize(n);
-    for( i = 0; i < n; i++ )
-        Mat(covs[i]).copyTo(_covs[i]);
-}
-
-Mat CvEM::getWeights() const
-{
-    return Mat(weights);
-}
-
-Mat CvEM::getProbs() const
-{
-    return Mat(probs);
-}
-
+} // namespace cv
 
 /* End of file. */
index b38aa34..0460527 100644 (file)
@@ -1517,6 +1517,11 @@ CvERTrees::~CvERTrees()
 {
 }
 
+std::string CvERTrees::getName() const
+{
+    return CV_TYPE_NAME_ML_ERTREES;
+}
+
 bool CvERTrees::train( const CvMat* _train_data, int _tflag,
                         const CvMat* _responses, const CvMat* _var_idx,
                         const CvMat* _sample_idx, const CvMat* _var_type,
index 61614c2..81576c3 100644 (file)
@@ -246,6 +246,10 @@ CvRTrees::~CvRTrees()
     clear();
 }
 
+std::string CvRTrees::getName() const
+{
+    return CV_TYPE_NAME_ML_RTREES;
+}
 
 CvMat* CvRTrees::get_active_var_mask()
 {
@@ -726,7 +730,8 @@ void CvRTrees::write( CvFileStorage* fs, const char* name ) const
     if( ntrees < 1 || !trees || nsamples < 1 )
         CV_Error( CV_StsBadArg, "Invalid CvRTrees object" );
 
-    cvStartWriteStruct( fs, name, CV_NODE_MAP, CV_TYPE_NAME_ML_RTREES );
+    std::string modelNodeName = this->getName();
+    cvStartWriteStruct( fs, name, CV_NODE_MAP, modelNodeName.c_str() );
 
     cvWriteInt( fs, "nclasses", nclasses );
     cvWriteInt( fs, "nsamples", nsamples );
index 0576e73..ba0dec7 100644 (file)
 using namespace std;
 using namespace cv;
 
-void defaultDistribs( vector<Mat>& means, vector<Mat>& covs )
+static
+void defaultDistribs( Mat& means, vector<Mat>& covs, int type=CV_32FC1 )
 {
     float mp0[] = {0.0f, 0.0f}, cp0[] = {0.67f, 0.0f, 0.0f, 0.67f};
     float mp1[] = {5.0f, 0.0f}, cp1[] = {1.0f, 0.0f, 0.0f, 1.0f};
     float mp2[] = {1.0f, 5.0f}, cp2[] = {1.0f, 0.0f, 0.0f, 1.0f};
+    means.create(3, 2, type);
     Mat m0( 1, 2, CV_32FC1, mp0 ), c0( 2, 2, CV_32FC1, cp0 );
     Mat m1( 1, 2, CV_32FC1, mp1 ), c1( 2, 2, CV_32FC1, cp1 );
     Mat m2( 1, 2, CV_32FC1, mp2 ), c2( 2, 2, CV_32FC1, cp2 );
     means.resize(3), covs.resize(3);
-    m0.copyTo(means[0]), c0.copyTo(covs[0]);
-    m1.copyTo(means[1]), c1.copyTo(covs[1]);
-    m2.copyTo(means[2]), c2.copyTo(covs[2]);
+
+    Mat mr0 = means.row(0);
+    m0.convertTo(mr0, type);
+    c0.convertTo(covs[0], type);
+
+    Mat mr1 = means.row(1);
+    m1.convertTo(mr1, type);
+    c1.convertTo(covs[1], type);
+
+    Mat mr2 = means.row(2);
+    m2.convertTo(mr2, type);
+    c2.convertTo(covs[2], type);
 }
 
 // generate points sets by normal distributions
-void generateData( Mat& data, Mat& labels, const vector<int>& sizes, const vector<Mat>& means, const vector<Mat>& covs, int labelType )
+static
+void generateData( Mat& data, Mat& labels, const vector<int>& sizes, const Mat& _means, const vector<Mat>& covs, int dataType, int labelType )
 {
     vector<int>::const_iterator sit = sizes.begin();
     int total = 0;
     for( ; sit != sizes.end(); ++sit )
         total += *sit;
-    assert( means.size() == sizes.size() && covs.size() == sizes.size() );
-    assert( !data.empty() && data.rows == total );
-    assert( data.type() == CV_32FC1 );
+    CV_Assert( _means.rows == (int)sizes.size() && covs.size() == sizes.size() );
+    CV_Assert( !data.empty() && data.rows == total );
+    CV_Assert( data.type() == dataType );
     
     labels.create( data.rows, 1, labelType );
 
-    randn( data, Scalar::all(0.0), Scalar::all(1.0) );
+    randn( data, Scalar::all(-1.0), Scalar::all(1.0) );
+    vector<Mat> means(sizes.size());
+    for(int i = 0; i < _means.rows; i++)
+        means[i] = _means.row(i);
     vector<Mat>::const_iterator mit = means.begin(), cit = covs.begin();
     int bi, ei = 0;
     sit = sizes.begin();
@@ -83,7 +98,7 @@ void generateData( Mat& data, Mat& labels, const vector<int>& sizes, const vecto
         assert( cit->rows == data.cols && cit->cols == data.cols );
         for( int i = bi; i < ei; i++, p++ )
         {
-            Mat r(1, data.cols, CV_32FC1, data.ptr<float>(i));
+            Mat r = data.row(i);
             r =  r * (*cit) + *mit; 
             if( labelType == CV_32FC1 )
                 labels.at<float>(p, 0) = (float)l;
@@ -95,6 +110,7 @@ void generateData( Mat& data, Mat& labels, const vector<int>& sizes, const vecto
     }
 }
 
+static
 int maxIdx( const vector<int>& count )
 {
     int idx = -1;
@@ -112,74 +128,83 @@ int maxIdx( const vector<int>& count )
     return idx;
 }
 
+static
 bool getLabelsMap( const Mat& labels, const vector<int>& sizes, vector<int>& labelsMap )
 {
-    int total = 0, setCount = (int)sizes.size();
-    vector<int>::const_iterator sit = sizes.begin();
-    for( ; sit != sizes.end(); ++sit )
-        total += *sit;
+    size_t total = 0, nclusters = sizes.size();
+    for(size_t i = 0; i < sizes.size(); i++)
+        total += sizes[i];
+
     assert( !labels.empty() );
-    assert( labels.rows == total && labels.cols == 1 );
+    assert( labels.total() == total && (labels.cols == 1 || labels.rows == 1));
     assert( labels.type() == CV_32SC1 || labels.type() == CV_32FC1 );
 
     bool isFlt = labels.type() == CV_32FC1;
-    labelsMap.resize(setCount);
-    vector<int>::iterator lmit = labelsMap.begin();
-    vector<bool> buzy(setCount, false);
-    int bi, ei = 0;
-    for( sit = sizes.begin(); sit != sizes.end(); ++sit, ++lmit )
+
+    labelsMap.resize(nclusters);
+
+    vector<bool> buzy(nclusters, false);
+    int startIndex = 0;
+    for( size_t clusterIndex = 0; clusterIndex < sizes.size(); clusterIndex++ )
     {
-        vector<int> count( setCount, 0 );
-        bi = ei;
-        ei = bi + *sit;
-        if( isFlt )
+        vector<int> count( nclusters, 0 );
+        for( int i = startIndex; i < startIndex + sizes[clusterIndex]; i++)
         {
-            for( int i = bi; i < ei; i++ )
-                count[(int)labels.at<float>(i, 0)]++;
+            int lbl = isFlt ? (int)labels.at<float>(i) : labels.at<int>(i);
+            CV_Assert(lbl < (int)nclusters);
+            count[lbl]++;
+            CV_Assert(count[lbl] < (int)total);
         }
-        else
-        {
-            for( int i = bi; i < ei; i++ )
-                count[labels.at<int>(i, 0)]++;
-        }
-  
-        *lmit = maxIdx( count );
-        if( buzy[*lmit] )
-            return false;
-        buzy[*lmit] = true;
+        startIndex += sizes[clusterIndex];
+
+        int cls = maxIdx( count );
+        CV_Assert( !buzy[cls] );
+
+        labelsMap[clusterIndex] = cls;
+
+        buzy[cls] = true;
     }
-    return true;    
+    for(size_t i = 0; i < buzy.size(); i++)
+        if(!buzy[i])
+            return false;
+
+    return true;
 }
 
-float calcErr( const Mat& labels, const Mat& origLabels, const vector<int>& sizes, bool labelsEquivalent = true )
+static
+bool calcErr( const Mat& labels, const Mat& origLabels, const vector<int>& sizes, float& err, bool labelsEquivalent = true )
 {
-    int err = 0;
-    assert( !labels.empty() && !origLabels.empty() );
-    assert( labels.cols == 1 && origLabels.cols == 1 );
-    assert( labels.rows == origLabels.rows );
-    assert( labels.type() == origLabels.type() );
-    assert( labels.type() == CV_32SC1 || labels.type() == CV_32FC1 );
+    err = 0;
+    CV_Assert( !labels.empty() && !origLabels.empty() );
+    CV_Assert( labels.rows == 1 || labels.cols == 1 );
+    CV_Assert( origLabels.rows == 1 || origLabels.cols == 1 );
+    CV_Assert( labels.total() == origLabels.total() );
+    CV_Assert( labels.type() == CV_32SC1 || labels.type() == CV_32FC1 );
+    CV_Assert( origLabels.type() == labels.type() );
 
     vector<int> labelsMap;
     bool isFlt = labels.type() == CV_32FC1;
     if( !labelsEquivalent )
     {
-        getLabelsMap( labels, sizes, labelsMap );
+        if( !getLabelsMap( labels, sizes, labelsMap ) )
+            return false;
+
         for( int i = 0; i < labels.rows; i++ )
             if( isFlt )
-                err += labels.at<float>(i, 0) != labelsMap[(int)origLabels.at<float>(i, 0)];
+                err += labels.at<float>(i) != labelsMap[(int)origLabels.at<float>(i)] ? 1.f : 0.f;
             else
-                err += labels.at<int>(i, 0) != labelsMap[origLabels.at<int>(i, 0)];
+                err += labels.at<int>(i) != labelsMap[origLabels.at<int>(i)] ? 1.f : 0.f;
     }
     else
     {
         for( int i = 0; i < labels.rows; i++ )
             if( isFlt )
-                err += labels.at<float>(i, 0) != origLabels.at<float>(i, 0);
+                err += labels.at<float>(i) != origLabels.at<float>(i) ? 1.f : 0.f;
             else
-                err += labels.at<int>(i, 0) != origLabels.at<int>(i, 0);
+                err += labels.at<int>(i) != origLabels.at<int>(i) ? 1.f : 0.f;
     }
-    return (float)err / (float)labels.rows;
+    err /= (float)labels.rows;
+    return true;
 }
 
 //--------------------------------------------------------------------------------------------
@@ -198,17 +223,22 @@ void CV_KMeansTest::run( int /*start_from*/ )
     
     Mat data( pointsCount, 2, CV_32FC1 ), labels;
     vector<int> sizes( sizesArr, sizesArr + sizeof(sizesArr) / sizeof(sizesArr[0]) );
-    vector<Mat> means, covs;
+    Mat means;
+    vector<Mat> covs;
     defaultDistribs( means, covs );
-    generateData( data, labels, sizes, means, covs, CV_32SC1 );
+    generateData( data, labels, sizes, means, covs, CV_32FC1, CV_32SC1 );
     
     int code = cvtest::TS::OK;
     float err;
     Mat bestLabels;
     // 1. flag==KMEANS_PP_CENTERS
     kmeans( data, 3, bestLabels, TermCriteria( TermCriteria::COUNT, iters, 0.0), 0, KMEANS_PP_CENTERS, noArray() );
-    err = calcErr( bestLabels, labels, sizes, false );
-    if( err > 0.01f )
+    if( !calcErr( bestLabels, labels, sizes, err , false ) )
+    {
+        ts->printf( cvtest::TS::LOG, "Bad output labels if flag==KMEANS_PP_CENTERS.\n" );
+        code = cvtest::TS::FAIL_INVALID_OUTPUT;
+    }
+    else if( err > 0.01f )
     {
         ts->printf( cvtest::TS::LOG, "Bad accuracy (%f) if flag==KMEANS_PP_CENTERS.\n", err );
         code = cvtest::TS::FAIL_BAD_ACCURACY;
@@ -216,10 +246,14 @@ void CV_KMeansTest::run( int /*start_from*/ )
 
     // 2. flag==KMEANS_RANDOM_CENTERS
     kmeans( data, 3, bestLabels, TermCriteria( TermCriteria::COUNT, iters, 0.0), 0, KMEANS_RANDOM_CENTERS, noArray() );
-    err = calcErr( bestLabels, labels, sizes, false );
-    if( err > 0.01f )
+    if( !calcErr( bestLabels, labels, sizes, err, false ) )
     {
-        ts->printf( cvtest::TS::LOG, "Bad accuracy (%f) if flag==KMEANS_PP_CENTERS.\n", err );
+        ts->printf( cvtest::TS::LOG, "Bad output labels if flag==KMEANS_RANDOM_CENTERS.\n" );
+        code = cvtest::TS::FAIL_INVALID_OUTPUT;
+    }
+    else if( err > 0.01f )
+    {
+        ts->printf( cvtest::TS::LOG, "Bad accuracy (%f) if flag==KMEANS_RANDOM_CENTERS.\n", err );
         code = cvtest::TS::FAIL_BAD_ACCURACY;
     }
 
@@ -229,10 +263,14 @@ void CV_KMeansTest::run( int /*start_from*/ )
     for( int i = 0; i < 0.5f * pointsCount; i++ )
         bestLabels.at<int>( rng.next() % pointsCount, 0 ) = rng.next() % 3;
     kmeans( data, 3, bestLabels, TermCriteria( TermCriteria::COUNT, iters, 0.0), 0, KMEANS_USE_INITIAL_LABELS, noArray() );
-    err = calcErr( bestLabels, labels, sizes, false );
-    if( err > 0.01f )
+    if( !calcErr( bestLabels, labels, sizes, err, false ) )
     {
-        ts->printf( cvtest::TS::LOG, "Bad accuracy (%f) if flag==KMEANS_PP_CENTERS.\n", err );
+        ts->printf( cvtest::TS::LOG, "Bad output labels if flag==KMEANS_USE_INITIAL_LABELS.\n" );
+        code = cvtest::TS::FAIL_INVALID_OUTPUT;
+    }
+    else if( err > 0.01f )
+    {
+        ts->printf( cvtest::TS::LOG, "Bad accuracy (%f) if flag==KMEANS_USE_INITIAL_LABELS.\n", err );
         code = cvtest::TS::FAIL_BAD_ACCURACY;
     }
 
@@ -255,20 +293,26 @@ void CV_KNearestTest::run( int /*start_from*/ )
     // train data
     Mat trainData( pointsCount, 2, CV_32FC1 ), trainLabels;
     vector<int> sizes( sizesArr, sizesArr + sizeof(sizesArr) / sizeof(sizesArr[0]) );
-    vector<Mat> means, covs;
+    Mat means;
+    vector<Mat> covs;
     defaultDistribs( means, covs );
-    generateData( trainData, trainLabels, sizes, means, covs, CV_32FC1 );
+    generateData( trainData, trainLabels, sizes, means, covs, CV_32FC1, CV_32FC1 );
 
     // test data
     Mat testData( pointsCount, 2, CV_32FC1 ), testLabels, bestLabels;
-    generateData( testData, testLabels, sizes, means, covs, CV_32FC1 );
+    generateData( testData, testLabels, sizes, means, covs, CV_32FC1, CV_32FC1 );
 
     int code = cvtest::TS::OK;
     KNearest knearest;
     knearest.train( trainData, trainLabels );
     knearest.find_nearest( testData, 4, &bestLabels );
-    float err = calcErr( bestLabels, testLabels, sizes, true );
-    if( err > 0.01f )
+    float err;
+    if( !calcErr( bestLabels, testLabels, sizes, err, true ) )
+    {
+        ts->printf( cvtest::TS::LOG, "Bad output labels.\n" );
+        code = cvtest::TS::FAIL_INVALID_OUTPUT;
+    }
+    else if( err > 0.01f )
     {
         ts->printf( cvtest::TS::LOG, "Bad accuracy (%f) on test data.\n", err );
         code = cvtest::TS::FAIL_BAD_ACCURACY;
@@ -276,95 +320,216 @@ void CV_KNearestTest::run( int /*start_from*/ )
     ts->set_failed_test_info( code );
 }
 
+class EM_Params
+{
+public:
+    EM_Params(int nclusters=10, int covMatType=EM::COV_MAT_DIAGONAL, int startStep=EM::START_AUTO_STEP,
+           const cv::TermCriteria& termCrit=cv::TermCriteria(cv::TermCriteria::COUNT+cv::TermCriteria::EPS, 100, FLT_EPSILON),
+           const cv::Mat* probs=0, const cv::Mat* weights=0,
+           const cv::Mat* means=0, const std::vector<cv::Mat>* covs=0)
+        : nclusters(nclusters), covMatType(covMatType), startStep(startStep),
+        probs(probs), weights(weights), means(means), covs(covs), termCrit(termCrit)
+    {}
+    
+    int nclusters;
+    int covMatType;
+    int startStep;
+    
+    // all 4 following matrices should have type CV_32FC1
+    const cv::Mat* probs;
+    const cv::Mat* weights;
+    const cv::Mat* means;
+    const std::vector<cv::Mat>* covs;
+    
+    cv::TermCriteria termCrit;
+};
+
 //--------------------------------------------------------------------------------------------
-class CV_EMTest : public cvtest::BaseTest {
+class CV_EMTest : public cvtest::BaseTest
+{
 public:
     CV_EMTest() {}
 protected:
     virtual void run( int start_from );
+    int runCase( int caseIndex, const EM_Params& params,
+                  const cv::Mat& trainData, const cv::Mat& trainLabels,
+                  const cv::Mat& testData, const cv::Mat& testLabels,
+                  const vector<int>& sizes);
 };
 
+int CV_EMTest::runCase( int caseIndex, const EM_Params& params,
+                        const cv::Mat& trainData, const cv::Mat& trainLabels,
+                        const cv::Mat& testData, const cv::Mat& testLabels,
+                        const vector<int>& sizes )
+{
+    int code = cvtest::TS::OK;
+
+    cv::Mat labels;
+    float err;
+
+    cv::EM em(params.nclusters, params.covMatType, params.termCrit);
+    if( params.startStep == EM::START_AUTO_STEP )
+        em.train( trainData, labels );
+    else if( params.startStep == EM::START_E_STEP )
+        em.trainE( trainData, *params.means, *params.covs, *params.weights, labels );
+    else if( params.startStep == EM::START_M_STEP )
+        em.trainM( trainData, *params.probs, labels );
+
+    // check train error
+    if( !calcErr( labels, trainLabels, sizes, err , false ) )
+    {
+        ts->printf( cvtest::TS::LOG, "Case index %i : Bad output labels.\n", caseIndex );
+        code = cvtest::TS::FAIL_INVALID_OUTPUT;
+    }
+    else if( err > 0.008f )
+    {
+        ts->printf( cvtest::TS::LOG, "Case index %i : Bad accuracy (%f) on train data.\n", caseIndex, err );
+        code = cvtest::TS::FAIL_BAD_ACCURACY;
+    }
+
+    // check test error
+    labels.create( testData.rows, 1, CV_32SC1 );
+    for( int i = 0; i < testData.rows; i++ )
+    {
+        Mat sample = testData.row(i);
+        double likelihood = 0;
+        Mat probs;
+        labels.at<int>(i,0) = (int)em.predict( sample, probs, &likelihood );
+    }
+    if( !calcErr( labels, testLabels, sizes, err, false ) )
+    {
+        ts->printf( cvtest::TS::LOG, "Case index %i : Bad output labels.\n", caseIndex );
+        code = cvtest::TS::FAIL_INVALID_OUTPUT;
+    }
+    else if( err > 0.008f )
+    {
+        ts->printf( cvtest::TS::LOG, "Case index %i : Bad accuracy (%f) on test data.\n", caseIndex, err );
+        code = cvtest::TS::FAIL_BAD_ACCURACY;
+    }
+
+    return code;
+}
+
 void CV_EMTest::run( int /*start_from*/ )
 {
-    int sizesArr[] = { 5000, 7000, 8000 };
+    int sizesArr[] = { 500, 700, 800 };
     int pointsCount = sizesArr[0]+ sizesArr[1] + sizesArr[2];
 
+    // Points distribution
+    Mat means;
+    vector<Mat> covs;
+    defaultDistribs( means, covs, CV_64FC1 );
+
     // train data
-    Mat trainData( pointsCount, 2, CV_32FC1 ), trainLabels;
+    Mat trainData( pointsCount, 2, CV_64FC1 ), trainLabels;
     vector<int> sizes( sizesArr, sizesArr + sizeof(sizesArr) / sizeof(sizesArr[0]) );
-    vector<Mat> means, covs;
-    defaultDistribs( means, covs );
-    generateData( trainData, trainLabels, sizes, means, covs, CV_32SC1 );
+    generateData( trainData, trainLabels, sizes, means, covs, CV_64FC1, CV_32SC1 );
 
     // test data
-    Mat testData( pointsCount, 2, CV_32FC1 ), testLabels, bestLabels;
-    generateData( testData, testLabels, sizes, means, covs, CV_32SC1 );
+    Mat testData( pointsCount, 2, CV_64FC1 ), testLabels;
+    generateData( testData, testLabels, sizes, means, covs, CV_64FC1, CV_32SC1 );
 
-    int code = cvtest::TS::OK;
-    float err;
-    ExpectationMaximization em;
-    CvEMParams params;
+    EM_Params params;
     params.nclusters = 3;
-    em.train( trainData, Mat(), params, &bestLabels );
+    Mat probs(trainData.rows, params.nclusters, CV_64FC1, cv::Scalar(1));
+    params.probs = &probs;
+    Mat weights(1, params.nclusters, CV_64FC1, cv::Scalar(1));
+    params.weights = &weights;
+    params.means = &means;
+    params.covs = &covs;
 
-    // check train error
-    err = calcErr( bestLabels, trainLabels, sizes, false );
-    if( err > 0.002f )
+    int code = cvtest::TS::OK;
+    int caseIndex = 0;
     {
-        ts->printf( cvtest::TS::LOG, "Bad accuracy (%f) on train data.\n", err );
-        code = cvtest::TS::FAIL_BAD_ACCURACY;
+        params.startStep = cv::EM::START_AUTO_STEP;
+        params.covMatType = cv::EM::COV_MAT_GENERIC;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
     }
-
-    // check test error
-    bestLabels.create( testData.rows, 1, CV_32SC1 );
-    for( int i = 0; i < testData.rows; i++ )
     {
-        Mat sample( 1, testData.cols, CV_32FC1, testData.ptr<float>(i));
-        bestLabels.at<int>(i,0) = (int)em.predict( sample, 0 );
+        params.startStep = cv::EM::START_AUTO_STEP;
+        params.covMatType = cv::EM::COV_MAT_DIAGONAL;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
     }
-    err = calcErr( bestLabels, testLabels, sizes, false );
-    if( err > 0.005f )
     {
-        ts->printf( cvtest::TS::LOG, "Bad accuracy (%f) on test data.\n", err );
-        code = cvtest::TS::FAIL_BAD_ACCURACY;
+        params.startStep = cv::EM::START_AUTO_STEP;
+        params.covMatType = cv::EM::COV_MAT_SPHERICAL;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.startStep = cv::EM::START_M_STEP;
+        params.covMatType = cv::EM::COV_MAT_GENERIC;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.startStep = cv::EM::START_M_STEP;
+        params.covMatType = cv::EM::COV_MAT_DIAGONAL;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.startStep = cv::EM::START_M_STEP;
+        params.covMatType = cv::EM::COV_MAT_SPHERICAL;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.startStep = cv::EM::START_E_STEP;
+        params.covMatType = cv::EM::COV_MAT_GENERIC;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.startStep = cv::EM::START_E_STEP;
+        params.covMatType = cv::EM::COV_MAT_DIAGONAL;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
+    }
+    {
+        params.startStep = cv::EM::START_E_STEP;
+        params.covMatType = cv::EM::COV_MAT_SPHERICAL;
+        int currCode = runCase(caseIndex++, params, trainData, trainLabels, testData, testLabels, sizes);
+        code = currCode == cvtest::TS::OK ? code : currCode;
     }
     
     ts->set_failed_test_info( code );
 }
 
-class CV_EMTest_Smoke : public cvtest::BaseTest {
+class CV_EMTest_SaveLoad : public cvtest::BaseTest {
 public:
-    CV_EMTest_Smoke() {}
+    CV_EMTest_SaveLoad() {}
 protected:
     virtual void run( int /*start_from*/ )
     {
         int code = cvtest::TS::OK;
-        CvEM em;
+        const int nclusters = 2;
+        cv::EM em(nclusters);
 
-        Mat samples = Mat(3,2,CV_32F);
-        samples.at<float>(0,0) = 1;
-        samples.at<float>(1,0) = 2;
-        samples.at<float>(2,0) = 3;
-
-        CvEMParams params;
-        params.nclusters = 2;
+        Mat samples = Mat(3,1,CV_64FC1);
+        samples.at<double>(0,0) = 1;
+        samples.at<double>(1,0) = 2;
+        samples.at<double>(2,0) = 3;
 
         Mat labels;
 
-        em.train(samples, Mat(), params, &labels);
+        em.train(samples, labels);
 
-        Mat firstResult(samples.rows, 1, CV_32FC1);
+        Mat firstResult(samples.rows, 1, CV_32SC1);
         for( int i = 0; i < samples.rows; i++)
-            firstResult.at<float>(i) = em.predict( samples.row(i) );
+            firstResult.at<int>(i) = em.predict(samples.row(i));
 
         // Write out
         string filename = tempfile() + ".xml";
         {
             FileStorage fs = FileStorage(filename, FileStorage::WRITE);
-
             try
             {
-                em.write(fs.fs, "EM");
+                fs << "em" << "{";
+                em.write(fs);
+                fs << "}";
             }
             catch(...)
             {
@@ -378,11 +543,11 @@ protected:
         // Read in
         {
             FileStorage fs = FileStorage(filename, FileStorage::READ);
-            FileNode fileNode = fs["EM"];
-
+            CV_Assert(fs.isOpened());
+            FileNode fn = fs["em"];
             try
             {
-                em.read(const_cast<CvFileStorage*>(fileNode.fs), const_cast<CvFileNode*>(fileNode.node));
+                em.read(fn);
             }
             catch(...)
             {
@@ -395,7 +560,7 @@ protected:
 
         int errCaseCount = 0;
         for( int i = 0; i < samples.rows; i++)
-            errCaseCount = std::abs(em.predict(samples.row(i)) - firstResult.at<float>(i)) < FLT_EPSILON ? 0 : 1;
+            errCaseCount = std::abs(em.predict(samples.row(i)) - firstResult.at<int>(i)) < FLT_EPSILON ? 0 : 1;
 
         if( errCaseCount > 0 )
         {
@@ -410,4 +575,4 @@ protected:
 TEST(ML_KMeans, accuracy) { CV_KMeansTest test; test.safe_run(); }
 TEST(ML_KNearest, accuracy) { CV_KNearestTest test; test.safe_run(); }
 TEST(ML_EM, accuracy) { CV_EMTest test; test.safe_run(); }
-TEST(ML_EM, smoke) { CV_EMTest_Smoke test; test.safe_run(); }
+TEST(ML_EM, save_load) { CV_EMTest_SaveLoad test; test.safe_run(); }
index b2fa94d..a5dfbe8 100644 (file)
@@ -451,7 +451,6 @@ CV_MLBaseTest::CV_MLBaseTest(const char* _modelName)
     nbayes = 0;
     knearest = 0;
     svm = 0;
-    em = 0;
     ann = 0;
     dtree = 0;
     boost = 0;
@@ -463,8 +462,6 @@ CV_MLBaseTest::CV_MLBaseTest(const char* _modelName)
         knearest = new CvKNearest;
     else if( !modelName.compare(CV_SVM) )
         svm = new CvSVM;
-    else if( !modelName.compare(CV_EM) )
-        em = new CvEM;
     else if( !modelName.compare(CV_ANN) )
         ann = new CvANN_MLP;
     else if( !modelName.compare(CV_DTREE) )
@@ -487,8 +484,6 @@ CV_MLBaseTest::~CV_MLBaseTest()
         delete knearest;
     if( svm )
         delete svm;
-    if( em )
-        delete em;
     if( ann )
         delete ann;
     if( dtree )
@@ -756,8 +751,6 @@ void CV_MLBaseTest::save( const char* filename )
         knearest->save( filename );
     else if( !modelName.compare(CV_SVM) )
         svm->save( filename );
-    else if( !modelName.compare(CV_EM) )
-        em->save( filename );
     else if( !modelName.compare(CV_ANN) )
         ann->save( filename );
     else if( !modelName.compare(CV_DTREE) )
@@ -778,8 +771,6 @@ void CV_MLBaseTest::load( const char* filename )
         knearest->load( filename );
     else if( !modelName.compare(CV_SVM) )
         svm->load( filename );
-    else if( !modelName.compare(CV_EM) )
-        em->load( filename );
     else if( !modelName.compare(CV_ANN) )
         ann->load( filename );
     else if( !modelName.compare(CV_DTREE) )
index af345ab..a939d1c 100644 (file)
@@ -44,7 +44,6 @@ protected:
     CvNormalBayesClassifier* nbayes;
     CvKNearest* knearest;
     CvSVM* svm;
-    CvEM* em;
     CvANN_MLP* ann;
     CvDTree* dtree;
     CvBoost* boost;
index c3ab805..1071fda 100644 (file)
@@ -170,3 +170,4 @@ Detects keypoints and computes SURF descriptors for them.
     
     :param params: SURF algorithm parameters in OpenCV 1.x API.
 
+The function is parallelized with the TBB library.
index d6dc146..dd084cd 100644 (file)
@@ -48,7 +48,7 @@
 namespace cv
 {
 
-CV_EXPORTS bool initModule_nonfree(void);
+CV_EXPORTS_W bool initModule_nonfree();
     
 }
 
index 92705e5..2c54372 100644 (file)
@@ -672,29 +672,6 @@ int SIFT::descriptorType() const
     return CV_32F;
 }
 
-static Algorithm* createSIFT()
-{
-    return new SIFT;
-}
-static AlgorithmInfo sift_info("Feature2D.SIFT", createSIFT);
-    
-AlgorithmInfo* SIFT::info() const
-{
-    static volatile bool initialized = false;
-    if( !initialized )
-    {
-        SIFT obj;
-        sift_info.addParam(obj, "nFeatures", obj.nfeatures);
-        sift_info.addParam(obj, "nOctaveLayers", obj.nOctaveLayers);
-        sift_info.addParam(obj, "contrastThreshold", obj.contrastThreshold);
-        sift_info.addParam(obj, "edgeThreshold", obj.edgeThreshold);
-        sift_info.addParam(obj, "sigma", obj.sigma);
-        
-        initialized = true;
-    }
-    return &sift_info;
-}
-
 
 void SIFT::operator()(InputArray _image, InputArray _mask,
                       vector<KeyPoint>& keypoints) const
index ebc84d2..68ff520 100644 (file)
@@ -109,8 +109,6 @@ Modifications by Ian Mahon
 */
 #include "precomp.hpp"
 
-bool cv::initModule_nonfree(void) { return true; }
-
 namespace cv
 {
 
@@ -879,16 +877,29 @@ void SURF::operator()(InputArray _img, InputArray _mask,
     if( N > 0 )
     {
         Mat descriptors;
+        bool _1d = false;
+        int dcols = extended ? 128 : 64;
+        size_t dsize = dcols*sizeof(float);
+        
         if( doDescriptors )
         {
-            _descriptors.create((int)keypoints.size(), (extended ? 128 : 64), CV_32F);
-            descriptors = _descriptors.getMat();
+            _1d = _descriptors.kind() == _InputArray::STD_VECTOR && _descriptors.type() == CV_32F;
+            if( _1d )
+            {
+                _descriptors.create(N*dcols, 1, CV_32F);
+                descriptors = _descriptors.getMat().reshape(1, N);
+            }
+            else
+            {
+                _descriptors.create(N, dcols, CV_32F);
+                descriptors = _descriptors.getMat();
+            }
         }
         
+        // we call SURFInvoker in any case, even if we do not need descriptors,
+        // since it computes orientation of each feature.
         parallel_for(BlockedRange(0, N), SURFInvoker(img, sum, keypoints, descriptors, extended, upright) );
         
-        size_t dsize = descriptors.cols*descriptors.elemSize();
-    
         // remove keypoints that were marked for deletion
         for( i = j = 0; i < N; i++ )
         {
@@ -910,6 +921,8 @@ void SURF::operator()(InputArray _img, InputArray _mask,
             if( doDescriptors )
             {
                 Mat d = descriptors.rowRange(0, N);
+                if( _1d )
+                    d = d.reshape(1, N*dcols);
                 d.copyTo(_descriptors);
             }
         }
@@ -927,11 +940,21 @@ void SURF::computeImpl( const Mat& image, vector<KeyPoint>& keypoints, Mat& desc
     (*this)(image, Mat(), keypoints, descriptors, true);
 }    
 
+    
+///////////////////////////////////////////////////////////////////////////////////////////////////////////
+    
 static Algorithm* createSURF()
 {
     return new SURF;
 }
-static AlgorithmInfo surf_info("Feature2D.SURF", createSURF);
+
+static AlgorithmInfo& surf_info()
+{
+    static AlgorithmInfo surf_info_var("Feature2D.SURF", createSURF);
+    return surf_info_var;
+}
+
+static AlgorithmInfo& surf_info_auto = surf_info();
 
 AlgorithmInfo* SURF::info() const
 {
@@ -939,53 +962,52 @@ AlgorithmInfo* SURF::info() const
     if( !initialized )
     {
         SURF obj;
-        surf_info.addParam(obj, "hessianThreshold", obj.hessianThreshold);
-        surf_info.addParam(obj, "nOctaves", obj.nOctaves);
-        surf_info.addParam(obj, "nOctaveLayers", obj.nOctaveLayers);
-        surf_info.addParam(obj, "extended", obj.extended);
-        surf_info.addParam(obj, "upright", obj.upright);
+        surf_info().addParam(obj, "hessianThreshold", obj.hessianThreshold);
+        surf_info().addParam(obj, "nOctaves", obj.nOctaves);
+        surf_info().addParam(obj, "nOctaveLayers", obj.nOctaveLayers);
+        surf_info().addParam(obj, "extended", obj.extended);
+        surf_info().addParam(obj, "upright", obj.upright);
         
         initialized = true;
     }
-    return &surf_info;
+    return &surf_info();
 }
-    
-/*
- // SurfFeatureDetector
-    SurfFeatureDetector::SurfFeatureDetector( double hessianThreshold, int octaves, int octaveLayers, bool upright )
-    : surf(hessianThreshold, octaves, octaveLayers, false, upright)
-    {}
-    
-    void SurfFeatureDetector::read (const FileNode& fn)
-    {
-        double hessianThreshold = fn["hessianThreshold"];
-        int octaves = fn["octaves"];
-        int octaveLayers = fn["octaveLayers"];
-        bool upright = (int)fn["upright"] != 0;
-        
-        surf = SURF( hessianThreshold, octaves, octaveLayers, false, upright );
-    }
-    
-    void SurfFeatureDetector::write (FileStorage& fs) const
-    {
-        //fs << "algorithm" << getAlgorithmName ();
-        
-        fs << "hessianThreshold" << surf.hessianThreshold;
-        fs << "octaves" << surf.nOctaves;
-        fs << "octaveLayers" << surf.nOctaveLayers;
-        fs << "upright" << surf.upright;
-    }
-    
-    void SurfFeatureDetector::detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask ) const
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static Algorithm* createSIFT() { return new SIFT; }
+
+static AlgorithmInfo& sift_info()
+{
+    static AlgorithmInfo sift_info_var("Feature2D.SIFT", createSIFT);
+    return sift_info_var;
+}
+
+static AlgorithmInfo& sift_info_auto = sift_info();
+
+AlgorithmInfo* SIFT::info() const
+{
+    static volatile bool initialized = false;
+    if( !initialized )
     {
-        Mat grayImage = image;
-        if( image.type() != CV_8U ) cvtColor( image, grayImage, CV_BGR2GRAY );
+        SIFT obj;
+        sift_info().addParam(obj, "nFeatures", obj.nfeatures);
+        sift_info().addParam(obj, "nOctaveLayers", obj.nOctaveLayers);
+        sift_info().addParam(obj, "contrastThreshold", obj.contrastThreshold);
+        sift_info().addParam(obj, "edgeThreshold", obj.edgeThreshold);
+        sift_info().addParam(obj, "sigma", obj.sigma);
         
-        surf(grayImage, mask, keypoints);
+        initialized = true;
     }
+    return &sift_info();
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////    
     
-    
-*/
+bool initModule_nonfree(void)
+{
+    Ptr<Algorithm> sift = createSIFT(), surf = createSURF();
+    return sift->info() != 0 && surf->info() != 0;
+}
+
 }
index 5d7afa8..24aa5d9 100644 (file)
@@ -268,13 +268,15 @@ static Mat readMatFromBin( const string& filename )
     if( f )
     {
         int rows, cols, type, dataSize;
-        fread( (void*)&rows, sizeof(int), 1, f );
-        fread( (void*)&cols, sizeof(int), 1, f );
-        fread( (void*)&type, sizeof(int), 1, f );
-        fread( (void*)&dataSize, sizeof(int), 1, f );
+        size_t elements_read1 = fread( (void*)&rows, sizeof(int), 1, f );
+        size_t elements_read2 = fread( (void*)&cols, sizeof(int), 1, f );
+        size_t elements_read3 = fread( (void*)&type, sizeof(int), 1, f );
+        size_t elements_read4 = fread( (void*)&dataSize, sizeof(int), 1, f );
+        CV_Assert(elements_read1 == 1 && elements_read2 == 1 && elements_read3 == 1 && elements_read4 == 1);
 
         uchar* data = (uchar*)cvAlloc(dataSize);
-        fread( (void*)data, 1, dataSize, f );
+        size_t elements_read = fread( (void*)data, 1, dataSize, f );
+        CV_Assert(elements_read == (size_t)(dataSize));
         fclose(f);
 
         return Mat( rows, cols, type, data );
@@ -1026,3 +1028,53 @@ TEST( Features2d_DescriptorExtractor_Calonder_float, regression )
     test.safe_run();
 }
 #endif*/ // CV_SSE2
+
+TEST(Features2d_BruteForceDescriptorMatcher_knnMatch, regression)
+{
+    const int sz = 100;
+    const int k = 3;
+
+    Ptr<DescriptorExtractor> ext = DescriptorExtractor::create("SURF");
+    ASSERT_TRUE(ext != NULL);
+
+    Ptr<FeatureDetector> det = FeatureDetector::create("SURF");
+    //"%YAML:1.0\nhessianThreshold: 8000.\noctaves: 3\noctaveLayers: 4\nupright: 0\n"
+    ASSERT_TRUE(det != NULL);
+
+    Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce");
+    ASSERT_TRUE(matcher != NULL);
+
+    Mat imgT(sz, sz, CV_8U, Scalar(255));
+    line(imgT, Point(20, sz/2), Point(sz-21, sz/2), Scalar(100), 2);
+    line(imgT, Point(sz/2, 20), Point(sz/2, sz-21), Scalar(100), 2);
+    vector<KeyPoint> kpT;
+    kpT.push_back( KeyPoint(50, 50, 16, 0, 20000, 1, -1) );
+    kpT.push_back( KeyPoint(42, 42, 16, 160, 10000, 1, -1) );
+    Mat descT;
+    ext->compute(imgT, kpT, descT);
+
+    Mat imgQ(sz, sz, CV_8U, Scalar(255));
+    line(imgQ, Point(30, sz/2), Point(sz-31, sz/2), Scalar(100), 3);
+    line(imgQ, Point(sz/2, 30), Point(sz/2, sz-31), Scalar(100), 3);
+    vector<KeyPoint> kpQ;
+    det->detect(imgQ, kpQ);
+    Mat descQ;
+    ext->compute(imgQ, kpQ, descQ);
+
+    vector<vector<DMatch> > matches;
+
+    matcher->knnMatch(descQ, descT, matches, k);
+
+    //cout << "\nBest " << k << " matches to " << descT.rows << " train desc-s." << endl;
+    ASSERT_EQ(descQ.rows, matches.size());
+    for(size_t i = 0; i<matches.size(); i++)
+    {
+        //cout << "\nmatches[" << i << "].size()==" << matches[i].size() << endl;
+        ASSERT_GT(min(k, descT.rows), static_cast<int>(matches[i].size()));
+        for(size_t j = 0; j<matches[i].size(); j++)
+        {
+            //cout << "\t" << matches[i][j].queryIdx << " -> " << matches[i][j].trainIdx << endl;
+            ASSERT_EQ(matches[i][j].queryIdx, static_cast<int>(i));
+        }
+    }
+}
index 9da55b4..ec9419a 100644 (file)
@@ -1,2 +1,2 @@
 set(the_description "Object Detection")
-ocv_define_module(objdetect opencv_calib3d OPTIONAL opencv_highgui)
+ocv_define_module(objdetect OPTIONAL opencv_highgui)
index aa19ec8..4d19fe1 100644 (file)
@@ -12,7 +12,7 @@ First, a classifier (namely a *cascade of boosted classifiers working with haar-
 
 After a classifier is trained, it can be applied to a region of interest (of the same size as used during the training) in an input image. The classifier outputs a "1" if the region is likely to show the object (i.e., face/car), and "0" otherwise. To search for the object in the whole image one can move the search window across the image and check every location using the classifier. The classifier is designed so that it can be easily "resized" in order to be able to find the objects of interest at different sizes, which is more efficient than resizing the image itself. So, to find an object of an unknown size in the image the scan procedure should be done several times at different scales.
 
-The word "cascade" in the classifier name means that the resultant classifier consists of several simpler classifiers (*stages*) that are applied subsequently to a region of interest until at some stage the candidate is rejected or all the stages are passed. The word "boosted" means that the classifiers at every stage of the cascade are complex themselves and they are built out of basic classifiers using one of four different ``boosting`` techniques (weighted voting). Currently Discrete Adaboost, Real Adaboost, Gentle Adaboost and Logitboost are supported. The basic classifiers are decision-tree classifiers with at least 2 leaves. Haar-like features are the input to the basic classifers, and are calculated as described below. The current algorithm uses the following Haar-like features:
+The word "cascade" in the classifier name means that the resultant classifier consists of several simpler classifiers (*stages*) that are applied subsequently to a region of interest until at some stage the candidate is rejected or all the stages are passed. The word "boosted" means that the classifiers at every stage of the cascade are complex themselves and they are built out of basic classifiers using one of four different ``boosting`` techniques (weighted voting). Currently Discrete Adaboost, Real Adaboost, Gentle Adaboost and Logitboost are supported. The basic classifiers are decision-tree classifiers with at least 2 leaves. Haar-like features are the input to the basic classifiers, and are calculated as described below. The current algorithm uses the following Haar-like features:
 
 
 .. image:: pics/haarfeatures.png
@@ -205,7 +205,7 @@ Detects objects of different sizes in the input image. The detected objects are
 
     :param scaleFactor: Parameter specifying how much the image size is reduced at each image scale.
 
-    :param minNeighbors: Parameter specifying how many neighbors each candiate rectangle should have to retain it.
+    :param minNeighbors: Parameter specifying how many neighbors each candidate rectangle should have to retain it.
 
     :param flags: Parameter with the same meaning for an old cascade as in the function ``cvHaarDetectObjects``. It is not used for a new cascade.
 
@@ -213,6 +213,7 @@ Detects objects of different sizes in the input image. The detected objects are
 
     :param maxSize: Maximum possible object size. Objects larger than that are ignored.
 
+The function is parallelized with the TBB library.
 
 
 CascadeClassifier::setImage
index 7a740ba..a22fe8d 100644 (file)
@@ -248,7 +248,7 @@ and corresponding confidence levels.
     
 LatentSvmDetector::getClassNames
 --------------------------------
-Return the class (model) names that were passed in constructor or method ``load`` or extructed from models filenames in those methods.
+Return the class (model) names that were passed in constructor or method ``load`` or extracted from models filenames in those methods.
 
 .. ocv:function:: const vector<string>& LatentSvmDetector::getClassNames() const
 
index e21573a..e3eb07d 100644 (file)
@@ -44,7 +44,6 @@
 #define __OPENCV_OBJDETECT_HPP__
 
 #include "opencv2/core/core.hpp"
-#include "opencv2/features2d/features2d.hpp"
 
 #ifdef __cplusplus
 #include <map>
index 4c0fa49..f6c7d61 100644 (file)
@@ -1500,7 +1500,8 @@ cvLoadHaarClassifierCascade( const char* directory, CvSize orig_window_size )
         fseek( f, 0, SEEK_END );
         size = ftell( f );
         fseek( f, 0, SEEK_SET );
-        fread( ptr, 1, size, f );
+        size_t elements_read = fread( ptr, 1, size, f );
+        CV_Assert(elements_read == (size_t)(size));
         fclose(f);
         input_cascade[i] = ptr;
         ptr += size;
index c307892..78a726c 100644 (file)
@@ -272,12 +272,12 @@ void quantizedOrientations(const Mat& src, Mat& magnitude,
 
   // Allocate temporary buffers
   Size size = src.size();
-  Mat_<Vec3s> sobel_3dx(size); // per-channel horizontal derivative
-  Mat_<Vec3s> sobel_3dy(size); // per-channel vertical derivative
-  Mat_<float> sobel_dx(size);      // maximum horizontal derivative
-  Mat_<float> sobel_dy(size);      // maximum vertical derivative
-  Mat_<float> sobel_ag(size);      // final gradient orientation (unquantized)
-  Mat_<Vec3b> smoothed(size);
+  Mat sobel_3dx; // per-channel horizontal derivative
+  Mat sobel_3dy; // per-channel vertical derivative
+  Mat sobel_dx(size, CV_32F);      // maximum horizontal derivative
+  Mat sobel_dy(size, CV_32F);      // maximum vertical derivative
+  Mat sobel_ag;  // final gradient orientation (unquantized)
+  Mat smoothed;
 
   // Compute horizontal and vertical image derivatives on all color channels separately
   static const int KERNEL_SIZE = 7;
@@ -306,27 +306,27 @@ void quantizedOrientations(const Mat& src, Mat& magnitude,
     for (int i = 0; i < length0; i += 3)
     {
       // Use the gradient orientation of the channel whose magnitude is largest
-      unsigned short mag1 = CV_SQR((unsigned short)ptrx[i]) + CV_SQR((unsigned short)ptry[i]);
-      unsigned short mag2 = CV_SQR((unsigned short)ptrx[i + 1]) + CV_SQR((unsigned short)ptry[i + 1]);
-      unsigned short mag3 = CV_SQR((unsigned short)ptrx[i + 2]) + CV_SQR((unsigned short)ptry[i + 2]);
+      int mag1 = CV_SQR(ptrx[i]) + CV_SQR(ptry[i]);
+      int mag2 = CV_SQR(ptrx[i + 1]) + CV_SQR(ptry[i + 1]);
+      int mag3 = CV_SQR(ptrx[i + 2]) + CV_SQR(ptry[i + 2]);
 
       if (mag1 >= mag2 && mag1 >= mag3)
       {
         ptr0x[ind] = ptrx[i];
         ptr0y[ind] = ptry[i];
-        ptrmg[ind] = mag1;
+        ptrmg[ind] = (float)mag1;
       }
       else if (mag2 >= mag1 && mag2 >= mag3)
       {
         ptr0x[ind] = ptrx[i + 1];
         ptr0y[ind] = ptry[i + 1];
-        ptrmg[ind] = mag2;
+        ptrmg[ind] = (float)mag2;
       }
       else
       {
         ptr0x[ind] = ptrx[i + 2];
         ptr0y[ind] = ptry[i + 2];
-        ptrmg[ind] = mag3;
+        ptrmg[ind] = (float)mag3;
       }
       ++ind;
     }
index e4ad85f..46c8d9e 100644 (file)
@@ -244,7 +244,8 @@ void parserRFilter  (FILE * xmlf, int p, CvLSVMFilterObject * model, float *b){
                 }\r
                 if(tagVal == WEIGHTS){\r
                     data = (double *)malloc( sizeof(double) * p * sizeX * sizeY);\r
-                    fread(data, sizeof(double), p * sizeX * sizeY, xmlf);\r
+                    size_t elements_read = fread(data, sizeof(double), p * sizeX * sizeY, xmlf);\r
+                    CV_Assert(elements_read == (size_t)(p * sizeX * sizeY));\r
                     model->H = (float *)malloc(sizeof(float)* p * sizeX * sizeY);\r
                     for(ii = 0; ii < p * sizeX * sizeY; ii++){\r
                         model->H[ii] = (float)data[ii];\r
@@ -502,7 +503,8 @@ void parserPFilter  (FILE * xmlf, int p, int /*N_path*/, CvLSVMFilterObject * mo
                 }\r
                 if(tagVal == WEIGHTS){\r
                     data = (double *)malloc( sizeof(double) * p * sizeX * sizeY);\r
-                    fread(data, sizeof(double), p * sizeX * sizeY, xmlf);\r
+                    size_t elements_read = fread(data, sizeof(double), p * sizeX * sizeY, xmlf);\r
+                    CV_Assert(elements_read == (size_t)(p * sizeX * sizeY));\r
                     model->H = (float *)malloc(sizeof(float)* p * sizeX * sizeY);\r
                     for(ii = 0; ii < p * sizeX * sizeY; ii++){\r
                         model->H[ii] = (float)data[ii];\r
index 4d86ebf..8dad2a1 100644 (file)
@@ -56,8 +56,6 @@
 #include "opencv2/imgproc/imgproc_c.h"
 #include "opencv2/core/core_c.h"
 #include "opencv2/core/internal.hpp"
-#include "opencv2/features2d/features2d.hpp"
-#include "opencv2/calib3d/calib3d.hpp"
 
 #include "opencv2/opencv_modules.hpp"
 #ifdef HAVE_OPENCV_HIGHGUI
index 3fb81ea..f37aa52 100644 (file)
@@ -20,7 +20,7 @@ Restores the selected region in an image using the region neighborhood.
 
     :param dst: Output image with the same size and type as  ``src`` .
     
-    :param inpaintRadius: Radius of a circlular neighborhood of each point inpainted that is considered by the algorithm.
+    :param inpaintRadius: Radius of a circular neighborhood of each point inpainted that is considered by the algorithm.
 
     :param flags: Inpainting method that could be one of the following:
 
index f708bd6..0bfd71f 100644 (file)
@@ -10,44 +10,32 @@ if(ANDROID OR IOS OR NOT PYTHONLIBS_FOUND OR NOT PYTHON_USE_NUMPY)
 endif()
 
 set(the_description "The python bindings")
-ocv_add_module(python BINDINGS opencv_core opencv_flann opencv_imgproc opencv_video opencv_ml opencv_features2d opencv_highgui opencv_calib3d opencv_photo opencv_nonfree opencv_objdetect opencv_legacy opencv_contrib)
+ocv_add_module(python BINDINGS opencv_core opencv_flann opencv_imgproc opencv_video opencv_ml opencv_features2d opencv_highgui opencv_calib3d opencv_photo opencv_objdetect opencv_legacy OPTIONAL opencv_nonfree)
 
-ocv_include_directories(${PYTHON_INCLUDE_PATH})
-ocv_include_directories(
+add_definitions(-DPYTHON_USE_NUMPY=1)
+
+ocv_module_include_directories(
+    "${PYTHON_INCLUDE_PATH}"
+    "${PYTHON_NUMPY_INCLUDE_DIR}"
     "${CMAKE_CURRENT_SOURCE_DIR}/src2"
-    "${OpenCV_SOURCE_DIR}/modules/core/include"
-    "${OpenCV_SOURCE_DIR}/modules/flann/include"
-    "${OpenCV_SOURCE_DIR}/modules/imgproc/include"
-    "${OpenCV_SOURCE_DIR}/modules/video/include"
-    "${OpenCV_SOURCE_DIR}/modules/photo/include"
-    "${OpenCV_SOURCE_DIR}/modules/highgui/include"
-    "${OpenCV_SOURCE_DIR}/modules/ml/include"
-    "${OpenCV_SOURCE_DIR}/modules/features2d/include"
-    "${OpenCV_SOURCE_DIR}/modules/flann/include"
-    "${OpenCV_SOURCE_DIR}/modules/calib3d/include"
-    "${OpenCV_SOURCE_DIR}/modules/objdetect/include"
-    "${OpenCV_SOURCE_DIR}/modules/nonfree/include"
-    "${OpenCV_SOURCE_DIR}/modules/legacy/include"
-    "${OpenCV_SOURCE_DIR}/modules/contrib/include"
     )
 
-include_directories(${CMAKE_CURRENT_BINARY_DIR})
-
-set(opencv_hdrs "${OpenCV_SOURCE_DIR}/modules/core/include/opencv2/core/core.hpp"
-    "${OpenCV_SOURCE_DIR}/modules/flann/include/opencv2/flann/miniflann.hpp"
-    "${OpenCV_SOURCE_DIR}/modules/imgproc/include/opencv2/imgproc/imgproc.hpp"
-    "${OpenCV_SOURCE_DIR}/modules/video/include/opencv2/video/background_segm.hpp"
-    "${OpenCV_SOURCE_DIR}/modules/video/include/opencv2/video/tracking.hpp"
-    "${OpenCV_SOURCE_DIR}/modules/photo/include/opencv2/photo/photo.hpp"
-    "${OpenCV_SOURCE_DIR}/modules/highgui/include/opencv2/highgui/highgui.hpp"
-    "${OpenCV_SOURCE_DIR}/modules/ml/include/opencv2/ml/ml.hpp"
-    "${OpenCV_SOURCE_DIR}/modules/features2d/include/opencv2/features2d/features2d.hpp"
-    "${OpenCV_SOURCE_DIR}/modules/nonfree/include/opencv2/nonfree/features2d.hpp"
-    "${OpenCV_SOURCE_DIR}/modules/calib3d/include/opencv2/calib3d/calib3d.hpp"
-    "${OpenCV_SOURCE_DIR}/modules/objdetect/include/opencv2/objdetect/objdetect.hpp")
-
-if(MSVC)
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
+set(opencv_hdrs
+    "${OPENCV_MODULE_opencv_core_LOCATION}/include/opencv2/core/core.hpp"
+    "${OPENCV_MODULE_opencv_flann_LOCATION}/include/opencv2/flann/miniflann.hpp"
+    "${OPENCV_MODULE_opencv_imgproc_LOCATION}/include/opencv2/imgproc/imgproc.hpp"
+    "${OPENCV_MODULE_opencv_video_LOCATION}/include/opencv2/video/background_segm.hpp"
+    "${OPENCV_MODULE_opencv_video_LOCATION}/include/opencv2/video/tracking.hpp"
+    "${OPENCV_MODULE_opencv_photo_LOCATION}/include/opencv2/photo/photo.hpp"
+    "${OPENCV_MODULE_opencv_highgui_LOCATION}/include/opencv2/highgui/highgui.hpp"
+    "${OPENCV_MODULE_opencv_ml_LOCATION}/include/opencv2/ml/ml.hpp"
+    "${OPENCV_MODULE_opencv_features2d_LOCATION}/include/opencv2/features2d/features2d.hpp"
+    "${OPENCV_MODULE_opencv_calib3d_LOCATION}/include/opencv2/calib3d/calib3d.hpp"
+    "${OPENCV_MODULE_opencv_objdetect_LOCATION}/include/opencv2/objdetect/objdetect.hpp")
+
+if(HAVE_opencv_nonfree)
+  list(APPEND opencv_hdrs     "${OPENCV_MODULE_opencv_nonfree_LOCATION}/include/opencv2/nonfree/features2d.hpp"
+                              "${OPENCV_MODULE_opencv_nonfree_LOCATION}/include/opencv2/nonfree/nonfree.hpp")
 endif()
 
 set(cv2_generated_hdrs
@@ -57,53 +45,58 @@ set(cv2_generated_hdrs
     "${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_type_reg.h"
     "${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_const_reg.h")
 
-
 add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated0.i
    COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/src2/gen.py" "${CMAKE_CURRENT_SOURCE_DIR}/src2"
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/api
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/defs
-   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/gen.py
-   )
+   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/gen.py)
 
 add_custom_command(
-     OUTPUT ${cv2_generated_hdrs}
-     COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/src2/gen2.py" ${CMAKE_CURRENT_BINARY_DIR} ${opencv_hdrs}
-     DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/gen2.py
-     DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/hdr_parser.py
-     DEPENDS ${opencv_hdrs})
-
-set(cv2_target "opencv_python")
-add_library(${cv2_target} SHARED src2/cv2.cpp ${CMAKE_CURRENT_BINARY_DIR}/generated0.i ${cv2_generated_hdrs} src2/cv2.cv.hpp)
-target_link_libraries(${cv2_target} ${PYTHON_LIBRARIES} opencv_core opencv_flann opencv_imgproc opencv_video opencv_ml opencv_features2d opencv_highgui opencv_calib3d opencv_objdetect opencv_legacy opencv_contrib opencv_photo)
-    
-set_target_properties(${cv2_target} PROPERTIES PREFIX "")
-set_target_properties(${cv2_target} PROPERTIES OUTPUT_NAME "cv2")
+   OUTPUT ${cv2_generated_hdrs}
+   COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/src2/gen2.py" ${CMAKE_CURRENT_BINARY_DIR} ${opencv_hdrs}
+   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/gen2.py
+   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/hdr_parser.py
+   DEPENDS ${opencv_hdrs})
+
+add_library(${the_module} SHARED src2/cv2.cpp ${CMAKE_CURRENT_BINARY_DIR}/generated0.i ${cv2_generated_hdrs} src2/cv2.cv.hpp)
+target_link_libraries(${the_module} ${PYTHON_LIBRARIES} ${OPENCV_MODULE_${the_module}_DEPS})
 
 execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import distutils.sysconfig; print distutils.sysconfig.get_config_var('SO')"
                 RESULT_VARIABLE PYTHON_CVPY_PROCESS
                 OUTPUT_VARIABLE CVPY_SUFFIX
                 OUTPUT_STRIP_TRAILING_WHITESPACE)
 
-set_target_properties(${cv2_target} PROPERTIES SUFFIX ${CVPY_SUFFIX})
+set_target_properties(${the_module} PROPERTIES
+                      PREFIX ""
+                      OUTPUT_NAME cv2
+                      SUFFIX ${CVPY_SUFFIX})
 
-if (MSVC AND NOT BUILD_SHARED_LIBS)
-    set_target_properties(${cv2_target} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:atlthunk.lib /NODEFAULTLIB:atlsd.lib /DEBUG")
+if(CMAKE_COMPILER_IS_GNUCXX AND NOT ENABLE_NOISY_WARNINGS)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-function")
 endif()
 
-set(cvpymodules ${cv2_target})
+if(MSVC AND NOT ENABLE_NOISY_WARNINGS)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4100") #unreferenced formal parameter
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4127") #conditional expression is constant
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4505") #unreferenced local function has been removed 
+  string(REPLACE "/W4" "/W3" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+endif()
+
+if(MSVC AND NOT BUILD_SHARED_LIBS)
+  set_target_properties(${the_module} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:atlthunk.lib /NODEFAULTLIB:atlsd.lib /DEBUG")
+endif()
 
-if(WIN32)
-  set(CVPY_PATH "Python${PYTHON_VERSION_MAJOR_MINOR}/Lib/site-packages")
+if(MSVC)
   set(PYTHON_INSTALL_CONFIGURATIONS CONFIGURATIONS Release)
 else()
-  set(CVPY_PATH ${PYTHON_PACKAGES_PATH})
   set(PYTHON_INSTALL_CONFIGURATIONS "")
 endif()
 
-install(TARGETS ${cvpymodules} ${PYTHON_INSTALL_CONFIGURATIONS}
-      RUNTIME DESTINATION ${CVPY_PATH} COMPONENT main
-      LIBRARY DESTINATION ${CVPY_PATH} COMPONENT main
-      ARCHIVE DESTINATION ${CVPY_PATH} COMPONENT main
-      )
-install(FILES src2/cv.py ${PYTHON_INSTALL_CONFIGURATIONS} DESTINATION ${CVPY_PATH} COMPONENT main)
+install(TARGETS ${the_module}
+        ${PYTHON_INSTALL_CONFIGURATIONS}
+        RUNTIME DESTINATION ${PYTHON_PACKAGES_PATH} COMPONENT main
+        LIBRARY DESTINATION ${PYTHON_PACKAGES_PATH} COMPONENT main
+        ARCHIVE DESTINATION ${PYTHON_PACKAGES_PATH} COMPONENT main
+        )
+install(FILES src2/cv.py ${PYTHON_INSTALL_CONFIGURATIONS} DESTINATION ${PYTHON_PACKAGES_PATH} COMPONENT main)
index e928e36..c84d3c7 100644 (file)
 #include "opencv2/video/tracking.hpp"
 #include "opencv2/video/background_segm.hpp"
 #include "opencv2/photo/photo.hpp"
-#include "opencv2/nonfree/nonfree.hpp"
 #include "opencv2/highgui/highgui.hpp"
 
+#include "opencv2/opencv_modules.hpp"
+#ifdef HAVE_OPENCV_NONFREE
+#include "opencv2/nonfree/nonfree.hpp"
+static bool makeUseOfNonfree = cv::initModule_nonfree();
+#endif
+
+
 using cv::flann::IndexParams;
 using cv::flann::SearchParams;
 
@@ -370,8 +376,9 @@ static bool pyopencv_to(PyObject* obj, uchar& value, const char* name = "<unknow
 {
     if(!obj || obj == Py_None)
         return true;
-    value = (int)PyInt_AsLong(obj);
-    return value != -1 || !PyErr_Occurred();
+    int ivalue = (int)PyInt_AsLong(obj);
+    value = cv::saturate_cast<uchar>(ivalue);
+    return ivalue != -1 || !PyErr_Occurred();
 }
 
 static PyObject* pyopencv_from(double value)
index d971d20..b90ff7a 100644 (file)
@@ -545,7 +545,7 @@ static PyObject *cvmat_array_struct(cvmat_t *cva)
 
 static PyObject *cvmatnd_array_struct(cvmatnd_t *cva)
 {
-  CvMatND *m;
+  CvMatND *m = 0;
   convert_to_CvMatND((PyObject *)cva, &m, "");
 
   arrayTrack *at = new arrayTrack;
@@ -693,7 +693,7 @@ static size_t cvmatnd_size(CvMatND *m)
 
 static PyObject *cvmatnd_tostring(PyObject *self, PyObject *args)
 {
-  CvMatND *m;
+  CvMatND *m = 0;
   if (!convert_to_CvMatND(self, &m, "self"))
     return NULL;
 
index e9c08b8..dc15ab9 100644 (file)
@@ -19,4 +19,6 @@ OpenCV API Reference
    photo/doc/photo.rst
    stitching/doc/stitching.rst
    nonfree/doc/nonfree.rst
+   contrib/doc/contrib.rst
+   legacy/doc/legacy.rst
 
index 06a8ac5..d5a68cd 100644 (file)
@@ -179,6 +179,8 @@ Performs images matching.
 
     :param mask: Mask indicating which image pairs must be matched
 
+The function is parallelized with the TBB library.
+
 .. seealso:: :ocv:struct:`detail::MatchesInfo`
 
 detail::FeaturesMatcher::isThreadSafe
index d746471..123ddd7 100644 (file)
@@ -233,7 +233,7 @@ Wave correction kind. ::
 
 detail::waveCorrect
 -------------------
-Tries to make panorama more horizontal (or verical).
+Tries to make panorama more horizontal (or vertical).
 
 .. ocv:function:: void waveCorrect(std::vector<Mat> &rmats, WaveCorrectKind kind)
 
index acd18f0..bab29a0 100644 (file)
@@ -113,7 +113,7 @@ public:
 private:\r
     // To avoid GCGraph dependency\r
     class Impl;\r
-    Ptr<Impl> impl_;\r
+    Ptr<PairwiseSeamFinder> impl_;\r
 };\r
 \r
 \r
index d4f4c52..b623750 100644 (file)
@@ -3,7 +3,7 @@ if(IOS)
 endif()
 
 if(MINGW)
-    set(OPENCV_MODULE_TYPE STATIC)
+  set(OPENCV_MODULE_TYPE STATIC)
 endif()
     
 set(the_description "The ts module")
@@ -13,12 +13,12 @@ ocv_module_include_directories()
 ocv_create_module()
 
 if(BUILD_SHARED_LIBS AND NOT MINGW)
-    add_definitions(-DGTEST_CREATE_SHARED_LIBRARY=1)
-    if (MSVC)
-        add_definitions( "/wd4251 /wd4275")
-    endif()
+  add_definitions(-DGTEST_CREATE_SHARED_LIBRARY=1)
+  if (MSVC AND NOT ENABLE_NOISY_WARNINGS)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4275")
+  endif()
 else()
-    add_definitions(-DGTEST_CREATE_SHARED_LIBRARY=0)
+  add_definitions(-DGTEST_CREATE_SHARED_LIBRARY=0)
 endif()
 
 ocv_add_precompiled_headers(${the_module})
index f9be444..b0fadfd 100644 (file)
@@ -4,7 +4,6 @@ from subprocess import Popen, PIPE
 
 hostos = os.name # 'nt', 'posix'
 hostmachine = platform.machine() # 'x86', 'AMD64', 'x86_64'
-nameprefix = "opencv_perf_"
 
 SIMD_DETECTION_PROGRAM="""
 #if __SSE5__
@@ -51,6 +50,7 @@ SIMD_DETECTION_PROGRAM="""
 
 parse_patterns = (
   {'name': "has_perf_tests",           'default': "OFF",      'pattern': re.compile("^BUILD_PERF_TESTS:BOOL=(ON)$")},
+  {'name': "has_accuracy_tests",       'default': "OFF",      'pattern': re.compile("^BUILD_TESTS:BOOL=(ON)$")},
   {'name': "cmake_home",               'default': None,       'pattern': re.compile("^CMAKE_HOME_DIRECTORY:INTERNAL=(.+)$")},
   {'name': "opencv_home",              'default': None,       'pattern': re.compile("^OpenCV_SOURCE_DIR:STATIC=(.+)$")},
   {'name': "tests_dir",                'default': None,       'pattern': re.compile("^EXECUTABLE_OUTPUT_PATH:PATH=(.+)$")},
@@ -197,10 +197,16 @@ def getRunningProcessExePathByName(name):
         return None
         
 class RunInfo(object):
+    def setCallback(self, name, callback):
+        setattr(self, name, callback)
+
     def __init__(self, path, options):
         self.options = options
         self.path = path
         self.error = None
+        self.setUp = None
+        self.tearDown = None
+        self.nameprefix = "opencv_" + options.mode + "_"
         for p in parse_patterns:
             setattr(self, p["name"], p["default"])
         cachefile = open(os.path.join(path, "CMakeCache.txt"), "rt")
@@ -266,8 +272,13 @@ class RunInfo(object):
                         self.adb = self.adb + ["-s", adb_serial]
             print "adb command:", " ".join(self.adb)
 
+        if self.adb:
+            #construct name for aapt tool
+            self.aapt = [os.path.join(os.path.dirname(self.adb[0]), ("aapt","aapt.exe")[hostos == 'nt'])]
+
         # fix has_perf_tests param
         self.has_perf_tests = self.has_perf_tests == "ON"
+        self.has_accuracy_tests = self.has_accuracy_tests == "ON"
         # fix is_x64 flag
         self.is_x64 = self.is_x64 == "ON"
         if not self.is_x64 and ("X64" in "%s %s %s" % (self.cxx_flags, self.cxx_flags_release, self.cxx_flags_debug) or "Win64" in self.cmake_generator):
@@ -372,13 +383,14 @@ class RunInfo(object):
             return False
         if hostos == self.targetos:
             return os.access(fullpath, os.X_OK)
+        if self.targetos == "android" and fullpath.endswith(".apk"):
+            return True
         return True
                 
     def getAvailableTestApps(self):
         if self.tests_dir and os.path.isdir(self.tests_dir):
-            files = glob.glob(os.path.join(self.tests_dir, nameprefix + "*"))
-            if self.targetos == hostos:
-                files = [f for f in files if self.isTest(f)]
+            files = glob.glob(os.path.join(self.tests_dir, self.nameprefix + "*"))
+            files = [f for f in files if self.isTest(f)]
             return files
         return []
     
@@ -386,8 +398,8 @@ class RunInfo(object):
         app = os.path.basename(app)
         if app.endswith(".exe"):
             app = app[:-4]
-        if app.startswith(nameprefix):
-            app = app[len(nameprefix):]
+        if app.startswith(self.nameprefix):
+            app = app[len(self.nameprefix):]
 
         if self.cmake_home_svn:
             if self.cmake_home_svn == self.opencv_home_svn:
@@ -506,6 +518,10 @@ class RunInfo(object):
         fullname += ".exe"
         if self.isTest(fullname):
             return fullname
+        if self.targetos == "android":
+            fullname += ".apk"
+            if self.isTest(fullname):
+                return fullname
         
         # short name for OpenCV tests
         for t in self.tests:
@@ -514,12 +530,12 @@ class RunInfo(object):
             fname = os.path.basename(t)
             if fname == name:
                 return t
-            if fname.endswith(".exe"):
+            if fname.endswith(".exe") or (self.targetos == "android" and fname.endswith(".apk")):
                 fname = fname[:-4]
             if fname == name:
                 return t
-            if fname.startswith(nameprefix):
-                fname = fname[len(nameprefix):]
+            if fname.startswith(self.nameprefix):
+                fname = fname[len(self.nameprefix):]
             if fname == name:
                 return t
         return None
@@ -576,10 +592,60 @@ class RunInfo(object):
         else:
             logfile = userlog[0][userlog[0].find(":")+1:]
         
-        if self.targetos == "android":
+        if self.targetos == "android" and exe.endswith(".apk"):
+            print "running", exe
+            try:
+                # get package info
+                output = Popen(self.aapt + ["dump", "xmltree", exe, "AndroidManifest.xml"], stdout=PIPE, stderr=_stderr).communicate()
+                if not output[0]:
+                    print >> _stderr, "failed to get manifest info from", exe
+                    return
+                tags = re.split(r"[ ]+E: ", output[0])
+                #get package name
+                manifest_tag = [t for t in tags if t.startswith("manifest ")]
+                if not manifest_tag:
+                    print >> _stderr, "failed to get manifest info from", exe
+                    return
+                pkg_name =  re.search(r"^[ ]+A: package=\"(?P<pkg>.*?)\" \(Raw: \"(?P=pkg)\"\)$", manifest_tag[0], flags=re.MULTILINE).group("pkg")
+                #get test instrumentation info
+                instrumentation_tag = [t for t in tags if t.startswith("instrumentation ")]
+                if not instrumentation_tag:
+                    print >> _stderr, "can not find instrumentation detials in", exe
+                    return
+                pkg_runner = re.search(r"^[ ]+A: android:name\(0x[0-9a-f]{8}\)=\"(?P<runner>.*?)\" \(Raw: \"(?P=runner)\"\)$", instrumentation_tag[0], flags=re.MULTILINE).group("runner")
+                pkg_target =  re.search(r"^[ ]+A: android:targetPackage\(0x[0-9a-f]{8}\)=\"(?P<pkg>.*?)\" \(Raw: \"(?P=pkg)\"\)$", instrumentation_tag[0], flags=re.MULTILINE).group("pkg")
+                if not pkg_name or not pkg_runner or not pkg_target:
+                    print >> _stderr, "can not find instrumentation detials in", exe
+                    return
+                if self.options.junit_package:
+                    if self.options.junit_package.startswith("."):
+                        pkg_target += self.options.junit_package
+                    else:
+                        pkg_target = self.options.junit_package
+                #uninstall already installed package
+                print >> _stderr, "Uninstalling old", pkg_name, "from device..."
+                output = Popen(self.adb + ["uninstall", pkg_name], stdout=_stdout, stderr=_stderr).wait()
+                if output != 0:
+                    print >> _stderr, "failed to uninstall", pkg_name, "from device"
+                    return
+                print >> _stderr, "Installing new", exe, "to device..."
+                output = Popen(self.adb + ["install", exe], stdout=_stdout, stderr=_stderr).wait()
+                if output != 0:
+                    print >> _stderr, "failed to install", exe, "to device"
+                    return
+                print >> _stderr, "Running jUnit tests for ", pkg_target
+                if self.setUp is not None:
+                    self.setUp()
+                Popen(self.adb + ["shell", "am instrument -w -e package " + pkg_target + " " + pkg_name + "/" + pkg_runner], stdout=_stdout, stderr=_stderr).wait()
+                if self.tearDown is not None:
+                    self.tearDown()
+            except OSError:
+                pass
+            return
+        elif self.targetos == "android":
             hostlogpath = ""
             try:
-                andoidcwd = "/data/bin/" + getpass.getuser().replace(" ","") + "_perf/"
+                andoidcwd = "/data/bin/" + getpass.getuser().replace(" ","") + "_" + self.options.mode +"/"
                 exename = os.path.basename(exe)
                 androidexe = andoidcwd + exename
                 #upload
@@ -600,7 +666,11 @@ class RunInfo(object):
                 else:
                     command = exename + " " + " ".join(args)
                 print >> _stderr, "Running:", command
+                if self.setUp is not None:
+                    self.setUp()
                 Popen(self.adb + ["shell", "export OPENCV_TEST_DATA_PATH=" + self.test_data_path + "&& cd " + andoidcwd + "&& ./" + command], stdout=_stdout, stderr=_stderr).wait()
+                if self.tearDown is not None:
+                    self.tearDown()
                 # try get log
                 if not self.options.help:
                     print >> _stderr, "Pulling", logfile, "from device..."
@@ -649,33 +719,44 @@ class RunInfo(object):
                 print >> _stderr, "Error: Test \"%s\" is not found in %s" % (test, self.tests_dir)
         return logs
 
+def getRunArgs(args):
+    run_args = []
+    for path in args:
+        path = os.path.abspath(path)
+        while (True):
+            if os.path.isdir(path) and os.path.isfile(os.path.join(path, "CMakeCache.txt")):
+                run_args.append(path)
+                break
+            npath = os.path.dirname(path)
+            if npath == path:
+                break
+            path = npath
+    return run_args
+
 if __name__ == "__main__":
     test_args = [a for a in sys.argv if a.startswith("--perf_") or a.startswith("--gtest_")]
     argv =      [a for a in sys.argv if not(a.startswith("--perf_") or a.startswith("--gtest_"))]
     
     parser = OptionParser()
     parser.add_option("-t", "--tests", dest="tests", help="comma-separated list of modules to test", metavar="SUITS", default="")
+    
     parser.add_option("-w", "--cwd", dest="cwd", help="working directory for tests", metavar="PATH", default=".")
+    parser.add_option("-a", "--accuracy", dest="accuracy", help="look for accuracy tests instead of performance tests", action="store_true", default=False)
     parser.add_option("-l", "--longname", dest="useLongNames", action="store_true", help="generate log files with long names", default=False)
     parser.add_option("", "--android_test_data_path", dest="test_data_path", help="OPENCV_TEST_DATA_PATH for Android run", metavar="PATH", default="/sdcard/opencv_testdata/")
     parser.add_option("", "--configuration", dest="configuration", help="force Debug or Release donfiguration", metavar="CFG", default="")
     parser.add_option("", "--serial", dest="adb_serial", help="Android: directs command to the USB device or emulator with the given serial number", metavar="serial number", default="")
+    parser.add_option("", "--package", dest="junit_package", help="Android: run jUnit tests for specified package", metavar="package", default="")
     parser.add_option("", "--help-tests", dest="help", help="Show help for test executable", action="store_true", default=False)
     
     (options, args) = parser.parse_args(argv)
+
+    if options.accuracy:
+        options.mode = "test"
+    else:
+        options.mode = "perf"
     
-    run_args = []
-    
-    for path in args:
-        path = os.path.abspath(path)
-        while (True):
-            if os.path.isdir(path) and os.path.isfile(os.path.join(path, "CMakeCache.txt")):
-                run_args.append(path)
-                break
-            npath = os.path.dirname(path)
-            if npath == path:
-                break
-            path = npath
+    run_args = getRunArgs(args)
     
     if len(run_args) == 0:
         print >> sys.stderr, "Usage:\n", os.path.basename(sys.argv[0]), "<build_path>"
index 415fdd5..b9df881 100644 (file)
@@ -1,7 +1,62 @@
 #include "precomp.hpp"\r
 \r
+#if ANDROID\r
+# include <sys/time.h>\r
+#endif\r
+\r
 using namespace perf;\r
 \r
+int64 TestBase::timeLimitDefault = 0;\r
+unsigned int TestBase::iterationsLimitDefault = (unsigned int)(-1);\r
+int64 TestBase::_timeadjustment = 0;\r
+\r
+const char *command_line_keys =\r
+{\r
+    "{   |perf_max_outliers   |8        |percent of allowed outliers}"\r
+    "{   |perf_min_samples    |10       |minimal required numer of samples}"\r
+    "{   |perf_force_samples  |100      |force set maximum number of samples for all tests}"\r
+    "{   |perf_seed           |809564   |seed for random numbers generator}"\r
+    "{   |perf_tbb_nthreads   |-1       |if TBB is enabled, the number of TBB threads}"\r
+    "{   |perf_write_sanity   |false    |allow to create new records for sanity checks}"\r
+    #if ANDROID\r
+    "{   |perf_time_limit     |6.0      |default time limit for a single test (in seconds)}"\r
+    "{   |perf_affinity_mask  |0        |set affinity mask for the main thread}"\r
+    "{   |perf_log_power_checkpoints  |false    |additional xml logging for power measurement}"\r
+    #else\r
+    "{   |perf_time_limit     |3.0      |default time limit for a single test (in seconds)}"\r
+    #endif\r
+    "{   |perf_max_deviation  |1.0      |}"\r
+    "{h  |help                |false    |}"\r
+};\r
+\r
+static double       param_max_outliers;\r
+static double       param_max_deviation;\r
+static unsigned int param_min_samples;\r
+static unsigned int param_force_samples;\r
+static uint64       param_seed;\r
+static double       param_time_limit;\r
+static int          param_tbb_nthreads;\r
+static bool         param_write_sanity;\r
+#if ANDROID\r
+static int          param_affinity_mask;\r
+static bool         log_power_checkpoints;\r
+\r
+#include <sys/syscall.h>\r
+#include <pthread.h>\r
+static void setCurrentThreadAffinityMask(int mask)\r
+{\r
+    pid_t pid=gettid();\r
+    int syscallres=syscall(__NR_sched_setaffinity, pid, sizeof(mask), &mask);\r
+    if (syscallres)\r
+    {\r
+        int err=errno;\r
+        err=err;//to avoid warnings about unused variables\r
+        LOGE("Error in the syscall setaffinity: mask=%d=0x%x err=%d=0x%x", mask, mask, err, err);\r
+    }\r
+}\r
+\r
+#endif\r
+\r
 void randu(cv::Mat& m)\r
 {\r
     const int bigValue = 0x00000FFF;\r
@@ -82,14 +137,22 @@ void Regression::init(const std::string& testSuitName, const std::string& ext)
         storageOutPath = testSuitName;\r
     }\r
 \r
-    if (storageIn.open(storageInPath, cv::FileStorage::READ))\r
+    try\r
     {\r
-        rootIn = storageIn.root();\r
-        if (storageInPath.length() > 3 && storageInPath.substr(storageInPath.length()-3) == ".gz")\r
-            storageOutPath += "_new";\r
-        storageOutPath += ext;\r
+        if (storageIn.open(storageInPath, cv::FileStorage::READ))\r
+        {\r
+            rootIn = storageIn.root();\r
+            if (storageInPath.length() > 3 && storageInPath.substr(storageInPath.length()-3) == ".gz")\r
+                storageOutPath += "_new";\r
+            storageOutPath += ext;\r
+        }\r
     }\r
-    else\r
+    catch(cv::Exception&)\r
+    {\r
+        LOGE("Failed to open sanity data for reading: %s", storageInPath.c_str());\r
+    }\r
+    \r
+    if(!storageIn.isOpened())\r
         storageOutPath = storageInPath;\r
 }\r
 \r
@@ -408,17 +471,20 @@ Regression& Regression::operator() (const std::string& name, cv::InputArray arra
     cv::FileNode n = rootIn[nodename];\r
     if(n.isNone())\r
     {\r
-        if (nodename != currentTestNodeName)\r
+        if(param_write_sanity)\r
         {\r
-            if (!currentTestNodeName.empty())\r
-                write() << "}";\r
-            currentTestNodeName = nodename;\r
+            if (nodename != currentTestNodeName)\r
+            {\r
+                if (!currentTestNodeName.empty())\r
+                    write() << "}";\r
+                currentTestNodeName = nodename;\r
 \r
-            write() << nodename << "{";\r
+                write() << nodename << "{";\r
+            }\r
+            write() << name << "{";\r
+            write(array);\r
+            write() << "}";\r
         }\r
-        write() << name << "{";\r
-        write(array);\r
-        write() << "}";\r
     }\r
     else\r
     {\r
@@ -455,52 +521,7 @@ performance_metrics::performance_metrics()
 /*****************************************************************************************\\r
 *                                   ::perf::TestBase\r
 \*****************************************************************************************/\r
-int64 TestBase::timeLimitDefault = 0;\r
-unsigned int TestBase::iterationsLimitDefault = (unsigned int)(-1);\r
-int64 TestBase::_timeadjustment = 0;\r
 \r
-const char *command_line_keys =\r
-{\r
-    "{   |perf_max_outliers   |8        |percent of allowed outliers}"\r
-    "{   |perf_min_samples    |10       |minimal required numer of samples}"\r
-    "{   |perf_force_samples  |100      |force set maximum number of samples for all tests}"\r
-    "{   |perf_seed           |809564   |seed for random numbers generator}"\r
-    "{   |perf_tbb_nthreads   |-1       |if TBB is enabled, the number of TBB threads}"\r
-    #if ANDROID\r
-    "{   |perf_time_limit     |6.0      |default time limit for a single test (in seconds)}"\r
-    "{   |perf_affinity_mask  |0        |set affinity mask for the main thread}"\r
-    #else\r
-    "{   |perf_time_limit     |3.0      |default time limit for a single test (in seconds)}"\r
-    #endif\r
-    "{   |perf_max_deviation  |1.0      |}"\r
-    "{h  |help                |false    |}"\r
-};\r
-\r
-double       param_max_outliers;\r
-double       param_max_deviation;\r
-unsigned int param_min_samples;\r
-unsigned int perf_force_samples;\r
-uint64       param_seed;\r
-double       param_time_limit;\r
-int          param_tbb_nthreads;\r
-#if ANDROID\r
-int          param_affinity_mask;\r
-\r
-#include <sys/syscall.h>\r
-#include <pthread.h>\r
-static void setCurrentThreadAffinityMask(int mask)\r
-{\r
-    pid_t pid=gettid();\r
-    int syscallres=syscall(__NR_sched_setaffinity, pid, sizeof(mask), &mask);\r
-    if (syscallres)\r
-    {\r
-        int err=errno;\r
-        err=err;//to avoid warnings about unused variables\r
-        LOGE("Error in the syscall setaffinity: mask=%d=0x%x err=%d=0x%x", mask, mask, err, err);\r
-    }\r
-}\r
-\r
-#endif\r
 \r
 void TestBase::Init(int argc, const char* const argv[])\r
 {\r
@@ -510,11 +531,12 @@ void TestBase::Init(int argc, const char* const argv[])
     param_max_deviation = std::max(0., args.get<double>("perf_max_deviation"));\r
     param_seed = args.get<uint64>("perf_seed");\r
     param_time_limit = std::max(0., args.get<double>("perf_time_limit"));\r
-    perf_force_samples = args.get<unsigned int>("perf_force_samples");\r
-\r
+    param_force_samples = args.get<unsigned int>("perf_force_samples");\r
+    param_write_sanity = args.get<bool>("perf_write_sanity");\r
     param_tbb_nthreads  = args.get<int>("perf_tbb_nthreads");\r
 #if ANDROID\r
     param_affinity_mask = args.get<int>("perf_affinity_mask");\r
+    log_power_checkpoints = args.get<bool>("perf_log_power_checkpoints");\r
 #endif\r
 \r
     if (args.get<bool>("help"))\r
@@ -525,7 +547,7 @@ void TestBase::Init(int argc, const char* const argv[])
     }\r
 \r
     timeLimitDefault = param_time_limit == 0.0 ? 1 : (int64)(param_time_limit * cv::getTickFrequency());\r
-    iterationsLimitDefault = perf_force_samples == 0 ? (unsigned)(-1) : perf_force_samples;\r
+    iterationsLimitDefault = param_force_samples == 0 ? (unsigned)(-1) : param_force_samples;\r
     _timeadjustment = _calibrate();\r
 }\r
 \r
@@ -613,7 +635,19 @@ cv::Size TestBase::getSize(cv::InputArray a)
 \r
 bool TestBase::next()\r
 {\r
-    return ++currentIter < nIters && totalTime < timeLimit;\r
+    bool has_next = ++currentIter < nIters && totalTime < timeLimit;\r
+#if ANDROID\r
+    if (log_power_checkpoints)\r
+    {\r
+        timeval tim;\r
+        gettimeofday(&tim, NULL);\r
+        unsigned long long t1 = tim.tv_sec * 1000LLU + (unsigned long long)(tim.tv_usec / 1000.f);\r
+        \r
+        if (currentIter == 1) RecordProperty("test_start", cv::format("%llu",t1).c_str());\r
+        if (!has_next) RecordProperty("test_complete", cv::format("%llu",t1).c_str());\r
+    }\r
+#endif    \r
+    return has_next;\r
 }\r
 \r
 void TestBase::warmup_impl(cv::Mat m, int wtype)\r
@@ -985,7 +1019,7 @@ TestBase::_declareHelper& TestBase::_declareHelper::tbb_threads(int n)
     if (n > 0)\r
         test->p_tbb_initializer=new tbb::task_scheduler_init(n);\r
 #endif\r
-       (void)n;\r
+    (void)n;\r
     return *this;\r
 }\r
 \r
index e9178bd..3aca9e2 100644 (file)
@@ -8,9 +8,9 @@ calcOpticalFlowPyrLK
 ------------------------
 Calculates an optical flow for a sparse feature set using the iterative Lucas-Kanade method with pyramids.
 
-.. ocv:function:: void calcOpticalFlowPyrLK( InputArray prevImg, InputArray nextImg, InputArray prevPts, InputOutputArray nextPts, OutputArray status, OutputArray err, Size winSize=Size(15,15), int maxLevel=3,        TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), double derivLambda=0.5, int flags=0 )
+.. ocv:function:: void calcOpticalFlowPyrLK( InputArray prevImg, InputArray nextImg, InputArray prevPts, InputOutputArray nextPts, OutputArray status, OutputArray err, Size winSize=Size(15,15), int maxLevel=3, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), int flags=0, double minEigThreshold=1e-4)
 
-.. ocv:pyfunction:: cv2.calcOpticalFlowPyrLK(prevImg, nextImg, prevPts[, nextPts[, status[, err[, winSize[, maxLevel[, criteria[, derivLambda[, flags]]]]]]]]) -> nextPts, status, err
+.. ocv:pyfunction:: cv2.calcOpticalFlowPyrLK(prevImg, nextImg, prevPts[, nextPts[, status[, err[, winSize[, maxLevel[, criteria[, flags[, minEigThreshold]]]]]]]]) -> nextPts, status, err
 
 .. ocv:cfunction:: void cvCalcOpticalFlowPyrLK( const CvArr* prev, const CvArr* curr, CvArr* prevPyr, CvArr* currPyr, const CvPoint2D32f* prevFeatures, CvPoint2D32f* currFeatures, int count, CvSize winSize, int level, char* status, float* trackError, CvTermCriteria criteria, int flags )
 .. ocv:pyoldfunction:: cv.CalcOpticalFlowPyrLK( prev, curr, prevPyr, currPyr, prevFeatures, winSize, level, criteria, flags, guesses=None) -> (currFeatures, status, trackError)
@@ -25,7 +25,7 @@ Calculates an optical flow for a sparse feature set using the iterative Lucas-Ka
 
     :param status: Output status vector. Each element of the vector is set to 1 if the flow for the corresponding features has been found. Otherwise, it is set to 0.
 
-    :param err: Output vector that contains the difference between patches around the original and moved points.
+    :param err: Output vector of errors. Each element of the vector is set to a error for the corresponding feature. A type of the error measure can be set in ``flags`` parameter. If the flow wasn't found then the error is not defined (use the ``status`` parameter to find such cases).
 
     :param winSize: Size of the search window at each pyramid level.
 
@@ -33,14 +33,15 @@ Calculates an optical flow for a sparse feature set using the iterative Lucas-Ka
 
     :param criteria: Parameter specifying the termination criteria of the iterative search algorithm (after the specified maximum number of iterations  ``criteria.maxCount``  or when the search window moves by less than  ``criteria.epsilon`` .
     
-    :param derivLambda: Not used.
-
     :param flags: Operation flags:
 
             * **OPTFLOW_USE_INITIAL_FLOW** Use initial estimations stored in  ``nextPts`` . If the flag is not set, then ``prevPts`` is copied to ``nextPts`` and is considered as the initial estimate.
+
+            * **OPTFLOW_LK_GET_MIN_EIGENVALS** Use minimum eigen values as a error measure (see ``minEigThreshold`` description). If the flag is not set, then L1 distance between patches around the original and a moved point divided by number of pixels in a window is used as a error measure.
+
+    :param minEigThreshold: The algorithm computes a minimum eigen value of a 2x2 normal matrix of optical flow equations (this matrix is called a spatial gradient matrix in [Bouguet00]_) divided by number of pixels in a window. If this value is less then ``minEigThreshold`` then a corresponding feature is filtered out and its flow is not computed. So it allows to remove bad points earlier and speed up the computation.
             
-The function implements a sparse iterative version of the Lucas-Kanade optical flow in pyramids. See
-[Bouguet00]_.
+The function implements a sparse iterative version of the Lucas-Kanade optical flow in pyramids. See [Bouguet00]_. The function is parallelized with the TBB library.
 
 
 
@@ -78,7 +79,7 @@ Computes a dense optical flow using the Gunnar Farneback's algorithm.
 
             * **OPTFLOW_FARNEBACK_GAUSSIAN** Use the Gaussian  :math:`\texttt{winsize}\times\texttt{winsize}`  filter instead of a box filter of the same size for optical flow estimation. Usually, this option gives z more accurate flow than with a box filter, at the cost of lower speed. Normally,  ``winsize``  for a Gaussian window should be set to a larger value to achieve the same level of robustness.
 
-The function finds an optical flow for each ``prevImg`` pixel using the [Farneback2003]_ alorithm so that
+The function finds an optical flow for each ``prevImg`` pixel using the [Farneback2003]_ algorithm so that
 
 .. math::
 
@@ -97,7 +98,7 @@ Computes an optimal affine transformation between two 2D point sets.
 
     :param dst: Second input 2D point set of the same size and the same type as ``A``, or another image.
 
-    :param fullAffine: If true, the function finds an optimal affine transformation with no additional resrictions (6 degrees of freedom). Otherwise, the class of transformations to choose from is limited to combinations of translation, rotation, and uniform scaling (5 degrees of freedom).
+    :param fullAffine: If true, the function finds an optimal affine transformation with no additional restrictions (6 degrees of freedom). Otherwise, the class of transformations to choose from is limited to combinations of translation, rotation, and uniform scaling (5 degrees of freedom).
 
 The function finds an optimal affine transform *[A|b]* (a ``2 x 3`` floating-point matrix) that approximates best the affine transformation between:
 
@@ -181,9 +182,9 @@ Calculates a gradient orientation of a motion history image.
 
     :param orientation: Output motion gradient orientation image that has the same type and the same size as  ``mhi`` . Each pixel of the image is a motion orientation, from 0 to 360 degrees.
 
-    :param delta1: Minimal (or maximal) allowed difference between  ``mhi``  values within a pixel neighorhood.
+    :param delta1: Minimal (or maximal) allowed difference between  ``mhi``  values within a pixel neighborhood.
     
-    :param delta2: Maximal (or minimal) allowed difference between  ``mhi``  values within a pixel neighorhood. That is, the function finds the minimum ( :math:`m(x,y)` ) and maximum ( :math:`M(x,y)` )  ``mhi``  values over  :math:`3 \times 3`  neighborhood of each pixel and marks the motion orientation at  :math:`(x, y)`  as valid only if
+    :param delta2: Maximal (or minimal) allowed difference between  ``mhi``  values within a pixel neighborhood. That is, the function finds the minimum ( :math:`m(x,y)` ) and maximum ( :math:`M(x,y)` )  ``mhi``  values over  :math:`3 \times 3`  neighborhood of each pixel and marks the motion orientation at  :math:`(x, y)`  as valid only if
 
         .. math::
 
@@ -279,7 +280,9 @@ Finds an object center, size, and orientation.
 
     :param criteria: Stop criteria for the underlying  :ocv:func:`meanShift` .
 
-The function implements the CAMSHIFT object tracking algrorithm
+    :returns: (in old interfaces) Number of iterations CAMSHIFT took to converge 
+
+The function implements the CAMSHIFT object tracking algorithm
 [Bradski98]_.
 First, it finds an object center using
 :ocv:func:`meanShift` and then adjusts the window size and finds the optimal rotation. The function returns the rotated rectangle structure that includes the object position, size, and orientation. The next position of the search window can be obtained with ``RotatedRect::boundingRect()`` .
@@ -305,6 +308,8 @@ Finds an object on a back projection image.
 
     :param criteria: Stop criteria for the iterative search algorithm.
 
+    :returns: Number of iterations CAMSHIFT took to converge.
+
 The function implements the iterative object search algorithm. It takes the input back projection of an object and the initial position. The mass center in ``window`` of the back projection image is computed and the search window center shifts to the mass center. The procedure is repeated until the specified number of iterations ``criteria.maxCount`` is done or until the window center shifts by less than ``criteria.epsilon`` . The algorithm is used inside
 :ocv:func:`CamShift` and, unlike
 :ocv:func:`CamShift` , the search window size or orientation do not change during the search. You can simply pass the output of
@@ -443,16 +448,16 @@ BackgroundSubtractorMOG
 
 .. ocv:class:: BackgroundSubtractorMOG : public BackgroundSubtractor
 
-Gaussian Mixture-based Backbround/Foreground Segmentation Algorithm.
+Gaussian Mixture-based Background/Foreground Segmentation Algorithm.
 
-The class implements the algorithm described in P. KadewTraKuPong and R. Bowden, *An improved adaptive background mixture model for real-time tracking with shadow detection*, Proc. 2nd European Workshp on Advanced Video-Based Surveillance Systems, 2001: http://personal.ee.surrey.ac.uk/Personal/R.Bowden/publications/avbs01/avbs01.pdf
+The class implements the algorithm described in P. KadewTraKuPong and R. Bowden, *An improved adaptive background mixture model for real-time tracking with shadow detection*, Proc. 2nd European Workshop on Advanced Video-Based Surveillance Systems, 2001: http://personal.ee.surrey.ac.uk/Personal/R.Bowden/publications/avbs01/avbs01.pdf
 
 
 
 
 BackgroundSubtractorMOG::BackgroundSubtractorMOG
 ------------------------------------------------
-The contructors
+The constructors.
 
 .. ocv:function:: BackgroundSubtractorMOG::BackgroundSubtractorMOG()
 
@@ -484,7 +489,7 @@ Parameters are the same as in :ocv:funcx:`BackgroundSubtractor::operator()`
 
 BackgroundSubtractorMOG2
 ------------------------
-Gaussian Mixture-based Backbround/Foreground Segmentation Algorithm.
+Gaussian Mixture-based Background/Foreground Segmentation Algorithm.
 
 .. ocv:class:: BackgroundSubtractorMOG2 : public BackgroundSubtractor
 
@@ -492,7 +497,7 @@ Gaussian Mixture-based Backbround/Foreground Segmentation Algorithm.
 
     .. ocv:member:: int nmixtures
     
-        Maximum allowed number of mixture comonents. Actual number is determined dynamically per pixel.
+        Maximum allowed number of mixture components. Actual number is determined dynamically per pixel.
 
     .. ocv:member:: float backgroundRatio
     
diff --git a/modules/video/perf/perf_main.cpp b/modules/video/perf/perf_main.cpp
new file mode 100644 (file)
index 0000000..2aeb908
--- /dev/null
@@ -0,0 +1,3 @@
+#include "perf_precomp.hpp"
+
+CV_PERF_TEST_MAIN(video)
diff --git a/modules/video/perf/perf_optflowpyrlk.cpp b/modules/video/perf/perf_optflowpyrlk.cpp
new file mode 100644 (file)
index 0000000..d0325da
--- /dev/null
@@ -0,0 +1,93 @@
+#include "perf_precomp.hpp"
+
+using namespace std;
+using namespace cv;
+using namespace perf;
+using std::tr1::make_tuple;
+using std::tr1::get;
+
+typedef tr1::tuple<std::string, int, int, tr1::tuple<int,int>, int> Path_Idx_Cn_NPoints_WSize_t;
+typedef TestBaseWithParam<Path_Idx_Cn_NPoints_WSize_t> Path_Idx_Cn_NPoints_WSize;
+
+void FormTrackingPointsArray(vector<Point2f>& points, int width, int height, int nPointsX, int nPointsY)
+{
+    int stepX = width / nPointsX;
+    int stepY = height / nPointsY;
+    if (stepX < 1 || stepY < 1) FAIL() << "Specified points number is too big";
+
+    points.clear();
+    points.reserve(nPointsX * nPointsY);
+
+    for( int x = stepX / 2; x < width; x += stepX )
+    {
+        for( int y = stepY / 2; y < height; y += stepY )
+        {
+            Point2f pt(static_cast<float>(x), static_cast<float>(y));
+            points.push_back(pt);
+        }
+    }
+}
+
+PERF_TEST_P(Path_Idx_Cn_NPoints_WSize, OpticalFlowPyrLK, testing::Combine(
+                testing::Values<std::string>("cv/optflow/frames/VGA_%02d.png", "cv/optflow/frames/720p_%02d.jpg"),
+                testing::Range(0, 3),
+                testing::Values(1, 3, 4),
+                testing::Values(make_tuple(9, 9), make_tuple(15, 15)),
+                testing::Values(11, 21, 25)
+                )
+            )
+{
+    string filename1 = getDataPath(cv::format(get<0>(GetParam()).c_str(), get<1>(GetParam())));
+    string filename2 = getDataPath(cv::format(get<0>(GetParam()).c_str(), get<1>(GetParam()) + 1));
+    Mat img1 = imread(filename1);
+    Mat img2 = imread(filename2);
+    if (img1.empty()) FAIL() << "Unable to load source image " << filename1;
+    if (img2.empty()) FAIL() << "Unable to load source image " << filename2;
+
+    int cn = get<2>(GetParam());
+    int nPointsX = min(get<0>(get<3>(GetParam())), img1.cols);
+    int nPointsY = min(get<1>(get<3>(GetParam())), img1.rows);
+    int winSize = get<4>(GetParam());
+    int maxLevel = 2;
+    TermCriteria criteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 5, 0.01);
+    int flags = 0;
+    double minEigThreshold = 1e-4;
+
+    Mat frame1, frame2;
+    switch(cn)
+    {
+    case 1:
+        cvtColor(img1, frame1, COLOR_BGR2GRAY, cn);
+        cvtColor(img2, frame2, COLOR_BGR2GRAY, cn);
+        break;
+    case 3:
+        frame1 = img1;
+        frame2 = img2;
+        break;
+    case 4:
+        cvtColor(img1, frame1, COLOR_BGR2BGRA, cn);
+        cvtColor(img2, frame2, COLOR_BGR2BGRA, cn);
+        break;
+    default:
+        FAIL() << "Unexpected number of channels: " << cn;
+    }
+
+    vector<Point2f> inPoints;
+    vector<Point2f> outPoints;
+    vector<uchar> status;
+    vector<float> err;
+
+    FormTrackingPointsArray(inPoints, frame1.cols, frame1.rows, nPointsX, nPointsY);
+    outPoints.resize(inPoints.size());
+    status.resize(inPoints.size());
+    err.resize(inPoints.size());
+
+    declare.in(frame1, frame2, inPoints).out(outPoints);
+
+    TEST_CYCLE_N(30)
+    {
+        calcOpticalFlowPyrLK(frame1, frame2, inPoints, outPoints, status, err,
+                             Size(winSize, winSize), maxLevel, criteria,
+                             flags, minEigThreshold);
+    }
+}
diff --git a/modules/video/perf/perf_precomp.cpp b/modules/video/perf/perf_precomp.cpp
new file mode 100644 (file)
index 0000000..8552ac3
--- /dev/null
@@ -0,0 +1 @@
+#include "perf_precomp.hpp"
diff --git a/modules/video/perf/perf_precomp.hpp b/modules/video/perf/perf_precomp.hpp
new file mode 100644 (file)
index 0000000..2dd31c2
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef __OPENCV_VIDEO_PRECOMP_HPP__
+#define __OPENCV_VIDEO_PRECOMP_HPP__
+
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/video/video.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include "opencv2/ts/ts.hpp"
+
+#if GTEST_CREATE_SHARED_LIBRARY
+#error no modules except ts should have GTEST_CREATE_SHARED_LIBRARY defined
+#endif
+
+#endif
index d7750c6..3d99813 100644 (file)
@@ -52,9 +52,8 @@
 //      windowOut   - Location, height and width of converged CAMSHIFT window
 //      len         - If != NULL, return equivalent len
 //      width       - If != NULL, return equivalent width
-//      itersUsed   - Returns number of iterations CAMSHIFT took to converge
 //    Returns:
-//      The function itself returns the area found
+//      Number of iterations CAMSHIFT took to converge
 //    Notes:
 //F*/
 CV_IMPL int
@@ -155,9 +154,8 @@ cvMeanShift( const void* imgProb, CvRect windowIn,
 //      len         - If != NULL, return equivalent len
 //      width       - If != NULL, return equivalent width
 //      area        - sum of all elements in result window
-//      itersUsed   - Returns number of iterations CAMSHIFT took to converge
 //    Returns:
-//      The function itself returns the area found
+//      Number of iterations CAMSHIFT took to converge
 //    Notes:
 //F*/
 CV_IMPL int
index 85bb26d..141a961 100644 (file)
@@ -97,7 +97,7 @@ void FastMarchingMethod::heapUp(int idx)
 void FastMarchingMethod::heapDown(int idx)
 {
     int l, r, smallest;
-    while (true)
+    for(;;)
     {
         l = 2*idx+1;
         r = 2*idx+2;
@@ -106,7 +106,8 @@ void FastMarchingMethod::heapDown(int idx)
         if (l < size_ && narrowBand_[l] < narrowBand_[smallest]) smallest = l;
         if (r < size_ && narrowBand_[r] < narrowBand_[smallest]) smallest = r;
 
-        if (smallest == idx) break;
+        if (smallest == idx)
+            break;
         else
         {
             std::swap(indexOf(narrowBand_[idx]), indexOf(narrowBand_[smallest]));
index 6710998..ab7348a 100644 (file)
@@ -293,7 +293,9 @@ public:
                         }
 
                         Point3_<uchar> cp = frame1(py1,px1), cq = frame1(qy1,qx1);
-                        float distColor = sqr(cp.x-cq.x) + sqr(cp.y-cq.y) + sqr(cp.z-cq.z);
+                        float distColor = sqr(static_cast<float>(cp.x-cq.x))
+                                        + sqr(static_cast<float>(cp.y-cq.y))
+                                        + sqr(static_cast<float>(cp.z-cq.z));
                         float w = 1.f / (sqrt(distColor * (dx*dx + dy*dy)) + eps);
 
                         uEst += w * (flowX(qy0,qx0) - dudx*dx - dudy*dy);
index facad4c..82b990a 100644 (file)
@@ -4,12 +4,11 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.LinkedList;
-import java.util.List;
 
 import org.opencv.android.Utils;
 import org.opencv.core.Core;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfRect;
 import org.opencv.core.Rect;
 import org.opencv.core.Scalar;
 import org.opencv.core.Size;
@@ -81,11 +80,11 @@ class FdView extends SampleCvViewBase {
         if (mCascade != null) {
             int height = mGray.rows();
             int faceSize = Math.round(height * FdActivity.minFaceSize);
-            List<Rect> faces = new LinkedList<Rect>();
+            MatOfRect faces = new MatOfRect();
             mCascade.detectMultiScale(mGray, faces, 1.1, 2, 2 // TODO: objdetect.CV_HAAR_SCALE_IMAGE
                     , new Size(faceSize, faceSize), new Size());
 
-            for (Rect r : faces)
+            for (Rect r : faces.toArray())
                 Core.rectangle(mRgba, r.tl(), r.br(), new Scalar(0, 255, 0, 255), 3);
         }
 
index 61dd3d5..f34a15e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <projectDescription>\r
-       <name>Tutorial 1 Basic - 0. Android Camera</name>\r
+       <name>Tutorial 0 (Basic) - Android Camera</name>\r
        <comment></comment>\r
        <projects>\r
        </projects>\r
index f49b358..afeaa2f 100644 (file)
@@ -10,13 +10,10 @@ import android.view.Window;
 public class Sample0Base extends Activity {
     private static final String TAG            = "Sample::Activity";
 
-    public static final int     VIEW_MODE_RGBA = 0;
-    public static final int     VIEW_MODE_GRAY = 1;
-
     private MenuItem            mItemPreviewRGBA;
     private MenuItem            mItemPreviewGray;
+    private Sample0View mView;
 
-    public static int           viewMode       = VIEW_MODE_RGBA;
 
     public Sample0Base() {
         Log.i(TAG, "Instantiated new " + this.getClass());
@@ -28,7 +25,8 @@ public class Sample0Base extends Activity {
         Log.i(TAG, "onCreate");
         super.onCreate(savedInstanceState);
         requestWindowFeature(Window.FEATURE_NO_TITLE);
-        setContentView(new Sample0View(this));
+        mView = new Sample0View(this);
+        setContentView(mView);
     }
 
     @Override
@@ -43,9 +41,9 @@ public class Sample0Base extends Activity {
     public boolean onOptionsItemSelected(MenuItem item) {
         Log.i(TAG, "Menu Item selected " + item);
         if (item == mItemPreviewRGBA)
-            viewMode = VIEW_MODE_RGBA;
+               mView.setViewMode(Sample0View.VIEW_MODE_RGBA);
         else if (item == mItemPreviewGray)
-            viewMode = VIEW_MODE_GRAY;
+               mView.setViewMode(Sample0View.VIEW_MODE_GRAY);
         return true;
     }
 }
index b167230..f38c1f9 100644 (file)
@@ -2,34 +2,52 @@ package org.opencv.samples.tutorial0;
 
 import android.content.Context;
 import android.graphics.Bitmap;
+import android.util.Log;
 
 class Sample0View extends SampleViewBase {
+       
+       private static final String TAG = "Sample0View";
+       int mSize;
+       int[] mRGBA;
+       private Bitmap mBitmap;
+    private int mViewMode;
+    
+    public static final int     VIEW_MODE_RGBA = 0;
+    public static final int     VIEW_MODE_GRAY = 1;
+    
+       
     public Sample0View(Context context) {
         super(context);
+        mSize = 0;
+        mViewMode = VIEW_MODE_RGBA;
     }
 
     @Override
     protected Bitmap processFrame(byte[] data) {
         int frameSize = getFrameWidth() * getFrameHeight();
-        int[] rgba = new int[frameSize];
+        
+        int[] rgba = mRGBA;
 
-        int view_mode = Sample0Base.viewMode;
-        if (view_mode == Sample0Base.VIEW_MODE_GRAY) {
+        final int view_mode = mViewMode;
+        if (view_mode == VIEW_MODE_GRAY) {
             for (int i = 0; i < frameSize; i++) {
                 int y = (0xff & ((int) data[i]));
                 rgba[i] = 0xff000000 + (y << 16) + (y << 8) + y;
             }
-        } else if (view_mode == Sample0Base.VIEW_MODE_RGBA) {
+        } else if (view_mode == VIEW_MODE_RGBA) {
             for (int i = 0; i < getFrameHeight(); i++)
                 for (int j = 0; j < getFrameWidth(); j++) {
-                    int y = (0xff & ((int) data[i * getFrameWidth() + j]));
-                    int u = (0xff & ((int) data[frameSize + (i >> 1) * getFrameWidth() + (j & ~1) + 0]));
-                    int v = (0xff & ((int) data[frameSize + (i >> 1) * getFrameWidth() + (j & ~1) + 1]));
+                       int index = i * getFrameWidth() + j;
+                       int supply_index = frameSize + (i >> 1) * getFrameWidth() + (j & ~1);
+                    int y = (0xff & ((int) data[index]));
+                    int u = (0xff & ((int) data[supply_index + 0]));
+                    int v = (0xff & ((int) data[supply_index + 1]));
                     y = y < 16 ? 16 : y;
-
-                    int r = Math.round(1.164f * (y - 16) + 1.596f * (v - 128));
-                    int g = Math.round(1.164f * (y - 16) - 0.813f * (v - 128) - 0.391f * (u - 128));
-                    int b = Math.round(1.164f * (y - 16) + 2.018f * (u - 128));
+                    
+                    float y_conv = 1.164f * (y - 16);
+                    int r = Math.round(y_conv + 1.596f * (v - 128));
+                    int g = Math.round(y_conv - 0.813f * (v - 128) - 0.391f * (u - 128));
+                    int b = Math.round(y_conv + 2.018f * (u - 128));
 
                     r = r < 0 ? 0 : (r > 255 ? 255 : r);
                     g = g < 0 ? 0 : (g > 255 ? 255 : g);
@@ -38,9 +56,26 @@ class Sample0View extends SampleViewBase {
                     rgba[i * getFrameWidth() + j] = 0xff000000 + (b << 16) + (g << 8) + r;
                 }
         }
-
-        Bitmap bmp = Bitmap.createBitmap(getFrameWidth(), getFrameHeight(), Bitmap.Config.ARGB_8888);
-        bmp.setPixels(rgba, 0/* offset */, getFrameWidth() /* stride */, 0, 0, getFrameWidth(), getFrameHeight());
-        return bmp;
+        
+        mBitmap.setPixels(rgba, 0/* offset */, getFrameWidth() /* stride */, 0, 0, getFrameWidth(), getFrameHeight());
+        return mBitmap;
     }
+
+       @Override
+       protected void onPreviewStared(int previewWidth, int previewHeight) {
+               /* Create a bitmap that will be used through to calculate the image to */
+        mBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Bitmap.Config.ARGB_8888);
+       mRGBA = new int[previewWidth * previewHeight];
+       }
+
+       @Override
+       protected void onPreviewStopped() {
+               mBitmap.recycle();
+               mBitmap = null;
+               mRGBA = null;
+       }
+
+       public void setViewMode(int viewMode) {
+               mViewMode = viewMode;
+       }
 }
\ No newline at end of file
index ecf30c6..084092f 100644 (file)
@@ -6,6 +6,7 @@ import java.util.List;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
+import android.graphics.ImageFormat;
 import android.graphics.SurfaceTexture;
 import android.hardware.Camera;
 import android.hardware.Camera.PreviewCallback;
@@ -23,6 +24,8 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
     private int                 mFrameHeight;
     private byte[]              mFrame;
     private boolean             mThreadRun;
+    private byte[]              mBuffer;
+
 
     public SampleViewBase(Context context) {
         super(context);
@@ -43,9 +46,10 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
             mCamera.setPreviewTexture( new SurfaceTexture(10) );
         else
-               mCamera.setPreviewDisplay(null);
-       }
-    
+           mCamera.setPreviewDisplay(null);
+    }
+
+
     public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
         Log.i(TAG, "surfaceCreated");
         if (mCamera != null) {
@@ -56,7 +60,7 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
 
             // selecting optimal camera preview size
             {
-                double minDiff = Double.MAX_VALUE;
+                int  minDiff = Integer.MAX_VALUE;
                 for (Camera.Size size : sizes) {
                     if (Math.abs(size.height - height) < minDiff) {
                         mFrameWidth = size.width;
@@ -67,12 +71,34 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
             }
 
             params.setPreviewSize(getFrameWidth(), getFrameHeight());
+            
+            List<String> FocusModes = params.getSupportedFocusModes();
+            if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO))
+            {
+               params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
+            }            
+            
             mCamera.setParameters(params);
-            try {
-               setPreview();
+            
+            /* Now allocate the buffer */
+            params = mCamera.getParameters();
+            int size = params.getPreviewSize().width * params.getPreviewSize().height;
+            size  = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8;
+            mBuffer = new byte[size];
+            /* The buffer where the current frame will be coppied */
+            mFrame = new byte [size];
+            mCamera.addCallbackBuffer(mBuffer);
+
+                       try {
+                               setPreview();
                        } catch (IOException e) {
                                Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
                        }
+
+            /* Notify that the preview is about to be started and deliver preview size */
+            onPreviewStared(params.getPreviewSize().width, params.getPreviewSize().height);
+
+            /* Now we can start a preview */
             mCamera.startPreview();
         }
     }
@@ -80,14 +106,17 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
     public void surfaceCreated(SurfaceHolder holder) {
         Log.i(TAG, "surfaceCreated");
         mCamera = Camera.open();
-        mCamera.setPreviewCallback(new PreviewCallback() {
+
+        mCamera.setPreviewCallbackWithBuffer(new PreviewCallback() {
             public void onPreviewFrame(byte[] data, Camera camera) {
                 synchronized (SampleViewBase.this) {
-                    mFrame = data;
-                    SampleViewBase.this.notify();
+                    System.arraycopy(data, 0, mFrame, 0, data.length);
+                    SampleViewBase.this.notify(); 
                 }
+                camera.addCallbackBuffer(mBuffer);
             }
         });
+                    
         (new Thread(this)).start();
     }
 
@@ -102,10 +131,27 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
                 mCamera = null;
             }
         }
+        onPreviewStopped();
     }
 
+    /* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */
     protected abstract Bitmap processFrame(byte[] data);
 
+    /**
+     * This method is called when the preview process is beeing started. It is called before the first frame delivered and processFrame is called
+     * It is called with the width and height parameters of the preview process. It can be used to prepare the data needed during the frame processing.
+     * @param previewWidth - the width of the preview frames that will be delivered via processFrame
+     * @param previewHeight - the height of the preview frames that will be delivered via processFrame
+     */
+    protected abstract void onPreviewStared(int previewWidtd, int previewHeight);
+
+    /**
+     * This method is called when preview is stopped. When this method is called the preview stopped and all the processing of frames already completed.
+     * If the Bitmap object returned via processFrame is cached - it is a good time to recycle it.
+     * Any other resourcses used during the preview can be released.
+     */
+    protected abstract void onPreviewStopped();
+
     public void run() {
         mThreadRun = true;
         Log.i(TAG, "Starting processing thread");
@@ -127,7 +173,6 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
                     canvas.drawBitmap(bmp, (canvas.getWidth() - getFrameWidth()) / 2, (canvas.getHeight() - getFrameHeight()) / 2, null);
                     mHolder.unlockCanvasAndPost(canvas);
                 }
-                bmp.recycle();
             }
         }
     }
index b67b0d9..b014ca7 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <projectDescription>\r
-       <name>Tutorial 1 Basic - 1. Add OpenCV</name>\r
+       <name>Tutorial 1 (Basic) - Add OpenCV</name>\r
        <comment></comment>\r
        <projects>\r
        </projects>\r
index f05ee33..de463f7 100644 (file)
@@ -8,17 +8,12 @@ import android.view.MenuItem;
 import android.view.Window;
 
 public class Sample1Java extends Activity {
-    private static final String TAG             = "Sample::Activity";
-
-    public static final int     VIEW_MODE_RGBA  = 0;
-    public static final int     VIEW_MODE_GRAY  = 1;
-    public static final int     VIEW_MODE_CANNY = 2;
+    private static final String TAG = "Sample::Activity";
 
     private MenuItem            mItemPreviewRGBA;
     private MenuItem            mItemPreviewGray;
     private MenuItem            mItemPreviewCanny;
-
-    public static int           viewMode        = VIEW_MODE_RGBA;
+    private Sample1View         mView;
 
     public Sample1Java() {
         Log.i(TAG, "Instantiated new " + this.getClass());
@@ -30,7 +25,8 @@ public class Sample1Java extends Activity {
         Log.i(TAG, "onCreate");
         super.onCreate(savedInstanceState);
         requestWindowFeature(Window.FEATURE_NO_TITLE);
-        setContentView(new Sample1View(this));
+        mView = new Sample1View(this);
+        setContentView(mView);
     }
 
     @Override
@@ -45,12 +41,13 @@ public class Sample1Java extends Activity {
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         Log.i(TAG, "Menu Item selected " + item);
-        if (item == mItemPreviewRGBA)
-            viewMode = VIEW_MODE_RGBA;
-        else if (item == mItemPreviewGray)
-            viewMode = VIEW_MODE_GRAY;
-        else if (item == mItemPreviewCanny)
-            viewMode = VIEW_MODE_CANNY;
+        if (item == mItemPreviewRGBA) {
+               mView.setViewMode(Sample1View.VIEW_MODE_RGBA);
+        } else if (item == mItemPreviewGray) {
+               mView.setViewMode(Sample1View.VIEW_MODE_GRAY);
+        } else if (item == mItemPreviewCanny) {
+               mView.setViewMode(Sample1View.VIEW_MODE_CANNY);
+        }
         return true;
     }
 }
index f7da211..987fca8 100644 (file)
@@ -14,26 +14,58 @@ import android.util.Log;
 import android.view.SurfaceHolder;
 
 class Sample1View extends SampleViewBase {
+
+    public static final int     VIEW_MODE_RGBA  = 0;
+    public static final int     VIEW_MODE_GRAY  = 1;
+    public static final int     VIEW_MODE_CANNY = 2;
+
     private Mat mYuv;
     private Mat mRgba;
     private Mat mGraySubmat;
     private Mat mIntermediateMat;
+       private Bitmap mBitmap;
+       private int mViewMode;
 
     public Sample1View(Context context) {
         super(context);
+        mViewMode = VIEW_MODE_RGBA;
     }
 
-    @Override
-    public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
-        super.surfaceChanged(_holder, format, width, height);
+       @Override
+       protected void onPreviewStared(int previewWidth, int previewHeight) {
+           synchronized (this) {
+               // initialize Mats before usage
+               mYuv = new Mat(getFrameHeight() + getFrameHeight() / 2, getFrameWidth(), CvType.CV_8UC1);
+               mGraySubmat = mYuv.submat(0, getFrameHeight(), 0, getFrameWidth());
+
+               mRgba = new Mat();
+               mIntermediateMat = new Mat();
+
+               mBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Bitmap.Config.ARGB_8888); 
+           }
+       }
 
-        synchronized (this) {
-            // initialize Mats before usage
-            mYuv = new Mat(getFrameHeight() + getFrameHeight() / 2, getFrameWidth(), CvType.CV_8UC1);
-            mGraySubmat = mYuv.submat(0, getFrameHeight(), 0, getFrameWidth());
+       @Override
+       protected void onPreviewStopped() {
+               if(mBitmap != null) {
+                       mBitmap.recycle();
+               }
 
-            mRgba = new Mat();
-            mIntermediateMat = new Mat();
+               synchronized (this) {
+            // Explicitly deallocate Mats
+            if (mYuv != null)
+                mYuv.release();
+            if (mRgba != null)
+                mRgba.release();
+            if (mGraySubmat != null)
+                mGraySubmat.release();
+            if (mIntermediateMat != null)
+                mIntermediateMat.release();
+
+            mYuv = null;
+            mRgba = null;
+            mGraySubmat = null;
+            mIntermediateMat = null;
         }
     }
 
@@ -41,51 +73,36 @@ class Sample1View extends SampleViewBase {
     protected Bitmap processFrame(byte[] data) {
         mYuv.put(0, 0, data);
 
-        switch (Sample1Java.viewMode) {
-        case Sample1Java.VIEW_MODE_GRAY:
+        final int viewMode = mViewMode;
+
+        switch (viewMode) {
+        case VIEW_MODE_GRAY:
             Imgproc.cvtColor(mGraySubmat, mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
             break;
-        case Sample1Java.VIEW_MODE_RGBA:
+        case VIEW_MODE_RGBA:
             Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV420sp2RGB, 4);
             Core.putText(mRgba, "OpenCV + Android", new Point(10, 100), 3/* CV_FONT_HERSHEY_COMPLEX */, 2, new Scalar(255, 0, 0, 255), 3);
             break;
-        case Sample1Java.VIEW_MODE_CANNY:
+        case VIEW_MODE_CANNY:
             Imgproc.Canny(mGraySubmat, mIntermediateMat, 80, 100);
             Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2BGRA, 4);
             break;
         }
 
-        Bitmap bmp = Bitmap.createBitmap(getFrameWidth(), getFrameHeight(), Bitmap.Config.ARGB_8888);
+        Bitmap bmp = mBitmap;
 
         try {
-               Utils.matToBitmap(mRgba, bmp);
-            return bmp;
+            Utils.matToBitmap(mRgba, bmp);
         } catch(Exception e) {
-               Log.e("org.opencv.samples.puzzle15", "Utils.matToBitmap() throws an exception: " + e.getMessage());
+            Log.e("org.opencv.samples.puzzle15", "Utils.matToBitmap() throws an exception: " + e.getMessage());
             bmp.recycle();
-            return null;
+            bmp = null;
         }
+        return bmp;
     }
 
-    @Override
-    public void run() {
-        super.run();
-
-        synchronized (this) {
-            // Explicitly deallocate Mats
-            if (mYuv != null)
-                mYuv.release();
-            if (mRgba != null)
-                mRgba.release();
-            if (mGraySubmat != null)
-                mGraySubmat.release();
-            if (mIntermediateMat != null)
-                mIntermediateMat.release();
-
-            mYuv = null;
-            mRgba = null;
-            mGraySubmat = null;
-            mIntermediateMat = null;
-        }
+    public void setViewMode(int viewMode) {
+       mViewMode = viewMode;
     }
+
 }
index f9ebdfc..4515976 100644 (file)
@@ -6,6 +6,7 @@ import java.util.List;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
+import android.graphics.ImageFormat;
 import android.graphics.SurfaceTexture;
 import android.hardware.Camera;
 import android.hardware.Camera.PreviewCallback;
@@ -23,6 +24,8 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
     private int                 mFrameHeight;
     private byte[]              mFrame;
     private boolean             mThreadRun;
+    private byte[]              mBuffer;
+
 
     public SampleViewBase(Context context) {
         super(context);
@@ -49,6 +52,7 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
     public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
         Log.i(TAG, "surfaceCreated");
         if (mCamera != null) {
+               
             Camera.Parameters params = mCamera.getParameters();
             List<Camera.Size> sizes = params.getSupportedPreviewSizes();
             mFrameWidth = width;
@@ -56,7 +60,7 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
 
             // selecting optimal camera preview size
             {
-                double minDiff = Double.MAX_VALUE;
+                int  minDiff = Integer.MAX_VALUE;
                 for (Camera.Size size : sizes) {
                     if (Math.abs(size.height - height) < minDiff) {
                         mFrameWidth = size.width;
@@ -67,12 +71,34 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
             }
 
             params.setPreviewSize(getFrameWidth(), getFrameHeight());
+
+            List<String> FocusModes = params.getSupportedFocusModes();
+            if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO))
+            {
+               params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
+            }
+            
             mCamera.setParameters(params);
-            try {
-               setPreview();
+
+            /* Now allocate the buffer */
+            params = mCamera.getParameters();
+            int size = params.getPreviewSize().width * params.getPreviewSize().height;
+            size  = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8;
+            mBuffer = new byte[size];
+            /* The buffer where the current frame will be coppied */
+            mFrame = new byte [size];
+            mCamera.addCallbackBuffer(mBuffer);
+
+                       try {
+                               setPreview();
                        } catch (IOException e) {
                                Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
                        }
+
+            /* Notify that the preview is about to be started and deliver preview size */
+            onPreviewStared(params.getPreviewSize().width, params.getPreviewSize().height);
+
+            /* Now we can start a preview */
             mCamera.startPreview();
         }
     }
@@ -80,14 +106,17 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
     public void surfaceCreated(SurfaceHolder holder) {
         Log.i(TAG, "surfaceCreated");
         mCamera = Camera.open();
-        mCamera.setPreviewCallback(new PreviewCallback() {
+
+        mCamera.setPreviewCallbackWithBuffer(new PreviewCallback() {
             public void onPreviewFrame(byte[] data, Camera camera) {
                 synchronized (SampleViewBase.this) {
-                    mFrame = data;
-                    SampleViewBase.this.notify();
+                    System.arraycopy(data, 0, mFrame, 0, data.length);
+                    SampleViewBase.this.notify(); 
                 }
+                camera.addCallbackBuffer(mBuffer);
             }
         });
+                    
         (new Thread(this)).start();
     }
 
@@ -102,10 +131,27 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
                 mCamera = null;
             }
         }
+        onPreviewStopped();
     }
 
+    /* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */
     protected abstract Bitmap processFrame(byte[] data);
 
+    /**
+     * This method is called when the preview process is beeing started. It is called before the first frame delivered and processFrame is called
+     * It is called with the width and height parameters of the preview process. It can be used to prepare the data needed during the frame processing.
+     * @param previewWidth - the width of the preview frames that will be delivered via processFrame
+     * @param previewHeight - the height of the preview frames that will be delivered via processFrame
+     */
+    protected abstract void onPreviewStared(int previewWidtd, int previewHeight);
+
+    /**
+     * This method is called when preview is stopped. When this method is called the preview stopped and all the processing of frames already completed.
+     * If the Bitmap object returned via processFrame is cached - it is a good time to recycle it.
+     * Any other resourcses used during the preview can be released.
+     */
+    protected abstract void onPreviewStopped();
+
     public void run() {
         mThreadRun = true;
         Log.i(TAG, "Starting processing thread");
@@ -127,7 +173,6 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
                     canvas.drawBitmap(bmp, (canvas.getWidth() - getFrameWidth()) / 2, (canvas.getHeight() - getFrameHeight()) / 2, null);
                     mHolder.unlockCanvasAndPost(canvas);
                 }
-                bmp.recycle();
             }
         }
     }
index aa5deb4..46aad4a 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <projectDescription>\r
-       <name>Tutorial 1 Basic - 2. Use OpenCV Camera</name>\r
+       <name>Tutorial 2 (Basic) - Use OpenCV Camera</name>\r
        <comment></comment>\r
        <projects>\r
        </projects>\r
index 406ffe2..6e76f86 100644 (file)
@@ -1,13 +1,17 @@
 package org.opencv.samples.tutorial2;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.opencv.android.Utils;
 import org.opencv.core.Core;
 import org.opencv.core.Mat;
+import org.opencv.core.MatOfPoint;
 import org.opencv.core.Point;
 import org.opencv.core.Scalar;
-import org.opencv.imgproc.Imgproc;
 import org.opencv.highgui.Highgui;
 import org.opencv.highgui.VideoCapture;
+import org.opencv.imgproc.Imgproc;
 
 import android.content.Context;
 import android.graphics.Bitmap;
@@ -18,6 +22,10 @@ class Sample2View extends SampleCvViewBase {
     private Mat mRgba;
     private Mat mGray;
     private Mat mIntermediateMat;
+    private Mat mIntermediateMat2;
+    private Mat mEmpty;
+    private Scalar lo, hi;
+    private Scalar bl, wh;
 
     public Sample2View(Context context) {
         super(context);
@@ -32,11 +40,18 @@ class Sample2View extends SampleCvViewBase {
             mGray = new Mat();
             mRgba = new Mat();
             mIntermediateMat = new Mat();
+            mIntermediateMat2 = new Mat();
+            mEmpty = new Mat();
+            lo = new Scalar(85, 100, 30);
+            hi = new Scalar(130, 255, 255);
+            bl = new Scalar(0, 0, 0, 255);
+            wh = new Scalar(255, 255, 255, 255);
         }
     }
 
     @Override
     protected Bitmap processFrame(VideoCapture capture) {
+       /**/
         switch (Sample2NativeCamera.viewMode) {
         case Sample2NativeCamera.VIEW_MODE_GRAY:
             capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
@@ -44,14 +59,39 @@ class Sample2View extends SampleCvViewBase {
             break;
         case Sample2NativeCamera.VIEW_MODE_RGBA:
             capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
-            Core.putText(mRgba, "OpenCV + Android", new Point(10, 100), 3/* CV_FONT_HERSHEY_COMPLEX */, 2, new Scalar(255, 0, 0, 255), 3);
+            Core.putText(mRgba, "OpenCV + Android", new Point(10, 100), 3, 2, new Scalar(255, 0, 0, 255), 3);
             break;
         case Sample2NativeCamera.VIEW_MODE_CANNY:
-            capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
+            /*capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
             Imgproc.Canny(mGray, mIntermediateMat, 80, 100);
             Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2BGRA, 4);
-            break;
+            */
+               capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
+               Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_RGB2HSV_FULL);
+               Core.inRange(mIntermediateMat, lo, hi, mIntermediateMat2); // green
+               Imgproc.dilate(mIntermediateMat2, mIntermediateMat2, mEmpty);
+               //
+               List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
+               Mat hierarchy = new Mat();
+               Imgproc.findContours(mIntermediateMat2, contours, hierarchy,Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
+               Log.d("processFrame", "contours.size()" + contours.size());
+               double maxArea = 0;
+               int indexMaxArea = -1;
+              for (int i = 0; i < contours.size(); i++) {
+                  double s = Imgproc.contourArea(contours.get(i));
+                    if(s > maxArea){
+                           indexMaxArea = i;
+                           maxArea = s;
+                    }
+              } 
+              
+                       mRgba.setTo(bl);
+                       Imgproc.drawContours(mRgba, contours, indexMaxArea, wh);
+                       //
+                       //Imgproc.cvtColor(mIntermediateMat2, mRgba, Imgproc.COLOR_GRAY2RGBA);
+                       break;
         }
+       /**/
 
         Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
 
@@ -78,6 +118,9 @@ class Sample2View extends SampleCvViewBase {
             if (mIntermediateMat != null)
                 mIntermediateMat.release();
 
+            if (mIntermediateMat2 != null)
+                mIntermediateMat2.release();
+            
             mRgba = null;
             mGray = null;
             mIntermediateMat = null;
index 61e2222..49d648d 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <projectDescription>\r
-       <name>Tutorial 2 Advanced - 1. Add Native OpenCV</name>\r
+       <name>Tutorial 3 (Advanced) - Add Native OpenCV</name>\r
        <comment></comment>\r
        <projects>\r
        </projects>\r
index f940f98..43450d5 100644 (file)
@@ -4,19 +4,40 @@ import android.content.Context;
 import android.graphics.Bitmap;
 
 class Sample3View extends SampleViewBase {
+       
+       private int mFrameSize;
+       private Bitmap mBitmap;
+       private int[] mRGBA;
 
     public Sample3View(Context context) {
         super(context);
     }
 
+       @Override
+       protected void onPreviewStared(int previewWidtd, int previewHeight) {
+               mFrameSize = previewWidtd * previewHeight;
+               mRGBA = new int[mFrameSize];
+               mBitmap = Bitmap.createBitmap(previewWidtd, previewHeight, Bitmap.Config.ARGB_8888);
+       }
+
+       @Override
+       protected void onPreviewStopped() {
+               if(mBitmap != null) {
+                       mBitmap.recycle();
+                       mBitmap = null;
+               }
+               mRGBA = null;
+               
+               
+       }
+
     @Override
     protected Bitmap processFrame(byte[] data) {
-        int frameSize = getFrameWidth() * getFrameHeight();
-        int[] rgba = new int[frameSize];
+        int[] rgba = mRGBA;
 
         FindFeatures(getFrameWidth(), getFrameHeight(), data, rgba);
 
-        Bitmap bmp = Bitmap.createBitmap(getFrameWidth(), getFrameHeight(), Bitmap.Config.ARGB_8888);
+        Bitmap bmp = mBitmap; 
         bmp.setPixels(rgba, 0/* offset */, getFrameWidth() /* stride */, 0, 0, getFrameWidth(), getFrameHeight());
         return bmp;
     }
@@ -24,10 +45,6 @@ class Sample3View extends SampleViewBase {
     public native void FindFeatures(int width, int height, byte yuv[], int[] rgba);
 
     static {
-       try {
-            System.loadLibrary("opencv_java");
-        } catch(Exception e) {
-        }
         System.loadLibrary("native_sample");
     }
 }
index 71df0f8..d220eda 100644 (file)
@@ -6,6 +6,7 @@ import java.util.List;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
+import android.graphics.ImageFormat;
 import android.graphics.SurfaceTexture;
 import android.hardware.Camera;
 import android.hardware.Camera.PreviewCallback;
@@ -23,6 +24,8 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
     private int                 mFrameHeight;
     private byte[]              mFrame;
     private boolean             mThreadRun;
+    private byte[]              mBuffer;
+
 
     public SampleViewBase(Context context) {
         super(context);
@@ -45,7 +48,7 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
         else
                mCamera.setPreviewDisplay(null);
        }
-    
+
     public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
         Log.i(TAG, "surfaceCreated");
         if (mCamera != null) {
@@ -56,7 +59,7 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
 
             // selecting optimal camera preview size
             {
-                double minDiff = Double.MAX_VALUE;
+                int  minDiff = Integer.MAX_VALUE;
                 for (Camera.Size size : sizes) {
                     if (Math.abs(size.height - height) < minDiff) {
                         mFrameWidth = size.width;
@@ -67,12 +70,34 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
             }
 
             params.setPreviewSize(getFrameWidth(), getFrameHeight());
+
+            List<String> FocusModes = params.getSupportedFocusModes();
+            if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO))
+            {
+               params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
+            }
+
             mCamera.setParameters(params);
-            try {
-               setPreview();
+
+            /* Now allocate the buffer */
+            params = mCamera.getParameters();
+            int size = params.getPreviewSize().width * params.getPreviewSize().height;
+            size  = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8;
+            mBuffer = new byte[size];
+            /* The buffer where the current frame will be coppied */
+            mFrame = new byte [size];
+            mCamera.addCallbackBuffer(mBuffer);
+
+                       try {
+                               setPreview();
                        } catch (IOException e) {
                                Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
                        }
+
+            /* Notify that the preview is about to be started and deliver preview size */
+            onPreviewStared(params.getPreviewSize().width, params.getPreviewSize().height);
+
+            /* Now we can start a preview */
             mCamera.startPreview();
         }
     }
@@ -80,14 +105,17 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
     public void surfaceCreated(SurfaceHolder holder) {
         Log.i(TAG, "surfaceCreated");
         mCamera = Camera.open();
-        mCamera.setPreviewCallback(new PreviewCallback() {
+
+        mCamera.setPreviewCallbackWithBuffer(new PreviewCallback() {
             public void onPreviewFrame(byte[] data, Camera camera) {
                 synchronized (SampleViewBase.this) {
-                    mFrame = data;
-                    SampleViewBase.this.notify();
+                    System.arraycopy(data, 0, mFrame, 0, data.length);
+                    SampleViewBase.this.notify(); 
                 }
+                camera.addCallbackBuffer(mBuffer);
             }
         });
+                    
         (new Thread(this)).start();
     }
 
@@ -102,10 +130,27 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
                 mCamera = null;
             }
         }
+        onPreviewStopped();
     }
 
+    /* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */
     protected abstract Bitmap processFrame(byte[] data);
 
+    /**
+     * This method is called when the preview process is beeing started. It is called before the first frame delivered and processFrame is called
+     * It is called with the width and height parameters of the preview process. It can be used to prepare the data needed during the frame processing.
+     * @param previewWidth - the width of the preview frames that will be delivered via processFrame
+     * @param previewHeight - the height of the preview frames that will be delivered via processFrame
+     */
+    protected abstract void onPreviewStared(int previewWidtd, int previewHeight);
+
+    /**
+     * This method is called when preview is stopped. When this method is called the preview stopped and all the processing of frames already completed.
+     * If the Bitmap object returned via processFrame is cached - it is a good time to recycle it.
+     * Any other resourcses used during the preview can be released.
+     */
+    protected abstract void onPreviewStopped();
+
     public void run() {
         mThreadRun = true;
         Log.i(TAG, "Starting processing thread");
@@ -127,7 +172,6 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
                     canvas.drawBitmap(bmp, (canvas.getWidth() - getFrameWidth()) / 2, (canvas.getHeight() - getFrameHeight()) / 2, null);
                     mHolder.unlockCanvasAndPost(canvas);
                 }
-                bmp.recycle();
             }
         }
     }
index 05a338e..e8c3eb4 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <projectDescription>\r
-       <name>Tutorial 2 Advanced - 2. Mix Java+Native OpenCV</name>\r
+       <name>Tutorial 4 (Advanced) - Mix Java+Native OpenCV</name>\r
        <comment></comment>\r
        <projects>\r
        </projects>\r
index 0c5eda4..ea36d7f 100644 (file)
@@ -8,19 +8,14 @@ import android.view.MenuItem;
 import android.view.Window;
 
 public class Sample4Mixed extends Activity {
-    private static final String TAG                = "Sample::Activity";
-
-    public static final int     VIEW_MODE_RGBA     = 0;
-    public static final int     VIEW_MODE_GRAY     = 1;
-    public static final int     VIEW_MODE_CANNY    = 2;
-    public static final int     VIEW_MODE_FEATURES = 5;
+    private static final String TAG = "Sample::Activity";
 
     private MenuItem            mItemPreviewRGBA;
     private MenuItem            mItemPreviewGray;
     private MenuItem            mItemPreviewCanny;
     private MenuItem            mItemPreviewFeatures;
+    private Sample4View         mView;    
 
-    public static int           viewMode           = VIEW_MODE_RGBA;
 
     public Sample4Mixed() {
         Log.i(TAG, "Instantiated new " + this.getClass());
@@ -32,7 +27,8 @@ public class Sample4Mixed extends Activity {
         super.onCreate(savedInstanceState);
         Log.i(TAG, "onCreate");
         requestWindowFeature(Window.FEATURE_NO_TITLE);
-        setContentView(new Sample4View(this));
+        mView = new Sample4View(this);
+        setContentView(mView);
     }
 
     public boolean onCreateOptionsMenu(Menu menu) {
@@ -46,14 +42,15 @@ public class Sample4Mixed extends Activity {
 
     public boolean onOptionsItemSelected(MenuItem item) {
         Log.i(TAG, "Menu Item selected " + item);
-        if (item == mItemPreviewRGBA)
-            viewMode = VIEW_MODE_RGBA;
-        else if (item == mItemPreviewGray)
-            viewMode = VIEW_MODE_GRAY;
-        else if (item == mItemPreviewCanny)
-            viewMode = VIEW_MODE_CANNY;
-        else if (item == mItemPreviewFeatures)
-            viewMode = VIEW_MODE_FEATURES;
+        if (item == mItemPreviewRGBA) {
+               mView.setViewMode(Sample4View.VIEW_MODE_RGBA);
+        } else if (item == mItemPreviewGray) {
+               mView.setViewMode(Sample4View.VIEW_MODE_GRAY);
+        } else if (item == mItemPreviewCanny) {
+               mView.setViewMode(Sample4View.VIEW_MODE_CANNY);
+        } else if (item == mItemPreviewFeatures) {
+               mView.setViewMode(Sample4View.VIEW_MODE_FEATURES);
+        }
         return true;
     }
 }
index 29f782d..c2d4584 100644 (file)
@@ -11,87 +11,106 @@ import android.util.Log;
 import android.view.SurfaceHolder;
 
 class Sample4View extends SampleViewBase {
+
+    public static final int     VIEW_MODE_RGBA     = 0;
+    public static final int     VIEW_MODE_GRAY     = 1;
+    public static final int     VIEW_MODE_CANNY    = 2;
+    public static final int     VIEW_MODE_FEATURES = 5;
+    
     private Mat mYuv;
     private Mat mRgba;
     private Mat mGraySubmat;
     private Mat mIntermediateMat;
 
+    private int mViewMode;
+       private Bitmap mBitmap;
+
     public Sample4View(Context context) {
         super(context);
     }
+    
+       @Override
+       protected void onPreviewStared(int previewWidtd, int previewHeight) {
+        // initialize Mats before usage
+        mYuv = new Mat(getFrameHeight() + getFrameHeight() / 2, getFrameWidth(), CvType.CV_8UC1);
+        mGraySubmat = mYuv.submat(0, getFrameHeight(), 0, getFrameWidth());
+
+        mRgba = new Mat();
+        mIntermediateMat = new Mat();
+        
+        mBitmap = Bitmap.createBitmap(previewWidtd, previewHeight, Bitmap.Config.ARGB_8888);
+       }
+
+       @Override
+       protected void onPreviewStopped() {
+               
+               if (mBitmap != null) {
+                       mBitmap.recycle();
+                       mBitmap = null;
+               }
+               
+        // Explicitly deallocate Mats
+        if (mYuv != null)
+            mYuv.release();
+        if (mRgba != null)
+            mRgba.release();
+        if (mGraySubmat != null)
+            mGraySubmat.release();
+        if (mIntermediateMat != null)
+            mIntermediateMat.release();
+
+        mYuv = null;
+        mRgba = null;
+        mGraySubmat = null;
+        mIntermediateMat = null;
+               
+       }
 
-    @Override
-    public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
-        super.surfaceChanged(_holder, format, width, height);
-
-        synchronized (this) {
-            // initialize Mats before usage
-            mYuv = new Mat(getFrameHeight() + getFrameHeight() / 2, getFrameWidth(), CvType.CV_8UC1);
-            mGraySubmat = mYuv.submat(0, getFrameHeight(), 0, getFrameWidth());
-
-            mRgba = new Mat();
-            mIntermediateMat = new Mat();
-        }
-    }
 
     @Override
     protected Bitmap processFrame(byte[] data) {
         mYuv.put(0, 0, data);
 
-        switch (Sample4Mixed.viewMode) {
-        case Sample4Mixed.VIEW_MODE_GRAY:
+        final int viewMode = mViewMode;
+
+        switch (viewMode) {
+        case VIEW_MODE_GRAY:
             Imgproc.cvtColor(mGraySubmat, mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
             break;
-        case Sample4Mixed.VIEW_MODE_RGBA:
+        case VIEW_MODE_RGBA:
             Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV420sp2RGB, 4);
             break;
-        case Sample4Mixed.VIEW_MODE_CANNY:
+        case VIEW_MODE_CANNY:
             Imgproc.Canny(mGraySubmat, mIntermediateMat, 80, 100);
             Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2BGRA, 4);
             break;
-        case Sample4Mixed.VIEW_MODE_FEATURES:
+        case VIEW_MODE_FEATURES:
             Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV420sp2RGB, 4);
             FindFeatures(mGraySubmat.getNativeObjAddr(), mRgba.getNativeObjAddr());
             break;
         }
 
-        Bitmap bmp = Bitmap.createBitmap(getFrameWidth(), getFrameHeight(), Bitmap.Config.ARGB_8888);
+        Bitmap bmp = mBitmap;
 
         try {
-               Utils.matToBitmap(mRgba, bmp);
-            return bmp;
+            Utils.matToBitmap(mRgba, bmp);
         } catch(Exception e) {
-               Log.e("org.opencv.samples.puzzle15", "Utils.matToBitmap() throws an exception: " + e.getMessage());
+            Log.e("org.opencv.samples.puzzle15", "Utils.matToBitmap() throws an exception: " + e.getMessage());
             bmp.recycle();
-            return null;
+            bmp = null;
         }
-    }
 
-    @Override
-    public void run() {
-        super.run();
-
-        synchronized (this) {
-            // Explicitly deallocate Mats
-            if (mYuv != null)
-                mYuv.release();
-            if (mRgba != null)
-                mRgba.release();
-            if (mGraySubmat != null)
-                mGraySubmat.release();
-            if (mIntermediateMat != null)
-                mIntermediateMat.release();
-
-            mYuv = null;
-            mRgba = null;
-            mGraySubmat = null;
-            mIntermediateMat = null;
-        }
+        return bmp;
     }
 
     public native void FindFeatures(long matAddrGr, long matAddrRgba);
 
     static {
+       System.loadLibrary("opencv_java");
         System.loadLibrary("mixed_sample");
     }
+
+    public void setViewMode(int viewMode) {
+               mViewMode = viewMode;
+    }
 }
index 87f1cdc..446f28e 100644 (file)
@@ -6,6 +6,7 @@ import java.util.List;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
+import android.graphics.ImageFormat;
 import android.graphics.SurfaceTexture;
 import android.hardware.Camera;
 import android.hardware.Camera.PreviewCallback;
@@ -23,6 +24,8 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
     private int                 mFrameHeight;
     private byte[]              mFrame;
     private boolean             mThreadRun;
+    private byte[]              mBuffer;
+
 
     public SampleViewBase(Context context) {
         super(context);
@@ -56,7 +59,7 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
 
             // selecting optimal camera preview size
             {
-                double minDiff = Double.MAX_VALUE;
+                int  minDiff = Integer.MAX_VALUE;
                 for (Camera.Size size : sizes) {
                     if (Math.abs(size.height - height) < minDiff) {
                         mFrameWidth = size.width;
@@ -67,12 +70,34 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
             }
 
             params.setPreviewSize(getFrameWidth(), getFrameHeight());
+            
+            List<String> FocusModes = params.getSupportedFocusModes();
+            if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO))
+            {
+               params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
+            }
+            
             mCamera.setParameters(params);
+
+            /* Now allocate the buffer */
+            params = mCamera.getParameters();
+            int size = params.getPreviewSize().width * params.getPreviewSize().height;
+            size  = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8;
+            mBuffer = new byte[size];
+            /* The buffer where the current frame will be coppied */
+            mFrame = new byte [size];
+            mCamera.addCallbackBuffer(mBuffer);
+
             try {
-               setPreview();
-                       } catch (IOException e) {
-                               Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
-                       }
+                setPreview();
+            } catch (IOException e) {
+                Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
+            }
+
+            /* Notify that the preview is about to be started and deliver preview size */
+            onPreviewStared(params.getPreviewSize().width, params.getPreviewSize().height);
+
+            /* Now we can start a preview */
             mCamera.startPreview();
         }
     }
@@ -80,14 +105,17 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
     public void surfaceCreated(SurfaceHolder holder) {
         Log.i(TAG, "surfaceCreated");
         mCamera = Camera.open();
-        mCamera.setPreviewCallback(new PreviewCallback() {
+
+        mCamera.setPreviewCallbackWithBuffer(new PreviewCallback() {
             public void onPreviewFrame(byte[] data, Camera camera) {
                 synchronized (SampleViewBase.this) {
-                    mFrame = data;
-                    SampleViewBase.this.notify();
+                    System.arraycopy(data, 0, mFrame, 0, data.length);
+                    SampleViewBase.this.notify(); 
                 }
+                camera.addCallbackBuffer(mBuffer);
             }
         });
+
         (new Thread(this)).start();
     }
 
@@ -102,10 +130,27 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
                 mCamera = null;
             }
         }
+        onPreviewStopped();
     }
 
+    /* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */
     protected abstract Bitmap processFrame(byte[] data);
 
+    /**
+     * This method is called when the preview process is beeing started. It is called before the first frame delivered and processFrame is called
+     * It is called with the width and height parameters of the preview process. It can be used to prepare the data needed during the frame processing.
+     * @param previewWidth - the width of the preview frames that will be delivered via processFrame
+     * @param previewHeight - the height of the preview frames that will be delivered via processFrame
+     */
+    protected abstract void onPreviewStared(int previewWidtd, int previewHeight);
+
+    /**
+     * This method is called when preview is stopped. When this method is called the preview stopped and all the processing of frames already completed.
+     * If the Bitmap object returned via processFrame is cached - it is a good time to recycle it.
+     * Any other resourcses used during the preview can be released.
+     */
+    protected abstract void onPreviewStopped();
+
     public void run() {
         mThreadRun = true;
         Log.i(TAG, "Starting processing thread");
@@ -127,12 +172,7 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde
                     canvas.drawBitmap(bmp, (canvas.getWidth() - getFrameWidth()) / 2, (canvas.getHeight() - getFrameHeight()) / 2, null);
                     mHolder.unlockCanvasAndPost(canvas);
                 }
-                bmp.recycle();
             }
         }
     }
-
-    static {
-        System.loadLibrary("opencv_java");
-    }
 }
\ No newline at end of file
index 68ae9be..13672e7 100644 (file)
@@ -12,7 +12,7 @@ ocv_check_dependencies(${OPENCV_C_SAMPLES_REQUIRED_DEPS})
 if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND)\r
   project(c_samples)\r
 \r
-  if(CMAKE_COMPILER_IS_GNUCXX)\r
+  if(CMAKE_COMPILER_IS_GNUCXX AND NOT ENABLE_NOISY_WARNINGS)\r
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-function")\r
   endif()\r
     \r
index 8ca3448..d777408 100644 (file)
@@ -49,7 +49,7 @@ static void findCComp( IplImage* img )
 }
 
 
-int main( int argc, char** argv )
+int main()
 {
     int i, j;
     CvMemStorage* storage = cvCreateMemStorage(0);
index fb581d1..7515bcc 100644 (file)
@@ -24,7 +24,7 @@ void drawOptFlowMap(const CvMat* flow, CvMat* cflowmap, int step,
         }
 }
 
-int main(int argc, char** argv)
+int main()
 {
     CvCapture* capture = cvCreateCameraCapture(0);
     CvMat* prevgray = 0, *gray = 0, *flow = 0, *cflow = 0;
index 2230912..4211bcf 100644 (file)
@@ -192,7 +192,9 @@ void print_variable_importance( CvDTree* dtree, const char** var_desc )
     }
 
     printf( "Print variable importance information? (y/n) " );
-    scanf( "%1s", input );
+    int values_read = scanf( "%1s", input );
+    CV_Assert(values_read == 1);
+
     if( input[0] != 'y' && input[0] != 'Y' )
         return;
 
@@ -230,7 +232,9 @@ void interactive_classification( CvDTree* dtree, const char** var_desc )
         const CvDTreeNode* node;
         
         printf( "Start/Proceed with interactive mushroom classification (y/n): " );
-        scanf( "%1s", input );
+        int values_read = scanf( "%1s", input );
+        CV_Assert(values_read == 1);
+
         if( input[0] != 'y' && input[0] != 'Y' )
             break;
         printf( "Enter 1-letter answers, '?' for missing/unknown value...\n" ); 
@@ -252,7 +256,8 @@ void interactive_classification( CvDTree* dtree, const char** var_desc )
                 const int* map = data->cat_map->data.i + data->cat_ofs->data.i[vi];
 
                 printf( "%s: ", var_desc[vi] );
-                scanf( "%1s", input );
+                values_read = scanf( "%1s", input );
+                CV_Assert(values_read == 1);
 
                 if( input[0] == '?' )
                 {
index 48ba10e..5c255e9 100644 (file)
@@ -121,7 +121,7 @@ int main(int argc, char** argv)
         print_result( rtrees.calc_error( &data, CV_TRAIN_ERROR), rtrees.calc_error( &data, CV_TEST_ERROR ), rtrees.get_var_importance() );
 
         printf("======ERTREES=====\n");
-        ertrees.train( &data, CvRTParams( 10, 2, 0, false, 16, 0, true, 0, 100, 0, CV_TERMCRIT_ITER ));
+        ertrees.train( &data, CvRTParams( 18, 2, 0, false, 16, 0, true, 0, 100, 0, CV_TERMCRIT_ITER ));
         print_result( ertrees.calc_error( &data, CV_TRAIN_ERROR), ertrees.calc_error( &data, CV_TEST_ERROR ), ertrees.get_var_importance() );
 
         printf("======GBTREES=====\n");
index 029f759..3f4bb6a 100644 (file)
@@ -20,7 +20,7 @@ if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND)
     ocv_include_directories("${OpenCV_SOURCE_DIR}/modules/gpu/include")
   endif()
 
-  if(CMAKE_COMPILER_IS_GNUCXX)
+  if(CMAKE_COMPILER_IS_GNUCXX AND NOT ENABLE_NOISY_WARNINGS)
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-function")
   endif()
     
index e7e9de9..6652cab 100644 (file)
@@ -273,7 +273,8 @@ int main(int argc, char** argv)
     if( dir[dir.size()-1] != '\\' && dir[dir.size()-1] != '/' )
         dir += "/";
     
-    system(("mkdir " + dir).c_str());
+    int result = system(("mkdir " + dir).c_str());
+    CV_Assert(result == 0);
     
     for( int i = 0; ddms[i*4] != 0; i++ )
     {
index c7a5c63..f230019 100644 (file)
@@ -1,4 +1,4 @@
-#include "opencv2/ml/ml.hpp"
+#include "opencv2/legacy/legacy.hpp"
 #include "opencv2/highgui/highgui.hpp"
 
 using namespace cv;
index 3096dc0..7277610 100644 (file)
@@ -82,7 +82,8 @@ int main(int argc, char** argv)
                sprintf(test_file, "%s", argv[1]);
                f = fopen(test_file, "r");
                char vid[20];
-               fscanf(f, "%s\n", vid);
+               int values_read = fscanf(f, "%s\n", vid);
+               CV_Assert(values_read == 1);
                cout << "Benchmarking against " << vid << endl;
                live = 0;
        }
@@ -133,7 +134,8 @@ int main(int argc, char** argv)
                }
                else
                {
-                       fscanf(f, "%d %f %f %f %f\n", &i, &w[0], &w[1], &w[2], &w[3]);
+                       int values_read = fscanf(f, "%d %f %f %f %f\n", &i, &w[0], &w[1], &w[2], &w[3]);
+                       CV_Assert(values_read == 5);
                        sprintf(img_file, "seqG/%04d.png", i);
                        image = imread(img_file, CV_LOAD_IMAGE_COLOR);
             if (image.empty())
diff --git a/samples/cpp/opencv_version.cpp b/samples/cpp/opencv_version.cpp
new file mode 100644 (file)
index 0000000..5eb4bcc
--- /dev/null
@@ -0,0 +1,28 @@
+#include "opencv2/core/core.hpp"
+#include <iostream>
+
+const char* keys = 
+{
+    "{ b |build |false | print complete build info }"
+    "{ h |help  |false | print this help           }"
+};
+
+int main(int argc, const char* argv[])
+{
+    cv::CommandLineParser parser(argc, argv, keys);
+
+    if (parser.get<bool>("help"))
+    {
+        parser.printParams();
+    }
+    else if (parser.get<bool>("build"))
+    {
+        std::cout << cv::getBuildInformation() << std::endl;
+    }
+    else
+    {
+        std::cout << "OpenCV " << CV_VERSION << std::endl;     
+    }
+
+    return 0;
+}
\ No newline at end of file
index ecb5a5f..f8902d4 100644 (file)
@@ -11,7 +11,6 @@ const Scalar WHITE_COLOR = CV_RGB(255,255,255);
 const string winName = "points";
 const int testStep = 5;
 
-
 Mat img, imgDst;
 RNG rng;
 
@@ -19,16 +18,16 @@ vector<Point>  trainedPoints;
 vector<int>    trainedPointsMarkers;
 vector<Scalar> classColors;
 
-#define NBC 0 // normal Bayessian classifier
-#define KNN 0 // k nearest neighbors classifier
-#define SVM 0 // support vectors machine
-#define DT  1 // decision tree
-#define BT  0 // ADA Boost
-#define GBT 0 // gradient boosted trees
-#define RF  0 // random forest
-#define ERT 0 // extremely randomized trees
-#define ANN 0 // artificial neural networks
-#define EM  0 // expectation-maximization
+#define _NBC_ 0 // normal Bayessian classifier
+#define _KNN_ 0 // k nearest neighbors classifier
+#define _SVM_ 0 // support vectors machine
+#define _DT_  1 // decision tree
+#define _BT_  0 // ADA Boost
+#define _GBT_ 0 // gradient boosted trees
+#define _RF_  0 // random forest
+#define _ERT_ 0 // extremely randomized trees
+#define _ANN_ 0 // artificial neural networks
+#define _EM_  0 // expectation-maximization
 
 void on_mouse( int event, int x, int y, int /*flags*/, void* )
 {
@@ -48,13 +47,13 @@ void on_mouse( int event, int x, int y, int /*flags*/, void* )
     }
     else if( event == CV_EVENT_RBUTTONUP )
     {
-#if BT
+#if _BT_
         if( classColors.size() < 2 )
         {
 #endif
             classColors.push_back( Scalar((uchar)rng(256), (uchar)rng(256), (uchar)rng(256)) );
             updateFlag = true;
-#if BT
+#if _BT_
         }
         else
             cout << "New class can not be added, because CvBoost can only be used for 2-class classification" << endl;
@@ -98,7 +97,7 @@ void prepare_train_data( Mat& samples, Mat& classes )
     samples.convertTo( samples, CV_32FC1 );
 }
 
-#if NBC
+#if _NBC_
 void find_decision_boundary_NBC()
 {
     img.copyTo( imgDst );
@@ -125,7 +124,7 @@ void find_decision_boundary_NBC()
 #endif
 
 
-#if KNN
+#if _KNN_
 void find_decision_boundary_KNN( int K )
 {
     img.copyTo( imgDst );
@@ -151,7 +150,7 @@ void find_decision_boundary_KNN( int K )
 }
 #endif
 
-#if SVM
+#if _SVM_
 void find_decision_boundary_SVM( CvSVMParams params )
 {
     img.copyTo( imgDst );
@@ -185,7 +184,7 @@ void find_decision_boundary_SVM( CvSVMParams params )
 }
 #endif
 
-#if DT
+#if _DT_
 void find_decision_boundary_DT()
 {
     img.copyTo( imgDst );
@@ -225,7 +224,7 @@ void find_decision_boundary_DT()
 }
 #endif
 
-#if BT
+#if _BT_
 void find_decision_boundary_BT()
 {
     img.copyTo( imgDst );
@@ -265,7 +264,7 @@ void find_decision_boundary_BT()
 
 #endif
 
-#if GBT
+#if _GBT_
 void find_decision_boundary_GBT()
 {
     img.copyTo( imgDst );
@@ -305,7 +304,7 @@ void find_decision_boundary_GBT()
 
 #endif
 
-#if RF
+#if _RF_
 void find_decision_boundary_RF()
 {
     img.copyTo( imgDst );
@@ -346,7 +345,7 @@ void find_decision_boundary_RF()
 
 #endif
 
-#if ERT
+#if _ERT_
 void find_decision_boundary_ERT()
 {
     img.copyTo( imgDst );
@@ -390,7 +389,7 @@ void find_decision_boundary_ERT()
 }
 #endif
 
-#if ANN
+#if _ANN_
 void find_decision_boundary_ANN( const Mat&  layer_sizes )
 {
     img.copyTo( imgDst );
@@ -435,7 +434,7 @@ void find_decision_boundary_ANN( const Mat&  layer_sizes )
 }
 #endif
 
-#if EM
+#if _EM_
 void find_decision_boundary_EM()
 {
     img.copyTo( imgDst );
@@ -443,19 +442,12 @@ void find_decision_boundary_EM()
     Mat trainSamples, trainClasses;
     prepare_train_data( trainSamples, trainClasses );
 
-    CvEM em;
-    CvEMParams params;
-    params.covs      = NULL;
-    params.means     = NULL;
-    params.weights   = NULL;
-    params.probs     = NULL;
+    cv::EM em;
+    cv::EM::Params params;
     params.nclusters = classColors.size();
-    params.cov_mat_type       = CvEM::COV_MAT_GENERIC;
-    params.start_step         = CvEM::START_AUTO_STEP;
-    params.term_crit.max_iter = 10;
-    params.term_crit.epsilon  = 0.1;
-    params.term_crit.type     = CV_TERMCRIT_ITER | CV_TERMCRIT_EPS;
-
+    params.covMatType = cv::EM::COV_MAT_GENERIC;
+    params.startStep = cv::EM::START_AUTO_STEP;
+    params.termCrit = cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::COUNT, 10, 0.1);
 
     // learn classifier
     em.train( trainSamples, Mat(), params, &trainClasses );
@@ -509,12 +501,12 @@ int main()
 
         if( key == 'r' ) // run
         {
-#if NBC
+#if _NBC_
             find_decision_boundary_NBC();
             cvNamedWindow( "NormalBayesClassifier", WINDOW_AUTOSIZE );
             imshow( "NormalBayesClassifier", imgDst );
 #endif
-#if KNN
+#if _KNN_
             int K = 3;
             find_decision_boundary_KNN( K );
             namedWindow( "kNN", WINDOW_AUTOSIZE );
@@ -526,7 +518,7 @@ int main()
             imshow( "kNN2", imgDst );
 #endif
 
-#if SVM
+#if _SVM_
             //(1)-(2)separable and not sets
             CvSVMParams params;
             params.svm_type = CvSVM::C_SVC;
@@ -549,37 +541,37 @@ int main()
             imshow( "classificationSVM2", imgDst );
 #endif
 
-#if DT
+#if _DT_
             find_decision_boundary_DT();
             namedWindow( "DT", WINDOW_AUTOSIZE );
             imshow( "DT", imgDst );
 #endif
 
-#if BT
+#if _BT_
             find_decision_boundary_BT();
             namedWindow( "BT", WINDOW_AUTOSIZE );
             imshow( "BT", imgDst);
 #endif
 
-#if GBT
+#if _GBT_
             find_decision_boundary_GBT();
             namedWindow( "GBT", WINDOW_AUTOSIZE );
             imshow( "GBT", imgDst);
 #endif
 
-#if RF
+#if _RF_
             find_decision_boundary_RF();
             namedWindow( "RF", WINDOW_AUTOSIZE );
             imshow( "RF", imgDst);
 #endif
 
-#if ERT
+#if _ERT_
             find_decision_boundary_ERT();
             namedWindow( "ERT", WINDOW_AUTOSIZE );
             imshow( "ERT", imgDst);
 #endif
 
-#if ANN
+#if _ANN_
             Mat layer_sizes1( 1, 3, CV_32SC1 );
             layer_sizes1.at<int>(0) = 2;
             layer_sizes1.at<int>(1) = 5;
@@ -589,7 +581,7 @@ int main()
             imshow( "ANN", imgDst );
 #endif
 
-#if EM
+#if _EM_
             find_decision_boundary_EM();
             namedWindow( "EM", WINDOW_AUTOSIZE );
             imshow( "EM", imgDst );
index 94ade9b..987290d 100644 (file)
@@ -491,7 +491,8 @@ int main(int argc, char** argv)
         if( outbarename )
         {
             cmd[6 + outbarename - outprefix] = '\0';
-            system(cmd);
+            int result = system(cmd);
+            CV_Assert(result == 0);
             outbarename++;
         }
         else
index 0f4ec25..c1bf36b 100644 (file)
@@ -21,7 +21,7 @@ if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND)
     ocv_include_directories(${CUDA_INCLUDE_DIRS})\r
   endif()\r
 \r
-  if(CMAKE_COMPILER_IS_GNUCXX)\r
+  if(CMAKE_COMPILER_IS_GNUCXX AND NOT ENABLE_NOISY_WARNINGS)\r
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-function")\r
   endif()\r
 \r
index 95e90e7..b610411 100644 (file)
@@ -215,7 +215,6 @@ int main(int argc, const char* argv[])
             switch (key)\r
             {\r
             case 27:\r
-                return 0;\r
                 break;\r
 \r
             case 'A':\r