From 2b3b89fb4b3360445d7b9d58cba3c811740734e7 Mon Sep 17 00:00:00 2001 From: Laentir Valetov Date: Tue, 25 Oct 2016 12:06:22 +0400 Subject: [PATCH] Fixed #58 Signed-off-by: Laentir Valetov --- README.md | 10 +- bin/Win32/opencv_classes2413d.dll | Bin 120832 -> 120832 bytes bin/Win64/opencv_classes2413.dll | Bin 0 -> 34816 bytes bin/Win64/opencv_classes2413d.dll | Bin 0 -> 168960 bytes source/classes/ocv.cls.contrib.pas | 4 +- source/classes/ocv.cls.features2d.pas | 86 +++++++++++++++--- source/classes/ocv.cls.highgui.pas | 22 ++--- source/classes/ocv.cls.objdetect.pas | 2 +- .../dclCommonOpenCV310.dproj | 22 ++--- source/component/ocv.comp.ImageOperation.pas | 33 ++++--- source/ocv.core.types_c.pas | 2 + source/ocv.lib.pas | 20 ++++ source/ocv.utils.pas | 7 +- source/opencv_classes/features2d_prx.cpp | 2 +- source/opencv_classes/opencv_classes.vcxproj | 11 ++- 15 files changed, 155 insertions(+), 66 deletions(-) create mode 100644 bin/Win64/opencv_classes2413.dll create mode 100644 bin/Win64/opencv_classes2413d.dll diff --git a/README.md b/README.md index 6afa1c7..9325f81 100644 --- a/README.md +++ b/README.md @@ -14,15 +14,7 @@ Files: msvcp120.dll, msvcr120.dll, msvcp120d.dll, msvcr120d.dll (1) 32-bit in the "Delphi-OpenCV\redist\VC2013x86\" (2) 64-bit in the "Delphi-OpenCV\redist\VC2013x64\" ``` -* Shared library FFMPEG for Windows can be downloaded from [here][5] (build ffmpeg-20160710-d4c8e93)
- libavutil 55. 28.100 / 55. 28.100
- libavcodec 57. 50.100 / 57. 50.100
- libavformat 57. 41.100 / 57. 41.100
- libavdevice 57. 0.102 / 57. 0.102
- libavfilter 6. 47.100 / 6. 47.100
- libswscale 4. 1.100 / 4. 1.100
- libswresample 2. 1.100 / 2. 1.100
- libpostproc 54. 0.100 / 54. 0.100
+* Shared library FFMPEG 3.1.4 for Windows can be downloaded from [here][5]
``` (3) FFmpeg 32-bit Shared (4) FFmpeg 64-bit Shared diff --git a/bin/Win32/opencv_classes2413d.dll b/bin/Win32/opencv_classes2413d.dll index 9ce8309ceac6ff15c77c7186e3dd67e65233eff4..cd5c9b6796750a6662bcad2a0d909e9f26c49467 100644 GIT binary patch delta 78 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%0A{j1mDBOIQy1y|m%J64mt?Q2^6 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 bD{bUAydl2K-6@niavsQeAm@Sq%^vuF; TKeyPointArrayOfArray = TArray; + TKeyPoint = record + pt: TcvPoint2f; // !< coordinates of the keypoints + size: Float; // !< diameter of the meaningful keypoint neighborhood + angle: Float; // !< computed orientation of the keypoint (-1 if not applicable); + // !< it's in [0,360) degrees and measured relative to + // !< image coordinate system, ie in clockwise. + response: Float; // !< the response by which the most strong keypoints have been selected. Can be used for the further sorting or subsampling + octave: Integer; // !< octave (pyramid layer) from which the keypoint has been extracted + class_id: Integer; // !< object class (if the keypoints need to be clustered by an object they belong to) + procedure KeyPoint(_pt: TcvPoint2f; _size: Float; _angle: Float = -1; _response: Float = 0; _octave: Integer = 0; + _class_id: Integer = -1); overload; + procedure KeyPoint(x: Float; y: Float; _size: Float; _angle: Float = -1; _response: Float = 0; _octave: Integer = 0; + _class_id: Integer = -1); overload; + function hash: size_t; + procedure convert(const keypoints: TKeyPointArray; Var points2f: TArrayOfcvPoint2f); overload; + procedure convert(const points2f: TArrayOfcvPoint2f; Var keypoints: TKeyPointArray); overload; + function overlap(const kp1, kp2: TKeyPoint): Float; + end; + + // ! writes vector of keypoints to the file storage + // CV_EXPORTS void write(FileStorage& fs, const string& name, const vector& keypoints); + // ! reads vector of keypoints from the specified file storage node + // CV_EXPORTS void read(const FileNode& node, CV_OUT vector& keypoints); + + // ---------------------------- KeyPointsFilter -------------------------- + // class CV_EXPORTS KeyPointsFilter + // ---------------------------- FeatureDetector -------------------------- const @@ -185,6 +206,8 @@ uses ocv.utils, ocv.lib; +function initModule_features2d; external features2d_lib name '?initModule_features2d@cv@@YA_NXZ'; + { TFeatureDetector } function Create_FeatureDetector(const detectorType: pAnsiChar): TOpenCVClass; stdcall; external opencv_classes_lib name '_Create_FeatureDetector@4'; @@ -279,4 +302,45 @@ begin Result := Empty_DescriptorExtractor(FData); end; +{ TKeyPoint } + +procedure TKeyPoint.KeyPoint(_pt: TcvPoint2f; _size, _angle, _response: Float; _octave, _class_id: Integer); +begin + pt := _pt; + size := _size; + angle := _angle; + response := _response; + octave := _octave; + class_id := _class_id; +end; + +procedure TKeyPoint.convert(const keypoints: TKeyPointArray; var points2f: TArrayOfcvPoint2f); +begin + +end; + +procedure TKeyPoint.convert(const points2f: TArrayOfcvPoint2f; var keypoints: TKeyPointArray); +begin + +end; + +function TKeyPoint.hash: size_t; +begin + +end; + +procedure TKeyPoint.KeyPoint(x, y, _size, _angle, _response: Float; _octave, _class_id: Integer); +begin + KeyPoint(CvPoint2f(x, y), _size, _angle, _response, _octave, _class_id); +end; + +function TKeyPoint.overlap(const kp1, kp2: TKeyPoint): Float; +begin + +end; + +initialization + +initModule_features2d; + end. diff --git a/source/classes/ocv.cls.highgui.pas b/source/classes/ocv.cls.highgui.pas index 95b1941..5c1ce0f 100644 --- a/source/classes/ocv.cls.highgui.pas +++ b/source/classes/ocv.cls.highgui.pas @@ -395,7 +395,7 @@ constructor TVideoCapture.Create(const FileName: String); begin Create; if Assigned(FData) then - _VideoCaptureOpenFileName(FData, FileName.AsPAnsiChar); + _VideoCaptureOpenFileName(FData, c_str(filename)); end; constructor TVideoCapture.Create; @@ -423,7 +423,7 @@ end; function TVideoCapture.Open(const FileName: String): cbool; begin if Assigned(FData) then - Result := _VideoCaptureOpenFileName(FData, FileName.AsPAnsiChar) + Result := _VideoCaptureOpenFileName(FData, c_str(filename)) else Result := false; end; @@ -453,12 +453,12 @@ end; procedure namedWindow(const winname: String; const flags: integer = WINDOW_AUTOSIZE); begin - cvNamedWindow(winname.AsPAnsiChar, flags); + cvNamedWindow(c_str(winname), flags); end; procedure destroyWindow(const winname: String); begin - cvDestroyWindow(winname.AsPAnsiChar); + cvDestroyWindow(c_str(winname)); end; procedure destroyAllWindows(); @@ -481,38 +481,38 @@ Var IplImage: TIplImage; begin IplImage.InitFromMat(Mat); - cvShowImage(winname.AsPAnsiChar, @IplImage); + cvShowImage(c_str(winname), @IplImage); end; procedure resizeWindow(const winname: String; const width, height: integer); begin - cvResizeWindow(winname.AsPAnsiChar, width, height); + cvResizeWindow(c_str(winname), width, height); end; procedure moveWindow(const winname: String; const x, y: integer); begin - cvMoveWindow(winname.AsPAnsiChar, x, y); + cvMoveWindow(c_str(winname), x, y); end; procedure setWindowProperty(const winname: String; const prop_id: integer; const prop_value: double); begin - cvSetWindowProperty(winname.AsPAnsiChar, prop_id, prop_value); + cvSetWindowProperty(c_str(winname), prop_id, prop_value); end; function getWindowProperty(const winname: String; const prop_id: integer): double; begin - Result := cvGetWindowProperty(winname.AsPAnsiChar, prop_id); + Result := cvGetWindowProperty(c_str(winname), prop_id); end; function createTrackbar(const trackbarname: String; const winname: String; Value: PInteger; count: integer; onChange: TCvTrackbarCallback2 = nil; userdata: Pointer = nil): integer; begin - Result := cvCreateTrackbar2(trackbarname.AsPAnsiChar, winname.AsPAnsiChar, Value, count, onChange, userdata); + Result := cvCreateTrackbar2(c_str(trackbarname), c_str(winname), Value, count, onChange, userdata); end; function imread(const FileName: string; flag: integer): IMat; begin - Result := TMat.Create(cvLoadImage(FileName.AsPAnsiChar, flag)); + Result := TMat.Create(cvLoadImage(c_str(FileName), flag)); end; end. diff --git a/source/classes/ocv.cls.objdetect.pas b/source/classes/ocv.cls.objdetect.pas index b7703ec..56614b9 100644 --- a/source/classes/ocv.cls.objdetect.pas +++ b/source/classes/ocv.cls.objdetect.pas @@ -233,7 +233,7 @@ end; function TCascadeClassifier.load(const FileName: String): cbool; begin - Result := _get_CascadeClassifier_load(FData, FileName.AsPAnsiChar); + Result := _get_CascadeClassifier_load(FData, c_str(FileName)); end; function TCascadeClassifier.setImage(Image: IMat): cbool; diff --git a/source/component/Delphi 10.1 Berlin/dclCommonOpenCV310.dproj b/source/component/Delphi 10.1 Berlin/dclCommonOpenCV310.dproj index 9fc13a6..685a002 100644 --- a/source/component/Delphi 10.1 Berlin/dclCommonOpenCV310.dproj +++ b/source/component/Delphi 10.1 Berlin/dclCommonOpenCV310.dproj @@ -207,7 +207,16 @@ true - + + + 0 + .dll;.bpl + + + 1 + .dylib + + Contents\Resources @@ -519,16 +528,7 @@ 1 - - - 0 - .dll;.bpl - - - 1 - .dylib - - + diff --git a/source/component/ocv.comp.ImageOperation.pas b/source/component/ocv.comp.ImageOperation.pas index 7e96bae..6c1f5ad 100644 --- a/source/component/ocv.comp.ImageOperation.pas +++ b/source/component/ocv.comp.ImageOperation.pas @@ -2707,24 +2707,29 @@ procedure TocvCommonMathOperation.GetImagesForTransorm(out Source1: IocvImage; o Var s1, s2, M: IocvImage; begin - Source1 := VideoSource.Image; - DoGetSourceImage(s2); - DoGetMaskImage(M); - if Assigned(s2) and ((s1.Width <> s2.Width) or (s1.height <> s2.height)) then + if Assigned(VideoSource) then begin - Source2 := s1.Same; - cvResize(s2.IpImage, Source2.IpImage, Integer(TransformInterpolation)); - end - else - Source2 := s2; + Source1 := VideoSource.Image; + DoGetSourceImage(s2); + DoGetMaskImage(M); + if Assigned(s2) and ((s1.Width <> s2.Width) or (s1.height <> s2.height)) then + begin + Source2 := s1.Same; + cvResize(s2.IpImage, Source2.IpImage, Integer(TransformInterpolation)); + end + else + Source2 := s2; - if Assigned(M) and ((s1.Width <> M.Width) or (s1.height <> M.height)) then - begin - Mask := s1.Same; - cvResize(M.IpImage, Mask.IpImage, Integer(TransformInterpolation)); + if Assigned(M) and ((s1.Width <> M.Width) or (s1.height <> M.height)) then + begin + Mask := s1.Same; + cvResize(M.IpImage, Mask.IpImage, Integer(TransformInterpolation)); + end + else + Mask := M; end else - Mask := M; + Source2 := Source1; end; procedure TocvCommonMathOperation.SetVideoSource_Source2(const Value: IocvDataSource); diff --git a/source/ocv.core.types_c.pas b/source/ocv.core.types_c.pas index c409137..71d6df7 100644 --- a/source/ocv.core.types_c.pas +++ b/source/ocv.core.types_c.pas @@ -756,6 +756,7 @@ type TcvPoint2f = TCvPoint2D32f; pcvPoint2f = pCvPoint2D32f; + TArrayOfcvPoint2f = TArray; pCvPoint3D32f = ^TCvPoint3D32f; @@ -2919,3 +2920,4 @@ CV_SEQ_CHAIN := (CV_SEQ_KIND_CURVE or CV_SEQ_ELTYPE_CODE); CV_SEQ_CHAIN_CONTOUR := (CV_SEQ_FLAG_CLOSED or CV_SEQ_CHAIN); end. + diff --git a/source/ocv.lib.pas b/source/ocv.lib.pas index ada107b..d229cc5 100644 --- a/source/ocv.lib.pas +++ b/source/ocv.lib.pas @@ -112,6 +112,26 @@ highgui_lib = {$IFDEF MSWINDOWS} {$ENDIF} {$ENDIF} // ------------------------------- +features2d_lib = {$IFDEF MSWINDOWS} + CV_DLL_DIR + 'opencv_' + +{$IFDEF DelphiOCVVersion_29} + 'features2d' + +{$ELSEIF DEFINED( DelphiOCVVersion_30)} + 'world' + +{$ENDIF} + CV_VERSION_DLL {$IFDEF DEBUG} + 'd'{$ENDIF} + '.dll'; +{$ELSE} +{$IFDEF MACOS} + 'opencv_features2d.dylib'; +{$ELSE} +{$IFDEF ANDROID} + 'libopencv_features2d.so'; +{$ELSE} + 'libopencv_features2d.so'; +{$ENDIF} +{$ENDIF} +{$ENDIF} +// ------------------------------- imgproc_lib = {$IFDEF MSWINDOWS} CV_DLL_DIR + 'opencv_' + {$IFDEF DelphiOCVVersion_29} diff --git a/source/ocv.utils.pas b/source/ocv.utils.pas index 5abf1d0..3bd97ed 100644 --- a/source/ocv.utils.pas +++ b/source/ocv.utils.pas @@ -88,11 +88,12 @@ function CropIplImage(const src: PIplImage; const roi: TCvRect): PIplImage; procedure ocvRGBToHSV(const R, G, B: byte; out _H, _S, _V: byte); procedure ocvHSVToRGB(const _H, _S, _V: byte; out _R, _G, _B: byte); +{$IFDEF DELPHIXE3_UP} Type - TStringAnsiHelper = record helper for - String + TStringAnsiHelper = record helper for String function AsPAnsiChar: PAnsiChar; end; +{$ENDIF} implementation @@ -104,12 +105,14 @@ uses {$ENDIF} ocv.core_c, System.Math; +{$IFDEF DELPHIXE3_UP} { TStringAnsiHelper } function TStringAnsiHelper.AsPAnsiChar: PAnsiChar; begin Result := c_str(Self); end; +{$ENDIF} function BitmapToIplImage(const bitmap: {$IFDEF DELPHIXE2_UP}Vcl.Graphics.TBitmap{$ELSE}Graphics.TBitmap{$ENDIF}): PIplImage; diff --git a/source/opencv_classes/features2d_prx.cpp b/source/opencv_classes/features2d_prx.cpp index 7138219..2c5d437 100644 --- a/source/opencv_classes/features2d_prx.cpp +++ b/source/opencv_classes/features2d_prx.cpp @@ -29,7 +29,7 @@ namespace cv std::vector* kp = new std::vector(); ICLASS_API void __stdcall detect_FeatureDetector(const FeatureDetector* r, IplImage* image, - CV_OUT int &keypointcount, CV_OUT _KeyPoint* &keypoints, IplImage* mask) + CV_OUT size_t &keypointcount, CV_OUT _KeyPoint* &keypoints, IplImage* mask) { //std::vector* kp = new std::vector(); //kp.clear(); diff --git a/source/opencv_classes/opencv_classes.vcxproj b/source/opencv_classes/opencv_classes.vcxproj index 0e0e109..eab25dc 100644 --- a/source/opencv_classes/opencv_classes.vcxproj +++ b/source/opencv_classes/opencv_classes.vcxproj @@ -22,6 +22,7 @@ {78DEF71B-AE48-44A1-9BEF-F517051EBF8F} Win32Proj opencv_classes + 8.1 @@ -75,10 +76,11 @@ D:\opencv\build\include\;$(IncludePath) - D:\OpenCV\build\x86\vc12\staticlib\;$(LibraryPath) + D:\OpenCV\build\x64\vc12\lib\;$(LibraryPath) true 2413d.dll ..\..\bin\win64\ + $(Configuration)\ false @@ -90,9 +92,10 @@ 2413.dll D:\opencv\build\include\;$(IncludePath) - D:\OpenCV\build\x86\vc12\staticlib\;$(LibraryPath) + D:\OpenCV\build\x64\vc12\lib\;$(LibraryPath) false ..\..\bin\win64\ + $(Configuration)\ @@ -117,7 +120,7 @@ Windows true - opencv_ts300d.lib;opencv_world300d.lib;%(AdditionalDependencies) + opencv_calib3d2413d.lib;opencv_contrib2413d.lib;opencv_core2413d.lib;opencv_features2d2413d.lib;opencv_flann2413d.lib;opencv_gpu2413d.lib;opencv_highgui2413d.lib;opencv_imgproc2413d.lib;opencv_legacy2413d.lib;opencv_ml2413d.lib;opencv_nonfree2413d.lib;opencv_objdetect2413d.lib;opencv_ocl2413d.lib;opencv_photo2413d.lib;opencv_stitching2413d.lib;opencv_superres2413d.lib;opencv_ts2413d.lib;opencv_video2413d.lib;opencv_videostab2413d.lib;%(AdditionalDependencies) @@ -151,7 +154,7 @@ true true true - opencv_ts300.lib;opencv_world300.lib;%(AdditionalDependencies) + opencv_calib3d2413.lib;opencv_contrib2413.lib;opencv_core2413.lib;opencv_features2d2413.lib;opencv_flann2413.lib;opencv_gpu2413.lib;opencv_highgui2413.lib;opencv_imgproc2413.lib;opencv_legacy2413.lib;opencv_ml2413.lib;opencv_nonfree2413.lib;opencv_objdetect2413.lib;opencv_ocl2413.lib;opencv_photo2413.lib;opencv_stitching2413.lib;opencv_superres2413.lib;opencv_ts2413.lib;opencv_video2413.lib;opencv_videostab2413.lib;%(AdditionalDependencies)