타겟 이미지 삭제
EasyAR은 더 이상 필요하지 않은 인식 이미지를 처리하는 두 가지 방법을 제공합니다: 영구 삭제와 임시 비활성화. 프로덕션 환경의 안정성을 보장하기 위해 다음 작업 지침을 주의 깊게 읽어보시기 바랍니다.
EasyAR 웹 관리 센터를 통한 작업
- 작업 단계: EasyAR 개발 센터 로그인 -> 클라우드 인식 관리 -> 해당 이미지 라이브러리 선택 -> 관리 클릭하여 라이브러리 관리 화면 진입.
- 삭제 방법:
- 일괄 삭제: 목록에서 대상 이미지를 선택하고 삭제를 클릭한 후 확인합니다.
- 개별 삭제: 대상 이미지 상세 페이지로 이동하여 페이지 내 삭제 버튼 클릭.

경고
삭제 작업은 되돌릴 수 없습니다. 삭제를 확인하면 해당 이미지의 모든 특징 데이터 및 연관 정보가 영구적으로 손실됩니다. 테스트 이미지 라이브러리에서 먼저 절차를 검증하고, 프로덕션 환경에서 직접 파괴적 테스트를 수행하는 것은 엄격히 금지됩니다.
모범 사례: 타겟 이미지 비활성화
대부분의 비즈니스 시나리오에서 특정 이미지를 향후 다시 사용할지 확실하지 않은 경우, 삭제 대신 비활성화를 사용하는 것이 좋습니다.
- 기능 특징: 비활성화된 대상 이미지는 데이터베이스 목록에 유지되지만 클라우드 인식 검색 과정에 참여하지 않습니다. 단, 인식 할당량은 차지합니다.
- 비활성화 방법: 관리 화면에서 인식 이미지를 선택하고 비활성화를 클릭합니다.

