void Track(void)
{
// 肌色を抽出する
extractSkinColor(frameImage, hsvImage, skinImage);
// 欠損領域を補間する
interpolate(skinImage, temp);
sabun(skinImage);
// ラベリングを行う
Label *labeling = createLabeling();
exec(labeling, skinImage, label, true, IGNORE_SIZE);
if (getNumOfResultRegions(labeling) > 0) {
// IGNORE_SIZEよりも大きな領域があった場合
int handarea; // 手領域の面積
int hullcount; // ConvexHullの頂点の数
CvPoint *handpoint; // 手領域内の点の座標配列
int *hull; // ConvexHullの頂点のhandpointにおけるindex番号
CvMat pointMatrix; // 手領域用行列
CvMat hullMatrix; // ConvexHull用行列
// 最大領域(手領域)の抽出を行う
handarea = pickupMaxArea(skinImage, label, convexHullImage);
// ConvexHullを生成する
createConvexHull(skinImage, handarea, &handpoint, &hull,
&pointMatrix, &hullMatrix);
hullcount = hullMatrix.cols;
// ConvexHullを描画する
drawConvexHull(convexHullImage, handpoint, hull, hullcount);
// ConvexHull内の面積を求める
hullarea =
calcConvexHullArea(convexHullImage, handpoint, hull,
hullcount);
printf("%d\n",hullarea);
// ジャンケンの判定を行う
if(hullarea <= 150000 && hullarea >= 60000)
decide(handarea, hullarea);
else
printf("n\n");
// メモリを解放する
free(handpoint);
free(hull);
} else {
// 画像を初期化する
cvSetZero(convexHullImage);
}
releaseLabeling(labeling);
if (skinImage->origin == 0) {
// 左上が原点の場合
cvFlip(skinImage, skinImage, 0);
}
if (convexHullImage->origin == 0) {
// 左上が原点の場合
cvFlip(convexHullImage, convexHullImage, 0);
}
}
最終更新:2010年01月29日 14:20