openCV コードで簡単な kmean クラスタリングを行っています。正常に実行されますが、valgrind を使用してメモリの問題があることを確認すると、次のようになります。
==6982== 条件付きジャンプまたは移動は初期化されていない値に依存します
==6982== 初期化されていない値はヒープ割り当てによって作成されました
入力画像 'obs' が大きな行列 'samples' に積み上げられ、kmean 組み込み関数を呼び出す簡単なコードを次に示します。
/*GETINITKMEANS: calculate initial kmeans segmentation (lev,img)
obs: input image
levels: array holding intensity levels
hh: height
ww: width of image
nlevels:number of levels
lev: holds segmentation labels
img: holds segmentation reconstruction
*/
void getinitkmeans(Mat &obs,Mat &lev,Mat &img,vector<UINT8>& levels,int hh,int ww,int nlevels)
{
int dim=hh*ww;
// data for kmeans
Mat samples(dim,3,CV_32F,Scalar(0));
Mat labels(dim,1,CV_8U,Scalar(0));
Mat centers(nlevels,3,CV_32F,Scalar(0));
// extract bgr pixel values into samples matrix
for (int i=0;i<hh;i++)
{
for (int j=0;j<ww;j++)
{
samples.at<float>(i*ww+j,0) = (float)obs.at<Vec3b>(i,j)[0];
samples.at<float>(i*ww+j,1) = (float)obs.at<Vec3b>(i,j)[1];
samples.at<float>(i*ww+j,2) = (float)obs.at<Vec3b>(i,j)[2];
}
}
// run kmeans algorithm
kmeans(samples,nlevels,labels,cv::TermCriteria(CV_TERMCRIT_ITER,30,0),1,KMEANS_RANDOM_CENTERS,centers);
// construct lev, img
for (int i=0;i<hh;i++)
{
for (int j=0;j<ww;j++)
{
lev.at<UINT8>(i,j) = labels.at<int>(i*ww+j,0);
img.at<UINT8>(i,j) = levels[labels.at<int>(i*ww+j,0)];
}
}
}