ページ 11

輪郭の追跡で無限ループに陥る

Posted: 2011年8月06日(土) 07:04
by aop
カメラから取得した画像でリアルタイムに画像処理を加える(輪郭を青で描く)ためにプログラムを組んだのですが、2秒くらい正常にうごいた後に固まってしまいます。
ブレークポイントなどをおいてみると輪郭追跡のループで無限ループになってしまっているようです

輪郭追跡は
http://homepage2.nifty.com/tsugu/sotuken/binedge/
を参考に作りました。
動作環境は
VisualC++ 2008
CPU:corei5
メモリ:8GB

コード:

/*以下質問用の参考事項
int rdata[320][240]には0または1があります
輪郭はrdataの値は変えずに画像の情報だけをかえています
c_width=320,c_height=240です*/
//画像内を捜査し有効画素を探す
		for(int i=0; i< c_height; i++) {
			for(int j=0; j < c_width; j++) {
				//有効画素があった場合輪郭追跡に入る
				if(rdata[i][j]!=0) {
					/*輪郭追跡*/
					//追跡用初期化
					sx=i;sy=j;px=sx;py=sy;
					DrawPixelSoftImage(Redcap,sx,sy,0,0,255,0);
					vec=2;IsFirst=1;

					//追跡開始点と追跡点が同じ座標なるまで輪郭追跡処理
					while( px != sx  ||  py != sy  ||  IsFirst == 1 ) {
						switch(vec) {
						case 0:    //左上を調査
							if( rdata[px-1][py-1]!= 0 ) {
								DrawPixelSoftImage(Redcap,px-1,py-1,0,0,255,0);
								px--; py--;
								vec = 6;
								break;
							}
						 case 1:    //左を調査
							if( rdata[px-1][py]!= 0 ) {
								DrawPixelSoftImage(Redcap,px-1,py,0,0,255,0);
								px--;
								vec = 0;
								break;
							}
						case 2:    //左下を調査
							if( rdata[px-1][py+1]!= 0 ) {
								DrawPixelSoftImage(Redcap,px-1,py+1,0,0,255,0);
								px--; py++;
								IsFirst = 0;
								vec = 0;
								break;
							}
						case 3:    //下を調査
							if( rdata[px][py+1]!= 0 ) {
								DrawPixelSoftImage(Redcap,px,py+1,0,0,255,0);
								py++;
								IsFirst = 0;
								vec = 2;
								break;
							}
						case 4:    //右下を調査
							if( rdata[px+1][py+1]!= 0 ) {
								DrawPixelSoftImage(Redcap,px+1,py+1,0,0,255,0);
								px++; py++;
								IsFirst = 0;
								vec = 2;
								break;
							}
						case 5:    //右を調査
							if( rdata[px+1][py]!= 0 ) {
								DrawPixelSoftImage(Redcap,px+1,py,0,0,255,0);
								px++;
								IsFirst = 0;
								vec = 4;
								break;
							}
							else {
								//孤立点であった場合
								if( IsFirst == 1 ) {
									IsFirst = 0;
									break;
								}
							}
						case 6:    //右上を調査
							if( rdata[px+1][py-1]!= 0 ) {
								DrawPixelSoftImage(Redcap,px+1,py-1,0,0,255,0);
								px++; py--;
								vec = 4;
								break;
							}
						case 7:    //上を調査
							if(rdata[px][py-1]!= 0 ) {
								DrawPixelSoftImage(Redcap,px,py-1,0,0,255,0);
								py--;//px=px
								vec = 6;
								break;
							}
						vec = 0;
						}
					}
				break;

				}
			}
		}