HoughLines and HoughCircles image operations

Signed-off-by: Laentir Valetov <laex@bk.ru>
This commit is contained in:
Laentir Valetov 2014-05-30 19:22:53 +04:00
parent 614e5335c0
commit e093d356cd
11 changed files with 2094 additions and 189 deletions

View File

@ -3,7 +3,7 @@
// Copyright (C) 2013 Project Delphi-OpenCV
// ****************************************************************
// Contributor:
// Laentir Valetov
// Laentir Valetov
// email:laex@bk.ru
// ****************************************************************
// You may retrieve the latest version of this file at the GitHub,
@ -33,14 +33,13 @@ program cv_AdaptiveSkinDetector;
uses
System.SysUtils,
WinApi.Windows,
lib,
highgui_c,
core_c,
Core.types_c,
imgproc_c,
imgproc.types_c
// ,contrib
;
ocv.lib,
ocv.highgui_c,
ocv.core_c,
ocv.Core.types_c,
ocv.imgproc_c,
ocv.imgproc.types_c,
ocv.contrib;
const
CLOCKS_PER_SEC = 1000;

View File

@ -3,7 +3,7 @@
<ProjectGuid>{37486FE1-CC21-40FA-8006-F946D2DCCC3E}</ProjectGuid>
<MainSource>OpenCV200.dpk</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Release</Config>
<Config Condition="'$(Config)'==''">Debug</Config>
<TargetedPlatforms>91</TargetedPlatforms>
<AppType>Package</AppType>
<FrameworkType>None</FrameworkType>
@ -190,7 +190,7 @@
<DCC_UnitSearchPath>..;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Keys>CompanyName=;FileDescription=OpenCV Component;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=OpenCV Component;ProductVersion=1.0.0.0;Comments=;LastCompiledTime=28.05.2014 22:11:47</VerInfo_Keys>
<VerInfo_Keys>CompanyName=;FileDescription=OpenCV Component;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=OpenCV Component;ProductVersion=1.0.0.0;Comments=;LastCompiledTime=30.05.2014 11:33:52</VerInfo_Keys>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
@ -230,7 +230,7 @@
<DCC_UnitSearchPath>..;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Keys>CompanyName=;FileDescription=OpenCV Component;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=OpenCV Component;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Keys>CompanyName=;FileDescription=OpenCV Component;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=OpenCV Component;ProductVersion=1.0.0.0;Comments=;LastCompiledTime=30.05.2014 19:19:54</VerInfo_Keys>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>

View File

@ -1,35 +1,5 @@
package dclOpenCV200;
{$R *.res}
{$R '..\OpenCV.dcr'}
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO OFF}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS OFF}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO OFF}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$DEFINE RELEASE}
{$ENDIF IMPLICITBUILDING}
{$DESCRIPTION 'OpenCV Component'}
{$DESIGNONLY}
{$IMPLICITBUILD OFF}
requires
OpenCV200,
rtl,

View File

@ -3,7 +3,7 @@
<ProjectGuid>{29A87BFF-B0BF-4A7F-BC7D-E36D34A7E4B5}</ProjectGuid>
<MainSource>dclOpenCV200.dpk</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Release</Config>
<Config Condition="'$(Config)'==''">Debug</Config>
<TargetedPlatforms>1</TargetedPlatforms>
<AppType>Package</AppType>
<FrameworkType>VCL</FrameworkType>
@ -123,7 +123,7 @@
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Keys>CompanyName=;FileDescription=OpenCV Component;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=OpenCV Component;ProductVersion=1.0.0.0;Comments=;LastCompiledTime=28.05.2014 22:11:50</VerInfo_Keys>
<VerInfo_Keys>CompanyName=;FileDescription=OpenCV Component;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=OpenCV Component;ProductVersion=1.0.0.0;Comments=;LastCompiledTime=30.05.2014 11:33:56</VerInfo_Keys>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
@ -141,7 +141,7 @@
<DCC_DcuOutput>.</DCC_DcuOutput>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Keys>CompanyName=;FileDescription=OpenCV Component;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=OpenCV Component;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Keys>CompanyName=;FileDescription=OpenCV Component;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=OpenCV Component;ProductVersion=1.0.0.0;Comments=;LastCompiledTime=30.05.2014 19:19:57</VerInfo_Keys>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
@ -153,7 +153,6 @@
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="..\OpenCV.dcr"/>
<DCCReference Include="OpenCV200.dcp"/>
<DCCReference Include="rtl.dcp"/>
<DCCReference Include="vcl.dcp"/>

View File

