#stub
複数枚の画像から,各座標における最頻値を計算する方法. 主に,固定カメラで撮影されたビデオシーケンスから背景画像を計算する方法
疎な多次元行列CvSparseMat型を生成する.画像におけるcvCreateImage,(密な)行列におけるcvCreateMat.
#geshi(c++,number){{ int dimensionSize[] = {256, 256, 256}; const int NUMBER_OF_DIMENSIONS = 3; IplImage *image = cvLoadImage(inputFileName[0]);
/*---生成---*/ CvSparseMat **histogram = new CvSparseMat* [image->width*image->height]; for(int i = 0;i < image->width*image->height;i++){
// ピクセルごとにヒストグラム用のCvSparseMatを作成 // typeがCV_16UC1なので,カウントは2byte=65536回までカウント可能 histogram[i] = cvCreateSparseMat(NUMBER_OF_DIMENSIONS, dimensionSize, CV_16UC1);
}
IplImage *background = cvCloneImage(image); cvReleaseImage(&image);
for(int frame = 0;frame < FRAME_LENGTH;frame++){
image = cvLoadImage(inputFileName[frame]);
/*---データ格納 ---*/
for(int y = 0;y < image->height;y++){
for(int x = 0;x < image->width;x++){
// RGBの値を取得
CvScalar color = cvGet2D(image, y, x);
// RGBによる3次元座標を構築してdimensionSizeに格納
for(int i = 0;i < NUMBER_OF_DIMENSIONS;i++){
dimensionSize[i] = color.val[i];
}
// dimensionSizeで指定した座標(色)が過去何回現れたか取得
// 1度も現れてない場合は0が返される
CvScalar count = cvGetND(histogram[y*image->width+x], dimensionSize);
// カウントアップ
count.val[0]++;
// 格納する
cvSetND(histogram[y*image->width+x], dimensionSize, count);
}
}
cvReleaseImage(&image);
}
for(int y = 0;y < image->height;y++){ for(int x = 0;x < image->width;x++){
// 内部のリスト構造のデータを手繰るためのイタレータ
CvSparseMatIterator mat_iterator;
// 初期化と同時に先頭ノードを返す関数
// 各ピクセルごとに先頭ノードを得る
CvSparseNode *node = cvInitSparseMatIterator(histogram[y*image->width+x], &mat_iterator);
CvSparseNode *head = node;
/*---リストを連結---*/
for(;node != 0;node->next != NULL){
// 疎行列内はリストが連結してるとは限らないので,
// GetNextSparseNodeを使って次ノードを手繰る.
node->next = cvGetNextSparseNode(&mat_iterator);
}
/*---ソーティング---*/
// リスト構造をソーティングする関数を別途定義しておくこと
// ここではマージソートを想定
// headノードが指す番地は最頻値になる
sort(head);
/*---最頻値画像---*/
// 最頻値を取得
// 疎行列内の特定の座標の値を取得するdefine文 CV_NODE_VAL
// unsigned int count = *(unsigned int*)CV_NODE_VAL(histogram[i], node);
// 疎行列内の座標(この場合は色)を取得するdefine文 CV_NODE_IDX
const int* index = CV_NODE_IDX(histogram[y*image->width+x], head);
CvScalar color;
for(int i = 0;i < NUMBER_OF_DIMENSIONS;i++){
color.val[i] = index[i];
}
cvSet2D(background, y, x, color);
} }
/*---解放---*/ for(int i = 0;i < image->width*image->height;i++){
cvReleaseSparseMat(&histogram[i]);
} delete [] histogram; }}
#geshi(c++,number,start=797){{
#define CV_NODE_VAL(mat,node) ((void*)*1
#define CV_NODE_IDX(mat,node) ((int*)*2 }}
ジャンル:OpenCV:OpenCV 2.1準拠