簡體   English   中英

Mat OpenCV中的斷言失敗

[英]Assertion failed in Mat OpenCV

我多次在OpenCV中運行EM算法。 最初,EM使用默認的初始參數運行。 在后續迭代中,我們根據先前迭代的輸出將參數傳遞給EM算法。 這是代碼

Mat meansCombine;
Mat weightsCombine;
vector<Mat> covsCombine;
for(int k=maxComponents; k>=minComponents; k--){

    EM model(k,EM::COV_MAT_DIAGONAL,TermCriteria(TermCriteria::COUNT+TermCriteria::EPS,2,0.0001));

    Mat labels;
    Mat probs;
    Mat log_likelihoods;

    if( k==maxComponents )
    {
        model.train(samples,log_likelihoods, labels, probs);
    }
    else
    {
        model.trainE(samples, meansCombine, covsCombine, weightsCombine, log_likelihoods, labels, probs); //provide parameters as per previous iteration results
    }

    double total_likelihood = 0.0;

    for(int i=0;i<log_likelihoods.rows;i++){
        double t = log_likelihoods.at<double>(i,0);
        total_likelihood += t;

    }

    int dimension =3;
    double l = k*(1 + dimension + ((dimension+1)*dimension)/2)-1;
    double penalty = 0.5*l*log(samples.rows*dimension);
    double mdl = -total_likelihood + penalty;
    mdl_output << "********** No. of components=" << k << "***********" << endl;
    mdl_output << "Total log likelihood=" << total_likelihood << endl;
    mdl_output << "Penalty=" << penalty << endl;
    mdl_output << "MDL value=" << mdl << endl;

    if(mdl < minMdl)
    {   
        minMdl = mdl;
        minK = k;
    }

    int c1,c2;
    Mat means = model.get<Mat>("means");
    Mat weights = model.get<Mat>("weights");
    vector<Mat> covs = model.get<vector<Mat> >("covs");

    leastBhattacharyaDist(means,covs,c1,c2);
    mdl_output << "Merging components" << c1 <<" and " << c2 <<endl;

    meansCombine = Mat(means.rows-1,means.cols,means.type());
    weightsCombine = Mat(weights.rows,(weights.cols)-1,weights.type());
    covsCombine.clear();

    mergeComponents(means,covs,weights,c1,c2,meansCombine,covsCombine,weightsCombine);

}

運行此代碼會給我以下斷言失敗消息。

Assertion failed (0 <= _rowRange.start && _rowRange.start <= _rowRange.end && _rowRange.end <= m.rows) in Mat, file /home/one_more_step/Documents/OpenCV/opencv-2.4.7/modules/core/src/matrix.cpp, line 284

無法追蹤錯誤。 提前致謝。

斷言通常表明以下代碼是在考慮某些假設的情況下編寫的-並且您的參數不符合這些假設。 (您可以做的最愚蠢的事情是刪除斷言-是的,代碼可能會起作用,但是在沒有滿足所有假設之后,您將來會在某個地方開槍。)

斷言有時很復雜,因為它們可能是由您無法控制的變量或代碼流觸發的。

通常,斷言非常容易調試。 在斷言發生時,只需在調試器中運行代碼:查看回溯。

回溯將通過上面顯示的代碼告訴您調用在哪里發生。

通過遍歷回溯的框架,您可以檢查所有變量的值-這將告訴您斷言為何消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM