함수간 변수 사용 및 flag 사용
큰맘
두개의 다른 함수가 있고한개의함수 안에서 다른 함수를 실행하는데flag를 사용해서 제가 필요한 값만얻어오려고 합니다. 알려주시면 감사하겠습니다.int findflag;void VisionDlg::Image(IplImage * m_srcImage, double decording_frame)
{
FindCorner(label.I_blobnum,center_w,center_h,m_image); 이 함수를 실행
CvFont font2;
//cvInitFont(&font2,CV_FONT_HERSHEY_SIMPLEX,0.5,0.5);
cvInitFont(&font2, CV_FONT_HERSHEY_COMPLEX,0.5,0.5);
char time[10] ={0,};
sprintf(time,%.1f,decording_sec);
int newdataflag = 0;
for(k=0;k4;k++)
{
Mat_dot[k]=Mat_pt[k+2];
}for (row=0;row2;row++)
{
for(col=0;col4;col++)
{
if(row ==0)Mat_poxy[row][col] = Mat_dot[col].x - center_w;//Mat_poxy[row][col] = Mat_dot[col].x-400;
elseMat_poxy[row][col]= center_h - Mat_dot[col].y;//Mat_poxy[row][col]=300-Mat_dot[col].y;
}
}
for (int jh = 1; jh 4; jh++)
{
if(preDotpt[jh].y == Mat_dot[jh].y && preDotpt[jh].x == Mat_dot[jh].x)
newdataflag = 0;
else
{
newdataflag = 1;
break;
}
}
//}
for (int jh = 1; jh 4; jh++)
{
preDotpt[jh] = Mat_dot[jh];
}
if (pre_decording_sec != decording_sec)
secflag = 0;
PostVisionSolFile = fopen(config.Sol_VisionPath.GetBuffer(),a+);fprintf(PostVisionSolFile,%d\t,(int)decording_sec);
fprintf(PostVisionSolFile,%d\t ,(int)(decording_frame));
for (col=0;col4;col++)
for (row=0;row2;row++)
fprintf(PostVisionSolFile,%d\t ,Mat_poxy[row][col]);
fprintf(PostVisionSolFile,%d\t,newdataflag);
fprintf(PostVisionSolFile,\n);fclose(PostVisionSolFile);
cvShowImage(Vision ,m_image);
DelVisMem();
cvReleaseImage( &labeled );
cvReleaseImage( &grayimage );
Invalidate(FALSE);
secflag++;
}
void VisionDlg::FindCorner(int I_blobnum,int center_w, int center_h,IplImage *m_image1) 함수 실행
{
for(int zz=0; zz label.I_blobnum; zz++ )
{
Mat_pt[0] = cvPoint( label.I_blobinform[zz].x,label.I_blobinform[zz].y);;
Mat_pt[1] = cvPoint( Mat_pt[0].x + label.I_blobinform[zz].width, Mat_pt[0].y + label.I_blobinform[zz].height);CvMemStorage* storage= cvCreateMemStorage(0);
CvSeq* contours= 0;// 1. 윤곽 검출
int mw= label.I_blobinform[zz].width;
int mh= label.I_blobinform[zz].height;IplImage* marker = cvCreateImage( cvSize(mw, mh), 8, 1 );
label.getblob(marker, zz);cvFindContours( marker, storage, &contours, sizeof (CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
//2. 꼭지점 추출
if (contours != 0)
{
int x;
doublefMaxDist;
CvPointcorner[4];for( x=0; x 4; x++ )corner[x] = cvPoint(0, 0);//초기 위치 설정
CvPoint *st = (CvPoint *)cvGetSeqElem( contours, 0 );
// 첫 번 째 꼭지점 추출(최대 거리를 가지는 점 선택)
fMaxDist = 0.0;for( x = 1; x contours-total; x++ )
{
CvPoint* pt = (CvPoint *)cvGetSeqElem( contours, x );double fDist = sqrt( (double)(( st-x - pt-x ) * ( st-x - pt-x ) + ( st-y - pt-y ) * ( st-y - pt-y ) ));if( fDist fMaxDist )
{
corner[0] = *pt;fMaxDist = fDist;
}
}// 두 번 째 꼭지점 추출(첫 번 째 꼭지점에서 최대 거리를 가지는 점 선택)
fMaxDist = 0.0;for( x = 0; x contours-total; x++ )
{
CvPoint* pt = (CvPoint *)cvGetSeqElem( contours, x );double fDist = sqrt( (double)(( corner[0].x - pt-x ) * ( corner[0].x - pt-x ) + ( corner[0].y - pt-y ) * ( corner[0].y - pt-y ) ));if( fDist fMaxDist )
{
corner[1] = *pt;fMaxDist = fDist;
}
}// 세 번 째 꼭지점 추출(첫 번 째, 두 번 째 꼭지점에서 최대 거리를 가지는 점 선택)
fMaxDist = 0.0;for( x = 0; x contours-total; x++ )
{
CvPoint* pt = (CvPoint *)cvGetSeqElem( contours, x );double fDist =sqrt( (double)(( corner[0].x - pt-x ) * ( corner[0].x - pt-x ) + ( corner[0].y - pt-y ) * ( corner[0].y - pt-y ) ))
+sqrt( (double)(( corner[1].x - pt-x ) * ( corner[1].x - pt-x ) + ( corner[1].y - pt-y ) * ( corner[1].y - pt-y ) ));if( fDist fMaxDist )
{
corner[2] = *pt;fMaxDist = fDist;
}
}// 네 번 째 꼭지점 추출
// (벡터 내적을 이용하여 좌표평면에서 사각형의 너비의 최대 값을 구한다.)
int x1 = corner[0].x;int y1 = corner[0].y;
int x2 = corner[1].x;int y2 = corner[1].y;
int x3 = corner[2].x;int y3 = corner[2].y;int nMaxDim = 0;for( x = 0; x contours-total; x++ )
{
CvPoint* pt = (CvPoint *)cvGetSeqElem( contours, x );int x = pt-x;
int y = pt-y;int nDim =abs( ( x1 * y2 + x2 * y + x * y1 ) - ( x2 * y1 + x * y2 + x1 * y ) )
+abs( ( x1 * y + x * y3 + x3 * y1 ) - ( x * y1 + x3 * y + x1 * y3 ) )
+abs( ( x * y2 + x2 * y3 + x3 * y ) - ( x2 * y + x3 * y2 + x * y3 ) );if( nDim nMaxDim )
{
corner[3] = *pt;nMaxDim = nDim;
}
}Mat_pt[2] = cvPoint( corner[0].x + label.I_blobinform[zz].x , corner[0].y + label.I_blobinform[zz].y );
Mat_pt[3] = cvPoint( corner[1].x + label.I_blobinform[zz].x , corner[1].y + label.I_blobinform[zz].y );
Mat_pt[4] = cvPoint( corner[2].x + label.I_blobinform[zz].x , corner[2].y + label.I_blobinform[zz].y );
Mat_pt[5] = cvPoint( corner[3].x + label.I_blobinform[zz].x , corner[3].y + label.I_blobinform[zz].y );////////////////////////// sort
CvPoint center,tmp_sort[4];
double dmax,dmin,dmax_se,dmin_se,dmin_th;
double d[4],d_se[4],d_th[4];
int maxnum,minnum,minnum_se,minnum_th;
dmax = 0;dmin = 640;dmin_se = 640;dmin_th = 640;
center = cvPoint(100,100);//cvPoint(320,240);
tmp_sort[0] = Mat_pt[2];tmp_sort[1] = Mat_pt[3];tmp_sort[2] = Mat_pt[4];tmp_sort[3] = Mat_pt[5];d[0] = sqrt(double((tmp_sort[0].x-center.x)*(tmp_sort[0].x-center.x)+(tmp_sort[0].y-center.y)*(tmp_sort[0].y-center.y)));
d[1] = sqrt(double((tmp_sort[1].x-center.x)*(tmp_sort[1].x-center.x)+(tmp_sort[1].y-center.y)*(tmp_sort[1].y-center.y)));
d[2] = sqrt(double((tmp_sort[2].x-center.x)*(tmp_sort[2].x-center.x)+(tmp_sort[2].y-center.y)*(tmp_sort[2].y-center.y)));
d[3] = sqrt(double((tmp_sort[3].x-center.x)*(tmp_sort[3].x-center.x)+(tmp_sort[3].y-center.y)*(tmp_sort[3].y-center.y)));for (int k=0;k4;k++)
{
if (d[k] dmax)
{
dmax = d[k];
maxnum = k;
}
if (d[k] dmin)
{
dmin = d[k];
minnum = k;
}
}d_se[0] = sqrt(double((tmp_sort[0].x-tmp_sort[maxnum].x)*(tmp_sort[0].x-tmp_sort[maxnum].x)+(tmp_sort[0].y-tmp_sort[maxnum].y)*(tmp_sort[0].y-tmp_sort[maxnum].y)));
d_se[1] = sqrt(double((tmp_sort[1].x-tmp_sort[maxnum].x)*(tmp_sort[1].x-tmp_sort[maxnum].x)+(tmp_sort[1].y-tmp_sort[maxnum].y)*(tmp_sort[1].y-tmp_sort[maxnum].y)));
d_se[2] = sqrt(double((tmp_sort[2].x-tmp_sort[maxnum].x)*(tmp_sort[2].x-tmp_sort[maxnum].x)+(tmp_sort[2].y-tmp_sort[maxnum].y)*(tmp_sort[2].y-tmp_sort[maxnum].y)));
d_se[3] = sqrt(double((tmp_sort[3].x-tmp_sort[maxnum].x)*(tmp_sort[3].x-tmp_sort[maxnum].x)+(tmp_sort[3].y-tmp_sort[maxnum].y)*(tmp_sort[3].y-tmp_sort[maxnum].y)));for (int kk=0;kk4;kk++)
{
if (d_se[kk] dmin_se && kk != maxnum && kk != minnum)
{
dmin_se = d_se[kk];
minnum_se = kk;
}
}d_th[0] = sqrt(double((tmp_sort[0].x-tmp_sort[minnum].x)*(tmp_sort[0].x-tmp_sort[minnum].x)+(tmp_sort[0].y-tmp_sort[minnum].y)*(tmp_sort[0].y-tmp_sort[minnum].y)));
d_th[1] = sqrt(double((tmp_sort[1].x-tmp_sort[minnum].x)*(tmp_sort[1].x-tmp_sort[minnum].x)+(tmp_sort[1].y-tmp_sort[minnum].y)*(tmp_sort[1].y-tmp_sort[minnum].y)));
d_th[2] = sqrt(double((tmp_sort[2].x-tmp_sort[minnum].x)*(tmp_sort[2].x-tmp_sort[minnum].x)+(tmp_sort[2].y-tmp_sort[minnum].y)*(tmp_sort[2].y-tmp_sort[minnum].y)));
d_th[3] = sqrt(double((tmp_sort[3].x-tmp_sort[minnum].x)*(tmp_sort[3].x-tmp_sort[minnum].x)+(tmp_sort[3].y-tmp_sort[minnum].y)*(tmp_sort[3].y-tmp_sort[minnum].y)));for (int kkk=0;kkk4;kkk++)
{
if (d_th[kkk] dmin_th && kkk != maxnum && kkk != minnum && kkk != minnum_se)
{
dmin_th = d_th[kkk];
minnum_th = kkk;
}
}Mat_pt[2] = tmp_sort[maxnum];
Mat_pt[3] = tmp_sort[minnum_th];
Mat_pt[4] = tmp_sort[minnum_se];
Mat_pt[5] = tmp_sort[minnum];
////////////////////////// sortcvReleaseMemStorage( &storage );
cvReleaseImage( &marker );CvScalar color = cvScalar(0,0,255);//b,g,r
CvScalar color1 = cvScalar(0,255,0);
CvScalar color2 = cvScalar(255,0,0);
CvScalar color3 = cvScalar(0,0,0);
&nbbr /if((Mat_pt[2].y 200) && (Mat_pt[5].y 300) && (Mat_pt[5].x 300) && (Mat_pt[2].y == Mat_pt[3].y) && (Mat_pt[2].x == Mat_pt[4].x) && (Mat_pt[3].x == Mat_pt[5].x))
{
cvCircle(m_image1,Mat_pt[2],5,color,2,8,0);
cvCircle(m_image1,Mat_pt[3],5,color1,2,8,0);
cvCircle(m_image1,Mat_pt[4],5,color2,2,8,0);
cvCircle(m_image1,Mat_pt[5],5,color3,2,8,0);
findflag = 0;
} 이부분에 해당하는 값만 위의 함수에 사용하고 싶다
else
{
findflag = 1;
}}}
}
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2676182 | 숫자 순서대로 배열하는법 | 권뉴 | 2024-11-24 |
2676152 | 기본적인거 하나 질문드립니다. | 개미 | 2024-11-24 |
2676124 | 함수선언관련 질문이에요~...털썩..수정완료 (2) | 가지 | 2024-11-24 |
2676092 | C언어 책 (2) | 아서 | 2024-11-24 |
2676065 | 웹사이트 또는 메신저 등에서 원하는 텍스트를 검사하는방법?? (1) | 모든 | 2024-11-23 |
2676033 | 배열 기초연습중 발생하는 에러 ㅠㅜ... | Creative | 2024-11-23 |
2676005 | keybd_event 게임 제어 | 영글 | 2024-11-23 |
2675900 | 진짜기본적인질문 | 글길 | 2024-11-22 |
2675845 | 수정좀해주세요ㅠㅠㅠ | 해골 | 2024-11-21 |
2675797 | 병합 정렬 소스 코드 질문입니다. (2) | 도래솔 | 2024-11-21 |
2675771 | 큐의 활용이 정확히 어떻게 되죠?? | 해긴 | 2024-11-21 |
2675745 | 도서관리 프로그램 질문이요 | 도리도리 | 2024-11-20 |
2675717 | 2진수로 변환하는것! (3) | 동생몬 | 2024-11-20 |
2675599 | for문 짝수 출력하는 법 (5) | 널위해 | 2024-11-19 |
2675575 | Linux 게시판이 없어서.. | 첫삥 | 2024-11-19 |
2675545 | 구조체 이용할 때 함수에 자료 넘겨주는 것은 어떻게 해야 하나요? | 아연 | 2024-11-19 |
2675518 | 사각형 가로로 어떻게 반복해서 만드는지좀.. 내용 | 신당 | 2024-11-18 |
2675491 | !느낌표를 입력하는것은 어떻게합니까~~?ㅠㅠ (5) | 사지타리우스 | 2024-11-18 |
2675411 | 파일입출력으로 받아온 파일의 중복문자열을 제거한 뒤 파일출력 | 앨버트 | 2024-11-17 |
2675385 | 링크드리스트 주소록 질문드립니다. (1) | 겨루 | 2024-11-17 |