使用JSARToolKit5 開發AR應用 (2) Marker

Tony_Stark發表於2017-09-29

相關站點

jsartoolkit5 - ARToolkit.js

Talkingdata - 用資料的心智去超越

three.js 系列教程 - 良心之作

JSARToolKit 支援多種標記

本文概述了不同的Marker型別,它們是如何在擴增實境應用中使用它們的呢。

這是JSARToolKit Marker的基本概述。
Marker是影像或視訊中的功能,JSARToolKit可以跟蹤並告知您他們在哪裡以及他們指向什麼位置方向。
JSARToolKit可以跟蹤的標記是平面影像。

文章中,我們將一個可開啟的框放在條形碼標記之上,這是一種特殊型別的內建方形標記,用於對其模式中的數字進行編碼。
JSARToolKit中有兩種其他型別的標記:方形影像標記和NFT(自然特徵跟蹤)標記。
方形影像標記是由黑色和白色輪廓包圍的正方形影像。
NFT標記是使用先進的計算機視覺機制跟蹤自由形式的影像標記。

我們來詳細瞭解每個標記型別,並附上一些您可以玩的樣品。

圖案標記

圖案標記是具有黑色和白色邊框的正方形影像,可用於以最少的CPU使用來跟蹤自定義影像。
圖案標記應該有一個厚實的黑色邊框,被一個厚實的白色邊框包圍。
正方形內的影像應該是高對比度和旋轉非對稱的(意思是:如果將其平放在桌子上並旋轉90度,180度或270度,則每個角度應該看起來不同)

高對比度要求的原因是ARToolKit的工作原理。
ARToolKit將視訊影像轉換為黑白閾值影像,然後在該影像中查詢矩形。
找到形狀後,它會在矩形中取樣畫素,並將讀取的畫素與註冊的標記進行比較。
如果足夠的畫素與標記相匹配,ARToolKit會告訴您的應用程式,它會找到一個標記,並計算將一個正方形變成矩形在螢幕上的形狀的轉換矩陣。

這是一個程式碼片段,初始化JSARToolKit並載入模式標記。
當視訊中看到模式標記時,下面的程式碼將標記詳細資訊記錄到控制檯。

var video = document.querySelector('video');
var ar = new ARController(video.videoWidth, video.videoHeight, 'Data/camera_para.dat');
ar.onload = function() {
	var markerId;

	// Load pattern marker.
	//
	ar.loadMarker('Data/patt.hiro', function(marker) {
		markerId = marker;
	});

	ar.addEventListener('getMarker', function(ev) {
		if (ev.data.marker.idPatt === markerId) {
			console.log('saw marker', ev.data.marker);
			console.log('transformation matrix', ar.getTransformationMatrix());
		}
	});

	console.log('camera matrix', ar.getCameraMatrix());

	setInterval(function() {
		ar.process(video);
	}, 33);
};複製程式碼

您可以在此演示中看到模式標記跟蹤。

條碼標記

條碼標記使用二進位制碼在黑白標記上畫一個數字。
它們不需要預先註冊並使用非常少的CPU。
認為他們是非常低解析度的QR碼,你有這個想法。

他們在封面下工作的方式很像模式標記。
庫讀回閾值影像資料,將其轉換為二進位制,並將位轉換為數字。
使用條形碼標記比使用圖案標記更容易。
所有您需要做的是將ARController的模式檢測模式設定為其中一種條形碼檢測模式,並檢查標記物件的idMatrix屬性。

arController.setPatternDetectionMode( artoolkit.AR_MATRIX_CODE_DETECTION );

arController.addEventListener('getMarker', function(ev) {
	console.log('saw barcode marker', ev.data.marker.idMatrix);
});複製程式碼

您可以在看到模式標記跟蹤。

混合模式跟蹤

使用混合模式標記跟蹤,您可以跟蹤圖案標記和條形碼標記。
這比跟蹤只有一種型別的標記更容易出錯,因為某些圖案標記可能被誤認為條形碼標記。
但是如果你需要這樣做,它很簡單,只需將ARController的模式檢測模式設定為混合模式跟蹤。

在混合模式跟蹤中,getMarker事件返回的標記分別具有idMatrix或idPatt屬性,分別設定為條形碼ID或模式標記ID。
不匹配的id設定為-1。

以下是如何做到這一點:

arController.setPatternDetectionMode( artoolkit.AR_TEMPLATE_MATCHING_COLOR_AND_MATRIX );

arController.addEventListener('getMarker', function(ev) {
	if (ev.data.marker.idMatrix !== -1) {
		console.log('saw barcode marker', ev.data.marker.idMatrix);
	}
	if (ev.data.marker.idPatt !== -1) {
		console.log('saw pattern marker', ev.data.marker.idPatt);
	}
});複製程式碼

您可以在看到混合模式標記跟蹤

NFT標記

NFT(自然特徵跟蹤)標記用於跟蹤自定義矩形影像,並且不需要標記為正方形或在影像周圍具有粗邊框。
例如,如果您想在架構書中彈出互動式3D模型來構建照片,則可以在每張建築照片中建立一個NFT標記。

要使用NFT,您需要事先建立標記(參見)。
NFT標記包含不同尺度的多個版本的標記影像。
這樣,跟蹤器可以進行快速的自上而下的影像匹配,從嘗試低解析度匹配開始,並將其下降到相機解析度匹配。

尚未在JSARToolKit5中實現NFT標記。

多標記跟蹤

您可以組合方形影像標記和條形碼標記來進行多標記跟蹤。
在多標記跟蹤中,您已經在單個平面上列印了幾個標記,即使某些標記不可見,也可以跟蹤表面。
以這種方式,多標記跟蹤可以以更加魯棒的方式跟蹤表面,而犧牲了一些額外的CPU使用。

多標記跟蹤的另一個優點是您可以將小標記放在非標記內容周圍,並使非標記內容的行為像標記。
例如,如果您將地圖影像列印在一張紙上,並在其周圍印有小標記,則可以將AR內容放在地圖的頂部,只要任何多標記影像可見,它就可以工作。

在這個意義上,多標記跟蹤的行為有點像NFT跟蹤。
多標記與NFT的缺點是您需要使用方形標記影像進行跟蹤。
這些優點是,多標記對於將跟蹤表面部分遮擋起來更加堅固,並且它們在CPU使用方面更便宜。

var markerId;
var markerCount = 0;

// Load multimarker.
//
arController.loadMultiMarker('Data/multi-barcode-4x3.dat', function(marker, subMarkerCount) {
	markerId = marker;
	markerCount = subMarkerCount;
});

arController.addEventListener('getMultiMarker', function(ev) {
	if (ev.data.multiMarkerId === markerId) {
		console.log('saw multimarker', ev.data.multiMarkerId);
		console.log('transformation matrix', arController.getTransformationMatrix());
	}
});

arController.addEventListener('getMultiMarkerSub', function(ev) {
	if (ev.data.multiMarkerId === markerId) {
		console.log('saw submarker', ev.data.markerId, ev.data.marker);
	}
});
複製程式碼

您可以在看到多標記跟蹤。

結論

我們已經瞭解了JSARToolKit中可用的不同型別的標記以及如何使用它們。
您可以跟蹤的不同型別的標記是方形影像標記,條形碼標記,NFT標記和多標記。

選擇使用哪種型別的標記取決於您的要求。
如果您需要快速跟蹤,請使用方形標記。
如果您需要自定義標記圖形,則可以使用方形自定義標記或NFT標記。
如果您需要非正方形標記,則需要使用NFT標記或多標記跟蹤。
對於強大的跟蹤,請使用多標記跟蹤。


相關文章