Added VCL example - Color Detection & Object Tracking

[*] samples/MultiDemo/vclColorTracking/vclColorTracking.dpr

Signed-off-by: Laex <laex@bk.ru>
This commit is contained in:
Laex 2013-08-10 10:40:36 +04:00
parent ef6a115962
commit 0ead41eec3
7 changed files with 665 additions and 54 deletions

View File

@ -2,7 +2,7 @@
// Project Delphi-OpenCV
// **************************************************************************************************
// Contributor:
// laentir Valetov
// Laentir Valetov
// email:laex@bk.ru
// **************************************************************************************************
// You may retrieve the latest version of this file at the GitHub,
@ -29,7 +29,7 @@
//
// For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html
// **************************************************************************************************
// Warning: Using Delphi XE3 syntax!
// Warning: Using Delphi XE2 syntax!
// **************************************************************************************************
// The Initial Developer of the Original Code:
// OpenCV: open source computer vision library
@ -44,18 +44,30 @@ unit cvUtils;
interface
Uses WinApi.Windows, core.types_c, Vcl.Graphics;
Uses
WinApi.Windows,
core.types_c,
Vcl.Graphics;
Function hsv2rgb(hue: single): TCvScalar;
procedure IplImage2Bitmap(iplImg: PIplImage; var bitmap: Vcl.Graphics.TBitmap);
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;
function c_str(const Text: String): pCVChar;
implementation
Uses System.SysUtils;
Uses
System.SysUtils;
function c_str(const Text: String): pCVChar;
begin
@ -64,14 +76,14 @@ end;
Function hsv2rgb(hue: single): TCvScalar;
var
rgb: array [0 .. 2] of Integer;
rgb : array [0 .. 2] of Integer;
p, sector: Integer;
const
sector_data: array [0 .. 5, 0 .. 2] of Integer = ((0, 2, 1), (1, 2, 0), (1, 0, 2), (2, 0, 1), (2, 1, 0), (0, 1, 2));
Begin
hue := hue * 0.033333333333333333333333333333333;
hue := hue * 0.033333333333333333333333333333333;
sector := cvFloor(hue);
p := cvRound(255 * (hue - sector));
p := cvRound(255 * (hue - sector));
if (sector and 1) = 1 then
p := 255
else
@ -81,7 +93,11 @@ Begin
rgb[sector_data[sector][1]] := 0;
rgb[sector_data[sector][2]] := p;
Result := cvScalar(rgb[2], rgb[1], rgb[0], 0);
Result := cvScalar(
rgb[2],
rgb[1],
rgb[0],
0);
End;
{ -----------------------------------------------------------------------------
@ -91,19 +107,21 @@ End;
Arguments: iplImg: PIplImage; bitmap: TBitmap
Description: convert a IplImage to a Windows bitmap
----------------------------------------------------------------------------- }
procedure IplImage2Bitmap(iplImg: PIplImage; var bitmap: Vcl.Graphics.TBitmap);
procedure IplImage2Bitmap(
iplImg: PIplImage;
var bitmap: Vcl.Graphics.TBitmap);
VAR
i, j: Integer;
offset: longint;
i, j : Integer;
offset : longint;
dataByte, RowIn: PByteArray;
channelsCount: Integer;
channelsCount : Integer;
BEGIN
TRY
// assert((iplImg.Depth = 8) and (iplImg.NChannels = 3),
// 'IplImage2Bitmap: Not a 24 bit color iplImage!');
bitmap.Height := iplImg.Height;
bitmap.Width := iplImg.Width;
FOR j := 0 TO bitmap.Height - 1 DO
bitmap.Width := iplImg.Width;
FOR j := 0 TO bitmap.Height - 1 DO
BEGIN
// origin BL = Bottom-Left
if (iplImg.Origin = IPL_ORIGIN_BL) then
@ -111,25 +129,28 @@ BEGIN
else
RowIn := bitmap.Scanline[j];
offset := longint(iplImg.ImageData) + iplImg.WidthStep * j;
offset := longint(iplImg.ImageData) + iplImg.WidthStep * j;
dataByte := PByteArray(offset);
if (iplImg.ChannelSeq = 'BGR') then
begin
{ direct copy of the iplImage row bytes to bitmap row }
CopyMemory(RowIn, dataByte, iplImg.WidthStep);
CopyMemory(
RowIn,
dataByte,
iplImg.WidthStep);
End
else if (iplImg.ChannelSeq = 'GRAY') then
FOR i := 0 TO bitmap.Width - 1 DO
begin
RowIn[3 * i] := dataByte[i];
RowIn[3 * i] := dataByte[i];
RowIn[3 * i + 1] := dataByte[i];
RowIn[3 * i + 2] := dataByte[i];
End
else
FOR i := 0 TO 3 * bitmap.Width - 1 DO
begin
RowIn[i] := dataByte[i + 2];
RowIn[i] := dataByte[i + 2];
RowIn[i + 1] := dataByte[i + 1];
RowIn[i + 2] := dataByte[i];
End;
@ -140,20 +161,20 @@ END; { IplImage2Bitmap }
function cvImage2Bitmap(img: PIplImage): Vcl.Graphics.TBitmap;
var
info: string;
bmp: Vcl.Graphics.TBitmap;
deep: Integer;
info : string;
bmp : Vcl.Graphics.TBitmap;
deep : Integer;
i, j, K, wStep, Channels: Integer;
data: PByteArray;
pb: PByteArray;
data : PByteArray;
pb : PByteArray;
begin
Result := NIL;
if (img <> NIL) then
begin
bmp := Vcl.Graphics.TBitmap.Create;
bmp.Width := img^.Width;
bmp := Vcl.Graphics.TBitmap.Create;
bmp.Width := img^.Width;
bmp.Height := img^.Height;
deep := img^.nChannels * img^.depth;
deep := img^.nChannels * img^.depth;
case deep of
8:
bmp.PixelFormat := pf8bit;
@ -164,15 +185,15 @@ begin
32:
bmp.PixelFormat := pf32bit;
End;
wStep := img^.WidthStep;
wStep := img^.WidthStep;
Channels := img^.nChannels;
data := Pointer(img^.ImageData);
for i := 0 to img^.Height - 1 do
data := Pointer(img^.ImageData);
for i := 0 to img^.Height - 1 do
begin
pb := bmp.Scanline[i];
pb := bmp.Scanline[i];
for j := 0 to img^.Width - 1 do
begin
for K := 0 to Channels - 1 do
for K := 0 to Channels - 1 do
pb[3 * j + K] := data[i * wStep + j * Channels + K]
End;
End;
@ -181,20 +202,24 @@ begin
End;
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;
pCOLORREF = ^COLORREF;
pBITMAPINFOHEADER = ^BITMAPINFOHEADER;
Var
isrgb: Boolean;
isgray: Boolean;
buf: array [1 .. sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256] of byte;
dibhdr: pBITMAPINFOHEADER;
isrgb : Boolean;
isgray : Boolean;
buf : array [1 .. sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256] of byte;
dibhdr : pBITMAPINFOHEADER;
_dibhdr: TBitmapInfo ABSOLUTE buf;
_rgb: pCOLORREF;
i: Integer;
_rgb : pCOLORREF;
i : Integer;
begin
if (not Assigned(img)) or (not Assigned(img^.ImageData)) then
Exit(false);
@ -207,12 +232,15 @@ begin
Exit(false);
dibhdr := @buf;
_rgb := pCOLORREF(Integer(dibhdr) + sizeof(BITMAPINFOHEADER));
_rgb := pCOLORREF(Integer(dibhdr) + sizeof(BITMAPINFOHEADER));
if (isgray) then
for i := 0 to 255 do
_rgb[i] := rgb(i, i, i);
dibhdr^.biSize := sizeof(BITMAPINFOHEADER);
for i := 0 to 255 do
_rgb[i] := rgb(
i,
i,
i);
dibhdr^.biSize := sizeof(BITMAPINFOHEADER);
dibhdr^.biWidth := img^.Width;
// Check origin for display
if img^.Origin = 0 then
@ -220,18 +248,20 @@ begin
else
dibhdr^.biHeight := img^.Height;
dibhdr^.biPlanes := 1;
dibhdr^.biBitCount := 8 * img^.nChannels;
dibhdr^.biCompression := BI_RGB;
dibhdr^.biSizeImage := 0; // img^.imageSize;
dibhdr^.biPlanes := 1;
dibhdr^.biBitCount := 8 * img^.nChannels;
dibhdr^.biCompression := BI_RGB;
dibhdr^.biSizeImage := 0; // img^.imageSize;
dibhdr^.biXPelsPerMeter := 0;
dibhdr^.biYPelsPerMeter := 0;
dibhdr^.biClrUsed := 0;
dibhdr^.biClrImportant := 0;
dibhdr^.biClrUsed := 0;
dibhdr^.biClrImportant := 0;
if Stretch then
begin
SetStretchBltMode(dc, COLORONCOLOR);
SetStretchBltMode(
dc,
COLORONCOLOR);
// Stretch the image to fit the rectangle
Result := StretchDIBits(dc, rect.left, rect.top, rect.Width, rect.Height, 0, 0, img^.Width, img^.Height,
img^.ImageData, _dibhdr, DIB_RGB_COLORS, SRCCOPY) > 0;

View File

@ -41,7 +41,7 @@
// Project Delphi-OpenCV
// **************************************************************************************************
// Contributor:
// laentir Valetov
// Laentir Valetov
// email:laex@bk.ru
// **************************************************************************************************
// You may retrieve the latest version of this file at the GitHub,
@ -68,7 +68,7 @@
//
// For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html
// **************************************************************************************************
// Warning: Using Delphi XE3 syntax!
// Warning: Using Delphi XE2 syntax!
// **************************************************************************************************
// The Initial Developer of the Original Code:
// OpenCV: open source computer vision library

View File

@ -0,0 +1,51 @@
object MainForm: TMainForm
Left = 0
Top = 0
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'Color Detection & Object Tracking '
ClientHeight = 342
ClientWidth = 670
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object pb1: TPaintBox
Left = 8
Top = 52
Width = 325
Height = 281
end
object pb2: TPaintBox
Left = 339
Top = 52
Width = 325
Height = 281
end
object rb1: TRadioButton
Left = 8
Top = 31
Width = 165
Height = 17
Caption = 'Tracking Red objects'
TabOrder = 1
end
object rb2: TRadioButton
Left = 8
Top = 8
Width = 165
Height = 17
Caption = 'Detecting Red objects'
Checked = True
TabOrder = 0
TabStop = True
end
end

View File

@ -0,0 +1,318 @@
(* / **************************************************************************************************
// 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
// **************************************************************************************************
// License:
// The contents of this file are 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/
//
// 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.
//
// Alternatively, the contents of this file may be used under the terms of the
// GNU Lesser General Public License (the "LGPL License"), in which case the
// provisions of the LGPL License are applicable instead of those above.
// If you wish to allow use of your version of this file only under the terms
// of the LGPL License and not to allow others to use your version of this file
// under the MPL, indicate your decision by deleting the provisions above and
// replace them with the notice and other provisions required by the LGPL
// License. If you do not delete the provisions above, a recipient may use
// your version of this file under either the MPL or the LGPL License.
//
// For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html
// **************************************************************************************************
// Warning: Using Delphi XE2 syntax!
// **************************************************************************************************
// The Initial Developer of the Original Code:
// OpenCV: open source computer vision library
// Homepage: http://opencv.org
// Online docs: http://docs.opencv.org
// Q&A forum: http://answers.opencv.org
// Dev zone: http://code.opencv.org
// ************************************************************************************************** *)
unit uMainForm;
interface
uses
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
highgui_c,
core.types_c,
Vcl.StdCtrls,
Vcl.ExtCtrls;
type
TMainForm = class(TForm)
pb1: TPaintBox;
pb2: TPaintBox;
rb1: TRadioButton;
rb2: TRadioButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
capture : pCvCapture;
lastX, lastY: Integer;
imgTracking : pIplImage;
procedure OnIdle(
Sender: TObject;
var Done: Boolean);
procedure DetectingRedObjects(img: pIplImage);
procedure TrackingRedObjects(img: pIplImage);
procedure trackObject(imgThresh: pIplImage);
public
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
Uses
core_c,
imgproc_c,
imgproc.types_c,
cvUtils;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
if Assigned(capture) then
cvReleaseCapture(capture);
if Assigned(imgTracking) then
cvReleaseImage(imgTracking);
end;
// This function threshold the HSV image and create a binary image
function GetThresholdedImage(imgHSV: pIplImage): pIplImage;
begin
Result := cvCreateImage(
cvGetSize(imgHSV),
IPL_DEPTH_8U,
1);
// Convet a video into a binary image based on the red color.
// Red color area of the video is assined to '1' and other area is assigned to '0' in the binary image
cvInRangeS(
imgHSV,
cvScalar(170, 160, 60),
cvScalar(180, 256, 256),
Result);
end;
procedure TMainForm.DetectingRedObjects(img: pIplImage);
Var
imgHSV : pIplImage;
imgThresh: pIplImage;
frame : pIplImage;
begin
frame := cvCloneImage(img);
// smooth the original image using Gaussian kernel
cvSmooth(
frame,
frame,
CV_GAUSSIAN,
3,
3);
imgHSV := cvCreateImage(
cvGetSize(frame),
IPL_DEPTH_8U,
3);
// Change the color format from BGR to HSV
cvCvtColor(
frame,
imgHSV,
CV_BGR2HSV);
imgThresh := GetThresholdedImage(imgHSV);
// smooth the binary image using Gaussian kernel
cvSmooth(
imgThresh,
imgThresh,
CV_GAUSSIAN,
3,
3);
ipDraw(
pb1.Canvas.Handle,
frame,
pb1.ClientRect);
ipDraw(
pb2.Canvas.Handle,
imgThresh,
pb1.ClientRect);
// Clean up used images
cvReleaseImage(imgHSV);
cvReleaseImage(imgThresh);
cvReleaseImage(frame);
end;
procedure TMainForm.trackObject(imgThresh: pIplImage);
Var
moments : pCvMoments;
moment10, moment01, area: Double;
posX, posY : Integer;
begin
// Calculate the moments of 'imgThresh'
moments := allocMem(sizeof(TCvMoments));
cvMoments(
imgThresh,
moments,
1);
moment10 := cvGetSpatialMoment(
moments,
1,
0);
moment01 := cvGetSpatialMoment(
moments,
0,
1);
area := cvGetCentralMoment(
moments,
0,
0);
// if the area<1000, I consider that the there are no object in the image and it's because of the noise, the area is not zero
if (area > 1000) then
begin
// calculate the position of the ball
posX := Trunc(moment10 / area);
posY := Trunc(moment01 / area);
if (lastX >= 0) and (lastY >= 0) and (posX >= 0) and (posY >= 0) then
// Draw a yellow line from the previous point to the current point
cvLine(
imgTracking,
cvPoint(posX, posY),
cvPoint(lastX, lastY),
cvScalar(0, 0, 255),
4);
lastX := posX;
lastY := posY;
end;
freemem(moments);
end;
procedure TMainForm.TrackingRedObjects(img: pIplImage);
Var
imgHSV : pIplImage;
imgThresh: pIplImage;
frame : pIplImage;
begin
frame := cvCloneImage(img);
cvSmooth(
frame,
frame,
CV_GAUSSIAN,
3,
3); // smooth the original image using Gaussian kernel
imgHSV := cvCreateImage(
cvGetSize(frame),
IPL_DEPTH_8U,
3);
cvCvtColor(
frame,
imgHSV,
CV_BGR2HSV); // Change the color format from BGR to HSV
imgThresh := GetThresholdedImage(imgHSV);
cvSmooth(
imgThresh,
imgThresh,
CV_GAUSSIAN,
3,
3); // smooth the binary image using Gaussian kernel
// track the possition of the ball
trackObject(imgThresh);
// Add the tracking image and the frame
cvAdd(
frame,
imgTracking,
frame);
ipDraw(
pb1.Canvas.Handle,
frame,
pb1.ClientRect);
ipDraw(
pb2.Canvas.Handle,
imgThresh,
pb1.ClientRect);
// Clean up used images
cvReleaseImage(imgHSV);
cvReleaseImage(imgThresh);
cvReleaseImage(frame);
end;
procedure TMainForm.OnIdle(
Sender: TObject;
var Done: Boolean);
Var
frame: pIplImage;
begin
if Assigned(capture) then
begin
frame := cvQueryFrame(capture);
if Assigned(frame) then
begin
if rb2.Checked then
DetectingRedObjects(frame)
else if rb1.Checked then
begin
if not Assigned(imgTracking) then
begin
// create a blank image and assigned to 'imgTracking' which has the same size of original video
imgTracking := cvCreateImage(
cvGetSize(frame),
IPL_DEPTH_8U,
3);
cvZero(imgTracking); // covert the image, 'imgTracking' to black
end;
TrackingRedObjects(frame);
end;
end;
end;
Done := False;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
lastX := -1;
lastY := -1;
capture := cvCreateCameraCapture(CV_CAP_ANY);
if Assigned(capture) then
Application.OnIdle := OnIdle;
end;
end.

View File

@ -0,0 +1,44 @@
// *****************************************************************
// 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.
// **************************************************************************************************
// Original: http://opencv-srf.blogspot.ru/2010/09/object-detection-using-color-seperation.html
// *******************************************************************
// JCL_DEBUG_EXPERT_GENERATEJDBG OFF
// JCL_DEBUG_EXPERT_INSERTJDBG OFF
program vclColorTracking;
uses
Vcl.Forms,
uMainForm in 'uMainForm.pas' {MainForm};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(
TMainForm,
MainForm);
Application.Run;
end.

View File

@ -0,0 +1,168 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{B539F149-8AF0-4A5A-A74F-4A3205ED1D16}</ProjectGuid>
<ProjectVersion>14.6</ProjectVersion>
<FrameworkType>VCL</FrameworkType>
<MainSource>vclColorTracking.dpr</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
<TargetedPlatforms>1</TargetedPlatforms>
<AppType>Application</AppType>
</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="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
<Cfg_1_Win32>true</Cfg_1_Win32>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' 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)'!=''">
<Manifest_File>None</Manifest_File>
<Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon>
<VerInfo_Locale>1049</VerInfo_Locale>
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(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>
<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
<DCC_ExeOutput>..\..\..\bin\</DCC_ExeOutput>
<DCC_E>false</DCC_E>
<DCC_N>false</DCC_N>
<DCC_S>false</DCC_S>
<DCC_F>false</DCC_F>
<DCC_K>false</DCC_K>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<DCC_UsePackage>cxPivotGridChartRS17;JvGlobus;JvMM;dxSkinSevenRS17;dxSkinBlueprintRS17;JvManagedThreads;dxSkinHighContrastRS17;dxSkinOffice2007BlackRS17;dxCoreRS17;dac170;cxPageControldxBarPopupMenuRS17;dxSkinXmas2008BlueRS17;dxPSDBTeeChartRS17;GLS_ODE;JvCrypt;dxPSTeeChartRS17;dxSkinSummer2008RS17;dxPScxSchedulerLnkRS17;dxSkinBlueRS17;dxSkinDarkRoomRS17;DBXInterBaseDriver;DataSnapServer;DataSnapCommon;dxPScxTLLnkRS17;JvNet;GLScene_RunTime;officeXPrt;JvDotNetCtrls;dxRibbonRS17;DbxCommonDriver;cxDataRS17;vclimg;dxSkinsdxBarPainterRS17;dxPSdxDBTVLnkRS17;dbxcds;DatasnapConnectorsFreePascal;dxSkinMoneyTwinsRS17;JvXPCtrls;vcldb;cxExportRS17;dxPSCoreRS17;dxBarExtItemsRS17;dxGDIPlusRS17;dxNavBarRS17;CustomIPTransport;cxLibraryRS17;cxGridRS17;dxSkinOffice2010BlackRS17;dsnap;IndyIPServer;unidac170;IndyCore;dxSkinMcSkinRS17;CloudService;dxPScxCommonRS17;FmxTeeUI;frxDB17;dxSkinsdxDLPainterRS17;dxSkiniMaginaryRS17;AnyDAC_PhysDb2_D17;JvDB;JvRuntimeDesign;dxPScxVGridLnkRS17;JclDeveloperTools;unidacfmx170;dxSkinSevenClassicRS17;dxPScxExtCommonRS17;dxPScxSSLnkRS17;dxSkinLilianRS17;fs17;dxPSdxLCLnkRS17;dxSkinOffice2010BlueRS17;bindcompfmx;dclTP_LockBox3;dxSkinOffice2010SilverRS17;vcldbx;cxSchedulerGridRS17;dbrtl;bindcomp;inetdb;JvPluginSystem;dxBarRS17;IcsCommonDXE3Run;DBXOdbcDriver;dxBarDBNavRS17;JvCmp;dxSkinWhiteprintRS17;JvTimeFramework;xmlrtl;dxSkinsdxRibbonPainterRS17;ibxpress;GLSS_OpenAL;dxDockingRS17;bindengine;vclactnband;soaprtl;FMXTee;dxADOServerModeRS17;bindcompvcl;dxBarExtDBItemsRS17;PasLib;Jcl;vclie;dxPSPrVwRibbonRS17;dxSkinOffice2007PinkRS17;IcsFmxDXE3Run;cxPageControlRS17;dxSkinscxPCPainterRS17;AnyDAC_PhysADS_D17;AnyDAC_PhysIB_D17;dxmdsRS17;dxSkinTheAsphaltWorldRS17;DBXInformixDriver;Intraweb;dxPsPrVwAdvRS17;GLSS_FMOD;dxSkinSilverRS17;dxdborRS17;DBXFirebirdDriver;dsnapcon;inet;fsDB17;FFmpegFmx_DXE3;JvPascalInterpreter;vclx;dxSkinStardustRS17;cxEditorsRS17;DBXSybaseASADriver;crcontrols170;dbexpress;EurekaLogCore;IndyIPClient;JvBDE;AnyDAC_PhysMySQL_D17;cxTreeListdxBarPopupMenuRS17;dxSkinVS2010RS17;GLCg_RunTime;GLS_NGD;ZComponent;dxThemeRS17;DBXSqliteDriver;dxPScxGridLnkRS17;fmx;JvDlgs;IndySystem;TeeDB;dxSkinValentineRS17;inetdbbde;vclib;DataSnapClient;dxSkinDevExpressStyleRS17;FFmpegRtl_DXE3;DataSnapProviderClient;DBXSybaseASEDriver;cxBarEditItemRS17;AnyDAC_PhysMSAcc_D17;dxServerModeRS17;cxPivotGridOLAPRS17;cxSchedulerRS17;MetropolisUILiveTile;dxSkinPumpkinRS17;dxPSLnksRS17;AnyDAC_PhysSQLITE_D17;dxPSdxDBOCLnkRS17;cxVerticalGridRS17;dxSkinSpringTimeRS17;vcldsnap;GLS_Computing_RunTime;dacvcl170;dxSkinDevExpressDarkStyleRS17;DBXDb2Driver;AnyDAC_ComI_D17;DBXOracleDriver;dxSkinLiquidSkyRS17;JvCore;AnyDAC_PhysMSSQL_D17;vclribbon;AnyDAC_Comp_D17;cxSpreadSheetRS17;AnyDAC_PhysODBC_D17;fmxase;vcl;dxSkinOffice2007SilverRS17;AnyDAC_PhysPg_D17;CodeSiteExpressPkg;DBXMSSQLDriver;IndyIPCommon;dxPSdxOCLnkRS17;FFmpegVcl_DXE3;dcldxSkinsCoreRS17;JvAppFrm;AnyDAC_PhysASA_D17;inetdbxpress;webdsnap;IcsVclDXE3Run;dxSkinCoffeeRS17;AnyDAC_PhysOracle_D17;JvDocking;adortl;dxSkinscxSchedulerPainterRS17;JvWizards;frx17;JvHMI;dxtrmdRS17;dxPScxPCProdRS17;AnyDAC_GUIxForms_D17;JvBands;ZDbc;rtl;DbxClientDriver;dxTabbedMDIRS17;dxSkinSharpPlusRS17;dxComnRS17;ZPlain;dxSkinsCoreRS17;dxSkinLondonLiquidSkyRS17;dxdbtrRS17;JclContainers;Tee;JvSystem;dxorgcRS17;svnui;dxSkinBlackRS17;JvControls;IndyProtocols;DBXMySQLDriver;dxLayoutControlRS17;bindcompdbx;TeeUI;JvJans;JvPrintPreview;JvPageComps;JvStdCtrls;JvCustom;dxSkinOffice2007BlueRS17;dxPScxPivotGridLnkRS17;dxSpellCheckerRS17;ZCore;vcltouch;dxSkinOffice2007GreenRS17;dxSkinSharpRS17;websnap;dxSkinFoggyRS17;dxTileControlRS17;VclSmp;dxSkinDarkSideRS17;cxPivotGridRS17;DataSnapConnectors;AnyDAC_Phys_D17;dacfmx170;fmxobj;cxTreeListRS17;JclVcl;dxPSdxFCLnkRS17;dxSkinGlassOceansRS17;unidacvcl170;ZParseSql;frxe17;svn;dxFlowChartRS17;fmxdae;dxSkinsdxNavBarPainterRS17;bdertl;ExpertTools;DataSnapIndy10ServerTransport;dxDBXServerModeRS17;dxSkinCaramelRS17;$(DCC_UsePackage)</DCC_UsePackage>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<DCC_UsePackage>cxPivotGridChartRS17;dxSkinSevenRS17;dxSkinBlueprintRS17;dxSkinHighContrastRS17;dxSkinOffice2007BlackRS17;dxCoreRS17;cxPageControldxBarPopupMenuRS17;dxSkinXmas2008BlueRS17;dxPSDBTeeChartRS17;dxPSTeeChartRS17;dxSkinSummer2008RS17;dxPScxSchedulerLnkRS17;dxSkinBlueRS17;dxSkinDarkRoomRS17;DBXInterBaseDriver;DataSnapServer;DataSnapCommon;dxPScxTLLnkRS17;officeXPrt;dxRibbonRS17;DbxCommonDriver;cxDataRS17;vclimg;dxSkinsdxBarPainterRS17;dxPSdxDBTVLnkRS17;dbxcds;DatasnapConnectorsFreePascal;dxSkinMoneyTwinsRS17;vcldb;cxExportRS17;dxPSCoreRS17;dxBarExtItemsRS17;dxGDIPlusRS17;dxNavBarRS17;CustomIPTransport;cxLibraryRS17;cxGridRS17;dxSkinOffice2010BlackRS17;dsnap;IndyIPServer;IndyCore;dxSkinMcSkinRS17;CloudService;dxPScxCommonRS17;FmxTeeUI;dxSkinsdxDLPainterRS17;dxSkiniMaginaryRS17;AnyDAC_PhysDb2_D17;dxPScxVGridLnkRS17;dxSkinSevenClassicRS17;dxPScxExtCommonRS17;dxPScxSSLnkRS17;dxSkinLilianRS17;dxPSdxLCLnkRS17;dxSkinOffice2010BlueRS17;bindcompfmx;dxSkinOffice2010SilverRS17;cxSchedulerGridRS17;dbrtl;bindcomp;inetdb;dxBarRS17;IcsCommonDXE3Run;DBXOdbcDriver;dxBarDBNavRS17;dxSkinWhiteprintRS17;xmlrtl;dxSkinsdxRibbonPainterRS17;ibxpress;dxDockingRS17;bindengine;vclactnband;soaprtl;FMXTee;dxADOServerModeRS17;bindcompvcl;dxBarExtDBItemsRS17;vclie;dxPSPrVwRibbonRS17;dxSkinOffice2007PinkRS17;IcsFmxDXE3Run;cxPageControlRS17;dxSkinscxPCPainterRS17;AnyDAC_PhysADS_D17;AnyDAC_PhysIB_D17;dxmdsRS17;dxSkinTheAsphaltWorldRS17;DBXInformixDriver;Intraweb;dxPsPrVwAdvRS17;dxSkinSilverRS17;dxdborRS17;DBXFirebirdDriver;dsnapcon;inet;vclx;dxSkinStardustRS17;cxEditorsRS17;DBXSybaseASADriver;dbexpress;IndyIPClient;AnyDAC_PhysMySQL_D17;cxTreeListdxBarPopupMenuRS17;dxSkinVS2010RS17;ZComponent;dxThemeRS17;DBXSqliteDriver;dxPScxGridLnkRS17;fmx;IndySystem;TeeDB;dxSkinValentineRS17;vclib;DataSnapClient;dxSkinDevExpressStyleRS17;DataSnapProviderClient;DBXSybaseASEDriver;cxBarEditItemRS17;AnyDAC_PhysMSAcc_D17;dxServerModeRS17;cxPivotGridOLAPRS17;cxSchedulerRS17;MetropolisUILiveTile;dxSkinPumpkinRS17;dxPSLnksRS17;AnyDAC_PhysSQLITE_D17;dxPSdxDBOCLnkRS17;cxVerticalGridRS17;dxSkinSpringTimeRS17;vcldsnap;dxSkinDevExpressDarkStyleRS17;DBXDb2Driver;AnyDAC_ComI_D17;DBXOracleDriver;dxSkinLiquidSkyRS17;AnyDAC_PhysMSSQL_D17;vclribbon;AnyDAC_Comp_D17;cxSpreadSheetRS17;AnyDAC_PhysODBC_D17;fmxase;vcl;dxSkinOffice2007SilverRS17;AnyDAC_PhysPg_D17;DBXMSSQLDriver;IndyIPCommon;dxPSdxOCLnkRS17;dcldxSkinsCoreRS17;AnyDAC_PhysASA_D17;inetdbxpress;webdsnap;IcsVclDXE3Run;dxSkinCoffeeRS17;AnyDAC_PhysOracle_D17;adortl;dxSkinscxSchedulerPainterRS17;dxtrmdRS17;dxPScxPCProdRS17;AnyDAC_GUIxForms_D17;ZDbc;rtl;DbxClientDriver;dxTabbedMDIRS17;dxSkinSharpPlusRS17;dxComnRS17;ZPlain;dxSkinsCoreRS17;dxSkinLondonLiquidSkyRS17;dxdbtrRS17;Tee;dxorgcRS17;dxSkinBlackRS17;IndyProtocols;DBXMySQLDriver;dxLayoutControlRS17;bindcompdbx;TeeUI;dxSkinOffice2007BlueRS17;dxPScxPivotGridLnkRS17;dxSpellCheckerRS17;ZCore;vcltouch;dxSkinOffice2007GreenRS17;dxSkinSharpRS17;websnap;dxSkinFoggyRS17;dxTileControlRS17;VclSmp;dxSkinDarkSideRS17;cxPivotGridRS17;DataSnapConnectors;AnyDAC_Phys_D17;fmxobj;cxTreeListRS17;dxPSdxFCLnkRS17;dxSkinGlassOceansRS17;ZParseSql;dxFlowChartRS17;fmxdae;dxSkinsdxNavBarPainterRS17;DataSnapIndy10ServerTransport;dxDBXServerModeRS17;dxSkinCaramelRS17;$(DCC_UsePackage)</DCC_UsePackage>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
<DCC_DebugDCUs>true</DCC_DebugDCUs>
<DCC_Optimize>false</DCC_Optimize>
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<DCC_RemoteDebug>true</DCC_RemoteDebug>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<DCC_RemoteDebug>false</DCC_RemoteDebug>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<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_Win32)'!=''">
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="uMainForm.pas">
<Form>MainForm</Form>
</DCCReference>
<BuildConfiguration Include="Release">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Debug">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType/>
<BorlandProject>
<Delphi.Personality>
<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>
<Source>
<Source Name="MainSource">vclColorTracking.dpr</Source>
</Source>
</Delphi.Personality>
<Deployment/>
<Platforms>
<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>