Added augmented reality example

Signed-off-by: Laex <laex@bk.ru>
This commit is contained in:
Laex 2013-06-10 08:21:02 +04:00
parent 8070464750
commit 23df8e84a1
8 changed files with 488 additions and 74 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -1,8 +1,56 @@
Delphi-OpenCV
-------------
Project is no longer divided by version OpenCV.<br>
Project matching, the latest version of OpenCV.<br>
The current version of OpenCV 2.4.5.<br>
Development environment - Delphi XE3.<br>
<br>
How to install the project see the file "readme-en.txt"
* OpenCV version - 2.4.5<br>
* Development environment - Delphi XE3<br>
How to install:
---------------
1. Download the archive Delphi-OpenCV-master.zip
2. Unzip it to a convenient directory, thus get the following directory structure
<Directory, such as "C:\OpenCV" or just "C:\" - <PROJECT_ROOT>>
<Delphi-OpenCV-master>
<Bin>
<include>
<opencv_classes>
<samples>
3. Add the search path for the modules of the project in Delphi IDE (Tools-Options-Delphi Options-Library-Library path)
<PROJECT_ROOT>\Delphi-OpenCV-master\Include
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\core
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\highgui
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\imgproc
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\legacy
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\nonfree
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\objdetect
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\calib3d
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\contrib
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\video
where <PROJECT_ROOT> directory, which was unzipped project.
4. You can unzip files subdirectory of the project without <Delphi-OpenCV-master>.
Then the directory structure of the project is as follows:
<Directory, such as "C:\OpenCV" - <PROJECT_ROOT>>
<Bin>
<include>
<opencv_classes>
<samples>
and path
<PROJECT_ROOT>\Include
<PROJECT_ROOT>\Include\core
<PROJECT_ROOT>\Include\highgui
<PROJECT_ROOT>\Include\imgproc
<PROJECT_ROOT>\Include\legacy
<PROJECT_ROOT>\Include\nonfree
<PROJECT_ROOT>\Include\objdetect
<PROJECT_ROOT>\Include\calib3d
<PROJECT_ROOT>\Include\contrib
<PROJECT_ROOT>\Include\video
5. Open "<PROJECT_ROOT>\samples\Samples.groupproj" in Delphi IDE and compile the sample programs.

View File

@ -49,7 +49,7 @@ Uses WinApi.Windows, core.types_c, Vcl.Graphics;
Function hsv2rgb(hue: single): TCvScalar;
procedure IplImage2Bitmap(iplImg: PIplImage; var bitmap: Vcl.Graphics.TBitmap);
function cvImage2Bitmap(img: PIplImage): Vcl.Graphics.TBitmap;
function ipDraw(dc: HDC; img: PIplImage; const rect: TRect; const Stretch: Boolean = true): Boolean;
function ipDraw(dc: HDC; img: PIplImage; const rect: TRect; const Stretch: Boolean = true): Boolean;
Type
TAnsiString = record helper for AnsiString
@ -69,6 +69,12 @@ Type
function AsString: string;
end;
TSingle = record helper for
Single
public
function AsInteger: Integer;
end;
implementation
Uses System.SysUtils;
@ -223,8 +229,7 @@ begin
result := IntToStr(Self);
end;
function ipDraw(dc: HDC; img: PIplImage; const rect: TRect; const Stretch: Boolean = true): Boolean;
function ipDraw(dc: HDC; img: PIplImage; const rect: TRect; const Stretch: Boolean = true): Boolean;
Type
pCOLORREF = ^COLORREF;
@ -281,8 +286,15 @@ begin
end
else
// Draw without scaling
result := SetDIBitsToDevice(dc, rect.Left, rect.Top, img^.Width, img^.Height, 0, 0, 0, img^.Height, img^.ImageData,
result := SetDIBitsToDevice(dc, rect.left, rect.top, img^.Width, img^.Height, 0, 0, 0, img^.Height, img^.ImageData,
_dibhdr, DIB_RGB_COLORS) > 0;
end;
{ TSingle }
function TSingle.AsInteger: Integer;
begin
result := Trunc(Self);
end;
end.

View File

@ -1,64 +0,0 @@
Header files OpenCV 2.4.5 for Delphi XE3
========================================
Developers:
-----------
Laentir Valetov
Email: laex@bk.ru
Mikhail Grigorev
Email: sleuthhound@gmail.com
How to install:
---------------
1. Download the archive Delphi-OpenCV-master.zip
2. Unzip it to a convenient directory, thus get the following directory structure
<Directory, such as "C:\OpenCV" or just "C:\" - <PROJECT_ROOT>>
<Delphi-OpenCV-master>
<Bin>
<include>
<opencv_classes>
<samples>
3. Add the search path for the modules of the project in Delphi IDE (Tools-Options-Delphi Options-Library-Library path)
<PROJECT_ROOT>\Delphi-OpenCV-master\Include
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\core
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\highgui
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\imgproc
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\legacy
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\nonfree
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\objdetect
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\calib3d
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\contrib
<PROJECT_ROOT>\Delphi-OpenCV-master\Include\video
where <PROJECT_ROOT> directory, which was unzipped project.
4. You can unzip files subdirectory of the project without <Delphi-OpenCV-master>.
Then the directory structure of the project is as follows:
<Directory, such as "C:\OpenCV" - <PROJECT_ROOT>>
<Bin>
<include>
<opencv_classes>
<samples>
and path
<PROJECT_ROOT>\Include
<PROJECT_ROOT>\Include\core
<PROJECT_ROOT>\Include\highgui
<PROJECT_ROOT>\Include\imgproc
<PROJECT_ROOT>\Include\legacy
<PROJECT_ROOT>\Include\nonfree
<PROJECT_ROOT>\Include\objdetect
<PROJECT_ROOT>\Include\calib3d
<PROJECT_ROOT>\Include\contrib
<PROJECT_ROOT>\Include\video
5. Open "<PROJECT_ROOT>\samples\Samples.groupproj" in Delphi IDE and compile the sample programs.

View File

@ -0,0 +1,270 @@
(* /*****************************************************************
// Delphi-OpenCV Demo
// 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.
******************************************************************* *)
// JCL_DEBUG_EXPERT_GENERATEJDBG OFF
// JCL_DEBUG_EXPERT_INSERTJDBG OFF
// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF
program simplAR;
{$APPTYPE CONSOLE}
{$POINTERMATH ON}
{$R *.res}
uses
System.SysUtils,
highgui_c,
core_c,
Core.types_c,
calib3d_c,
imgproc_c,
imgproc.types_c,
objdetect;
const
//Print pattern "resource\chessboard 6x5.jpg"
trailer_filename = 'resource\trailer.avi';
pic_filename = 'resource\pic.jpg';
Var
capture: pCvCapture = nil;
image: pIplImage = nil;
frame: pIplImage = nil;
disp, neg_img, cpy_img: pIplImage;
key: Integer = 0;
fcount: Integer = 0;
option: Integer = 0;
vid: pCvCapture = nil;
pic: pIplImage;
b_width: Integer = 5;
b_height: Integer = 4;
b_squares: Integer = 20;
b_size: TCvSize;
warp_matrix: pCvMat;
corners: pCvPoint2D32f;
corner_count: Integer;
gray: pIplImage;
found: Integer;
p: array [0 .. 3] of TCvPoint2D32f;
q: array [0 .. 3] of TCvPoint2D32f;
blank: pIplImage;
pp: array [0 .. 3] of TCvPoint;
begin
try
capture := cvCreateCameraCapture(0);
if not Assigned(capture) then
Halt;
// Use a video with aspect ratio 4:3
vid := cvCreateFileCapture(trailer_filename);
if not Assigned(vid) then
begin
cvReleaseCapture(capture);
Halt;
end;
pic := cvLoadImage(pic_filename);
cvFlip(pic, pic, 1);
b_size := cvSize(b_width, b_height);
// The pattern actually has 6 x 5 squares, but has 5 x 4 := 20 'ENCLOSED' corners
warp_matrix := cvCreateMat(3, 3, CV_32FC1);
corners := AllocMem(b_squares * SizeOf(TCvPoint2D32f));
WriteLn('Select an option to run the program');
WriteLn;
WriteLn('1. Show an Image over the pattern.');
WriteLn('2. Play a Clip over the pattern.');
WriteLn('3. Mark the pattern.');
Write('>');
Readln(option);
// Quit on invalid entry
if (option < 1) or (option > 3) then
begin
WriteLn('Invalid selection.');
Halt;
end;
cvNamedWindow('Video', CV_WINDOW_AUTOSIZE);
while (key <> 27) do
begin
image := cvQueryFrame(capture);
if not Assigned(image) then
break;
cvFlip(image, image, 1);
disp := cvCreateImage(cvGetSize(image), 8, 3);
cpy_img := cvCreateImage(cvGetSize(image), 8, 3);
neg_img := cvCreateImage(cvGetSize(image), 8, 3);
gray := cvCreateImage(cvGetSize(image), image^.depth, 1);
found := cvFindChessboardCorners(image, b_size, corners, @corner_count, CV_CALIB_CB_ADAPTIVE_THRESH or
CV_CALIB_CB_FILTER_QUADS);
cvCvtColor(image, gray, CV_BGR2GRAY);
// This function identifies the pattern from the gray image, saves the valid group of corners
cvFindCornerSubPix(gray, corners, corner_count, cvSize(11, 11), cvSize(-1, -1),
cvTermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
if (corner_count = b_squares) then
begin
if (option = 1) then
begin
blank := cvCreateImage(cvGetSize(pic), 8, 3);
cvZero(blank);
cvNot(blank, blank);
// Set of source points to calculate Perspective matrix
q[0].x := pic^.width * 0;
q[0].y := pic^.height * 0;
q[1].x := pic^.width;
q[1].y := pic^.height * 0;
q[2].x := pic^.width;
q[2].y := pic^.height;
q[3].x := pic^.width * 0;
q[3].y := pic^.height;
// Set of destination points to calculate Perspective matrix
p[0].x := corners[0].x;
p[0].y := corners[0].y;
p[1].x := corners[4].x;
p[1].y := corners[4].y;
p[2].x := corners[19].x;
p[2].y := corners[19].y;
p[3].x := corners[15].x;
p[3].y := corners[15].y;
// Calculate Perspective matrix
cvGetPerspectiveTransform(@q, @p, warp_matrix);
// Boolean juggle to obtain 2D-Augmentation
cvZero(neg_img);
cvZero(cpy_img);
cvWarpPerspective(pic, neg_img, warp_matrix,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0));
cvWarpPerspective(blank, cpy_img, warp_matrix,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0));
cvNot(cpy_img, cpy_img);
cvAnd(cpy_img, image, cpy_img);
cvOr(cpy_img, neg_img, image);
cvShowImage('Video', image);
end
else if (option = 2) then
begin
frame := cvQueryFrame(vid);
if not Assigned(frame) then
WriteLn('error frame');
blank := cvCreateImage(cvGetSize(frame), 8, 3);
cvZero(blank);
cvNot(blank, blank);
q[0].x := frame^.width * 0;
q[0].y := frame^.height * 0;
q[1].x := frame^.width;
q[1].y := frame^.height * 0;
q[2].x := frame^.width;
q[2].y := frame^.height;
q[3].x := frame^.width * 0;
q[3].y := frame^.height;
p[0].x := corners[0].x;
p[0].y := corners[0].y;
p[1].x := corners[4].x;
p[1].y := corners[4].y;
p[2].x := corners[19].x;
p[2].y := corners[19].y;
p[3].x := corners[15].x;
p[3].y := corners[15].y;
cvGetPerspectiveTransform(@q, @p, warp_matrix);
// Boolean juggle to obtain 2D-Augmentation
cvZero(neg_img);
cvZero(cpy_img);
cvWarpPerspective(frame, neg_img, warp_matrix,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0));
cvWarpPerspective(blank, cpy_img, warp_matrix,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0));
cvNot(cpy_img, cpy_img);
cvAnd(cpy_img, image, cpy_img);
cvOr(cpy_img, neg_img, image);
cvShowImage('Video', image);
end
else
begin
pp[0].x := Trunc(corners[0].x);
pp[0].y := Trunc(corners[0].y);
pp[1].x := Trunc(corners[4].x);
pp[1].y := Trunc(corners[4].y);
pp[2].x := Trunc(corners[19].x);
pp[2].y := Trunc(corners[19].y);
pp[3].x := Trunc(corners[15].x);
pp[3].y := Trunc(corners[15].y);
cvLine(image, pp[0], pp[1], CV_RGB(255, 0, 0), 2);
cvLine(image, pp[1], pp[2], CV_RGB(0, 255, 0), 2);
cvLine(image, pp[2], pp[3], CV_RGB(0, 0, 255), 2);
cvLine(image, pp[3], pp[0], CV_RGB(255, 255, 0), 2);
// or simply
// cvDrawChessboardCorners(image, b_size, corners, corner_count, found);
cvShowImage('Video', image);
end;
end
else
begin
// Show gray image when pattern is not detected
cvFlip(gray, gray);
cvShowImage('Video', gray);
end;
key := cvWaitKey(1);
end;
cvDestroyWindow('Video');
cvReleaseCapture(vid);
cvReleaseMat(warp_matrix);
cvReleaseCapture(capture);
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.

View File

@ -0,0 +1,148 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{2AB18958-8E39-4F33-B1B9-D20DB968E408}</ProjectGuid>
<MainSource>simplAR.dpr</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<TargetedPlatforms>1</TargetedPlatforms>
<AppType>Console</AppType>
<FrameworkType>None</FrameworkType>
<ProjectVersion>14.4</ProjectVersion>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
<Cfg_2_Win32>true</Cfg_2_Win32>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<DCC_E>false</DCC_E>
<DCC_ExeOutput>..\..\..\bin\</DCC_ExeOutput>
<Manifest_File>None</Manifest_File>
<DCC_ImageBase>00400000</DCC_ImageBase>
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
<DCC_F>false</DCC_F>
<DCC_K>false</DCC_K>
<DCC_S>false</DCC_S>
<VerInfo_Locale>1049</VerInfo_Locale>
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName=;CFBundleDisplayName=;CFBundleIdentifier=;CFBundleVersion=;CFBundlePackageType=;CFBundleSignature=;CFBundleAllowMixedLocalizations=;CFBundleExecutable=</VerInfo_Keys>
<DCC_N>false</DCC_N>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Locale>1033</VerInfo_Locale>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
<DCC_DebugInformation>false</DCC_DebugInformation>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
<DCC_Optimize>false</DCC_Optimize>
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<Manifest_File>None</Manifest_File>
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Locale>1033</VerInfo_Locale>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<BuildConfiguration Include="Debug">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Release">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType/>
<BorlandProject>
<Delphi.Personality>
<Source>
<Source Name="MainSource">simplAR.dpr</Source>
</Source>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
<VersionInfo Name="MajorVer">1</VersionInfo>
<VersionInfo Name="MinorVer">0</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">0</VersionInfo>
<VersionInfo Name="Debug">False</VersionInfo>
<VersionInfo Name="PreRelease">False</VersionInfo>
<VersionInfo Name="Special">False</VersionInfo>
<VersionInfo Name="Private">False</VersionInfo>
<VersionInfo Name="DLL">False</VersionInfo>
<VersionInfo Name="Locale">1049</VersionInfo>
<VersionInfo Name="CodePage">1251</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName"/>
<VersionInfoKeys Name="FileDescription"/>
<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName"/>
<VersionInfoKeys Name="LegalCopyright"/>
<VersionInfoKeys Name="LegalTrademarks"/>
<VersionInfoKeys Name="OriginalFilename"/>
<VersionInfoKeys Name="ProductName"/>
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"/>
<VersionInfoKeys Name="CFBundleName"/>
<VersionInfoKeys Name="CFBundleDisplayName"/>
<VersionInfoKeys Name="CFBundleIdentifier"/>
<VersionInfoKeys Name="CFBundleVersion"/>
<VersionInfoKeys Name="CFBundlePackageType"/>
<VersionInfoKeys Name="CFBundleSignature"/>
<VersionInfoKeys Name="CFBundleAllowMixedLocalizations"/>
<VersionInfoKeys Name="CFBundleExecutable"/>
</VersionInfoKeys>
<Excluded_Packages>
<Excluded_Packages Name="C:\Users\Alex\Documents\DevExpress VCL\Library\RS17\dcldxPSTeeChartRS17.bpl">ExpressPrinting System ReportLink for TeeChart by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="C:\Users\Alex\Documents\DevExpress VCL\Library\RS17\dcldxPSDBTeeChartRS17.bpl">ExpressPrinting System ReportLink for DBTeeChart by Developer Express Inc.</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dclofficexp170.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k170.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\bcboffice2k170.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages>
</Excluded_Packages>
</Delphi.Personality>
<Platforms>
<Platform value="OSX32">False</Platform>
<Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform>
</Platforms>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
</Project>

Binary file not shown.