Как отфильтровать VNBarcodeObservation для дубликатов - PullRequest
0 голосов
/ 20 октября 2019

Я использую зрение для обнаружения штрих-кодов. Однако в некоторых случаях я получаю 14 результатов для одного и того же штрих-кода, и его штрихи не пересекаются. Как мне отфильтровать его (оно должно работать, если изображение имеет несколько штрих-кодов с одинаковой полезной строкой)

enter image description here

<__NSArrayI 0x600002c30b80>(
<VNBarcodeObservation: 0x60000352de40> 07F1C42E-294A-4DE7-869F-D3F09AAC431C, revision 1, 0.862163 [0.132208 0.242925 0.714649 0.0141509] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000352d6b0> E6B66CD4-EB56-41E2-A1F7-A03E0D241834, revision 1, 0.862163 [0.132208 0.488208 0.714649 0.0235849] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000352c9a0> 0C220EDA-6372-4060-8D23-649C3964FD9A, revision 1, 0.862163 [0.132208 0.535377 0.714649 0.0141509] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000352d760> B7463F3C-A4FF-4701-B9C3-89AE1116104F, revision 1, 0.862163 [0.132208 0.445755 0.714649 0.0141509] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000352d810> C29FCF2F-AAAA-4066-B0B8-054C70750F07, revision 1, 0.862163 [0.132208 0.549528 0.714649 0.0141509] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000352d8c0> D4B4E4D5-BAA2-49DF-990B-E66EA286FFB8, revision 1, 0.862163 [0.132208 0.431604 0.714649 0.0141509] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000352dad0> 60C6B5F1-7F09-44B9-9480-8815D1BE8DEB, revision 1, 0.862163 [0.132208 0.615566 0.714649 0.0141509] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000352db80> 53CAF7DD-9FA6-4630-A5F5-D9874B27CC4B, revision 1, 0.862163 [0.132208 0.365566 0.714649 0.0141509] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000352dc30> 0E434398-7B0F-40EF-BF75-A917BD2E9F4A, revision 1, 0.862163 [0.132208 0.676887 0.714649 0.0141509] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000352dce0> 6E7C45BF-A0F7-496F-87D2-0FF878BBB42B, revision 1, 0.862163 [0.132208 0.304245 0.714649 0.0141509] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000352dd90> C6C19C7A-26DE-4415-8622-DF48CB23D441, revision 1, 0.862163 [0.132208 0.738208 0.714649 0.0141509] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000352def0> C32F2A82-419D-4913-963E-0A7DDE1C59CA, revision 1, 0.862163 [0.132208 0.865566 0.714649 0.0141509] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000352d970> 647F0ACC-562F-4FA0-831C-2E71026B39AF, revision 1, 0.786768 [0.130136 0.312306 0.718435 0.386501] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000352da20> 9A28A5CB-E2E7-477F-B3FB-664F6D8A6E85, revision 1, 0.786768 [0.130136 0.301193 0.718435 0.386501] VNBarcodeSymbologyEAN13 (0614141007349)
)

0.786768 и 0.862163 является уверенным декодированием

код:

@implementation VisionBarcodeResult

+ (instancetype)resultWithRect:(CGRect)aRect payload:(NSString *)payload
{
    VisionBarcodeResult *result = [[VisionBarcodeResult alloc] init];
    result.rectAsValue = [NSValue valueWithRect:aRect];
    result.payload = [payload copy];
    return result;
}

- (BOOL)isEqual:(VisionBarcodeResult *)object
{
    if ([object isKindOfClass:[VisionBarcodeResult class]] == NO) {
        return NO;
    }
    if ([[object payload] isEqualToString:[self payload]] == NO) {
        return NO;
    }
    CGRect objectRect = [[object rectAsValue] rectValue];
    CGRect rect = [[self rectAsValue] rectValue];
    CGRect testRect = CGRectIntersection(objectRect, rect);
    BOOL hasIntersectionRect = CGRectIntersectsRect(objectRect, rect); //this returns NO
    return hasIntersectionRect;
}

@end

повернутый штрих-код: enter image description here

<VNBarcodeObservation: 0x6000035180b0> 08C43A9E-E128-4367-A0F5-A146C7F80585, revision 1, 0.836489 [0.272847 0.558402 0.539022 0.00614754] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x600003518210> BF252820-1DDA-40A4-AD7A-D75862C327ED, revision 1, 0.833157 [0.244318 0.433402 0.539017 0.00614754] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x6000035182c0> 9EA78ECD-5AF2-4AE0-97B0-FF3AD0CB87F3, revision 1, 0.831615 [0.286828 0.619877 0.539105 0.00614754] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x60000350c000> AD95C351-6B59-4CE7-BF92-75B2087442E0, revision 1, 0.829899 [0.262993 0.515369 0.53903 0.00614754] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x600003508000> 7F41DED3-1031-41F0-8032-BAE3889A7546, revision 1, 0.826128 [0.254106 0.476434 0.539093 0.00614754] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x600003529600> 92F28ED8-78E1-4F44-B715-5043A1F2E393, revision 1, 0.815060 [0.258704 0.494877 0.539153 0.0102459] VNBarcodeSymbologyEAN13 (0614141007349),
<VNBarcodeObservation: 0x6000035296b0> 2E22E903-6F67-447F-9D0E-E2CECD638610, revision 1, 0.808241 [0.271471 0.425747 0.510506 0.134987] VNBarcodeSymbologyEAN13 (0614141007349)

обратный инжиниринг

(lldb) br set -r "setACBSBarcodeInfo"
Breakpoint 8: where = Vision`-[VNBarcodeObservation setACBSBarcodeInfo:], address = 0x00007fff57649f17
(lldb) po $rdx
{
    BarcodeRawData = <00060104 01040100 00070304 09>;
    BarcodeType = EAN13;
    CodeLocation =     (
                {
            X = "181.0926055908203";
            Y = "241.5";
        },
                {
            X = "181.0926055908203";
            Y = "246.5";
        },
                {
            X = "558.4996948242188";
            Y = "246.5";
        },
                {
            X = "558.4996948242188";
            Y = "241.5";
        }
    );
    CodeProperties =     {
        DataCodewordsHigh = 1;
        DataCodewordsWide = 13;
    };
    DecodeConfidence = "0.8150604";
}
...