1

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)];
        }
    }
}
4

0 に答える 0