@ -248,7 +248,7 @@ type
property sigma2: Double index 1 Read GetFloatParam write SetFloatParam;
property size1: Integer index 0 Read GetIntParam write SetIntParam;
property size2: Integer index 1 Read GetIntParam write SetIntParam;
property SmoothOperation: TocvSmoothOperations read FSmoothOperation write SetSmoothOperation default GAUSSIAN;
property SmoothType: TocvSmoothOperations read FSmoothOperation write SetSmoothOperation default GAUSSIAN;
end;
TocvThresholdType = (THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC, THRESH_TOZERO, THRESH_TOZERO_INV, THRESH_MASK,
@ -434,8 +434,6 @@ type
function DoTransform(const Source: IocvImage; out Destanation: IocvImage): Boolean; override;
end;
TocvLineType = (LT_FILLED, LT_8, LT_AA);
TocvDraw = class(TPersistent)
protected
FColor: TColor;
@ -448,11 +446,15 @@ type
FThickness: Integer;
FLineType: TocvLineType;
FShift: Integer;
function GetCvLineType: Integer;
function GetCvColor: TCvScalar;
public
constructor Create(AOwner: TPersistent);
destructor Destroy; override;
property Color: TColor read FColor write FColor default clGreen;
property Shift: Integer read FShift write FShift default 0;
property cvLineType: Integer read GetCvLineType;
property cvColor: TCvScalar read GetCvColor;
published
property Enabled: Boolean read FEnabled write FEnabled default True;
property Thickness: Integer read FThickness write FThickness default 2;
@ -460,6 +462,11 @@ type
property Offset: TocvPoint2D32i read FOffset write FOffset;
end;
TocvDrawColor = class(TocvDraw)
published
property Color;
end;
TocvMatchTemplateMethod = (TM_SQDIFF, TM_SQDIFF_NORMED, TM_CCORR, TM_CCORR_NORMED, TM_CCOEFF, TM_CCOEFF_NORMED);
TocvMatchTemplate = class(TocvCustomImageOperation)
@ -491,10 +498,7 @@ type
TocvContourApproximationMethods = (CHAIN_CODE, CHAIN_APPROX_NONE, CHAIN_APPROX_SIMPLE, CHAIN_APPROX_TC89_L1,
CHAIN_APPROX_TC89_KCOS, LINK_RUNS);
TocvDrawMotionRect = class(TocvDraw)
published
property Color;
end;
TocvDrawMotionRect = TocvDrawColor;
TocvMotionDetect = class(TocvCustomImageOperationWithNestedOperation)
protected
@ -523,6 +527,99 @@ type
property NotifyOnlyWhenFound: Boolean index 1 Read GetBoolParam write SetBoolParam;
end;
TocvHoughTransform = (HOUGH_STANDARD, HOUGH_PROBABILISTIC, HOUGH_MULTI_SCALE, HOUGH_GRADIENT);
TocvDrawHoughCircles = TocvDrawColor;
TovcHoughCirclesSmooth = class(TPersistent)
protected
procedure AssignTo(Dest: TPersistent); override;
private
FSmoothOperation: TocvSmoothOperations;
Fsigma1: Double;
Fsigma2: Double;
Fsize1: Integer;
Fsize2: Integer;
FEnabled: Boolean;
public
constructor Create;
published
property sigma1: Double Read Fsigma1 write Fsigma1;
property sigma2: Double Read Fsigma2 write Fsigma2;
property size1: Integer Read Fsize1 write Fsize1 default 0;
property size2: Integer Read Fsize2 write Fsize2 default 0;
property SmoothType: TocvSmoothOperations read FSmoothOperation write FSmoothOperation default GAUSSIAN;
property Enabled: Boolean read FEnabled write FEnabled default True;
end;
TocvHoughCircles = class(TocvCustomImageOperation)
protected
procedure AssignTo(Dest: TPersistent); override;
private
FHoughTransform: TocvHoughTransform;
FDrawCircle: TocvDrawHoughCircles;
FOnCircles: TOnOcvCircles;
FSmooth: TovcHoughCirclesSmooth;
public
constructor Create(AOwner: TPersistent); override;
destructor Destroy; override;
function DoTransform(const Source: IocvImage; out Destanation: IocvImage): Boolean; override;
published
property Method: TocvHoughTransform read FHoughTransform write FHoughTransform default HOUGH_GRADIENT;
property InverseRatio: Double index 0 Read GetFloatParam write SetFloatParam;
property MinDist: Double index 1 Read GetFloatParam write SetFloatParam;
property Param1: Double index 2 Read GetFloatParam write SetFloatParam;
property Param2: Double index 3 Read GetFloatParam write SetFloatParam;
property MinRadius: Integer index 0 Read GetIntParam write SetIntParam;
property MaxRadius: Integer index 1 Read GetIntParam write SetIntParam;
property DrawCircle: TocvDrawHoughCircles read FDrawCircle write FDrawCircle;
property OnCircles: TOnOcvCircles read FOnCircles write FOnCircles;
property NotifyOnlyWhenFound: Boolean index 0 Read GetBoolParam write SetBoolParam;
property Smooth: TovcHoughCirclesSmooth read FSmooth write FSmooth;
end;
TocvHoughLinesCanny = class(TPersistent)
protected
procedure AssignTo(Dest: TPersistent); override;
private
FThreshold1: Double;
FThreshold2: Double;
FApertureSize: Integer;
public
constructor Create;
published
property Threshold1: Double read FThreshold1 write FThreshold1;
property Threshold2: Double read FThreshold2 write FThreshold2;
property ApertureSize: Integer read FApertureSize write FApertureSize default 3;
end;
TocvDrawHoughLines = TocvDrawColor;
TocvHoughLines = class(TocvCustomImageOperation)
protected
procedure AssignTo(Dest: TPersistent); override;
private
FHoughTransform: TocvHoughTransform;
FCanny: TocvHoughLinesCanny;
FOnLines: TOnOcvLines;
FDrawLines: TocvDrawHoughLines;
public
constructor Create(AOwner: TPersistent); override;
destructor Destroy; override;
function DoTransform(const Source: IocvImage; out Destanation: IocvImage): Boolean; override;
published
property Method: TocvHoughTransform read FHoughTransform write FHoughTransform default HOUGH_PROBABILISTIC;
property Rho: Double index 0 Read GetFloatParam write SetFloatParam;
property Theta: Double index 1 Read GetFloatParam write SetFloatParam;
property Param1: Double index 2 Read GetFloatParam write SetFloatParam;
property Param2: Double index 3 Read GetFloatParam write SetFloatParam;
property Threshold: Integer index 0 Read GetIntParam write SetIntParam;
property Canny: TocvHoughLinesCanny Read FCanny write FCanny;
property OnLines: TOnOcvLines read FOnLines write FOnLines;
property DrawLines: TocvDrawHoughLines read FDrawLines write FDrawLines;
property NotifyOnlyWhenFound: Boolean index 0 Read GetBoolParam write SetBoolParam;
end;
TocvHaarCascadeDraw = class(TocvDraw)
published
property Color;
@ -744,7 +841,8 @@ uses
ocv.core_c,
ocv.imgproc_c,
ocv.imgproc.types_c,
ocv.cvutils, System.Math;
ocv.cvutils,
System.Math;
type
TPersistentAccessProtected = class(TPersistent);
@ -770,27 +868,6 @@ begin
Result := _RegisteredImageOperations;
end;
const
cLineType: array [TocvLineType] of Integer = (CV_FILLED, 8, CV_AA);
procedure GetRGBValue(const AColor: TColor; var r, g, b: byte);
Var
RGBColor: TColor;
begin
RGBColor := ColorToRGB(AColor);
r := GetRValue(RGBColor);
g := GetGValue(RGBColor);
b := GetBValue(RGBColor);
end;
function ColorToCvRGB(const Color: TColor): TCvScalar;
var
r, g, b: byte;
begin
GetRGBValue(Color, r, g, b);
Result := CV_RGB(r, g, b);
end;
{TocvImageOperation}
procedure TocvImageOperation.SetOnAfterEachOperation(const Value: TOnOcvNotifyCollectionItem);
@ -1158,7 +1235,7 @@ Var
Image: pIplImage;
begin
Image := cvCloneImage(Source.IpImage);
cvSmooth(Source.IpImage, Image, ocvSmoothOperations[SmoothOperation], size1, size2, sigma1, sigma2);
cvSmooth(Source.IpImage, Image, ocvSmoothOperations[SmoothType], size1, size2, sigma1, sigma2);
Destanation := TocvImage.Create(Image);
Result := True;
end;
@ -1708,6 +1785,16 @@ begin
inherited;
end;
function TocvDraw.GetCvColor: TCvScalar;
begin
Result := ColorToCvRGB(Color);
end;
function TocvDraw.GetCvLineType: Integer;
begin
Result := cLineType[LineType];
end;
function TocvDraw.GetOwner: TPersistent;
begin
Result := FOwner;
@ -2070,6 +2157,7 @@ begin
Threshold := 25;
MaxValue := 255;
end;
NotifyOnlyWhenFound := False;
end;
destructor TocvMotionDetect.Destroy;
@ -2672,6 +2760,221 @@ begin
FY := AY;
end;
{TocvHoughCircles}
procedure TocvHoughCircles.AssignTo(Dest: TPersistent);
begin
inherited;
if Dest is TocvHoughCircles then
begin
FHoughTransform := (Dest as TocvHoughCircles).FHoughTransform;
end;
end;
constructor TocvHoughCircles.Create(AOwner: TPersistent);
begin
inherited;
FHoughTransform := HOUGH_GRADIENT;
InverseRatio := 1;
MinDist := 100;
Param1 := 100;
Param2 := 100;
MinRadius := 0;
MaxRadius := 0;
FDrawCircle := TocvDrawHoughCircles.Create(Self);
NotifyOnlyWhenFound := False;
FSmooth := TovcHoughCirclesSmooth.Create;
FSmooth.SmoothType := GAUSSIAN;
FSmooth.size1 := 5;
FSmooth.size2 := 5;
FSmooth.sigma1 := 0;
FSmooth.sigma2 := 0;
end;
destructor TocvHoughCircles.Destroy;
begin
FDrawCircle.Free;
FSmooth.Free;
inherited;
end;
function TocvHoughCircles.DoTransform(const Source: IocvImage; out Destanation: IocvImage): Boolean;
type
TFloatArray = array [0 .. 10] of Single;
pFloatArray = ^TFloatArray;
Var
results: pCvSeq;
storage: pCvMemStorage;
Circles: TocvCircles;
i: Integer;
p: pFloatArray;
D: IocvImage;
begin
SetLength(Circles, 0);
Destanation := Source;
try
storage := cvCreateMemStorage(0);
results := nil;
try
if Smooth.Enabled then
begin
D := Source.Same;
cvSmooth(Source.IpImage, D.IpImage, ocvSmoothOperations[Smooth.SmoothType], Smooth.size1, Smooth.size2, Smooth.sigma1,
Smooth.sigma2);
end
else
D := Source;
results := cvHoughCircles(D.GrayImage.IpImage, storage, Integer(Method), InverseRatio, MinDist, Param1, Param2, MinRadius,
MaxRadius);
if Assigned(results) then
begin
SetLength(Circles, results^.total);
for i := 0 to results^.total - 1 do
begin
p := pFloatArray(cvGetSeqElem(results, i));
Circles[i].cX := cvRound(p^[0]);
Circles[i].cY := cvRound(p^[1]);
Circles[i].Radius := cvRound(p^[2]);
if DrawCircle.Enabled then
cvCircle(Destanation.IpImage, cvPoint(Circles[i].cX, Circles[i].cY), Circles[i].Radius, DrawCircle.cvColor,
DrawCircle.Thickness, DrawCircle.cvLineType, DrawCircle.Shift);
end;
end;
finally
cvReleaseMemStorage(storage);
end;
except
end;
if Assigned(OnCircles) and ((Length(Circles) > 0) or (not NotifyOnlyWhenFound)) then
OnCircles(Self, Destanation, Circles);
end;
{TocvHoughLines}
procedure TocvHoughLines.AssignTo(Dest: TPersistent);
begin
inherited;
if Dest is TocvHoughLines then
begin
FHoughTransform := (Dest as TocvHoughLines).FHoughTransform
end;
end;
constructor TocvHoughLines.Create(AOwner: TPersistent);
begin
inherited;
FHoughTransform := HOUGH_PROBABILISTIC;
Rho := 1;
Theta := CV_PI / 180;
Param1 := 50;
Param2 := 10;
Threshold := 50;
FCanny := TocvHoughLinesCanny.Create;
FDrawLines := TocvDrawHoughLines.Create(Self);
NotifyOnlyWhenFound := True;
end;
destructor TocvHoughLines.Destroy;
begin
FCanny.Free;
FDrawLines.Free;
inherited;
end;
function TocvHoughLines.DoTransform(const Source: IocvImage; out Destanation: IocvImage): Boolean;
Var
lines: pCvSeq;
line: pCvPointArray;
storage: pCvMemStorage;
SG, D: IocvImage;
i: Integer;
ocvlines: TocvLines;
begin
lines := nil;
SetLength(ocvlines, 0);
Destanation := Source;
try
storage := cvCreateMemStorage(0);
try
SG := Source.GrayImage;
D := SG.Same;
cvCanny(SG.IpImage, D.IpImage, Canny.Threshold1, Canny.Threshold2, Canny.ApertureSize);
lines := cvHoughLines2(D.IpImage, storage, Integer(Method), Rho, Theta, Threshold, Param1, Param2);
if Assigned(lines) then
begin
SetLength(ocvlines, lines^.total);
for i := 0 to lines^.total - 1 do
begin
line := pCvPointArray(cvGetSeqElem(lines, i));
ocvlines[i].S := line^[0];
ocvlines[i].E := line^[1];
if DrawLines.Enabled then
cvLine(Destanation.IpImage, line^[0], line^[1], DrawLines.cvColor, DrawLines.Thickness, DrawLines.cvLineType,
DrawLines.Shift);
end;
end;
if Assigned(OnLines) and ((Length(ocvlines) > 0) or (not NotifyOnlyWhenFound)) then
OnLines(Self, Destanation, ocvlines);
finally
cvReleaseMemStorage(storage);
end;
except
end;
end;
{TovcHoughCirclesSmooth}
procedure TovcHoughCirclesSmooth.AssignTo(Dest: TPersistent);
begin
inherited;
if Dest is TovcHoughCirclesSmooth then
begin
FSmoothOperation := (Dest as TovcHoughCirclesSmooth).FSmoothOperation;
Fsigma1 := (Dest as TovcHoughCirclesSmooth).Fsigma1;
Fsigma2 := (Dest as TovcHoughCirclesSmooth).Fsigma2;
Fsize1 := (Dest as TovcHoughCirclesSmooth).Fsize1;
Fsize2 := (Dest as TovcHoughCirclesSmooth).Fsize2;
FEnabled := (Dest as TovcHoughCirclesSmooth).FEnabled;
end;
end;
constructor TovcHoughCirclesSmooth.Create;
begin
inherited;
FSmoothOperation := GAUSSIAN;
Fsigma1 := 0;
Fsigma2 := 0;
Fsize1 := 5;
Fsize2 := 5;
FEnabled := True;
end;
{TocvHoughLinesCanny}
procedure TocvHoughLinesCanny.AssignTo(Dest: TPersistent);
begin
inherited;
if Dest is TocvHoughLinesCanny then
begin
FThreshold1 := (Dest as TocvHoughLinesCanny).FThreshold1;
FThreshold2 := (Dest as TocvHoughLinesCanny).FThreshold2;
FApertureSize := (Dest as TocvHoughLinesCanny).FApertureSize;
end;
end;
constructor TocvHoughLinesCanny.Create;
begin
inherited;
FThreshold1 := 50;
FThreshold2 := 200;
FApertureSize := 3;
end;
initialization
GetRegisteredImageOperations.RegisterIOClass(TocvNoneOperation, 'None');
@ -2693,6 +2996,8 @@ GetRegisteredImageOperations.RegisterIOClass(TocvMotionDetect, 'MotionDetect');
GetRegisteredImageOperations.RegisterIOClass(TovcCropOperation, 'Crop');
GetRegisteredImageOperations.RegisterIOClass(TovcAddWeightedOperation, 'AddWeighted');
GetRegisteredImageOperations.RegisterIOClass(TocvWarpPerspective, 'WarpPerspective');
GetRegisteredImageOperations.RegisterIOClass(TocvHoughCircles, 'HoughCircles');
GetRegisteredImageOperations.RegisterIOClass(TocvHoughLines, 'HoughLines');
finalization

View File

@ -70,7 +70,9 @@ begin
{} TocvMotionDetect,
{} TovcCropOperation,
{} TovcAddWeightedOperation,
{} TocvWarpPerspective]);
{} TocvWarpPerspective,
{} TocvHoughCircles,
{} TocvHoughLines]);
end;
{$IFDEF FPC}

View File

@ -30,20 +30,89 @@ interface
uses
{$IFDEF VER15P}
WinApi.Windows,
System.SysUtils,
System.Classes,
System.Generics.Collections,
System.Types,
Vcl.Graphics,
{$ELSE}
Windows,
SysUtils,
Classes,
Graphics,
{$IFNDEF VER5}Types, {$ENDIF VER5}
{$ENDIF VER15P}
ocv.core_c,
ocv.core.types_c;
Type
TocvRect = Type TRect;
TocvLine = record
S, E: TCvPoint;
end;
TocvCircle = record
cX, cY: Integer;
Radius: Integer;
end;
{$IFDEF VER17P}
TocvRects = TArray<TocvRect>;
TocvCircles = TArray<TocvCircle>;
TocvLines = TArray<TocvLine>;
{$ELSE}
TocvRects = Array of TocvRect;
TocvCircles = Array of TocvCircle;
TocvLines = array of TocvLine;
{$ENDIF}
TocvLineType = (LT_FILLED, LT_8, LT_AA);
IocvFont = interface
['{3EAFF1CE-7C65-4138-829F-329C81DDED8F}']
function GetFontName: string;
procedure SetFontName(const Value: string);
function GetFontColor: TColor;
procedure SetFontColor(const Value: TColor);
function GetFontThickness: Integer;
procedure SetFontThickness(const Value: Integer);
function GetFontLineType: TocvLineType;
procedure SetFontLineType(const Value: TocvLineType);
function GetFontHScale: Single;
procedure SetFontHScale(const Value: Single);
function GetFontVScale: Single;
procedure SetFontVScale(const Value: Single);
function GetCvFont: TCvFont;
property Name: string read GetFontName write SetFontName;
property Color: TColor read GetFontColor write SetFontColor;
property Thickness: Integer read GetFontThickness write SetFontThickness;
property LineType: TocvLineType read GetFontLineType write SetFontLineType;
property HScale: Single read GetFontHScale write SetFontHScale;
property VScale: Single read GetFontVScale write SetFontVScale;
property cvFont: TCvFont Read GetCvFont;
end;
IocvCanvas = interface
['{D5BCBC44-8139-42A7-A97A-0A5AD33C6526}']
function GetOcvFont: IocvFont;
property ocvFont: IocvFont read GetOcvFont;
procedure Rectangle(const x1, y1, x2, y2: Integer; const Color: TColor = clRed; const Thickness: Integer = 1;
const LineType: TocvLineType = LT_8; const Shift: Integer = 0);
procedure Circle(const x, y, r: Integer; const Color: TColor = clRed; const Thickness: Integer = 1;
const LineType: TocvLineType = LT_8; const Shift: Integer = 0);
procedure Ellipse(const CenterX, CenterY: Integer; const Axes: TocvRect; const Angle: double; const start_angle: double;
const nd_angle: double; const Color: TColor = clRed; const Thickness: Integer = 1; const LineType: TocvLineType = LT_8;
const Shift: Integer = 0);
procedure EllipseBox(const Box: TocvRect; const Angle: Single; const Color: TColor = clRed; const Thickness: Integer = 1;
Const LineType: TocvLineType = LT_8; const Shift: Integer = 0); overload;
procedure EllipseBox(const Box: TCvBox2D; const Color: TColor = clRed; const Thickness: Integer = 1;
Const LineType: TocvLineType = LT_8; const Shift: Integer = 0); overload;
procedure TextOut(const x, y: Integer; const Text: String; const Shadow: Boolean = False);
end;
IocvImage = interface
['{84567F57-A399-4179-AA0F-6F8A2788F89B}']
function GetIplImage: pIplImage;
@ -55,21 +124,84 @@ Type
function Crop(const roi: TCvRect): IocvImage;
function GetWidth: Integer;
function GetHeight: Integer;
function GetCanvas: IocvCanvas;
// -------------------------------------------
property IpImage: pIplImage Read GetIplImage;
property isGray: Boolean read GetisGray;
property Width: Integer read GetWidth;
property Height: Integer read GetHeight;
property isGray: Boolean Read GetisGray;
property Width: Integer Read GetWidth;
property Height: Integer Read GetHeight;
property Canvas: IocvCanvas Read GetCanvas;
end;
TocvFont = class(TInterfacedObject, IocvFont)
private
FCvFont: TCvFont;
FFontColor: TColor;
FFontLineType: TocvLineType;
procedure CreateOcvFont;
protected
function GetFontName: string;
procedure SetFontName(const Value: string);
function GetFontColor: TColor;
procedure SetFontColor(const Value: TColor);
function GetFontThickness: Integer;
procedure SetFontThickness(const Value: Integer);
function GetFontLineType: TocvLineType;
procedure SetFontLineType(const Value: TocvLineType);
function GetFontHScale: Single;
procedure SetFontHScale(const Value: Single);
function GetFontVScale: Single;
procedure SetFontVScale(const Value: Single);
function GetCvFont: TCvFont;
public
constructor Create;
property Name: string read GetFontName write SetFontName;
property Color: TColor read GetFontColor write SetFontColor;
property Thickness: Integer read GetFontThickness write SetFontThickness;
property LineType: TocvLineType read GetFontLineType write SetFontLineType;
property HScale: Single read GetFontHScale write SetFontHScale;
property VScale: Single read GetFontVScale write SetFontVScale;
property cvFont: TCvFont Read GetCvFont;
end;
TocvImage = class;
TocvCanvas = class(TInterfacedObject, IocvCanvas)
private
FOwner: TocvImage;
FocvFont: IocvFont;
protected
function GetOcvFont: IocvFont;
public
constructor Create(AOwner: TocvImage);
destructor Destroy; override;
procedure Rectangle(const x1, y1, x2, y2: Integer; const Color: TColor = clRed; const Thickness: Integer = 1;
const LineType: TocvLineType = LT_AA; const Shift: Integer = 0);
procedure Circle(const CenterX, CenterY, Radius: Integer; const Color: TColor = clRed; const Thickness: Integer = 1;
const LineType: TocvLineType = LT_8; const Shift: Integer = 0);
procedure Ellipse(const CenterX, CenterY: Integer; const Axes: TocvRect; const Angle: double; const start_angle: double;
const nd_angle: double; const Color: TColor = clRed; const Thickness: Integer = 1; const LineType: TocvLineType = LT_8;
const Shift: Integer = 0);
procedure EllipseBox(const Box: TocvRect; const Angle: Single; const Color: TColor = clRed; const Thickness: Integer = 1;
Const LineType: TocvLineType = LT_8; const Shift: Integer = 0); overload;
procedure EllipseBox(const Box: TCvBox2D; const Color: TColor = clRed; const Thickness: Integer = 1;
Const LineType: TocvLineType = LT_8; const Shift: Integer = 0); overload;
procedure TextOut(const x, y: Integer; const Text: String; const Shadow: Boolean = False);
property ocvFont: IocvFont read GetOcvFont;
end;
TocvImage = class(TInterfacedObject, IocvImage)
private
FImage: pIplImage;
FocvCanvas: IocvCanvas;
protected
function GetIplImage: pIplImage;
function GetisGray: Boolean;
function GetWidth: Integer;
function GetHeight: Integer;
function GetCanvas: IocvCanvas;
public
constructor Create; overload;
constructor Create(const AImage: pIplImage); overload;
constructor Create(const Bitmap: TBitmap); overload;
constructor CreateClone(const AImage: pIplImage);
@ -81,7 +213,7 @@ Type
function AsBitmap: TBitmap;
function Crop(const roi: TCvRect): IocvImage;
property IplImage: pIplImage Read GetIplImage;
property isGray: Boolean read GetisGray;
property isGray: Boolean Read GetisGray;
end;
TOnOcvNotifyCollectionItem = procedure(PrevOperation, Operation, NextOperation: TObject; const IplImage: IocvImage;
@ -92,16 +224,11 @@ Type
TOnOcvBeforeTransform = procedure(Sender: TObject; const IplImage: IocvImage; Var ContinueTransform: Boolean) of object;
TOnOcvContour = procedure(Sender: TObject; const IplImage: IocvImage; const ContourCount: Integer; const Contours: pCvSeq)
of object;
TocvRect = Type TRect;
{$IFDEF VER17P}
TocvRects = TArray<TocvRect>;
{$ELSE}
TocvRects = Array of TocvRect;
{$ENDIF}
TOnOcvHaarCascade = procedure(Sender: TObject; const IplImage: IocvImage; const HaarRects: TocvRects) of object;
TOnOcvRect = procedure(Sender: TObject; const IplImage: IocvImage; const Rect: TocvRect) of object;
TOnOcvRects = procedure(Sender: TObject; const IplImage: IocvImage; const Rects: TocvRects) of object;
TOnOcvCircles = procedure(Sender: TObject; const IplImage: IocvImage; const Circles: TocvCircles) of object;
TOnOcvLines = procedure(Sender: TObject; const IplImage: IocvImage; const Lines: TocvLines) of object;
IocvDataReceiver = interface
['{F67DEC9E-CCE0-49D2-AB9B-AD7E1020C5DC}']
@ -116,7 +243,7 @@ Type
function GetName: string;
function GetImage: IocvImage;
function GetEnabled: Boolean;
property Enabled: Boolean read GetEnabled;
property Enabled: Boolean Read GetEnabled;
end;
TocvReceiverList = class(TThreadList) // <IocvDataReceiver>;
@ -138,17 +265,17 @@ Type
destructor Destroy; override;
procedure AddReceiver(const OpenCVVideoReceiver: IocvDataReceiver); virtual;
procedure RemoveReceiver(const OpenCVVideoReceiver: IocvDataReceiver); virtual;
property Image: IocvImage read GetImage;
property Image: IocvImage Read GetImage;
end;
TocvDataReceiver = class(TComponent, IocvDataReceiver)
private
FocvVideoSource: IocvDataSource;
protected
procedure TakeImage(const IplImage: IocvImage); virtual;
procedure SetVideoSource(const Value: TObject); virtual;
procedure SetOpenCVVideoSource(const Value: IocvDataSource); virtual;
public
procedure TakeImage(const IplImage: IocvImage); virtual;
destructor Destroy; override;
published
property VideoSource: IocvDataSource Read FocvVideoSource write SetOpenCVVideoSource;
@ -170,13 +297,15 @@ Type
function ocvRect(Left, Top, Right, Bottom: Integer): TocvRect;
function ocvRectCenter(cX, cY, Width, Height: Integer): TocvRect;
procedure GetRGBValue(const AColor: TColor; var r, g, b: byte);
function ColorToCvRGB(const Color: TColor): TCvScalar;
const
cLineType: array [TocvLineType] of Integer = (CV_FILLED, 8, CV_AA);
implementation
uses
ocv.core_c,
ocv.imgproc_c,
ocv.imgproc.types_c,
ocv.highgui_c;
uses ocv.imgproc_c, ocv.imgproc.types_c, ocv.highgui_c;
function ocvRect(Left, Top, Right, Bottom: Integer): TocvRect;
begin
@ -231,13 +360,13 @@ end;
procedure TocvDataSource.NotifyReceiver(const IplImage: IocvImage);
Var
R: Pointer; // IocvDataReceiver;
r: Pointer; // IocvDataReceiver;
LockList: TList; // <IocvDataReceiver>;
begin
LockList := FOpenCVVideoReceivers.LockList;
try
for R in LockList do
IocvDataReceiver(R).TakeImage(IplImage);
for r in LockList do
IocvDataReceiver(r).TakeImage(IplImage);
finally
FOpenCVVideoReceivers.UnlockList;
end;
@ -361,6 +490,7 @@ end;
constructor TocvImage.Create(const AImage: pIplImage);
begin
Create;
FImage := AImage;
end;
@ -368,6 +498,7 @@ constructor TocvImage.Create(const Bitmap: TBitmap);
Var
bitmapData: PByte;
begin
Create;
Assert(Bitmap.PixelFormat = pf24bit, 'only 24bit'); // Ïîêà òîëüêî òàêîé ôîðìàò - IPL_DEPTH_8U, 3
bitmapData := Bitmap.Scanline[0];
FImage := cvCreateImage(cvSize(Bitmap.Width, Bitmap.Height), IPL_DEPTH_8U, 3);
@ -378,8 +509,14 @@ begin
FImage^.roi := nil;
end;
constructor TocvImage.Create;
begin
FocvCanvas := TocvCanvas.Create(Self);
end;
constructor TocvImage.CreateClone(const AImage: pIplImage);
begin
Create;
FImage := cvCloneImage(AImage);
end;
@ -396,10 +533,16 @@ end;
destructor TocvImage.Destroy;
begin
// FocvCanvas.Free;
cvReleaseImage(FImage);
inherited;
end;
function TocvImage.GetCanvas: IocvCanvas;
begin
Result := FocvCanvas as IocvCanvas;
end;
function TocvImage.GetHeight: Integer;
begin
if Assigned(FImage) then
@ -462,4 +605,182 @@ begin
inherited Remove(Pointer(Item));
end;
procedure GetRGBValue(const AColor: TColor; var r, g, b: byte);
Var
RGBColor: TColor;
begin
RGBColor := ColorToRGB(AColor);
r := GetRValue(RGBColor);
g := GetGValue(RGBColor);
b := GetBValue(RGBColor);
end;
function ColorToCvRGB(const Color: TColor): TCvScalar;
var
r, g, b: byte;
begin
GetRGBValue(Color, r, g, b);
Result := CV_RGB(r, g, b);
end;
{TocvCanvas}
procedure TocvCanvas.Circle(const CenterX, CenterY, Radius: Integer; const Color: TColor; const Thickness: Integer;
const LineType: TocvLineType; const Shift: Integer);
begin
if Assigned(FOwner) and Assigned(FOwner.FImage) then
cvCircle(FOwner.FImage, cvPoint(CenterX, CenterY), Radius, ColorToCvRGB(Color), Thickness, cLineType[LineType], Shift);
end;
constructor TocvCanvas.Create(AOwner: TocvImage);
begin
FOwner := AOwner;
FocvFont := TocvFont.Create;
end;
destructor TocvCanvas.Destroy;
begin
// FocvFont.Free;
inherited;
end;
procedure TocvCanvas.Ellipse(const CenterX, CenterY: Integer; const Axes: TocvRect; const Angle, start_angle, nd_angle: double;
const Color: TColor; const Thickness: Integer; const LineType: TocvLineType; const Shift: Integer);
begin
if Assigned(FOwner) and Assigned(FOwner.FImage) then
cvEllipse(FOwner.FImage, cvPoint(CenterX, CenterY), cvSize(Axes.Width, Axes.Height), Angle, start_angle, nd_angle,
ColorToCvRGB(Color), Thickness, cLineType[LineType], Shift);
end;
procedure TocvCanvas.EllipseBox(const Box: TCvBox2D; const Color: TColor; const Thickness: Integer; const LineType: TocvLineType;
const Shift: Integer);
begin
if Assigned(FOwner) and Assigned(FOwner.FImage) then
cvEllipseBox(FOwner.FImage, Box, ColorToCvRGB(Color), Thickness, cLineType[LineType], Shift);
end;
function TocvCanvas.GetOcvFont: IocvFont;
begin
Result := FocvFont as IocvFont;
end;
procedure TocvCanvas.EllipseBox(const Box: TocvRect; const Angle: Single; const Color: TColor; const Thickness: Integer;
const LineType: TocvLineType; const Shift: Integer);
begin
EllipseBox(CvBox2D(Box.Left, Box.Top, Box.Width, Box.Height, Angle), Color, Thickness, LineType, Shift);
end;
procedure TocvCanvas.Rectangle(const x1, y1, x2, y2: Integer; const Color: TColor; const Thickness: Integer;
const LineType: TocvLineType; const Shift: Integer);
begin
if Assigned(FOwner) and Assigned(FOwner.FImage) then
cvRectangle(FOwner.FImage, cvPoint(x1, y1), cvPoint(x2, y2), ColorToCvRGB(Color), Thickness, cLineType[LineType], Shift);
end;
procedure TocvCanvas.TextOut(const x, y: Integer; const Text: String; const Shadow: Boolean);
Var
str: pCVChar;
Font: TCvFont;
begin
if Assigned(FOwner) and Assigned(FOwner.FImage) then
begin
str := @(AnsiString(Text)[1]);
Font := ocvFont.cvFont;
if Shadow then
cvPutText(FOwner.FImage, str, cvPoint(x - 1, y - 1), @Font, CV_RGB(0, 0, 0));
cvPutText(FOwner.FImage, str, cvPoint(x, y), @Font, ColorToCvRGB(ocvFont.Color));
end;
end;
{TocvFont}
constructor TocvFont.Create;
begin
inherited;
FillChar(FCvFont, SizeOf(FCvFont), 0);
FCvFont.HScale := 0.5;
FCvFont.VScale := 0.5;
FCvFont.Thickness := 1;
FFontLineType := LT_8;
FFontColor := clRed;
CreateOcvFont;
end;
procedure TocvFont.CreateOcvFont;
begin
cvInitFont(@FCvFont, CV_FONT_VECTOR0, HScale, VScale, 0, Thickness, cLineType[LineType]);
end;
function TocvFont.GetCvFont: TCvFont;
begin
Result := FCvFont;
end;
function TocvFont.GetFontColor: TColor;
begin
Result := FFontColor;
end;
function TocvFont.GetFontHScale: Single;
begin
Result := FCvFont.HScale;
end;
function TocvFont.GetFontLineType: TocvLineType;
begin
Result := FFontLineType;
end;
function TocvFont.GetFontName: string;
begin
Result := FCvFont.nameFont;
end;
function TocvFont.GetFontThickness: Integer;
begin
Result := FCvFont.Thickness;
end;
function TocvFont.GetFontVScale: Single;
begin
Result := FCvFont.VScale;
end;
procedure TocvFont.SetFontColor(const Value: TColor);
begin
FFontColor := Value;
FCvFont.Color := ColorToCvRGB(Value);
CreateOcvFont;
end;
procedure TocvFont.SetFontHScale(const Value: Single);
begin
FCvFont.HScale := Value;
CreateOcvFont;
end;
procedure TocvFont.SetFontLineType(const Value: TocvLineType);
begin
FFontLineType := Value;
CreateOcvFont;
end;
procedure TocvFont.SetFontName(const Value: string);
begin
FCvFont.nameFont := pCVChar(AnsiString(Value));
CreateOcvFont;
end;
procedure TocvFont.SetFontThickness(const Value: Integer);
begin
FCvFont.Thickness := Value;
CreateOcvFont;
end;
procedure TocvFont.SetFontVScale(const Value: Single);
begin
FCvFont.VScale := Value;
CreateOcvFont;
end;
end.

1305
source/ocv.contrib.pas Normal file

File diff suppressed because it is too large Load Diff

View File

@ -84,7 +84,6 @@
// *************************************************************************************************
{$I OpenCV.inc}
{$IFDEF DEBUG}
{$A8,B-,C+,D+,E-,F-,G+,H+,I+,J+,K-,L+,M-,N+,O-,P+,Q+,R+,S-,T-,U-,V+,W+,X+,Y+,Z1}
{$ELSE}
@ -99,7 +98,6 @@
{$IFDEF VER12P}
{$POINTERMATH ON}
{$ENDIF}
unit ocv.core.types_c;
interface
@ -131,24 +129,23 @@ type
CVChar = AnsiChar;
{$IFNDEF VER16P}
{$IFDEF CLR}
{$IFDEF VER11P}
{$IFDEF VER11P}
NativeInt = size_t;
NativeUInt = size_t;
{$ELSE}
{$ELSE}
NativeInt = Integer;
NativeUInt = Cardinal;
{$ENDIF}
{$ENDIF}
{$ELSE}
{$IFDEF FPC}
{$IFDEF FPC}
NativeInt = SizeInt;
NativeUInt = SizeUInt;
{$ELSE}
{$ELSE}
NativeInt = Integer;
NativeUInt = Cardinal;
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$ENDIF}
function strdup(const str: pCVChar): pCVChar;
function cv_stricmp(const str1, str2: pCVChar): Integer;
procedure strcpy(var str1: pCVChar; const str2: pCVChar); overload;
@ -287,8 +284,7 @@ const
// CvRNG rng = seed ? (uint64)seed : (uint64)(int64)-1;
// return rng;
// }
function cvRNG(seed: int64 = -1): TCvRNG; {$IFDEF VER9P}inline;{$ENDIF}
function cvRNG(seed: int64 = -1): TCvRNG; {$IFDEF VER9P}inline; {$ENDIF}
(****************************************************************************************\
* Image cType (IplImage) *
****************************************************************************************)
@ -477,14 +473,13 @@ const
{$EXTERNALSYM CV_USRTYPE1}
CV_MAT_DEPTH_MASK = (CV_DEPTH_MAX - 1);
{$EXTERNALSYM CV_MAT_DEPTH_MASK}
function CV_8UC1: Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_8UC1: Integer; {$IFDEF VER9P}inline; {$ENDIF}
{$EXTERNALSYM CV_8UC1}
(*
CV_8UC2 = CV_MAKETYPE(CV_8U, 2);
{$EXTERNALSYM CV_8UC2}
*)
function CV_8UC3: Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_8UC3: Integer; {$IFDEF VER9P}inline; {$ENDIF}
{$EXTERNALSYM CV_8UC3}
(*
CV_8UC4 = CV_MAKETYPE(CV_8U, 4);
@ -527,8 +522,7 @@ function CV_8UC3: Integer; {$IFDEF VER9P}inline;{$ENDIF}
// const
// CV_32SC2 = CV_MAKETYPE(CV_32S, 2);
{$EXTERNALSYM CV_32SC2}
function CV_32SC2: Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_32SC2: Integer; {$IFDEF VER9P}inline; {$ENDIF}
(*
const
CV_32SC3 = CV_MAKETYPE(CV_32S, 3);
@ -546,9 +540,9 @@ function CV_32SC2: Integer; {$IFDEF VER9P}inline;{$ENDIF}
CV_32FC1 = CV_MAKETYPE(CV_32F, 1);
{$EXTERNALSYM CV_32FC1}
*)
function CV_32FC2: Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_32FC2: Integer; {$IFDEF VER9P}inline; {$ENDIF}
{$EXTERNALSYM CV_32FC2}
function CV_32FC3: Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_32FC3: Integer; {$IFDEF VER9P}inline; {$ENDIF}
{$EXTERNALSYM CV_32FC3}
(*
const
@ -560,11 +554,11 @@ function CV_32FC3: Integer; {$IFDEF VER9P}inline;{$ENDIF}
CV_32FC(n)CV_MAKETYPE(CV_32F, (n));
*)
function CV_64FC1: Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_64FC1: Integer; {$IFDEF VER9P}inline; {$ENDIF}
{$EXTERNALSYM CV_64FC1}
function CV_64FC2: Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_64FC2: Integer; {$IFDEF VER9P}inline; {$ENDIF}
{$EXTERNALSYM CV_64FC2}
function CV_64FC3: Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_64FC3: Integer; {$IFDEF VER9P}inline; {$ENDIF}
{$EXTERNALSYM CV_64FC3}
(*
const
@ -578,7 +572,7 @@ function CV_64FC3: Integer; {$IFDEF VER9P}inline;{$ENDIF}
// * get reference to pixel at (col,row),
// for multi-channel images (col) should be multiplied by number of channels */
function CV_IMAGE_ELEM(image: pIplImage; size_elemtype, row, col: Integer): Pointer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_IMAGE_ELEM(image: pIplImage; size_elemtype, row, col: Integer): Pointer; {$IFDEF VER9P}inline; {$ENDIF}
// (((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])
const
@ -780,7 +774,7 @@ type
z: Single;
end;
function cvPoint3D32f(const x, y, z: Double): TCvPoint3D32f; {$IFDEF VER9P}inline;{$ENDIF}
function cvPoint3D32f(const x, y, z: Single): TCvPoint3D32f; {$IFDEF VER9P}inline; {$ENDIF}
Type
TCvPoint2D64f = record
@ -1277,16 +1271,14 @@ const
/// / >> Following declaration is a macro definition!
// CV_IS_SEQ_CLOSED(seq)(((seq)^.flags and CV_SEQ_FLAG_CLOSED) <> 0);
function CV_IS_SEQ_CLOSED(const Seq: pCvSeq): Boolean; {$IFDEF VER9P}inline;{$ENDIF}
function CV_IS_SEQ_CLOSED(const Seq: pCvSeq): Boolean; {$IFDEF VER9P}inline; {$ENDIF}
/// / >> Following declaration is a macro definition!
// const
// CV_IS_SEQ_CONVEX(seq)0;
// Following declaration is a macro definition!
// CV_IS_SEQ_HOLE(seq)(((seq)^.flags and CV_SEQ_FLAG_HOLE) <> 0);
function CV_IS_SEQ_HOLE(const Seq: pCvSeq): Boolean; {$IFDEF VER9P}inline;{$ENDIF}
function CV_IS_SEQ_HOLE(const Seq: pCvSeq): Boolean; {$IFDEF VER9P}inline; {$ENDIF}
/// / >> Following declaration is a macro definition!
// const
// CV_IS_SEQ_SIMPLE(seq)1;
@ -1370,11 +1362,11 @@ type
cvGetSeqElem( (CvSeq*)(seq), (index) )))
}
{$IFDEF VER15P}
function CV_SEQ_ELEM(Seq: pCvSeq; const size_of_elem: Integer; index: Integer): Pointer; {$IFDEF VER9P}inline;{$ENDIF}
{#define CV_GET_SEQ_ELEM( elem_type, seq, index ) CV_SEQ_ELEM( (seq), elem_type, (index) )}
function CV_GET_SEQ_ELEM(const size_of_elem: Integer; Seq: pCvSeq; index: Integer): Pointer; {$IFDEF VER9P}inline;{$ENDIF}
{$ENDIF VER15P}
function CV_SEQ_ELEM(Seq: pCvSeq; const size_of_elem: Integer; index: Integer): Pointer; {$IFDEF VER9P}inline; {$ENDIF}
{#define CV_GET_SEQ_ELEM( elem_type, seq, index ) CV_SEQ_ELEM( (seq), elem_type, (index) )}
function CV_GET_SEQ_ELEM(const size_of_elem: Integer; Seq: pCvSeq; index: Integer): Pointer; {$IFDEF VER9P}inline; {$ENDIF}
{$ENDIF VER15P}
// (* Add element to sequence: *)
// // >> Following declaration is a macro definition!
// const CV_WRITE_SEQ_ELEM_VAR(elem_ptr, writer);
@ -1388,8 +1380,7 @@ function CV_GET_SEQ_ELEM(const size_of_elem: Integer; Seq: pCvSeq; index: Intege
// Assert((writer).ptr <= (writer).block_max - SizeOf(elem));
// memcpy((writer).ptr, and (elem), SizeOf(elem)); (writer).ptr := mod +SizeOf(elem) then; end;
function CV_CAST_8U(t: Integer): uchar; {$IFDEF VER9P}inline;{$ENDIF}
function CV_CAST_8U(t: Integer): uchar; {$IFDEF VER9P}inline; {$ENDIF}
(*
/* Move reader position forward: */
#define CV_NEXT_SEQ_ELEM( elem_size, reader ) \
@ -1418,7 +1409,8 @@ procedure CV_NEXT_SEQ_ELEM(const elem_size: Integer; const Reader: TCvSeqReader)
CV_NEXT_SEQ_ELEM( sizeof(elem), reader ) \
}
*)
procedure CV_READ_SEQ_ELEM(const Elem: Pointer; const Reader: TCvSeqReader; const SizeOfElem: Integer); // {$IFDEF VER9P}inline;{$ENDIF}
procedure CV_READ_SEQ_ELEM(const Elem: Pointer; const Reader: TCvSeqReader; const SizeOfElem: Integer);
// {$IFDEF VER9P}inline;{$ENDIF}
// (* Read element and move read position backward: *)
@ -1607,7 +1599,7 @@ const
{$EXTERNALSYM CV_NODE_TYPE_MASK}
// >> Following declaration is a macro definition!
// CV_NODE_TYPE(flags)((flags) and CV_NODE_TYPE_MASK);
function CV_NODE_TYPE(const flags: Integer): Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_NODE_TYPE(const flags: Integer): Integer; {$IFDEF VER9P}inline; {$ENDIF}
const
(*file node flags*)
@ -1620,13 +1612,12 @@ const
CV_NODE_NAMED = 64;
{$EXTERNALSYM CV_NODE_NAMED}
// CV_NODE_IS_INT(flags) (CV_NODE_TYPE(flags) == CV_NODE_INT)
function CV_NODE_IS_INT(const flags: Integer): Boolean; {$IFDEF VER9P}inline;{$ENDIF}
function CV_NODE_IS_INT(const flags: Integer): Boolean; {$IFDEF VER9P}inline; {$ENDIF}
// CV_NODE_IS_REAL(flags) (CV_NODE_TYPE(flags) == CV_NODE_REAL)
function CV_NODE_IS_REAL(const flags: Integer): Boolean; {$IFDEF VER9P}inline;{$ENDIF}
function CV_NODE_IS_REAL(const flags: Integer): Boolean; {$IFDEF VER9P}inline; {$ENDIF}
// const CV_NODE_IS_INT(flags)(CV_NODE_TYPE(flags) = CV_NODE_INT)
// const CV_NODE_IS_REAL(flags) (CV_NODE_TYPE(flags) = CV_NODE_REAL)
function CV_NODE_IS_STRING(const flags: Integer): Boolean; {$IFDEF VER9P}inline;{$ENDIF}
function CV_NODE_IS_STRING(const flags: Integer): Boolean; {$IFDEF VER9P}inline; {$ENDIF}
// (CV_NODE_TYPE(flags) = CV_NODE_STRING)
// const CV_NODE_IS_SEQ(flags) (CV_NODE_TYPE(flags) = CV_NODE_SEQ)
// const CV_NODE_IS_MAP(flags) (CV_NODE_TYPE(flags) = CV_NODE_MAP)
@ -1725,10 +1716,10 @@ type
(* End of file.*)
// #define CV_SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t))
procedure CV_SWAP(var a, b, t: pIplImage); {$IFDEF VER9P}inline;{$ENDIF} overload;
procedure CV_SWAP(var a, b, t: pCvPoint2D32f); {$IFDEF VER9P}inline;{$ENDIF} overload;
procedure CV_SWAP(var a, b, t: pCvMat); {$IFDEF VER9P}inline;{$ENDIF} overload;
procedure CV_SWAP(var a, b, t: Pointer); {$IFDEF VER9P}inline;{$ENDIF} overload;
procedure CV_SWAP(var a, b, t: pIplImage); {$IFDEF VER9P}inline; {$ENDIF} overload;
procedure CV_SWAP(var a, b, t: pCvPoint2D32f); {$IFDEF VER9P}inline; {$ENDIF} overload;
procedure CV_SWAP(var a, b, t: pCvMat); {$IFDEF VER9P}inline; {$ENDIF} overload;
procedure CV_SWAP(var a, b, t: Pointer); {$IFDEF VER9P}inline; {$ENDIF} overload;
// {$IFNDEF MIN}
// {$HPPEMIT '# define MIN(a,b) ((a) > (b) ? (b) : (a))'}
@ -1930,8 +1921,7 @@ procedure CV_SWAP(var a, b, t: Pointer); {$IFDEF VER9P}inline;{$ENDIF} overload;
//
// const CV_IS_MASK_ARR(mat)(((mat)^.cType and (CV_MAT_TYPE_MASK and ~ CV_8SC1)) = 0)
function CV_ARE_TYPES_EQ(const mat1, mat2: pCvMat): Boolean; {$IFDEF VER9P}inline;{$ENDIF}
function CV_ARE_TYPES_EQ(const mat1, mat2: pCvMat): Boolean; {$IFDEF VER9P}inline; {$ENDIF}
// const CV_ARE_CNS_EQ(mat1, mat2)((((mat1)^.cType xor (mat2)^.cType) and CV_MAT_CN_MASK) = 0)
//
// const CV_ARE_DEPTHS_EQ(mat1, mat2)((((mat1)^.cType xor (mat2)^.cType) and CV_MAT_DEPTH_MASK) = 0)
@ -2034,12 +2024,9 @@ function cvIplDepth(_type: Integer): Integer; // {$IFDEF VER9P}inline;{$ENDIF}
// (* ****************************** CvPoint and variants ********************************** *)
function CvPoint2D32f(x, y: Double): TCvPoint2D32f; {$IFDEF VER9P}inline;{$ENDIF}
function cvPointTo32f(point: TCvPoint): TCvPoint2D32f; {$IFDEF VER9P}inline;{$ENDIF}
function cvPointFrom32f(point: TCvPoint2D32f): TCvPoint; {$IFDEF VER9P}inline;{$ENDIF}
function CvPoint2D32f(x, y: Single): TCvPoint2D32f; {$IFDEF VER9P}inline; {$ENDIF}
function cvPointTo32f(point: TCvPoint): TCvPoint2D32f; {$IFDEF VER9P}inline; {$ENDIF}
function cvPointFrom32f(point: TCvPoint2D32f): TCvPoint; {$IFDEF VER9P}inline; {$ENDIF}
// CV_INLINE CvPoint3D32f CvPoint3D32f(Double x, Double y, Double z)
//
// begin
@ -2116,8 +2103,7 @@ function cvPointFrom32f(point: TCvPoint2D32f): TCvPoint; {$IFDEF VER9P}inline;{$
// return scalar;
// }
function cvRealScalar(val0: Double): TCvScalar; {$IFDEF VER9P}inline;{$ENDIF}
function cvRealScalar(val0: Double): TCvScalar; {$IFDEF VER9P}inline; {$ENDIF}
// (*************************************************************************************** *)
// (* Dynamic Data structures *)
// (*************************************************************************************** *)
@ -2138,8 +2124,7 @@ function cvRealScalar(val0: Double): TCvScalar; {$IFDEF VER9P}inline;{$ENDIF}
// (* ********************************** CvTermCriteria ************************************ *)
// (* CV_INLINE CvTermCriteria CvTermCriteria(Integer cType, Integer max_iter, Double epsilon)
function CvTermCriteria(_type: Integer; max_iter: Integer; epsilon: Double): TCvTermCriteria; {$IFDEF VER9P}inline;{$ENDIF}
function CvTermCriteria(_type: Integer; max_iter: Integer; epsilon: Double): TCvTermCriteria; {$IFDEF VER9P}inline; {$ENDIF}
(*
CV_INLINE int cvFloor( double value )
{
@ -2164,13 +2149,14 @@ function CvTermCriteria(_type: Integer; max_iter: Integer; epsilon: Double): TCv
#endif
}
*)
function cvFloor(value: Double): Integer; {$IFDEF VER9P}inline;{$ENDIF}
function cvScalarAll(val0123: Double): TCvScalar; {$IFDEF VER9P}inline;{$ENDIF}
function CvPoint(const x, y: Integer): TCvPoint; {$IFDEF VER9P}inline;{$ENDIF}
function CvSize(const width, height: Integer): TCvSize; {$IFDEF VER9P}inline;{$ENDIF}
function CvScalar(const val0: Double; const val1: Double = 0; const val2: Double = 0; const val3: Double = 0): TCvScalar; {$IFDEF VER9P}inline;{$ENDIF}
function cvRandInt(Var rng: TCvRNG): Cardinal; {$IFDEF VER9P}inline;{$ENDIF}
function CvRect(Const x, y, width, height: Integer): TCvRect; {$IFDEF VER9P}inline;{$ENDIF}
function cvFloor(value: Double): Integer; {$IFDEF VER9P}inline; {$ENDIF}
function cvScalarAll(val0123: Double): TCvScalar; {$IFDEF VER9P}inline; {$ENDIF}
function CvPoint(const x, y: Integer): TCvPoint; {$IFDEF VER9P}inline; {$ENDIF}
function CvSize(const width, height: Integer): TCvSize; {$IFDEF VER9P}inline; {$ENDIF}
function CvScalar(const val0: Double; const val1: Double = 0; const val2: Double = 0; const val3: Double = 0): TCvScalar;
{$IFDEF VER9P}inline; {$ENDIF}
function cvRandInt(Var rng: TCvRNG): Cardinal; {$IFDEF VER9P}inline; {$ENDIF}
function CvRect(Const x, y, width, height: Integer): TCvRect; {$IFDEF VER9P}inline; {$ENDIF}
function cvRound(value: Double): Integer;
const
@ -2206,30 +2192,32 @@ function CV_MAT_TYPE(const flags: Integer): Integer;
function CV_ELEM_SIZE1(const _type: Integer): Integer;
function CV_ELEM_SIZE(const _type: Integer): Integer;
function CV_MAT_CN(const flags: Integer): Integer;
function CV_32FC1: Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_32SC1: Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_MAKETYPE(depth, cn: Integer): Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_32FC1: Integer; {$IFDEF VER9P}inline; {$ENDIF}
function CV_32SC1: Integer; {$IFDEF VER9P}inline; {$ENDIF}
function CV_MAKETYPE(depth, cn: Integer): Integer; {$IFDEF VER9P}inline; {$ENDIF}
// #define CV_MAT_ELEM( mat, elemtype, row, col )
// (*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))
function CV_MAT_ELEM(const mat: TCvMat; const elemsize: Integer; const row, col: Integer): Pointer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_MAT_ELEM(const mat: TCvMat; const elemsize: Integer; const row, col: Integer): Pointer; {$IFDEF VER9P}inline; {$ENDIF}
// #define CV_MAT_ELEM_PTR_FAST( mat, row, col, pix_size )
// (assert( (unsigned)(row) < (unsigned)(mat).rows &&
// (unsigned)(col) < (unsigned)(mat).cols ),
// (mat).data.ptr + (size_t)(mat).step*(row) + (pix_size)*(col))
function CV_MAT_ELEM_PTR_FAST(const mat: TCvMat; const row, col, pix_size: Integer): Pointer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_MAT_ELEM_PTR_FAST(const mat: TCvMat; const row, col, pix_size: Integer): Pointer; {$IFDEF VER9P}inline; {$ENDIF}
function iif(const Conditional: Boolean; const ifTrue, ifFalse: Variant): Variant; {$IFDEF VER9P}inline; {$ENDIF} overload;
function iif(const Conditional: Boolean; const ifTrue, ifFalse: Pointer): Pointer; {$IFDEF VER9P}inline; {$ENDIF} overload;
function iif(const Conditional: Boolean; const ifTrue, ifFalse: Variant): Variant; {$IFDEF VER9P}inline;{$ENDIF} overload;
function iif(const Conditional: Boolean; const ifTrue, ifFalse: Pointer): Pointer; {$IFDEF VER9P}inline;{$ENDIF} overload;
function CvBox2D(const cX, cY, width, height, angle: Single): TCvBox2D;
function CvSize2D32f(const width, height: Single): TCvSize2D32f;
implementation
uses
ocv.core_c,
{$IFDEF VER15P}
{$IFDEF VER15P}
System.SysUtils;
{$ELSE}
SysUtils;
{$ENDIF VER15P}
{$ELSE}
SysUtils;
{$ENDIF VER15P}
function strdup(const str: pCVChar): pCVChar;
begin
@ -2383,7 +2371,7 @@ begin
Result := Round(value);
end;
function iif(const Conditional: Boolean; const ifTrue, ifFalse: Variant): Variant; {$IFDEF VER9P}inline;{$ENDIF} overload;
function iif(const Conditional: Boolean; const ifTrue, ifFalse: Variant): Variant; {$IFDEF VER9P}inline; {$ENDIF} overload;
begin
if Conditional then
Result := ifTrue
@ -2391,7 +2379,7 @@ begin
Result := ifFalse;
end;
function iif(const Conditional: Boolean; const ifTrue, ifFalse: Pointer): Pointer; {$IFDEF VER9P}inline;{$ENDIF} overload;
function iif(const Conditional: Boolean; const ifTrue, ifFalse: Pointer): Pointer; {$IFDEF VER9P}inline; {$ENDIF} overload;
begin
if Conditional then
Result := ifTrue
@ -2417,12 +2405,13 @@ begin
Result := CV_NODE_TYPE(flags) = CV_NODE_REAL;
end;
function CV_NODE_IS_STRING(const flags: Integer): Boolean; {$IFDEF VER9P}inline;{$ENDIF}
function CV_NODE_IS_STRING(const flags: Integer): Boolean; {$IFDEF VER9P}inline; {$ENDIF}
begin
Result := CV_NODE_TYPE(flags) = CV_NODE_STRING
end;
procedure CV_READ_SEQ_ELEM(const Elem: Pointer; const Reader: TCvSeqReader; const SizeOfElem: Integer); // {$IFDEF VER9P}inline;{$ENDIF}
procedure CV_READ_SEQ_ELEM(const Elem: Pointer; const Reader: TCvSeqReader; const SizeOfElem: Integer);
// {$IFDEF VER9P}inline;{$ENDIF}
begin
// assert( (reader).seq->elem_size == sizeof(elem));
Assert(Reader.Seq^.elem_size = SizeOfElem);
@ -2480,7 +2469,7 @@ begin
Result.y := y;
end;
function cvPoint3D32f(const x, y, z: Double): TCvPoint3D32f; {$IFDEF VER9P}inline;{$ENDIF}
function cvPoint3D32f(const x, y, z: Single): TCvPoint3D32f; {$IFDEF VER9P}inline; {$ENDIF}
begin
Result.x := x;
Result.y := y;
@ -2525,13 +2514,14 @@ begin
end;
{$IFDEF VER15P}
function CV_GET_SEQ_ELEM;
begin
{#define CV_GET_SEQ_ELEM( elem_type, seq, index ) CV_SEQ_ELEM( (seq), elem_type, (index) )}
Result := CV_SEQ_ELEM(Seq, size_of_elem, index);
end;
function CV_SEQ_ELEM(Seq: pCvSeq; const size_of_elem: Integer; index: Integer): Pointer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_SEQ_ELEM(Seq: pCvSeq; const size_of_elem: Integer; index: Integer): Pointer; {$IFDEF VER9P}inline; {$ENDIF}
begin
// assert(sizeof((seq)->first[0]) == sizeof(CvSeqBlock) && (seq)->elem_size == sizeof(elem_type))
Assert(Assigned(Seq^.first) and (SizeOf(Seq^.first[0]) = SizeOf(TCvSeqBlock)) and (Seq^.elem_size = size_of_elem));
@ -2545,7 +2535,7 @@ begin
end;
{$ENDIF VER15P}
function CV_8UC1: Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_8UC1: Integer; {$IFDEF VER9P}inline; {$ENDIF}
begin
Result := CV_MAKETYPE(CV_8U, 1);
end;
@ -2555,7 +2545,7 @@ begin
Result := CV_MAKETYPE(CV_32F, 2);
end;
function CV_32FC3: Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_32FC3: Integer; {$IFDEF VER9P}inline; {$ENDIF}
begin
Result := CV_MAKETYPE(CV_32F, 3);
end;
@ -2570,7 +2560,7 @@ begin
Result := CV_MAKETYPE(CV_64F, 2);
end;
function CV_64FC3: Integer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_64FC3: Integer; {$IFDEF VER9P}inline; {$ENDIF}
begin
Result := CV_MAKETYPE(CV_64F, 3);
end;
@ -2586,13 +2576,14 @@ begin
Result := Assigned(ptr) and (pCvSetElem(ptr)^.flags >= 0);
end;
function CV_IMAGE_ELEM(image: pIplImage; size_elemtype, row, col: Integer): Pointer; {$IFDEF VER9P}inline;{$ENDIF}
function CV_IMAGE_ELEM(image: pIplImage; size_elemtype, row, col: Integer): Pointer; {$IFDEF VER9P}inline; {$ENDIF}
begin
// (((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])
Result := {$IFDEF D7}Pointer({$ENDIF D7}{$IFDEF VER9P}pByte{$ELSE}Integer{$ENDIF}(image^.imageData) + image^.widthStep * row + col * size_elemtype{$IFDEF D7}){$ENDIF D7};
Result := {$IFDEF D7}Pointer({$ENDIF D7}{$IFDEF VER9P}pByte{$ELSE}Integer{$ENDIF}(image^.imageData) + image^.widthStep * row +
col * size_elemtype{$IFDEF D7}){$ENDIF D7};
end;
function cvRealScalar(val0: Double): TCvScalar; {$IFDEF VER9P}inline;{$ENDIF}
function cvRealScalar(val0: Double): TCvScalar; {$IFDEF VER9P}inline; {$ENDIF}
begin
Result.val[0] := val0;
Result.val[1] := 0;
@ -2600,7 +2591,7 @@ begin
Result.val[3] := 0;
end;
function cvRNG(seed: int64 = -1): TCvRNG; {$IFDEF VER9P}inline;{$ENDIF}
function cvRNG(seed: int64 = -1): TCvRNG; {$IFDEF VER9P}inline; {$ENDIF}
begin
// CvRNG rng = seed ? (uint64)seed : (uint64)(int64)-1;
Result := iif(seed > 0, seed, uint64(int64(-1)));
@ -2623,24 +2614,37 @@ begin
depth := CV_MAT_DEPTH(_type);
Result := CV_ELEM_SIZE1(depth) * 8;
if (depth = CV_8S) or (depth = CV_16S) or (depth = CV_32S) then
Result := Result or IPL_DEPTH_SIGN;
Result := Result or Integer(IPL_DEPTH_SIGN);
end;
function CV_ARE_TYPES_EQ(const mat1, mat2: pCvMat): Boolean; {$IFDEF VER9P}inline;{$ENDIF}
function CV_ARE_TYPES_EQ(const mat1, mat2: pCvMat): Boolean; {$IFDEF VER9P}inline; {$ENDIF}
begin
Result := ((((mat1)^._type xor (mat2)^._type) and CV_MAT_TYPE_MASK) = 0);
end;
function CV_IS_SEQ_CLOSED(const Seq: pCvSeq): Boolean; {$IFDEF VER9P}inline;{$ENDIF}
function CV_IS_SEQ_CLOSED(const Seq: pCvSeq): Boolean; {$IFDEF VER9P}inline; {$ENDIF}
begin
Result := (Seq^.flags and CV_SEQ_FLAG_CLOSED) <> 0;
end;
function CV_IS_SEQ_HOLE(const Seq: pCvSeq): Boolean; {$IFDEF VER9P}inline;{$ENDIF}
function CV_IS_SEQ_HOLE(const Seq: pCvSeq): Boolean; {$IFDEF VER9P}inline; {$ENDIF}
begin
Result := (Seq^.flags and CV_SEQ_FLAG_HOLE) <> 0;
end;
function CvBox2D(const cX, cY, width, height, angle: Single): TCvBox2D;
begin
Result.center := CvPoint2D32f(cX, cY);
Result.size := CvSize2D32f(width, height);
Result.angle := angle;
end;
function CvSize2D32f(const width, height: Single): TCvSize2D32f;
begin
Result.width := width;
Result.height := height;
end;
initialization
CV_SEQ_ELTYPE_POINT := CV_32SC2;