Я получаю ошибки памяти, хотя я не управляю памятью вручную в c ++ - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь найти самую яркую точку на изображении и сделать какую-то "карту яркости" с функцией ниже.Он отлично работает с одним изображением, но когда я пытаюсь запустить функцию для всех изображений в каталоге, он делает 19 итераций, а затем перебивает с различными ошибками памяти.

Я использую Qt Creator 4.5.на основе Qt 5.10 с библиотекой Open cv

free(): corrupted unsorted chunks

free(): invalid next size (normal)

malloc_consolidate(): invalid chunk size

Я понимаю, что у меня проблемы с памятью, но не могу найти, где я это сделал.Я новичок в программировании и не использовал функции памяти в этой программе.

Функция, где возникает проблема.Обычно он разбивается на строку с convertTo().

cv::Mat Plot::statistic(const std::vector<cv::KeyPoint> &kp, const size_t dist, cv::Mat output_size) {

cv::Mat result = cv::Mat::zeros(output_size.size(), CV_32F); 

for(int i = 0, imax= kp.size(); i < imax; ++i) {
    cv::KeyPoint curr_kp=kp[i];
    for(size_t m = curr_kp.pt.x - dist/2 ; m < curr_kp.pt.x + dist/2; ++m)
        for(size_t n = curr_kp.pt.y - dist/2; n < curr_kp.pt.y + dist/2; ++n)
            if(abs(cv::norm(cv::Point2f(m,n) - curr_kp.pt)) < dist/2)
                result.at<float>(n,m) += 255.f/kp.size();
}

double maxVal=1;
cv::Point point_max;
cv::minMaxLoc(result,NULL,&maxVal,NULL,&point_max);
result.convertTo(result,CV_8U,255.f/maxVal);
return result;
}

Как я это называю:

for(int i=2,imax=plot_analyse.size();i<imax;i++) {
    QString curr_img=input_image.absoluteFilePath(plot_analyse[i]);
    QString output_path=output_dir+"/pltnst_"+curr_img.section("/",-1); //Setting output folder

    mt_make.Make_analysis(curr_img,5000); //Finding up to 5000 keypoints on image
    std::vector<cv::KeyPoint> original_kp = mt_make.Keypoints(); //Make a variable for keypints

    if (original_kp.empty()) {continue; }
    cv::Mat output_mat=Do.Open_image(curr_img.toStdString()); //Opening current image
    output_mat=make_maps.statistic(original_kp,100,output_mat); //Calling function
    cv::imwrite(output_path.toStdString(),output_mat); //Saving ready brightness map
}

Входная папка содержит 500+ серых изображений с разрешением 1000x1000.Я ожидаю, что все эти изображения будут иметь карты яркости в выходной папке и точки максимальной яркости для каждого.

...