2012-04-20 4 views
0

Код успешно компилируется, но при попытке выполнить код с некоторыми изображениями возникает следующая ошибка.sYSMALLOc: Assertion Failed error in opencv

malloc.c: 3096: SysMalloc: Утверждение `(old_top == (((mbinptr) (((символ *) & ((ау) -> мусорные ведра [((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) -> размер & 0x1) & & ((неподписанных долго) old_end & pagemask) == 0)»не удалось. Прерванный

Мой код:

#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; } 
    } 

} 

Можете ли вы помочь мне определить эту проблему?

+0

Может быть образы, которые производят ошибки, которые не являются действительными/приемлемыми для/OpenCV ... – Malkocoglu

+0

Использование 'new_image.at (у, х)' вместо 'new_image.at (у, х) [0] 'решил проблему. –

ответ

0

Я не могу воспроизвести точное сообщение об ошибке, которое вы получили. На моем компьютере ваша программа остановилась на segmentation fault.

Причина этого в том, что вы обращаетесь к пикселям ваших изображений с серым значением, как если бы они были изображениями rgb. Таким образом, вместо

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

вам нужно использовать

new_image.at<uchar>(y,x) 

Потому что в полутоновое изображение каждый пиксель имеет только одно значение вместо вектора 3 значений (красный, зеленый и синий). После того, как я применил эти изменения, ваша программа работала без ошибок и выдавала ожидаемый результат порогового двоичного изображения.

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