Zadanie Punkt orientacyjny umiejscowienia pozwala wykryć punkty orientacyjne ludzkich ciał na zdjęciach lub film. Możesz użyć tego zadania, aby zidentyfikować kluczowe lokalizacje ciała, przeanalizować postawę i kategoryzować ruchy. W tym zadaniu używane są modele systemów uczących się, które działają z pojedynczymi obrazami lub filmami. Zadanie generuje na obrazie punkty orientacyjne w pozycji ciała i trójwymiarowych współrzędnych świata.
Te instrukcje pokazują, jak korzystać z punktu orientacyjnego pose w aplikacjach na iOS. Kod przykład opisany w tych instrukcjach jest dostępny GitHub
Aby zobaczyć, jak działa to zadanie, wejdź na tę stronę wersji demonstracyjnej. Więcej informacji o funkcjach, modelach i opcjach konfiguracji zapoznaj się z Przegląd.
Przykładowy kod
Przykładowy kod MediaPipe Tasks to podstawowa implementacja punktu orientacyjnego Pozycja na iOS. W tym przykładzie używamy aparatu w fizycznym urządzeniu z iOS, aby wykryć Wykrywaj pozy w ciągłym strumieniu wideo. Aplikacja może też wykrywać pozy w obrazów i filmów z galerii urządzenia.
Możesz użyć tej aplikacji jako punktu wyjścia dla własnej aplikacji na iOS lub skorzystać z niej podczas modyfikowania istniejącej aplikacji. Przykładowy kod punktu orientacyjnego położenia jest hostowany GitHub
Pobieranie kodu
Poniżej znajdziesz instrukcje tworzenia lokalnej kopii przykładu. za pomocą narzędzia wiersza poleceń git.
Aby pobrać przykładowy kod:
Sklonuj repozytorium git za pomocą tego polecenia:
git clone https://github.com/google-ai-edge/mediapipe-samples
Opcjonalnie możesz skonfigurować instancję git tak, aby wykorzystywała rozproszony proces płatności, aby tylko pliki przykładowej aplikacji Pose Notebooker:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/pose_landmarker/ios/
Po utworzeniu lokalnej wersji przykładowego kodu możesz zainstalować w bibliotece zadań MediaPipe, otwórz projekt za pomocą Xcode i uruchom aplikację. Dla: więcej instrukcji znajdziesz w Przewodniku po konfiguracji na iOS.
Kluczowe elementy
Te pliki zawierają istotny kod przykładowego punktu orientacyjnego Pose Notebooker aplikacja:
- PoseLandmarkerService.swift: Inicjuje punkt orientacyjny, obsługuje wybór modelu i uruchamia wnioskowanie na danych wejściowych.
- CameraViewController: Implementuje interfejs trybu wprowadzania obrazu z kamery na żywo i wizualizuje punkty orientacyjne.
- MediaLibraryViewController.swift: ma interfejs dla trybu wprowadzania zdjęć i filmów oraz umożliwia wizualizację punktów orientacyjnych.
Konfiguracja
W tej sekcji opisujemy najważniejsze czynności związane z konfigurowaniem środowiska programistycznego oraz w projektach kodu, w których można używać punktów orientacyjnych. Ogólne informacje o konfigurowaniu środowisko programistyczne do używania zadań MediaPipe, w tym wersja platformy wymagania znajdziesz w przewodniku konfiguracji dla iOS.
Zależności
Punkt orientacyjny pozycji korzysta z biblioteki MediaPipeTasksVision
, którą trzeba zainstalować
za pomocą CocoaPods. Biblioteka jest zgodna z aplikacjami Swift i Objective-C.
i nie wymaga żadnej dodatkowej konfiguracji.
Instrukcje instalowania CocoaPods w macOS znajdziesz w CocoaPods
przewodnik instalacji.
Aby dowiedzieć się, jak utworzyć Podfile
z podami niezbędnymi dla Twojego
aplikacji można znaleźć w sekcji Korzystanie
CocoaPods.
Dodaj pod MediaPipeTasksVision w tabeli Podfile
przy użyciu tego kodu:
target 'MyPoseLandmarkerApp' do
use_frameworks!
pod 'MediaPipeTasksVision'
end
Jeśli Twoja aplikacja zawiera cele testów jednostkowych, zapoznaj się z przewodnikiem po konfiguracji
iOS, gdzie znajdziesz dodatkowe informacje o konfigurowaniu
Podfile
.
Model
Zadanie MediaPipe Pose Markuper wymaga wytrenowanego pakietu, który jest zgodny w tym zadaniu. Więcej informacji o dostępnych wytrenowanych modelach dla Punkt orientacyjny pozycjonowania, zobacz omówienie zadania Modele .
Skorzystaj z funkcji download_models.sh
skrypt
aby pobrać modele i dodać je do katalogu projektu za pomocą Xcode. Dla:
instrukcje dodawania plików do projektu Xcode znajdziesz w sekcji Zarządzanie plikami
i folderów w Xcode
projekt.
Użyj właściwości BaseOptions.modelAssetPath
, aby określić ścieżkę do modelu
w pakiecie aplikacji. Przykładowy kod znajdziesz w następnej sekcji.
Tworzenie zadania
Działanie punktu orientacyjnego możesz utworzyć, wywołując jeden z jego inicjatorów.
Inicjator PoseLandmarker(options:)
akceptuje wartości konfiguracji
.
Jeśli nie potrzebujesz punktu orientacyjnego Pose zainicjowanego z niestandardową konfiguracją
możesz użyć inicjatora PoseLandmarker(modelPath:)
do utworzenia
Ustaw punkt orientacyjny z domyślnymi opcjami. Więcej informacji o konfiguracji
Więcej informacji znajdziesz w artykule Omówienie konfiguracji.
Zadanie „Punkt orientacyjny pozycji” obsługuje 3 typy danych wejściowych: obrazy i pliki wideo
i transmisje wideo na żywo. Domyślnie PoseLandmarker(modelPath:)
inicjuje
dla nieruchomych obrazów. Jeśli chcesz, aby zadanie zostało zainicjowane do przetworzenia filmu
plików lub transmisji wideo na żywo, użyj właściwości PoseLandmarker(options:)
, aby określić wideo.
czy w trybie biegowym transmisji na żywo. Tryb transmisji na żywo wymaga też dodatkowych
poseLandmarkerLiveStreamDelegate
, która włącza
Ustaw punkt orientacyjny, aby przekazać przedstawicielowi wyniki wykrywania punktu orientacyjnego ułożenia
asynchronicznie.
Wybierz kartę odpowiadającą Twojemu trybowi biegowemu, aby zobaczyć, jak utworzyć zadanie i prowadź wnioskowanie.
Swift
Obraz
import MediaPipeTasksVision let modelPath = Bundle.main.path(forResource: "pose_landmarker", ofType: "task") let options = PoseLandmarkerOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .image options.minPoseDetectionConfidence = minPoseDetectionConfidence options.minPosePresenceConfidence = minPosePresenceConfidence options.minTrackingConfidence = minTrackingConfidence options.numPoses = numPoses let poseLandmarker = try PoseLandmarker(options: options)
Wideo
import MediaPipeTasksVision let modelPath = Bundle.main.path(forResource: "pose_landmarker", ofType: "task") let options = PoseLandmarkerOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .video options.minPoseDetectionConfidence = minPoseDetectionConfidence options.minPosePresenceConfidence = minPosePresenceConfidence options.minTrackingConfidence = minTrackingConfidence options.numPoses = numPoses let poseLandmarker = try PoseLandmarker(options: options)
Transmisja na żywo
import MediaPipeTasksVision // Class that conforms to the `PoseLandmarkerLiveStreamDelegate` protocol and // implements the method that the pose landmarker calls once it finishes // performing pose landmark detection in each input frame. class PoseLandmarkerResultProcessor: NSObject, PoseLandmarkerLiveStreamDelegate { func poseLandmarker( _ poseLandmarker: PoseLandmarker, didFinishDetection result: PoseLandmarkerResult?, timestampInMilliseconds: Int, error: Error?) { // Process the pose landmarker result or errors here. } } let modelPath = Bundle.main.path(forResource: "pose_landmarker", ofType: "task") let options = PoseLandmarkerOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .liveStream options.minPoseDetectionConfidence = minPoseDetectionConfidence options.minPosePresenceConfidence = minPosePresenceConfidence options.minTrackingConfidence = minTrackingConfidence options.numPoses = numPoses // Assign an object of the class to the `poseLandmarkerLiveStreamDelegate` // property. let processor = PoseLandmarkerResultProcessor() options.poseLandmarkerLiveStreamDelegate = processor let poseLandmarker = try PoseLandmarker(options: options)
Objective-C
Obraz
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"pose_landmarker" ofType:@"task"]; MPPPoseLandmarkerOptions *options = [[MPPPoseLandmarkerOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeImage; options.minPoseDetectionConfidence = minPoseDetectionConfidence; options.minPosePresenceConfidence = minPosePresenceConfidence; options.minTrackingConfidence = minTrackingConfidence; options.numPoses = numPoses; MPPPoseLandmarker *poseLandmarker = [[MPPPoseLandmarker alloc] initWithOptions:options error:nil];
Wideo
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"pose_landmarker" ofType:@"task"]; MPPPoseLandmarkerOptions *options = [[MPPPoseLandmarkerOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeVideo; options.minPoseDetectionConfidence = minPoseDetectionConfidence; options.minPosePresenceConfidence = minPosePresenceConfidence; options.minTrackingConfidence = minTrackingConfidence; options.numPoses = numPoses; MPPPoseLandmarker *poseLandmarker = [[MPPPoseLandmarker alloc] initWithOptions:options error:nil];
Transmisja na żywo
@import MediaPipeTasksVision; // Class that conforms to the `MPPPoseLandmarkerLiveStreamDelegate` protocol // and implements the method that the pose landmarker calls once it finishes // performing pose landmarks= detection in each input frame. @interface APPPoseLandmarkerResultProcessor : NSObject@end @implementation APPPoseLandmarkerResultProcessor - (void)poseLandmarker:(MPPPoseLandmarker *)poseLandmarker didFinishDetectionWithResult:(MPPPoseLandmarkerResult *)poseLandmarkerResult timestampInMilliseconds:(NSInteger)timestampInMilliseconds error:(NSError *)error { // Process the pose landmarker result or errors here. } @end NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"pose_landmarker" ofType:@"task"]; MPPPoseLandmarkerOptions *options = [[MPPPoseLandmarkerOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeLiveStream; options.minPoseDetectionConfidence = minPoseDetectionConfidence; options.minPosePresenceConfidence = minPosePresenceConfidence; options.minTrackingConfidence = minTrackingConfidence; options.numPoses = numPoses; // Assign an object of the class to the `poseLandmarkerLiveStreamDelegate` // property. APPPoseLandmarkerResultProcessor *processor = [APPPoseLandmarkerResultProcessor new]; options.poseLandmarkerLiveStreamDelegate = processor; MPPPoseLandmarker *poseLandmarker = [[MPPPoseLandmarker alloc] initWithOptions:options error:nil];
Uwaga: jeśli używasz trybu wideo lub transmisji na żywo, śledzenie w celu uniknięcia uruchomienia modelu wykrywania dłoni w każdej ramce, co pomaga i zmniejszyć opóźnienia.
Opcje konfiguracji
To zadanie zawiera te opcje konfiguracji aplikacji na iOS:
Nazwa opcji | Opis | Zakres wartości | Wartość domyślna |
---|---|---|---|
running_mode |
Ustawia tryb działania zadania. Są trzy
tryby: IMAGE: tryb wprowadzania pojedynczego obrazu. WIDEO: tryb zdekodowanych klatek filmu. LIVE_STREAM: tryb transmisji danych wejściowych na przykład z kamery. W tym trybie zasada poseLandmarkerLiveStreamDelegate musi mieć wartość
instancję klasy, która implementuje funkcję
PoseLandmarkerLiveStreamDelegate , aby otrzymać wyniki
asynchronicznego wykrywania punktów orientacyjnych
|
{RunningMode.image, RunningMode.video, RunningMode.liveStream } |
RunningMode.image |
num_poses |
Maksymalna liczba pozycji, które może wykryć Punkt orientacyjny. | Integer > 0 |
1 |
min_pose_detection_confidence |
Minimalny wskaźnik ufności, z którego ustala się pozycję została uznana za udaną. | Float [0.0,1.0] |
0.5 |
min_pose_presence_confidence |
Minimalny wskaźnik ufności obecności pozycji podczas wykrywania punktów orientacyjnych. | Float [0.0,1.0] |
0.5 |
min_tracking_confidence |
Minimalny wynik ufności dla śledzenia pozycji można uznać za udany. | Float [0.0,1.0] |
0.5 |
output_segmentation_masks |
Określa, czy punkt orientacyjny położenia wyświetla maskę segmentacji dla wykrytego w pozycji. | Boolean |
False |
result_callback |
Konfiguruje detektor wyników tak, aby otrzymywał wyniki z punktu orientacyjnego
asynchronicznie wtedy, gdy Pose Notebooker jest w trybie transmisji na żywo.
Tej opcji można używać tylko wtedy, gdy tryb działania jest ustawiony na LIVE_STREAM |
ResultListener |
N/A |
Konfiguracja transmisji na żywo
Gdy tryb biegowy jest ustawiony na transmisję na żywo, punkt orientacyjny pozycji wymaga parametru
dodatkową opcję konfiguracji poseLandmarkerLiveStreamDelegate
, która
umożliwia zarysowanie położenia punktów orientacyjnych przy użyciu punktów orientacyjnych
asynchronicznie. Przedstawiciel musi zaimplementować
poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)
,
które nazywa się punkt orientacyjny pozy po przetworzeniu wyników pozycji
wykrywanie punktów orientacyjnych w każdej ramce.
Nazwa opcji | Opis | Zakres wartości | Wartość domyślna |
---|---|---|---|
poseLandmarkerLiveStreamDelegate |
Włącza punkt orientacyjny umiejscowienia, aby otrzymać wyniki określonej pozycji
asynchroniczne wykrywanie punktów orientacyjnych w trybie transmisji na żywo. Klasa, której
instancji jest ustawiona na tę właściwość, musi implementować
poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)
. |
Nie dotyczy | Nie ustawiono |
Przygotuj dane
Musisz przekonwertować obraz lub ramkę wejściową na obiekt MPImage
przed
i przekazujemy ją do punktu orientacyjnego pozycji. MPImage
obsługuje różne typy obrazów z iOS
formatów i używać ich w dowolnym trybie działania do wnioskowania. Więcej
informacje na temat marki MPImage
znajdziesz w
Interfejs MPImage API
Wybierz format obrazu na iOS na podstawie swojego przypadku użycia i trybu uruchamiania
wymagane jest zgłoszenie.MPImage
akceptuje UIImage
, CVPixelBuffer
i
CMSampleBuffer
Formaty obrazów w iOS.
UIImage
Format UIImage
sprawdza się w tych trybach biegu:
Obrazy: obrazy z pakietu aplikacji, galerii użytkownika lub systemu plików w formacie Obrazy (
UIImage
) można przekonwertować na obiektMPImage
.Filmy: użyj narzędzia AVAssetImageGenerator. aby wyodrębnić klatki wideo do CGImage a potem przekonwertuj je na
UIImage
obrazy.
Swift
// Load an image on the user's device as an iOS `UIImage` object. // Convert the `UIImage` object to a MediaPipe's Image object having the default // orientation `UIImage.Orientation.up`. let image = try MPImage(uiImage: image)
Objective-C
// Load an image on the user's device as an iOS `UIImage` object. // Convert the `UIImage` object to a MediaPipe's Image object having the default // orientation `UIImageOrientationUp`. MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
Ten przykład inicjuje MPImage
z domyślną wartością
UIImage.Orientation.Up
orientacji ekranu. Możesz zainicjować MPImage
przy użyciu dowolnej z obsługiwanych
UIImage.Orientation
. Punkt orientacyjny pozycji nie obsługuje odbicia lustrzanego orientacji, np. .upMirrored
,
.downMirrored
, .leftMirrored
, .rightMirrored
.
Więcej informacji o UIImage
znajdziesz na stronie UIImage dla deweloperów Apple
Dokumentacja.
CVPixelBuffer
Format CVPixelBuffer
sprawdza się w przypadku aplikacji generujących ramki.
i zastosuj CoreImage na iOS
platformy przetwarzania danych.
Format CVPixelBuffer
sprawdza się w tych trybach biegu:
Obrazy: aplikacje, które po przetworzeniu generują
CVPixelBuffer
obrazy. przy użyciu platformyCoreImage
systemu iOS można wysłać do punktu orientacyjnego pozycji w trybie uruchamiania obrazu.Filmy: klatki wideo można konwertować do formatu
CVPixelBuffer
dla a następnie przesłany do punktu orientacyjnego pozy w trybie wideo.transmisja na żywo: aplikacje korzystające z aparatu w iOS do generowania klatek mogą być konwertowane w formacie
CVPixelBuffer
do przetworzenia przed wysłaniem do Ustaw punkt orientacyjny w trybie transmisji na żywo.
Swift
// Obtain a CVPixelBuffer. // Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the default // orientation `UIImage.Orientation.up`. let image = try MPImage(pixelBuffer: pixelBuffer)
Objective-C
// Obtain a CVPixelBuffer. // Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the // default orientation `UIImageOrientationUp`. MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
Więcej informacji o CVPixelBuffer
znajdziesz tutaj: CVPixelBuffer Apple
Dla programistów
Dokumentacja.
CMSampleBuffer
Format CMSampleBuffer
przechowuje próbki multimediów jednolitego typu mediów i jest
co sprawdza się w trybie biegowym transmisji na żywo. Klatki na żywo z aparatów z iOS są
asynchronicznie dostarczone w formacie CMSampleBuffer
przez iOS
AVCaptureVideoDataOutput (Wyjście AVCaptureVideoDataOutput).
Swift
// Obtain a CMSampleBuffer. // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default // orientation `UIImage.Orientation.up`. let image = try MPImage(sampleBuffer: sampleBuffer)
Objective-C
// Obtain a `CMSampleBuffer`. // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the // default orientation `UIImageOrientationUp`. MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
Więcej informacji o CMSampleBuffer
znajdziesz tutaj: CMSampleBuffer Apple
Dla programistów
Dokumentacja.
Uruchamianie zadania
Aby uruchomić punkt orientacyjny pozycji, użyj metody detect()
specyficznej dla przypisanego
tryb działania:
- Zdjęcie:
detect(image:)
- Film:
detect(videoFrame:timestampInMilliseconds:)
- Transmisja na żywo:
detectAsync(image:timestampInMilliseconds:)
Poniższe przykładowe fragmenty kodu pokazują, jak uruchomić punkt orientacyjny pozycji w różnych trybach:
Swift
Obraz
let result = try poseLandmarker.detect(image: image)
Wideo
let result = try poseLandmarker.detect( videoFrame: image, timestampInMilliseconds: timestamp)
Transmisja na żywo
try poseLandmarker.detectAsync( image: image, timestampInMilliseconds: timestamp)
Objective-C
Obraz
MPPPoseLandmarkerResult *result = [poseLandmarker detectImage:image error:nil];
Wideo
MPPPoseLandmarkerResult *result = [poseLandmarker detectVideoFrame:image timestampInMilliseconds:timestamp error:nil];
Transmisja na żywo
BOOL success = [poseLandmarker detectAsyncImage:image timestampInMilliseconds:timestamp error:nil];
Przykładowy kod punktu orientacyjnego pozy pokazuje implementacje każdego z tych trybów
więcej informacji: detect(image:)
, detect(videoFrame:timestampInMilliseconds:)
,
i detectAsync(image:timestampInMilliseconds:)
. Ten przykładowy kod umożliwia użycie funkcji
przełączać się między trybami przetwarzania, które mogą nie być wymagane
tych kwestii.
Pamiętaj:
Korzystając z trybu wideo lub transmisji na żywo, musisz też podać: sygnatura czasowa klatki wejściowej do zadania Pose Pointer.
W trybie obrazu lub filmu zadanie Pose Notebooker blokuje w bieżącym wątku aż do zakończenia przetwarzania obrazu lub ramki wejściowej. Do unikaj blokowania bieżącego wątku, uruchamiaj przetwarzanie w tle w iOS na iOS Dispatch lub NSOperation zasad.
W trybie transmisji na żywo zadanie Pose Pointer jest natychmiast przywracane i nie blokuje bieżącego wątku. Wywołuje on metodę
poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)
metoda z wynikiem punktu orientacyjnego położenia po przetworzeniu każdej klatki wejściowej. Punkt orientacyjny pozycji wywołuje tę metodę asynchronicznie na dedykowanym kolejki wysyłki. Aby wyświetlić wyniki w interfejsie, wyślij do głównej kolejki po przetworzeniu wyników. JeślidetectAsync
funkcja jest wywoływana, gdy zadanie punktu orientacyjnego jest zajęte przetwarzaniem kolejnego , punkt orientacyjny pozycji zignoruje nową klatkę wejściową.
Obsługa i wyświetlanie wyników
Po przeprowadzeniu wnioskowania zadanie punktu orientacyjnego zwraca wartość PoseLandmarkerResult
który zawiera współrzędne każdego punktu orientacyjnego pozycji.
Poniżej znajdziesz przykładowe dane wyjściowe tego zadania:
PoseLandmarkerResult:
Landmarks:
Landmark #0:
x : 0.638852
y : 0.671197
z : 0.129959
visibility : 0.9999997615814209
presence : 0.9999984502792358
Landmark #1:
x : 0.634599
y : 0.536441
z : -0.06984
visibility : 0.999909
presence : 0.999958
... (33 landmarks per pose)
WorldLandmarks:
Landmark #0:
x : 0.067485
y : 0.031084
z : 0.055223
visibility : 0.9999997615814209
presence : 0.9999984502792358
Landmark #1:
x : 0.063209
y : -0.00382
z : 0.020920
visibility : 0.999976
presence : 0.999998
... (33 world landmarks per pose)
SegmentationMasks:
... (pictured below)
Dane wyjściowe zawierają zarówno znormalizowane współrzędne (Landmarks
), jak i świat
(WorldLandmarks
) każdego punktu orientacyjnego.
Dane wyjściowe zawierają następujące znormalizowane współrzędne (Landmarks
):
x
iy
: współrzędne punktu orientacyjnego znormalizowane między 0,0 a 1,0 przez szerokość (x
) i wysokość (y
) obrazu.z
: głębokość punktu orientacyjnego, której głębia znajduje się w połowie bioder pochodzeniu danych. Im mniejsza wartość, tym punkt orientacyjny jest bliżej kamery. magnituda wielkości z używa mniej więcej takiej samej skali jak funkcjax
.visibility
: prawdopodobieństwo, że punkt orientacyjny jest widoczny na zdjęciu.
Dane wyjściowe zawierają następujące współrzędne świata (WorldLandmarks
):
x
,y
iz
: rzeczywiste, trójwymiarowe współrzędne w metrach, punktu środkowego bioder jako punktu początkowego.visibility
: prawdopodobieństwo, że punkt orientacyjny jest widoczny na zdjęciu.
Ten obraz przedstawia wizualizację danych wyjściowych zadania:
Opcjonalna maska segmentacji odpowiada prawdopodobieństwu przynależności każdego piksela wykrytej osobie. Na tej ilustracji widać maskę segmentacji wynik zadania:
Przykładowy kod punktu orientacyjnego pozycji pokazuje, jak wyświetlić punkt orientacyjny pozycji wyników.