Digital 3D Anthropometryfashiontech.snu.ac.kr/note/BodyMeasurement/10-Advanced Topics.pdf ·...
Transcript of Digital 3D Anthropometryfashiontech.snu.ac.kr/note/BodyMeasurement/10-Advanced Topics.pdf ·...
Sungmin Kim
SEOUL NATIONAL UNIVERSITY
Digital 3D Anthropometry
10. Advanced Topics
Introduction Body Data Analysis 측정 기능
임의의 단면 추출
– 법선 벡터 지정– 좌표 변환
랜드마크 자동 계측
– 실루엣 추출– 주요 랜드마크 찾기
» Crotch» Armpit
2
Data Analysis 임의의 단면 추출 단면의 각도 지정
3
void __fastcall TMainForm::Button7Click(TObject *Sender){if (Body){
AnsiString N=S_NAME->Text;if (N=="") return;if (Body->FindSection(N)!=-1){
Application->MessageBox("Section already exists","Caution",MB_ICONEXCLAMATION|MB_OK);return;}
Body->AddSection(N,Body->PlaneHeight,S_ANGLE->Text.ToDouble());S_LIST->Items->Add(N);Redraw();}
}S_ANGLETEdit
Data Analysis 임의의 단면 추출 단면의 각도 지정
4
void TBodyData::AddSection(AnsiString N,float y,float angle){...NM.Set(0,cos(theta),sin(theta));...TBodySection *S=AddSection(N);S->Angle=angle;...}
class TBodySection{public:
TBodySection();~TBodySection();
AnsiString Name;float Angle;
...
NMy
ztheta
Section
Data Analysis 임의의 단면 추출 단면의 각도 지정
5
Angle=0 Angle=30
Data Analysis 임의의 단면 추출 단면의 각도 지정
임의 각도 단면 추출의 문제점
6
S_ANGLETEdit
각도에 관계없이 x, z 좌표로만 projection 되는 문제
Data Analysis 임의의 단면 추출 단면의 각도 지정
3D 와 2D 점을 따로 관리해야 함
7
class TBodySection{public:
...TPoint3D *Point3D,*Point;
...}
TBodySection::TBodySection(){...Point=0;Point3D=0;...}
TBodySection::~TBodySection(){if (Point) delete[]Point;if (Point3D) delete[]Point3D;Point=0;Point3D=0;PointNum=0;...}
void TBodyData::Draw(TOpenGL *GL){if (Model){...
if (ShowSection){for(i=0;i<SectionNum;i++){
GL->DrawPoints(Section[i]->PointNum,Section[i]->Point3D,3,255,0,0);}
}...}
Data Analysis 임의의 단면 추출 단면의 각도 지정
3D 와 2D 점을 따로 관리해야 함
8
void TBodyData::AddSection(AnsiString N,float y,float angle){...S->Point=new TPoint3D[num];S->Point3D=new TPoint3D[num];for(i=0;i<Model->ElemNum;i++){
for(j=0;j<3;j++){k=(j==2) ? 0 : j+1;if (is[i*3+j]){ // 교차한다면
p1=Model->Node[Model->Elem[i*3+j]]-O;p2=Model->Node[Model->Elem[i*3+k]]-O;TPoint3D p=GetIntersection(NM,p1,p2);S->Point3D[S->PointNum]=p+O;
// projected 2D points
float y=p.y*cos(-theta)-p.z*sin(-theta);float z=p.y*sin(-theta)+p.z*cos(-theta);p.Set(p.x,y,z);S->Point[S->PointNum++]=p+O;}
}...}
Data Analysis 임의의 단면 추출 단면의 각도 지정
정확한 치수 측정이 가능
– Normal vector가 임의의 각도라면 어떨까 ? (Homework)
9
Data Analysis 랜드마크 자동 계측 주요 랜드마크의 자동 계측
메뉴 추가
10
void __fastcall TMainForm::FindLandmarks1Click(TObject *Sender){if (Body){
Body->FindLandmarks();SetInformation();Redraw();}
Data Analysis 랜드마크 자동 계측 주요 랜드마크의 자동 계측
실루엣 이미지의 추출
11
void TBodyData::GetSilhouette(){Model->GetSize();Graphics::TBitmap *B=new Graphics::TBitmap;B->HandleType=bmDIB; // for image analysisB->PixelFormat=pf24bit;B->Width=Model->Mx-Model->mx;B->Height=Model->My-Model->my;B->Canvas->Pen->Color=clBlack;B->Canvas->Brush->Color=clBlack;TPoint P[3];int i,j;for(i=0;i<Model->ElemNum;i++){
for(j=0;j<3;j++){TPoint3D p=Model->Node[Model->Elem[i*3+j]];P[j].x=(int)(p.x-Model->mx);P[j].y=B->Height-1-(int)(p.y-Model->my);}
B->Canvas->Polygon(P,2);}
B->SaveToFile("silhouette.bmp"); // for testdelete B;}
Data Analysis 랜드마크 자동 계측 주요 랜드마크의 자동 계측
실루엣 외곽선 점 추출
12
void TBodyData::GetSilhouette(){...TPoint2D *point=new TPoint2D[B->Width*B->Height];int num=0;for(i=1;i<B->Height-1;i++){
BYTE *L1=(BYTE*)B->ScanLine[i-1];BYTE *L2=(BYTE*)B->ScanLine[i];BYTE *L3=(BYTE*)B->ScanLine[i+1];for(j=1;j<B->Width-1;j++){
if (L2[j*3]==0){ // black pixelbool edge=false;if (L1[(j-1)*3]==255) edge=true;if (L1[j*3]==255) edge=true;if (L1[(j+1)*3]==255) edge=true;if (L2[(j-1)*3]==255) edge=true;if (L2[(j+1)*3]==255) edge=true;if (L3[(j-1)*3]==255) edge=true;if (L3[j*3]==255) edge=true;if (L3[(j+1)*3]==255) edge=true;
if (edge){point[num].x=Model->mx+j;point[num].y=Model->My-i;num++;}
}}
}FILE *F=fopen("silhouette.csv","w+"); // for testfor(i=0;i<num;i++){
fprintf(F,"%f,%f\n",point[i].x,point[i].y);}
fclose(F);delete[]point;
delete B;}
Data Analysis 랜드마크 자동 계측 주요 랜드마크의 자동 계측
실루엣 외곽선 점 추출
13
Polar Plot ?
Data Analysis 랜드마크 자동 계측 주요 랜드마크의 자동 계측
실루엣 외곽선을 폐곡선으로 만들기
14
...
// 폐곡선 만들기
if (Silhouette) delete Silhouette;Silhouette=new TBodySection;Silhouette->PointNum=num;Silhouette->Point=new TPoint3D[num];for(i=0;i<num;i++){
Silhouette->Point[i].Set(point[i].x,0,point[i].y);}
Silhouette->Range[0]=-5000;Silhouette->Range[1]=5000;Silhouette->FindClosedPath();
FILE *F=fopen("path.csv","w+"); // for testfor(i=0;i<Silhouette->PathNum;i++){
fprintf(F,"%f,%f\n",Silhouette->Path[i].x,Silhouette->Path[i].y);}
fclose(F);
delete []point;delete B;
Data Analysis 랜드마크 자동 계측 주요 랜드마크의 자동 계측
원점에서 외곽선까지의 거리를 그래프로 나타내보기
15
void TBodyData::FindLandmarks(){GetSilhouette();int i;FILE *F=fopen("polarcoord.csv","w+");for(i=0;i<Silhouette->PathNum;i++){
fprintf(F,"%f\n",Silhouette->Path[i].Length());}
fclose(F);}
Armpit
Crotch
float TPoint2D::Length(){return sqrt(x*x+y*y);}
Data Analysis 랜드마크 자동 계측 주요 랜드마크의 자동 계측
Crotch 점 찾기
16
void TBodyData::FindLandmarks(){GetSilhouette();
// Find Crotch
int i,Crotch;float d,MinD=10000;for(i=0;i<Silhouette->PathNum;i++){
d=Silhouette->Path[i].Length();if (d<MinD){
MinD=d;Crotch=i;}
}TBodyLandmark *L=AddLandmark("Crotch");L->Position=FindNearestPoint(Silhouette->Path[Crotch]);}
TPoint3D TBodyData::FindNearestPoint(TPoint2D p){int i,MinP;TPoint3D P;P.Set(p.x,p.y,0);float d,MinD=10000;for(i=0;i<Model->NodeNum;i++){
d=P.Distance(Model->Node[i]);if (d<MinD){
MinD=d;MinP=i;}
}return Model->Node[MinP];}
Data Analysis 랜드마크 자동 계측 주요 랜드마크의 자동 계측
Crotch 점 찾기
17
Data Analysis 랜드마크 자동 계측 주요 랜드마크의 자동 계측
Armpit점 찾기
18
Crotch대략적인 범위설정
0.45N~065N ?
대략적인 범위설정
1.35N~1.55N ?
N
Data Analysis 랜드마크 자동 계측 주요 랜드마크의 자동 계측
Armpit점 찾기
19
// Find Armpit
int RArmpit=FindPeak(Crotch,0.45,0.65);L=AddLandmark("R Armpit");L->Position=FindNearestPoint(Silhouette->Path[RArmpit]);int LArmpit=FindPeak(Crotch,1.35,1.55);L=AddLandmark("L Armpit");L->Position=FindNearestPoint(Silhouette->Path[LArmpit]);}
int TBodyData::FindPeak(int N,float s,float e){int i,MaxP;int S=(int)((float)N*s);int E=(int)((float)N*e);float d,MaxD=-10000;for(i=S;i<E;i++){
d=Silhouette->Path[i].Length();if (d>MaxD){
MaxD=d;MaxP=i;}
}return MaxP;}
Data Analysis 랜드마크 자동 계측 주요 랜드마크의 자동 계측
Armpit점 찾기
– 다른 점도 찾을 수 있지 않을까 ? (Homework)
20
Homework Chapter 4
TModel3D 를 써서 구 (Sphere) 모델링하기
ASCII 타입의 OBJ 파일을 읽어오기
Chapter 7
단면의 높이를 지정하는 UI 를 개선해보기
Chapter 10
임의 각도 단면의 측정
추가 랜드마크 찾기
프로그램의 최종 소스파일을 zip 파일로 묶어서 제출
21