目標圖列表查詢
雲識別(CRS)資料庫中通常儲存著海量的目標圖。為了方便開發者快速定位和管理這些數據,本章將詳細介紹目標圖的查看、分頁查詢及詳情說明。
通過 easyar web 管理目標圖集合
在可視化界面中,系統預設採用分頁列表形式展示目標圖,並按照最後修改時間進行逆序排列(最新改動的排在最前)。
目標圖集合
操作路徑:登入 easyar web [開發中心] -> [雲識別管理] -> 選取圖庫 -> 點選 [管理]。
在此界面中,您可以進行以下操作:
列表瀏覽:查看分頁展示的目標圖集合。
詳情入口:點選圖中 按鈕1 的 [管理] 可進入該目標圖的詳情頁。
精準檢索:在輸入框2 中,支援以下兩種檢索方式:
- 按名稱檢索:若您的系統按規則(如應用內 ID)命名圖片,可透過名稱快速定位。
- 按 targetId 檢索:例如當您透過相似圖查詢介面獲得具體
targetId後,可在此查詢其詳細配置。

目標圖詳情說明
點選進入詳情頁後,您可以查看到目標圖的完整屬性,包括:
- 灰階圖
- 圖片名稱:自訂的目標圖標識。
- TargetId:系統產生的唯一 ID。
- 狀態:顯示當前目標圖是否處於啟動或停用狀態。
- 品質評分:關於識別與追蹤效能的量化評分,詳情參考 目標圖識別難度評級。
- 自訂 meta:該目標圖關聯的元數據(如模型 URL 等)

