2012-04-20 114 views
0

代码编译成功,但当我尝试执行一些图像的代码时出现以下错误。sYSMALLOc:Assertion在opencv中失败的错误

malloc.c:3096:SYSMALLOC:断言`(old_top ==(((mbinptr)(((字符*)&((AV) - >仓[((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 * (为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 2012-04-20 06:38:41

+0

使用'new_image.at (y,x)'而不是'new_image.at (y,x)[0]解决了这个问题。 – 2012-05-01 06:37:07

回答

0

我无法重现您获得的确切错误消息。在我的电脑上,您的程序停止了segmentation fault

原因是,您正在访问灰度值图像的像素,就像它们是RGB图像一样。因此,而不是

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

你需要使用

new_image.at<uchar>(y,x) 

由于灰度图像的每个像素只有一个值,而不是3个值(红,绿,蓝)的矢量英寸在我应用这个更改后,程序运行时没有错误,并生成阈值二值图像的预期输出。

有可能因为这个原因你覆盖了一些其他的opencv当前使用的内存,并且这个内存损坏会导致你的错误信息。

相关问题