Sdílet prostřednictvím


Extraktor objektu obrázku

Pomocí extraktoru objektu obrázku můžete identifikovat konkrétní objekty na obrázku. Model zpracuje jak obrázek, tak i objekt "nápovědy" a vrátí masku identifikovaného objektu.

Podrobnosti o rozhraní API najdete v tématu Referenční informace k rozhraní API pro funkce vytváření obrázků AI.

Podrobnosti o moderování obsahu najdete v tématu Zabezpečení obsahu pomocí rozhraní API pro generování AI.

Důležité

Požadavky manifestu balíčku: Aby bylo možné používat rozhraní API Windows AI pro zpracování obrazu, musí být vaše aplikace zabalená jako balíček MSIX s deklarovanou systemAIModels možností ve vašem Package.appxmanifest manifestu. Kromě toho se ujistěte, že je atribut manifestu MaxVersionTested nastavený na nejnovější verzi Windows (např 10.0.26226.0 . nebo novější), aby správně podporoval funkce AI systému Windows. Použití starších hodnot může při načítání modelu způsobit chyby "Není deklarováno aplikací".

<Dependencies>
  <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.26226.0" />
  <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.26226.0" />
</Dependencies>

Poskytování tipů

Nápovědu můžete poskytnout libovolnou kombinací následujících možností:

  • Souřadnice bodů, které patří k tomu, co identifikujete.
  • Souřadnice bodů, které nepatří do toho, co identifikujete.
  • Souřadnicový obdélník, který zahrnuje to, co identifikujete.

Čím více tipů zadáte, tím přesnější může být model. Pokud chcete minimalizovat nepřesné výsledky nebo chyby, postupujte podle těchto pokynů.

  • Vyhněte se použití více obdélníků v nápovědě, protože mohou vytvořit nepřesnou masku.
  • Vyhněte se použití vyloučení bodů výhradně bez zahrnutí bodů nebo obdélníku.
  • Nezadávejte více než podporované maximum 32 souřadnic (1 pro bod, 2 pro obdélník), protože to vrátí chybu.

Vrácená maska je v osmibitové stupnici šedi, kde pixely masky pro identifikovaný objekt mají hodnotu 255 (všechny ostatní mají hodnotu 0).

Příklad extraktoru objektů obrázku

Následující příklady ukazují způsoby identifikace objektu v obrázku. V příkladech se předpokládá, že pro vstup již máte objekt rastrového obrázku softwaru (softwareBitmap).

  1. Ujistěte se, že je model extraktoru objektu obrázku k dispozici zavoláním metody GetReadyState a vyčkejte na úspěšný návrat metody EnsureReadyAsync.

  2. Jakmile je k dispozici model Image Object Extractor, vytvořte objekt ImageObjectExtractor, který na něj bude odkazovat.

  3. Předejte obrázek CreateWithSoftwareBitmapAsync.

  4. Vytvoření ImageObjectExtractorHint objektu. Další způsoby vytvoření objektu nápovědy s různými vstupy jsou demonstrována později.

  5. Pomocí metody GetSoftwareBitmapObjectMask odešlete nápovědu k modelu, který vrátí konečný výsledek.

using Microsoft.Graphics.Imaging;
using Microsoft.Windows.AI;
using Microsoft.Windows.Management.Deployment;
using Windows.Graphics.Imaging;

if (ImageObjectExtractor.GetReadyState() == AIFeatureReadyState.NotReady) 
{
    var result = await ImageObjectExtractor.EnsureReadyAsync();
    if (result.Status != AIFeatureReadyResultState.Success)
    {
        throw result.ExtendedError;
    }
}

ImageObjectExtractor imageObjectExtractor = await ImageObjectExtractor.CreateWithSoftwareBitmapAsync(softwareBitmap);

ImageObjectExtractorHint hint = new ImageObjectExtractorHint{
    includeRects: null, 
    includePoints:
        new List<PointInt32> { new PointInt32(306, 212),
                               new PointInt32(216, 336)},
    excludePoints: null};
SoftwareBitmap finalImage = imageObjectExtractor.GetSoftwareBitmapObjectMask(hint);
#include <winrt/Microsoft.Graphics.Imaging.h> 
#include <winrt/Microsoft.Windows.AI.Imaging.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Foundation.h>
using namespace winrt::Microsoft::Graphics::Imaging; 
using namespace winrt::Microsoft::Windows::AI.Imaging;
using namespace winrt::Windows::Graphics::Imaging; 
using namespace winrt::Windows::Foundation;

if (ImageObjectExtractor::GetReadyState() == AIFeatureReadyState::NotReady)
{
    auto loadResult = ImageObjectExtractor::EnsureReadyAsync().get();

    if (loadResult.Status() != AIFeatureReadyResultState::Success)
    {
        throw winrt::hresult_error(loadResult.ExtendedError());
    }
}

ImageObjectExtractor imageObjectExtractor = ImageObjectExtractor::CreateWithSoftwareBitmapAsync(softwareBitmap).get();

ImageObjectExtractorHint hint(
    {},
    {
        Windows::Graphics::PointInt32{306, 212},        
        Windows::Graphics::PointInt32{216, 336}
    },
    {}
);

Windows::Graphics::Imaging::SoftwareBitmap finalImage = imageObjectExtractor.GetSoftwareBitmapObjectMask(hint);

Určete nápovědy se zahrnutými a vyloučenými body

Tento fragment kódu ukazuje, jak jako nápovědu použít zahrnuté i vyloučené body.

ImageObjectExtractorHint hint(
    includeRects: null,
    includePoints: 
        new List<PointInt32> { new PointInt32(150, 90), 
                               new PointInt32(216, 336), 
                               new PointInt32(550, 330)},
    excludePoints: 
        new List<PointInt32> { new PointInt32(306, 212) });
ImageObjectExtractorHint hint(
    {}, 
    { 
        PointInt32{150, 90}, 
        PointInt32{216, 336}, 
        PointInt32{550, 330}
    },
    { 
        PointInt32{306, 212}
    }
);

Zadejte nápovědy obdélníkem

Tento fragment kódu ukazuje, jak jako nápovědu použít obdélník (RectInt32 je X, Y, Width, Height).

ImageObjectExtractorHint hint(
    includeRects: 
        new List<RectInt32> {new RectInt32(370, 278, 285, 126)},
    includePoints: null,
    excludePoints: null ); 
ImageObjectExtractorHint hint(
    { 
        RectInt32{370, 278, 285, 126}
    }, 
    {},
    {}
);

Viz také