使用 api 查詢目標圖集合
對於需要整合到自有後台的開發者,建議使用 REST API 進行管理。
參考文件:目標圖集合列表 API 介面
準備清單
在發起請求前,請確保已準備好以下資訊(詳情請參考 API 呼叫準備清單):
- CRS AppId
- API Key / API Secret 或者 Token
- Server-end URL: 目標圖像管理 URL 地址,https 使用 443 埠
請替換佔位符為實際參數,並運行 curl 腳本
- Your-Server-side-URL → 實際 API Host
- Your-Token → 實際的 API Key Authorization Token
- Your-CRS-AppId → 您的 appId
curl -X GET "https://<Your-Server-side-URL>/targets/infos?appId=<Your-CRS-AppId>" \
-H "Content-Type: application/json" \
-H "Authorization: <Your-Token>"
下載 Java 範例程式碼
透過 Maven 方式導入專案
Step 1. 開啟相關程式碼檔案 ListTargets.java
Step 2. 修改全域變數,替換你準備清單裡的認證參數
- CRS AppId
- API Key / API Secret
- TARGET_MGMT_URL → Server-end URL
public class ListTargets {
private static final String TARGET_MGMT_URL = "http://cn1.crs.easyar.com:8888";
private static final String CRS_APPID = "--here is your CRS AppId--";
private static final String API_KEY = "--here is your API Key--";
private static final String API_SECRET = "--here is your API Secret--";
public String list(Auth auth) throws IOException {
OkHttpClient client = new OkHttpClient.Builder().build();
JSONObject params = new JSONObject();
Auth.signParam(params, auth.getAppId(), auth.getApiKey(), auth.getApiSecret());
okhttp3.Request request = new okhttp3.Request.Builder()
.url(auth.getCloudURL() + "/targets/infos?"+ Common.toParam(params))
.get()
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
public static void main(String[] args) throws IOException{
Auth accessInfo = new Auth(CRS_APPID, API_KEY, API_SECRET, TARGET_MGMT_URL);
System.out.println(new ListTargets().list(accessInfo));
}
}
Step 3. 執行 Main
下載 NodeJS 範例代碼
Step 1. 配置密鑰檔案 keys.json
- CRS AppId
- API Key / API Secret
{
"appId": "--here is your appId for CRS App Instance for SDK 4--",
"apiKey": "--here is your api key which is create from website and which has crs permission--",
"apiSecret": "--here is your api secret which is create from website--"
}
Step 2. 運行,指定密鑰檔案以及 Server-end URL
node bin/getTargets -t <Server-end-URL> -c keys.json
若需更改分頁策略,傳入 getTargets 分页參數
- 'pageSize': 分頁大小
- 'pageNum': 第幾頁
var argv = require('yargs')
.usage('Usage: $0 [targetId] -t [host] -c [keys]')
.demand(0)
.default('t', 'http://localhost:8888').alias('t', 'host')
.default('c', 'keys.json').alias('c', 'keys')
.help('h').alias('h', 'help')
.epilog('copyright 2015, sightp.com')
.argv;
var fs = require('fs');
var host = argv.host;
var keys = JSON.parse(fs.readFileSync(argv.keys));
var farmer = require('../farmer')(host, keys.appKey, keys.appSecret);
farmer.getTargets({
'pageSize': 5,
'pageNum': 1,
})
.then(function(resp) {
console.log(resp.result.targets);
})
.fail(function(err) {
console.log(err);
});
getTargets 調用雲服務接口,範例代碼在 farmer.js
function getTargetsByPage(pageNum,pageSize) {
return Q.promise(function(resolve, reject) {
request.get(host + '/targets/infos?pageNum=' + pageNum + '&pageSize=' + pageSize)
.query(auth.signParams(keypair, {
"pageNum":pageNum,
"pageSize":pageSize
}))
.end(done(resolve, reject));
});
}
下載 Php 範例程式碼
Step 1. 開啟入口程式碼 demo.php
Step 2. 修改全域變數,替換你準備清單裡的認證參數
- CRS AppId
- API Key / API Secret
- Server-end URL
<?php
include 'EasyARClientSdkCRS.php';
$apiKey = 'API Key';
$apiSecret = 'API Secret';
$crsAppId = 'CRS AppId'
$crsCloudUrl = 'https://cn1-crs.easyar.com';
$pageNum = 1;
$pageSize = 5;
$sdk = new EasyARClientSdkCRS($apiKey, $apiSecret, $crsAppId, $crsCloudUrl);
$rs = $sdk->targetsV3($pageNum, $pageSize);
if ($rs->statusCode == 0) {
print_r($rs->result);
} else {
print_r($rs);
}
Step 3. 執行 php demo.php
新建相關代碼文件 list_targets.py,修改全域變量,然後運行
pip install requests
python list_targets.py
import time
import hashlib
import requests
# --- 全局配置 ---
API_KEY = "YOUR_API_KEY"
API_SECRET = "YOUR_API_SECRET"
APP_ID = "YOUR_APP_ID"
HOST = "https://crs-cn1.easyar.com"
def main():
timestamp = str(int(time.time() * 1000))
params = {
'apiKey': API_KEY,
'appId': APP_ID,
'timestamp': timestamp
}
# 簽名:排序鍵 -> 連接 -> 附加密鑰 -> SHA256
sorted_keys = sorted(params.keys())
sign_str = "".join([f"{k}{params[k]}" for k in sorted_keys]) + API_SECRET
signature = hashlib.sha256(sign_str.encode('utf-8')).hexdigest()
url = f"{HOST}/targets/infos"
params['signature'] = signature
print(f"Requesting GET {url}...")
response = requests.get(url, params=params)
print(f"Response: {response.text}")
if __name__ == "__main__":
main()
新建相關代碼文件 main.go,修改全局變量,然後運行
go run main.go
main.go:
package main
import (
"crypto/sha256"
"fmt"
"io"
"net/http"
"sort"
"strconv"
"time"
)
// --- Global configuration ---
var (
ApiKey = "YOUR_API_KEY"
ApiSecret = "YOUR_API_SECRET"
AppId = "YOUR_APP_ID"
Host = "https://crs-cn1.easyar.com"
)
func main() {
ts := strconv.FormatInt(time.Now().UnixNano()/1e6, 10)
params := map[string]string{
"apiKey": ApiKey,
"appId": AppId,
"timestamp": ts,
}
keys := make([]string, 0, len(params))
for k := range params { keys = append(keys, k) }
sort.Strings(keys)
builder := ""
for _, k := range keys { builder += k + params[k] }
builder += ApiSecret
signature := fmt.Sprintf("%x", sha256.Sum256([]byte(builder)))
url := fmt.Sprintf("%s/targets/infos?apiKey=%s&appId=%s×tamp=%s&signature=%s",
Host, ApiKey, AppId, ts, signature)
resp, _ := http.Get(url)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Printf("Response: %s\n", string(body))
}
在 Cargo.toml 中添加 reqwest, tokio, sha2, hex 相依套件。
執行 cargo run。
use sha2::{Sha256, Digest};
use std::collections::BTreeMap;
use std::time::{SystemTime, UNIX_EPOCH};
// --- 全域配置 ---
const API_KEY: &str = "YOUR_API_KEY";
const API_SECRET: &str = "YOUR_API_SECRET";
const APP_ID: &str = "YOUR_APP_ID";
const HOST: &str = "https://crs-cn1.easyar.com";
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let ts = SystemTime::now().duration_since(UNIX_EPOCH)?.as_millis().to_string();
let mut params = BTreeMap::new();
params.insert("apiKey", API_KEY);
params.insert("appId", APP_ID);
params.insert("timestamp", &ts);
let mut sign_str = String::new();
for (k, v) in ¶ms {
sign_str.push_str(k);
sign_str.push_str(v);
}
sign_str.push_str(API_SECRET);
let mut hasher = Sha256::new();
hasher.update(sign_str.as_bytes());
let signature = hex::encode(hasher.finalize());
let url = format!("{}/targets/infos?apiKey={}&appId={}×tamp={}&signature={}",
HOST, API_KEY, APP_ID, ts, signature);
let res = reqwest::get(url).await?;
println!("Response: {}", res.text().await?);
Ok(())
}
建立 .NET 主控台專案。
dotnet new console
dotnet run
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Net.Http;
class Program {
// --- 全域配置 ---
static string API_KEY = "YOUR_API_KEY";
static string API_SECRET = "YOUR_API_SECRET";
static string APP_ID = "YOUR_APP_ID";
static string HOST = "https://crs-cn1.easyar.com";
static async System.Threading.Tasks.Task Main() {
string timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds().ToString();
var dict = new SortedDictionary<string, string> {
{ "apiKey", API_KEY },
{ "appId", APP_ID },
{ "timestamp", timestamp }
};
StringBuilder sb = new StringBuilder();
foreach (var kv in dict) sb.Append(kv.Key).Append(kv.Value);
sb.Append(API_SECRET);
string signature = Sha256(sb.ToString());
using var client = new HttpClient();
string query = string.Join("&", dict.Select(x => $"{x.Key}={x.Value}")) + $"&signature={signature}";
string url = $"{HOST}/targets/infos?{query}";
var response = await client.GetAsync(url);
Console.WriteLine($"Result: {await response.Content.ReadAsStringAsync()}");
}
static string Sha256(string str) {
byte[] bytes = SHA256.HashData(Encoding.UTF8.GetBytes(str));
return BitConverter.ToString(bytes).Replace("-", "").ToLower();
}
}
- 運行環境
- Unity 2020 LTS 以上版本
- Scripting Backend:Mono 或 IL2CPP 均可
- API Compatibility Level:.NET Standard 2.1(推薦)
步驟 1:準備圖片文件
- 在 Unity 專案中建立目錄:
Assets/
└── Scripts/
└── ListImageTarget.cs
- 按照 Assets 目錄名稱
- 複製下面範例程式碼 ListImageTarget.cs
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class ListImageTarget : MonoBehaviour
{
[Header("Config")]
public string apiBaseUrl = "https://Your-Server-end-URL";
public string authorizationToken = "YOUR API KEY AUTH TOKEN";
public string crsAppId = "CRS-AppId";
public int pageSize = 5;
public int pageNum = 1;
private void Start()
{
StartCoroutine(ListTarget());
}
private IEnumerator ListTarget()
{
string url =
$"{apiBaseUrl}/targets/infos?appId={crsAppId}&pageSize={pageSize}&pageNum={pageNum}";
UnityWebRequest request = UnityWebRequest.Get(url);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
request.SetRequestHeader("Authorization", authorizationToken);
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("List target success:");
Debug.Log(request.downloadHandler.text);
}
else
{
Debug.LogError("List target failed:");
Debug.LogError(request.error);
Debug.LogError(request.downloadHandler.text);
}
}
}
- 在 Unity Editor 中:
- 建立一個空 GameObject
- 命名為 ListTarget
- 將 ListImageTarget 腳本拖曳到該物件上
步驟 3:設定參數(Inspector)
在 Inspector 面板中修改:
- Api Url
- Authorization Token
- Crs App Id
- page size
- page num
只需修改這幾項即可執行,填入準備清單準備好的參數
步驟 4:執行
- 點擊 Play
- 在 Console 中檢視結果:
- 成功:回傳 JSON(含 targetId)
- 失敗:HTTP / 錯誤訊息
相關主題:
下一主題: