List
이미지 트래커를 이용한 컬러링 문의입니다.
Posted Date: 2020-06-12 8:50     Edited Date: 2020-06-15 6:09     Writer: wind2015

Please provide your development details as below;

1. SDK Version: 5.0.0.1
2. Development Environment: Unity
3. Tracker/Scanner: ImageTracker
4. License Type(Free / Pro-One Time Fee / Pro-Subscription / Enterprise): Free
5. Target Device(Optional): 

포럼에 전에 컬러링 질문이 있어서

https://developer.maxst.com/BoardQuestions/Details/781

 

여기를 참고하여 했는데

	for (int i = 0; i < trackingResult.getCount(); i++) {
			Trackable trackable = trackingResult.getTrackable(i);

			float[] Xw = {-trackable.getWidth()/2.0f, -trackable.getHeight()/2.0f, 0.0f, 1.0f};
			//float[] Xw = {-trackable.getWidth()/2.0f, trackable.getHeight()/2.0f, 0.0f, 1.0f};
			//float[] Xw = {trackable.getWidth()/2.0f, -trackable.getHeight()/2.0f, 0.0f, 1.0f};
			//float[] Xw = {trackable.getWidth()/2.0f, trackable.getHeight()/2.0f, 0.0f, 1.0f};
			float[] Xc = new float[4];

			Matrix.multiplyMV(Xc, 0, trackable.getPoseMatrix(),0, Xw, 0);

			float[] Xc_ = new float[3];
			Xc_[0] = Xc[0];
			Xc_[1] = Xc[1];
			Xc_[2] = Xc[2];

			float[] K = {
					image.getWidth(), 0, 0,
					0, image.getWidth(), 0,
					image.getWidth()/2, image.getHeight()/2, 1
			};

			float[] p = new float[3];

			p[0] = K[0] * Xc_[0] + K[3] * Xc_[1] + K[6] * Xc_[2];
			p[1] = K[1] * Xc_[0] + K[4] * Xc_[1] + K[7] * Xc_[2];
			p[2] = K[2] * Xc_[0] + K[5] * Xc_[1] + K[8] * Xc_[2];

			p[0] = p[0]/p[2];
			p[1] = p[1]/p[2];
			p[2] = p[2]/p[2];

			Log.i(TAG, "P[0] = " + p[0] + "P[1] = " + p[1]);

이코드 안드로이드 네이티브에서 실행하셨다 하는데 유니티상에서는 불가능한가요?

Posted Date: 2020-06-15 6:09     Edited Date: 2020-06-15 6:09     Writer: inactive

안녕하세요,

 

우선 유니티상에서는 안드로이드에서 사용하는 GLES와 좌표축 설정등이 다릅니다.

그쪽에 정의된 공간과 다르게, 유니티에서는 UI편의를 위하여 카메라 기본 설정을 y축 2.5미터에 회전을 시켜놓았기 때문입니다.

따라서 유니티에서 사용하고 싶으시면 GetPose 안쪽부터 손보셔야 합니다.

 

기본적인 수식적인 예시론 (X,Y,Z,1) = Projection Matrix * Pose Matrix * (x y z 1) 를 이용하여 구한 뒤

(여기서 x , y, z 는 타겟의 위치입니다. 즉, 이미지가 1m*1m 짜리라면 (0.5, 0.5, 0, 1) 이 우상단이 되게 됩니다.)

X/Z Y/Z 와 카메라 이미지의 가운데 점을 이용하면 됩니다.

 

예를 들자면, X/Z가 1이면 가장 우측, X/Z가 -1이면 가장 좌측인 것으로

X/Z*(image width)/2 + (image width)/2 일 때 이미지에 매핑됩니다. ( 여기서 image는 스크린일 수도, 이미지 버퍼일 수도 있습니다.)

 

다만, 이렇게 얻어온 포즈는 몇픽셀 정도의 오차가 날 수 있습니다.

예전에 있었던 그 건에 대해서는 몇픽셀 정도 밀렸을 때 UV 기준으로 원하는 위치를 뽑아오기 어려워

드롭하게 된 것으로 알고 있습니다.

 

Connor

Maxst Support Team