0

The code compiles successfully but I am getting the following error when I try to execute the code with some images.

malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. Aborted

My code is:

#include "opencv2/modules/imgproc/include/opencv2/imgproc/imgproc.hpp"
#include "opencv2/modules/highgui/include/opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;

/// Global variables
int const min_BINARY_value = 0;
int const max_BINARY_value = 255;

Mat src, src_gray, new_image;
const char* window_name = "Web Safe Colors";

/**
 * @function main
 */
int main( int argc, char** argv )
{
  double sum=0, mean=0;

  /// Load an image
  src = imread( argv[1], 1 );

  /// Convert the image to Gray
  cvtColor( src, src_gray, CV_RGB2GRAY );

  /// Create new image matrix
  new_image = Mat::ones( src_gray.size(), src_gray.type() );

  /// Calculate sum of pixels
  for( int y = 0; y < src_gray.rows; y++ )
  { 
    for( int x = 0; x < src_gray.cols; x++ )
    { 
      sum = sum + src_gray.at<Vec3b>(y,x)[0];
    }
  }

  /// Calculate mean of pixels
  mean = sum / (src_gray.rows * src_gray.cols);

  /// Perform conversion to binary
  for( int y = 0; y < src_gray.rows; y++ )
  { 
    for( int x = 0; x < src_gray.cols; x++ )
    { 
      if(src_gray.at<Vec3b>(y,x)[0] <= mean)
        new_image.at<Vec3b>(y,x)[0] = min_BINARY_value;
      else
        new_image.at<Vec3b>(y,x)[0] = max_BINARY_value;
    }
  }

  /// Create a window to display results
  namedWindow( window_name, CV_WINDOW_AUTOSIZE );

  imshow( window_name, new_image );
  /// Wait until user finishes program
  while(true)
    {
      int c;
      c = waitKey( 20 );
      if( (char)c == 27 )
    { break; }
    }

}

Can you please help me identify the problem?

Paras Narang
  • 621
  • 1
  • 8
  • 20

1 Answers1

0

I cannot reproduce the exact error message you get. On my computer your program stopped with a segmentation fault.

The reason for this was, that you are accessing the pixels of your gray value images as if they were rgb images. So instead of

new_image.at<Vec3b>(y,x)[0]

you need to use

new_image.at<uchar>(y,x)

Because in a gray scale image every pixel only has a single value instead of a vector of 3 values (red, green and blue). After I applied this changes your program ran without errors and produced the expected output of an thresholded binary image.

It is possible that because of this you are overwriting some other memory opencv currently used and that this memory corruption then lead to your error message.

sietschie
  • 7,425
  • 3
  • 33
  • 54