新たなスタート,手の認識から

color1
color2

rooms19とLumineとtaicoclubも終わり,慌ただしく9月も終わりそう.
仕事は後2つぐらいこなせばいいから気が楽.
疲れがでて,丸一日寝込んだ.ニキビできた.回復した.

ということで,今やってるのが,手の認識をしてどおのこおのというやつなんだけど,これが意外と難しいかも?って考えだしてから気づいた.
言われた感じだと,手の大きさが30pxぐらいにしかならないから.無理です.
一応,ちょっときれいめの背景差分をして,そこから,輪郭を求めて面積でしきい値処理をして,クラスタリングをして,輪郭の曲率を求めて認識させようかと.
いい論文があったんだけど,丸一日はかかりそう..

というところで,輪郭あたりをとるプログラムを,
僕が卒論のときに書いたやつ.誰かのを参考にしたけど,わからないや.
cvStartFindContoursで初期化とかをしてからcvFindNextContourするとこがクラスタリングのポイントかな?結構レアな関数だから気づきにくいかも.

CvMemStorage* storage = cvCreateMemStorage( 0 );
CvSeq* find_contours = NULL;
CvSeq *tempseq;
CvPoint *data = NULL;
CvPoint center;
CvContourScanner cs;
CvMoments moments;
int area;
int distThreshold = 30;
int areaThreshold = 1000;

void ImageEffect::contours(IplImage* inputImage){

cs = cvStartFindContours( inputImage, storage, sizeof(CvContour),
CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cvPoint( 0, 0 ));
do {
tempseq = cvFindNextContour(cs);
if (tempseq != NULL) {
area = fabs(cvContourArea(tempseq, CV_WHOLE_SEQ));

if (area >= areaThreshold) {

cvContourMoments(tempseq, &moments);
center = cvPoint((int)cvGetSpatialMoment( &moments, 1, 0 ) /cvGetSpatialMoment( &moments, 0, 0),(int)cvGetSpatialMoment( &moments, 0, 1 )/cvGetSpatialMoment( &moments, 0, 0));

ofSetColor(0, 255, 0);
for(int te =0; te total; te++)
{
data = (CvPoint*)cvGetSeqElem(tempseq,te);
if( sqrt((center.x – data->x) * (center.x – data->x) + (center.y – data->y) * (center.y – data->y) ) > distThreshold){
ofRect(data->x, data->y, 1, 1);
}

}
ofCircle(center.x, center.y, 10);
}
}
}while (tempseq != NULL);

}

さ,早寝早起き.

タグ: ,