2016-09-11 19:14:52 +02:00
|
|
|
|
(*
|
|
|
|
|
*****************************************************************
|
|
|
|
|
Delphi-OpenCV
|
|
|
|
|
Copyright (C) 2013 Project Delphi-OpenCV
|
|
|
|
|
****************************************************************
|
|
|
|
|
Contributor:
|
|
|
|
|
Laentir Valetov
|
|
|
|
|
email:laex@bk.ru
|
|
|
|
|
****************************************************************
|
|
|
|
|
You may retrieve the latest version of this file at the GitHub,
|
|
|
|
|
located at git://github.com/Laex/Delphi-OpenCV.git
|
|
|
|
|
****************************************************************
|
|
|
|
|
The contents of this file are used with permission, subject to
|
|
|
|
|
the Mozilla Public License Version 1.1 (the "License"); you may
|
|
|
|
|
not use this file except in compliance with the License. You may
|
|
|
|
|
obtain a copy of the License at
|
|
|
|
|
http://www.mozilla.org/MPL/MPL-1_1Final.html
|
|
|
|
|
|
|
|
|
|
Software distributed under the License is distributed on an
|
|
|
|
|
"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
|
|
|
implied. See the License for the specific language governing
|
|
|
|
|
rights and limitations under the License.
|
|
|
|
|
*******************************************************************
|
|
|
|
|
*)
|
|
|
|
|
|
|
|
|
|
unit ocv.cls.features2d;
|
|
|
|
|
|
|
|
|
|
{$I OpenCV.inc}
|
|
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
|
|
Uses
|
|
|
|
|
ocv.cls.types,
|
|
|
|
|
ocv.cls.core,
|
|
|
|
|
ocv.core_c,
|
|
|
|
|
ocv.core.types_c;
|
|
|
|
|
|
2016-10-25 10:06:22 +02:00
|
|
|
|
// CV_EXPORTS bool initModule_features2d();
|
|
|
|
|
function initModule_features2d: cbool; cdecl;
|
|
|
|
|
|
2016-09-11 19:14:52 +02:00
|
|
|
|
type
|
2016-10-25 10:06:22 +02:00
|
|
|
|
|
|
|
|
|
// ---------------------------- KeyPoint --------------------------
|
2017-09-11 23:25:43 +02:00
|
|
|
|
(*
|
|
|
|
|
pKeyPoint = ^TKeyPoint;
|
|
|
|
|
TKeyPointArray = TArray<TKeyPoint>;
|
|
|
|
|
TKeyPointArrayOfArray = TArray<TKeyPointArray>;
|
2016-10-25 10:06:22 +02:00
|
|
|
|
|
2017-09-11 23:25:43 +02:00
|
|
|
|
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;
|
|
|
|
|
*)
|
|
|
|
|
// by ertankucukoglu
|
2016-10-25 10:06:22 +02:00
|
|
|
|
pKeyPoint = ^TKeyPoint;
|
|
|
|
|
|
2016-09-11 19:14:52 +02:00
|
|
|
|
TKeyPoint = record
|
2017-09-11 23:25:43 +02:00
|
|
|
|
public type
|
|
|
|
|
TKeyPointArray = TArray<TKeyPoint>;
|
|
|
|
|
TKeyPointArrayOfArray = TArray<TKeyPointArray>;
|
|
|
|
|
public
|
2016-09-11 19:14:52 +02:00
|
|
|
|
pt: TcvPoint2f; // !< coordinates of the keypoints
|
2016-10-25 10:06:22 +02:00
|
|
|
|
size: Float; // !< diameter of the meaningful keypoint neighborhood
|
|
|
|
|
angle: Float; // !< computed orientation of the keypoint (-1 if not applicable);
|
2016-09-11 19:14:52 +02:00
|
|
|
|
// !< it's in [0,360) degrees and measured relative to
|
|
|
|
|
// !< image coordinate system, ie in clockwise.
|
2017-09-11 23:25:43 +02:00
|
|
|
|
response: Float;
|
|
|
|
|
// !< the response by which the most strong keypoints have been selected. Can be used for the further sorting or subsampling
|
2016-09-11 19:14:52 +02:00
|
|
|
|
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)
|
2016-10-25 10:06:22 +02:00
|
|
|
|
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;
|
2016-09-11 19:14:52 +02:00
|
|
|
|
end;
|
|
|
|
|
|
2017-09-11 23:25:43 +02:00
|
|
|
|
TKeyPointArray = TKeyPoint.TKeyPointArray;
|
|
|
|
|
TKeyPointArrayOfArray = TKeyPoint.TKeyPointArrayOfArray;
|
|
|
|
|
|
2016-10-25 10:06:22 +02:00
|
|
|
|
// ! writes vector of keypoints to the file storage
|
|
|
|
|
// CV_EXPORTS void write(FileStorage& fs, const string& name, const vector<KeyPoint>& keypoints);
|
|
|
|
|
// ! reads vector of keypoints from the specified file storage node
|
|
|
|
|
// CV_EXPORTS void read(const FileNode& node, CV_OUT vector<KeyPoint>& keypoints);
|
2016-09-11 19:14:52 +02:00
|
|
|
|
|
2016-10-25 10:06:22 +02:00
|
|
|
|
// ---------------------------- KeyPointsFilter --------------------------
|
|
|
|
|
// class CV_EXPORTS KeyPointsFilter
|
2016-09-11 19:14:52 +02:00
|
|
|
|
|
|
|
|
|
// ---------------------------- FeatureDetector --------------------------
|
|
|
|
|
|
|
|
|
|
const
|
|
|
|
|
// feature detector adapter name
|
|
|
|
|
fanGridAdapter = 'Grid'; // GridAdaptedFeatureDetector
|
|
|
|
|
fanPyramidAdapter = 'Pyramid'; // PyramidAdaptedFeatureDetector
|
|
|
|
|
fanDynamicAdapter = 'Dynamic';
|
|
|
|
|
|
|
|
|
|
// feature detector name
|
|
|
|
|
fdtFAST = 'FAST'; // FastFeatureDetector
|
|
|
|
|
fdtSTAR = 'STAR'; // StarFeatureDetector
|
|
|
|
|
fdtSIFT = 'SIFT'; // SIFT (nonfree module)
|
|
|
|
|
fdtSURF = 'SURF'; // SURF (nonfree module)
|
|
|
|
|
fdtORB = 'ORB'; // ORB
|
|
|
|
|
fdtBRISK = 'BRISK'; // BRISK
|
|
|
|
|
fdtMSER = 'MSER'; // MSER
|
|
|
|
|
fdtGFTT = 'GFTT'; // GoodFeaturesToTrackDetector
|
|
|
|
|
fdtHARRIS = 'HARRIS'; // GoodFeaturesToTrackDetector with Harris detector enabled
|
|
|
|
|
fdtDense = 'Dense'; // DenseFeatureDetector
|
|
|
|
|
fdtSimpleBlob = 'SimpleBlob'; // SimpleBlobDetector
|
|
|
|
|
|
|
|
|
|
// combined format "adapter name"+"detector name"
|
|
|
|
|
// for example: "GridFAST", "PyramidSTAR" .
|
|
|
|
|
cfdGridFAST = 'GridFAST';
|
|
|
|
|
cfdPyramidSTAR = 'PyramidSTAR';
|
|
|
|
|
|
|
|
|
|
Type
|
|
|
|
|
IFeatureDetector = interface(IOCVCommon)
|
|
|
|
|
['{1BA6C295-0C46-4C64-AB37-1073F969830C}']
|
|
|
|
|
procedure detect(const image: PIplImage; Var keypoints: TKeyPointArray; const mask: PIplImage); overload;
|
|
|
|
|
procedure detect(const images: TArrayofPIplImage; Var keypoints: TKeyPointArrayOfArray; masks: TArrayofPIplImage); overload;
|
|
|
|
|
function empty(): boolean;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
TFeatureDetector = class(TOCVCommon, IFeatureDetector)
|
|
|
|
|
public
|
|
|
|
|
(*
|
|
|
|
|
* Detect keypoints in an image.
|
|
|
|
|
* image The image.
|
|
|
|
|
* keypoints The detected keypoints.
|
|
|
|
|
* mask Mask specifying where to look for keypoints (optional). Must be a char
|
|
|
|
|
* matrix with non-zero values in the region of interest.
|
|
|
|
|
*)
|
|
|
|
|
// CV_WRAP void detect( const Mat& image, CV_OUT vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
|
|
|
|
|
procedure detect(const image: PIplImage; Var keypoints: TKeyPointArray; const mask: PIplImage); overload;
|
|
|
|
|
|
|
|
|
|
(*
|
|
|
|
|
* Detect keypoints in an image set.
|
|
|
|
|
* images Image collection.
|
|
|
|
|
* keypoints Collection of keypoints detected in an input images. keypoints[i] is a set of keypoints detected in an images[i].
|
|
|
|
|
* masks Masks for image set. masks[i] is a mask for images[i].
|
|
|
|
|
*)
|
|
|
|
|
// void detect( const vector<Mat>& images, vector<vector<KeyPoint> >& keypoints, const vector<Mat>& masks=vector<Mat>() ) const;
|
|
|
|
|
procedure detect(const images: TArrayofPIplImage; Var keypoints: TKeyPointArrayOfArray; masks: TArrayofPIplImage); overload;
|
|
|
|
|
|
|
|
|
|
// Return true if detector object is empty
|
|
|
|
|
// CV_WRAP virtual bool empty() const;
|
|
|
|
|
function empty(): boolean;
|
|
|
|
|
// Create feature detector by detector name.
|
|
|
|
|
constructor Create(const detectorType: String);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ---------------------------- DescriptorExtractor --------------------------
|
|
|
|
|
|
|
|
|
|
const
|
|
|
|
|
// extractor adapter name
|
|
|
|
|
eanOpponent = 'Opponent'; // OpponentColorDescriptorExtractor
|
|
|
|
|
|
|
|
|
|
// descriptor extractor name
|
|
|
|
|
denSIFT = 'SIFT'; // SIFT
|
|
|
|
|
denSURF = 'SURF'; // SURF
|
|
|
|
|
denBRIEF = 'BRIEF'; // BriefDescriptorExtractor
|
|
|
|
|
denBRISK = 'BRISK'; // BRISK
|
|
|
|
|
denORB = 'ORB'; // ORB
|
|
|
|
|
denFREAK = 'FREAK'; // FREAK
|
|
|
|
|
|
|
|
|
|
// A combined format is also supported:
|
|
|
|
|
// descriptor extractor adapter name ( "Opponent" <20> OpponentColorDescriptorExtractor ) + descriptor extractor name,
|
|
|
|
|
// for example: "OpponentSIFT"
|
|
|
|
|
ceOpponentSIFT = 'OpponentSIFT';
|
|
|
|
|
|
|
|
|
|
Type
|
|
|
|
|
|
|
|
|
|
IDescriptorExtractor = interface(IOCVCommon)
|
|
|
|
|
['{E9FA5428-0592-487B-9003-EB36B1212050}']
|
|
|
|
|
procedure compute(const image: PIplImage; keypoints: TKeyPointArray; Var descriptors: TMat); overload;
|
|
|
|
|
procedure compute(const images: TArrayofPIplImage; keypoints: TKeyPointArrayOfArray; Var descriptors: TArrayOfTMat); overload;
|
|
|
|
|
function descriptorSize: Integer;
|
|
|
|
|
function descriptorType: Integer;
|
|
|
|
|
function empty: cbool;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
TDescriptorExtractor = class(TOCVCommon, IDescriptorExtractor)
|
|
|
|
|
public
|
|
|
|
|
(*
|
|
|
|
|
* Compute the descriptors for a set of keypoints in an image.
|
|
|
|
|
* image The image.
|
|
|
|
|
* keypoints The input keypoints. Keypoints for which a descriptor cannot be computed are removed.
|
|
|
|
|
* descriptors Copmputed descriptors. Row i is the descriptor for keypoint i.
|
|
|
|
|
*)
|
|
|
|
|
// CV_WRAP void compute( const Mat& image, CV_OUT CV_IN_OUT vector<KeyPoint>& keypoints, CV_OUT Mat& descriptors ) const;
|
|
|
|
|
procedure compute(const image: PIplImage; keypoints: TKeyPointArray; Var descriptors: TMat); overload;
|
|
|
|
|
|
|
|
|
|
(*
|
|
|
|
|
* Compute the descriptors for a keypoints collection detected in image collection.
|
|
|
|
|
* images Image collection.
|
|
|
|
|
* keypoints Input keypoints collection. keypoints[i] is keypoints detected in images[i].
|
|
|
|
|
* Keypoints for which a descriptor cannot be computed are removed.
|
|
|
|
|
* descriptors Descriptor collection. descriptors[i] are descriptors computed for set keypoints[i].
|
|
|
|
|
*)
|
|
|
|
|
// void compute( const vector<Mat>& images, vector<vector<KeyPoint> >& keypoints, vector<Mat>& descriptors ) const;
|
|
|
|
|
procedure compute(const images: TArrayofPIplImage; keypoints: TKeyPointArrayOfArray; Var descriptors: TArrayOfTMat); overload;
|
|
|
|
|
|
|
|
|
|
// CV_WRAP virtual int descriptorSize() const = 0;
|
|
|
|
|
function descriptorSize: Integer;
|
|
|
|
|
// CV_WRAP virtual int descriptorType() const = 0;
|
|
|
|
|
function descriptorType: Integer;
|
|
|
|
|
|
|
|
|
|
// CV_WRAP virtual bool empty() const;
|
|
|
|
|
function empty: cbool;
|
|
|
|
|
|
|
|
|
|
// CV_WRAP static Ptr<DescriptorExtractor> create( const string& descriptorExtractorType );
|
|
|
|
|
constructor Create(const descriptorExtractorType: String);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
implementation
|
|
|
|
|
|
|
|
|
|
uses
|
|
|
|
|
ocv.nonfree,
|
|
|
|
|
ocv.utils,
|
|
|
|
|
ocv.lib;
|
|
|
|
|
|
2016-10-25 10:06:22 +02:00
|
|
|
|
function initModule_features2d; external features2d_lib name '?initModule_features2d@cv@@YA_NXZ';
|
|
|
|
|
|
2016-09-11 19:14:52 +02:00
|
|
|
|
{ TFeatureDetector }
|
|
|
|
|
|
2017-09-11 23:25:43 +02:00
|
|
|
|
function Create_FeatureDetector(const detectorType: pAnsiChar): TOpenCVClass; stdcall;
|
|
|
|
|
external opencv_classes_lib name '_Create_FeatureDetector@4';
|
2016-09-11 19:14:52 +02:00
|
|
|
|
function Empty_FeatureDetector(const F: TOpenCVClass): cbool; stdcall; external opencv_classes_lib name '_Empty_FeatureDetector@4';
|
2017-09-11 23:25:43 +02:00
|
|
|
|
procedure detect_FeatureDetector(const F: TOpenCVClass; image: PIplImage; Var keypointcount: Integer; Var keypoints: pKeyPoint;
|
|
|
|
|
mask: PIplImage); stdcall; external opencv_classes_lib name '_detect_FeatureDetector@20';
|
2016-09-11 19:14:52 +02:00
|
|
|
|
|
|
|
|
|
constructor TFeatureDetector.Create(const detectorType: String);
|
|
|
|
|
begin
|
|
|
|
|
inherited Create(Create_FeatureDetector(detectorType.AsPAnsiChar));
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TFeatureDetector.detect(const image: PIplImage; Var keypoints: TKeyPointArray; const mask: PIplImage);
|
|
|
|
|
Var
|
|
|
|
|
kpcount: Integer;
|
|
|
|
|
kp: pKeyPoint;
|
|
|
|
|
i: Integer;
|
|
|
|
|
begin
|
|
|
|
|
detect_FeatureDetector(FData, image, kpcount, kp, mask);
|
|
|
|
|
SetLength(keypoints, kpcount);
|
|
|
|
|
for i := 0 to kpcount - 1 do
|
|
|
|
|
keypoints[i] := kp[i];
|
|
|
|
|
cvFree_(kp);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TFeatureDetector.detect(const images: TArrayofPIplImage; Var keypoints: TKeyPointArrayOfArray; masks: TArrayofPIplImage);
|
|
|
|
|
var
|
|
|
|
|
i: Integer;
|
|
|
|
|
begin
|
|
|
|
|
SetLength(keypoints, Length(images));
|
|
|
|
|
SetLength(masks, Length(images));
|
|
|
|
|
for i := 0 to High(images) do
|
|
|
|
|
detect(images[i], keypoints[i], masks[i]);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TFeatureDetector.empty: boolean;
|
|
|
|
|
begin
|
|
|
|
|
Result := Empty_FeatureDetector(FData);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
{ TDescriptorExtractor }
|
|
|
|
|
|
|
|
|
|
function Create_DescriptorExtractor(const descriptorExtractorType: pAnsiChar): TOpenCVClass; stdcall;
|
|
|
|
|
external opencv_classes_lib name '_Create_DescriptorExtractor@4';
|
|
|
|
|
function Empty_DescriptorExtractor(const F: TOpenCVClass): cbool; stdcall; external opencv_classes_lib name '_Empty_DescriptorExtractor@4';
|
2017-09-11 23:25:43 +02:00
|
|
|
|
procedure compute_DescriptorExtractor(const F: TOpenCVClass; image: PIplImage; keypointcount: Integer; keypoints: pKeyPoint;
|
|
|
|
|
Var mask: TOpenCVClass); stdcall; external opencv_classes_lib name '_compute_DescriptorExtractor@20';
|
2016-09-11 19:14:52 +02:00
|
|
|
|
function descriptorSize_DescriptorExtractor(const F: TOpenCVClass): Integer; stdcall;
|
|
|
|
|
external opencv_classes_lib name '_descriptorSize_DescriptorExtractor@4';
|
|
|
|
|
function descriptorType_DescriptorExtractor(const F: TOpenCVClass): Integer; stdcall;
|
|
|
|
|
external opencv_classes_lib name '_descriptorType_DescriptorExtractor@4';
|
|
|
|
|
|
|
|
|
|
procedure TDescriptorExtractor.compute(const image: PIplImage; keypoints: TKeyPointArray; Var descriptors: TMat);
|
|
|
|
|
Var
|
|
|
|
|
desc: TOpenCVClass;
|
|
|
|
|
begin
|
|
|
|
|
if Length(keypoints) > 0 then
|
|
|
|
|
begin
|
|
|
|
|
compute_DescriptorExtractor(FData, image, Length(keypoints), @keypoints[0], desc);
|
|
|
|
|
descriptors := TMat.Create(desc);
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
descriptors := TMat.Create;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TDescriptorExtractor.compute(const images: TArrayofPIplImage; keypoints: TKeyPointArrayOfArray; var descriptors: TArrayOfTMat);
|
|
|
|
|
var
|
|
|
|
|
i: Integer;
|
|
|
|
|
begin
|
|
|
|
|
SetLength(descriptors, Length(images));
|
|
|
|
|
for i := 0 to High(images) do
|
|
|
|
|
compute(images[i], keypoints[i], descriptors[i]);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
constructor TDescriptorExtractor.Create(const descriptorExtractorType: String);
|
|
|
|
|
begin
|
|
|
|
|
inherited Create(Create_DescriptorExtractor(descriptorExtractorType.AsPAnsiChar));
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TDescriptorExtractor.descriptorSize: Integer;
|
|
|
|
|
begin
|
|
|
|
|
Result := descriptorSize_DescriptorExtractor(FData);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TDescriptorExtractor.descriptorType: Integer;
|
|
|
|
|
begin
|
|
|
|
|
Result := descriptorType_DescriptorExtractor(FData);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TDescriptorExtractor.empty: cbool;
|
|
|
|
|
begin
|
|
|
|
|
Result := Empty_DescriptorExtractor(FData);
|
|
|
|
|
end;
|
|
|
|
|
|
2016-10-25 10:06:22 +02:00
|
|
|
|
{ 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;
|
|
|
|
|
|
2016-09-11 19:14:52 +02:00
|
|
|
|
end.
|