One I made works great IMO:
{
FindObjDual(TPA, Dist, XSortFrom, YSortFrom,
Color1, Tol1, HMod1, SMod1, MinCount1,
Color2, Tol2, HMod2, SMod2, MinCount2)
}
function FindObjDual(var TPAResult: TPointArray;
Dist, XSortFrom, YSortFrom: Integer;
Color1, Tol1: Integer; HMod1, SMod1: Extended; MinCount1: Integer;
Color2, Tol2: Integer; HMod2, SMod2: Extended; MinCount2: Integer): Boolean;
var
CTS, I, II: Integer;
TPA1, TPA2, TPA3, TPA4, TPA5: TPointArray;
ATPA1: T2DPointArray;
Box1: TBox;
Point1: TPoint;
begin
TPAResult := [];
CTS := GetColorToleranceSpeed;
ColorToleranceSpeed(2);
SetColorSpeed2Modifiers(HMod1, SMod1);
FindColorsTolerance(TPA1, Color1, MSX1, MSY1, MSX2, MSY2, Tol1);
SetColorSpeed2Modifiers(HMod2, SMod2);
FindColorsTolerance(TPA2, Color2, MSX1, MSY1, MSX2, MSY2, Tol2);
ColorToleranceSpeed(CTS);
TPA3 := CombineTPA(TPA1, TPA2);
ATPA1 := SplitTPA(TPA3, Dist);
for I := 0 to High(ATPA1) do
begin
Box1 := GetTPABounds(ATPA1[I]);
TPA4 := [];
TPA5 := [];
for II := 0 to High(TPA1) do
begin
if (InRange(TPA1[II].X, Box1.X1, Box1.X2)
and InRange(TPA1[II].Y, Box1.Y1, Box1.Y2)) then
begin
TPA4 := CombineTPA(TPA4, [TPA1[II]]);
end;
end;
for II := 0 to High(TPA2) do
begin
if (InRange(TPA2[II].X, Box1.X1, Box1.X2)
and InRange(TPA2[II].Y, Box1.Y1, Box1.Y2)) then
begin
TPA5 := CombineTPA(TPA5, [TPA2[II]]);
end;
end;
if (Length(TPA4) >= MinCount1) and (Length(TPA5) >= MinCount2) then
begin
Point1 := IntToPoint(Box1.X1 + ((Box1.X2 - Box1.X1) / 2), Box1.Y1
+ ((Box1.Y2 - Box1.Y1) / 2));
TPAResult := CombineTPA(TPAResult, [Point1]);
end;
end;
SortTPAFrom(TPAResult, IntToPoint(XSortFrom, YSortFrom));
if (Length(TPAResult) > 0) then
Result := True;
end;
It's like FindObjTPA (uses MinCount) but with 2 colors (and cts2) so way more accurate.
If you want to know how to use it take a look at my tanner script, link in signature. If you need more help just ask.