Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to resolve malloc error in opencv code

Tags:

c++

opencv

My code :

  cv::Mat img_mat = cv::Mat(hough_acc.size(), hough_acc[0].size(), CV_8UC1, cv::Scalar(0));
  std::cout << hough_acc.size(  ) << "  " << hough_acc[0].size() << std::endl;

  for (size_t i = 0; i < hough_acc.size(); i++) {
    for (size_t j = 0; j < hough_acc[0].size(); j++) {
      std::cout << hough_acc[i][j] << std::endl;
      img_mat.at<int> (i,j) = hough_acc[i][j];
    }
  }

The error is in the line img_mat.at<int> (i,j) = hough_acc[i][j];. Error is :

ps1: malloc.c:2392: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)

I have checked size of Mat img_mat and hough_acc[][] and both are equal. The values in hough_acc are also all integers. Don't understand why the error is there.

Full code :

void hough_lines_acc(cv::Mat img_a_edges, std::vector<std::vector<int> > &hough_acc) {
  int img_w = img_a_edges.cols;
  int img_h = img_a_edges.rows;

  int max_votes = 0;
  int min_votes = INT_MAX;

  for (size_t r = 0; r < img_h; r++) {
    for (size_t c = 0; c < img_w; c++) {
      if(true) {
        for (size_t angle = 0; angle < 180; angle++) {
          double theta = (angle * M_PI / 180);
          double rho = ( (c * cos(theta)) + (r * sin(theta)) );
          int buff = ++hough_acc[static_cast<int>(abs(rho))][static_cast<int>(theta)];

          if (buff > max_votes) {
            max_votes = buff;
          }
          if (buff < min_votes) {
            min_votes = buff;
          }
        }
      }
    }
  }

  double div = static_cast<double>(max_votes) / 255;
  int threshold = 10;
  int possible_edge = round(static_cast<double>(max_votes) / div) - threshold;

  cv::Mat img_mat = cv::Mat(hough_acc.size(), hough_acc[0].size(), CV_8UC1, cv::Scalar(0));
  std::cout << hough_acc.size(  ) << "  " << hough_acc[0].size() << std::endl;

  for (size_t i = 0; i < hough_acc.size(); i++) {
    for (size_t j = 0; j < hough_acc[0].size(); j++) {
      std::cout << hough_acc[i][j] << std::endl;
      img_mat.at<int> (i,j) = hough_acc[i][j];
    }
  }

  imwrite("../output/ps1-­2-­b-­1.png", img_mat);
}
like image 314
darth vader Avatar asked Aug 23 '26 08:08

darth vader


1 Answers

The malloc error you are getting can be caused by writing out of bounds before the suspected line. Is it possible that

    int buff = ++hough_acc[static_cast<int>(abs(rho))][static_cast<int>(theta)];

writes outside the bounds of hough_acc? Something is "fishy" since the array is of size 180 but you calculate the angles in radians so it should (probably?) go up to 6.

like image 79
Kostas Avatar answered Aug 24 '26 22:08

Kostas



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!