2.4. Algorithmic implementation
가장 중요한 단계는 "dimensioning, 각 뷰에서의 shape 식별, 각 뷰에서의 object의 rotation과 translation, 모든 뷰에서 결합한 part들 (isometric 뷰를 말하는 것 같음), SCAD 파일의 tree 생성, 3D point cloud 생성" 이 있다.
2.4.1. Dimensioning of objects
이미지에서는 object의 길이, 픽셀의 강도를 알아내는데 사용된다. 그래서 만약 view들마다 다른 pixel의 강도가 있다고 하면 shape의 dimension을 알아내기 불가능하다. (실질적으로 카메라로 찍을 경우 pixel의 강도가 제각각이다...)
Figure 4에서처럼 object의 초록색으로 hightlignt된 선의 dimension을 정의할 수 있고 object length를 알아낼 수 있다. 가장 바깥쪽 contour의 전체 식별 과정은 Algorithm 3에서 볼 수 있다.
2.4.2. Linked parent-child lists
전체 shape의 detail은 다음과 같이 liked list에 저장된다.
- node object - 3D 모델을 만들기위한 shape의 detail을 포함한 class object
- tuple([cX, xY]) - contour 중심 좌표 (이전에 moment를 통해서 구한 값인 것 같다.)
- 이미지 처리한 contour / index of the parent-child
- contour를 둘러싼 수평 직사각형의 높이
- contour를 둘러싼 수평 직사각형의 너비
Figure 4에서 큰 직사각형 안에 원과 직사각형이 있는 것처럼 하나의 object가 다른 object 내부에 있을 수 있다. 그래서 shape list로 parent-child relation grouping이 필요하다. 각 view에 각 shape list는 다음과 같이 정리할 수 있다.
각 parent와 child는 shape list의 모든 detail을 가지지만 해당 view에만 표시가 된다. 예를 들어서 다음과 같이 Figure 5가 있을때 직사각형은 원의 parent이고 front view의 object list는 [rectangle_detail_list, circle_detail_list]가 될 것 이다.
이렇게 parent-child list는 그 view에서만 제한되기때문에 3D shape에는 사용하지 않는다. 예를 들어 front view는 height와 length로 구성할 수 있지만 object의 너비(폭)에 대한 정보는 알아낼 수 없다. 그래서 모든 뷰를 파싱한다음 3D shape의 모든 detail을 포함하는 parent-child list를 만든다.
2.4.3. Re-arrangement of parent-child lists in each view
SCAD 파일의 통합과 생성을 하기 전에 각 view에서 출력한 parent-child list를 재정렬할 필요가 있다. front view list는 parent의 중심 좌표의 x 좌표를 기준으로 내림차순 정렬한 다음 저장된다. 다른 2개 view들은 오름차순 정렬하여 저장된다.
전체 알고리즘 순서는 다음과 같다.
- 인식된 모든 contour들은 면적을 기준으로 내림차순 정렬
- 각 contour의 shape을 알아냄 (직사각형의 길이와 높이, 원의 반지름 등)
- 가장 큰 contour의 중심은 child object의 translation과 rotation을 계산하기위해 필요
- 인식된 shape을 기반으로 node class object는 정사각형, 직사각형에 cube, 삼각형, 오각형, 육각형, 원에 cylinder로 정의
2.4.4. 2D views to SCAD models
front view를 기본 list로 보고 다른 view들을 추가하거나 업데이트한다.
front view에 있는 각 parent-child object list는 같은 모양에 대응되는 모양을 side view에서 찾아내야한다. 이를 위해 shape detail list에 저장된 height를 이용한다.
- variation을 허용하기 위해 roundOffApprox라 불리는 small error가 허용된다. (roundOffApprox는 front view와 side view에서의 길이 오차를 허용하기위한 값을 의미하는 것 같다.)
- 만약 shape of interest (shape처럼 보이는 것) 이 side view에 있지만 parent가 아닐 경우 그 shape은 extrude(돌출) 될 수 있다.
- side view에 대응하는 것이 존재한다면 list의 나머지 shape은 parent의 hole로 추가된다. 이것은 parent-child list가 parent의 x 좌표를 기준으로 내림차순 정렬이 되어있기때문에 가능한 것이다.
- top view에만 있는 shape이 있을 경우 hole이라고 볼 수 있다. 이것은 hole의 parent가 front 또는 side view에 반드시 있다는 것을 의미한다. 아니면 무시될 수 있다.
- 최종 parent-child list는 하나의 list로 compress된다.
- parent object들에대한 boolean operation은 null이 될 것(union, difference와 같은 operation을 수행하지 않기 때문)이고 child object들은 Union 또는 Difference가 될 것이다.
- 이진 트리는 각 parent-child에 대해 생성된다. 각 shape node class는 이진트리에서의 node이고 각 shape node는 비어있는 node class object의 child node이다. 비어있는 node class는 두 children 간의 operation을 포함하는 scad 문법 string만 가진다. 예시로 다음과 같이 만들어질 수 있다.
결론은 간단한 2D shape만 가능하고 더 복잡한 object는 불가능하다. (직접 구현해보고 적용해보면서 삽질을 해봐야할 것 같다. 그리고 본 논문 내용은 그저 아이디어를 위한 참고로 보는 것이 좋을 듯하다.)