- API 비활성화: 타겟 이미지 업데이트 API 호출을 통해
active속성을0으로 설정합니다.
API를 사용한 타겟 이미지 삭제
REST API를 통해 인식 이미지의 자동화된 정리가 가능합니다.
사전 준비
시작 전 타겟 이미지 삭제 API 문서를 읽고 다음 리소스를 준비하세요:
- CRS AppId
- API Key / Secret 또는 Token
- Server-end URL (포트 443)
- TargetId: 삭제할 대상 이미지의 고유 ID. TargetId가 존재하지 않으면 API는
statusCode: 404(Target not found)를 반환합니다.
아래의 플레이스홀더를 실제 매개변수로 대체하고 curl 스크립트를 실행하세요
- Your-Server-side-URL → 실제 API 호스트
- Your-Token → 실제 API Key Authorization Token
- Your-CRS-AppId → 귀하의 appId
- Your-todo-TargetId → 삭제 대상 targetId
curl -X DELETE "https://<Your Server-side-URL>/target/<Your-todo-TargetId>?appId=<Your-CRS-AppId>" \
-H "Content-Type: application/json" \
-H "Authorization: <Your-Token>"
Java 샘플 코드 다운로드
Maven 방식으로 프로젝트 가져오기
Step 1. 관련 코드 파일 RemoveTarget.java 열기
Step 2. 전역 변수 수정, 준비 목록의 인증 매개변수로 대체
- CRS AppId
- API Key / API Secret
- TARGET_MGMT_URL → 서버 측 URL
- TARGET_ID → 삭제할 대상 targetId
public class RemoveTarget {
private static final String TARGET_MGMT_URL = "https://cn1.crs.easyar.com";
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--";
private static final String TARGET_ID = "my_targetid";
/* TO_DEL_IDs lists all the targetIds to be removed
* must be separated by ","
*/
private static final String TO_DEL_IDs = "targetId1,targetId2,targetId3";
public String remove(Auth auth, String targetId) throws IOException {
okhttp3.Request request = new okhttp3.Request.Builder()
.url(auth.getCloudURL()+"/target/"+targetId+"?"+ Common.toParam(
Auth.signParam(new JSONObject(), auth.getAppId(), auth.getApiKey(), auth.getApiSecret())
))
.delete()
.build();
return new OkHttpClient.Builder().build().newCall(request).execute().body().string();
}
public String removeMultiTargets(Auth auth, String targetIds) throws IOException {
JSONObject params = new JSONObject().put("targetId", targetIds);
Auth.signParam(params, auth.getAppId(), auth.getApiKey(), auth.getApiSecret());
RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8")
, params.toString());
okhttp3.Request request = new okhttp3.Request.Builder()
.url(auth.getCloudURL() + "/targets")
.delete(requestBody)
.build();
return new OkHttpClient.Builder().build().newCall(request).execute().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 RemoveTarget().remove(accessInfo, TARGET_ID));
System.out.println(new RemoveTarget().removeMultiTargets(accessInfo, TO_DEL_IDs));
}
}
Step 3. Main 실행
NodeJS 샘플 코드 다운로드
1단계. 키 파일 keys.json 구성
- CRS AppId
- API Key / API Secret
- to-delete-targetId
{
"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--"
}
2단계. 실행, 키 파일 및 서버-엔드 URL 지정
node bin/deleteTarget <to-delete-targetId> -t <Server-end-URL> -c keys.json
var argv = require('yargs')
.usage('Usage: $0 [targetId] -t [host] -c [keys]')
.demand(1)
.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 targetId = argv._[0];
var host = argv.host;
var keys = JSON.parse(fs.readFileSync(argv.keys));
var farmer = require('../farmer')(host, keys.appKey, keys.appSecret);
farmer.deleteTarget(targetId)
.then(function(resp) {
console.log(resp.result.targetId);
})
.fail(function(err) {
console.log(err);
});
deleteTarget은 클라우드 서비스 인터페이스를 호출하며, 샘플 코드는 farmer.js에 있음
function deleteTarget(targetId) {
return Q.promise(function(resolve, reject) {
request.del(host + '/target/' + targetId)
.query(signParams())
.end(done(resolve, reject));
});
}
Php 샘플 코드 다운로드
Step 1. 엔트리 코드 demo.php 열기
Step 2. 글로벌 변수 수정, 준비 목록의 인증 파라미터로 대체
- CRS AppId
- API Key / API Secret
- Server-end URL
- toDeleteTargetId
<?php
include 'EasyARClientSdkCRS.php';
$apiKey = 'API Key';
$apiSecret = 'API Secret';
$crsAppId = 'CRS AppId'
$crsCloudUrl = 'https://cn1-crs.easyar.com';
$toDeleteTargetId = 'to-delete-targetId';
$sdk = new EasyARClientSdkCRS($apiKey, $apiSecret, $crsAppId, $crsCloudUrl);
$rs = $sdk->delete($toDeleteTargetId);
if ($rs->statusCode == 0) {
print_r($rs->result);
} else {
print_r($rs);
}
Step 3. php demo.php 실행
관련 코드 파일 delete_target.py를 새로 생성하고, 전역 변수를 수정한 후 실행
pip install requests
python delete_target.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"
TARGET_ID = "TARGET_ID"
def main():
timestamp = str(int(time.time() * 1000))
params = {
'apiKey': API_KEY,
'appId': APP_ID,
'timestamp': timestamp
}
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}/target/{TARGET_ID}"
final_params = {**params, 'signature': signature}
print(f"Requesting DELETE {url}...")
response = requests.delete(url, params=final_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"
)
var (
ApiKey = "YOUR_API_KEY"
ApiSecret = "YOUR_API_SECRET"
AppId = "YOUR_APP_ID"
Host = "https://crs-cn1.easyar.com"
TargetId = "TARGET_ID"
)
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/target/%s?apiKey=%s&appId=%s×tamp=%s&signature=%s",
Host, TargetId, ApiKey, AppId, ts, signature)
req, _ := http.NewRequest("DELETE", url, nil)
resp, _ := http.DefaultClient.Do(req)
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";
const TARGET_ID: &str = "YOUR_TARGET_ID";
#[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!("{}/target/{}?apiKey={}&appId={}×tamp={}&signature={}",
HOST, TARGET_ID, API_KEY, APP_ID, ts, signature);
let res = reqwest::Client::new().delete(url).send().await?;
println!("Response: {}", res.text().await?);
Ok(())
}
콘솔 프로젝트 만들기.
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 = "API_KEY";
static string API_SECRET = "API_SECRET";
static string APP_ID = "APP_ID";
static string HOST = "https://crs-cn1.easyar.com";
static string TARGET_ID = "TARGET_ID";
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}/target/{TARGET_ID}?{query}";
var response = await client.DeleteAsync(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 이상 버전
- 스크립팅 백엔드: Mono 또는 IL2CPP 모두 가능
- API 호환성 수준: .NET Standard 2.1 (권장)
Step 1: 이미지 파일 준비
- Unity 프로젝트 내 디렉터리 생성:
Assets/
└── Scripts/
└── DeleteImageTarget.cs
- Assets 디렉터리명에 따라
- 아래 예제 코드 DeleteImageTarget.cs 복사
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class DeleteImageTarget : MonoBehaviour
{
[Header("Config")]
public string targetId = "Your targetId";
public string apiBaseUrl = "https://Your-Server-end-URL";
public string authorizationToken = "YOUR API KEY AUTH TOKEN";
public string crsAppId = "CRS-AppId";
private void Start()
{
StartCoroutine(DeleteTarget());
}
private IEnumerator DeleteTarget()
{
string url =
$"{apiBaseUrl}/target/{targetId}?appId={crsAppId}";
UnityWebRequest request = UnityWebRequest.Delete(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("Delete target success:");
Debug.Log(request.downloadHandler.text);
}
else
{
Debug.LogError("Delete target failed:");
Debug.LogError(request.error);
Debug.LogError(request.downloadHandler.text);
}
}
}
- Unity Editor에서:
- 빈 GameObject 생성
- DeleteTarget으로 이름 지정
- DeleteImageTarget 스크립트를 해당 객체에 드래그 앤 드롭
Step 3: 파라미터 구성 (Inspector)
Inspector 패널에서 수정:
- Api Url
- Authorization Token
- Crs App Id
- Target Id : 삭제할 타겟 이미지의 targetId
이 항목들만 수정 후 실행, 준비된 파라미터 입력
Step 4: 실행
- Play 클릭
- Console에서 결과 확인:
- 성공: JSON 반환 (targetId 포함)
- 실패: HTTP/오류 메시지
관련 주제: