[英]sYSMALLOc: Assertion Failed error in opencv
該代碼成功編譯,但是當我嘗試對某些圖像執行該代碼時出現以下錯誤。
malloc.c:3096:sYSMALLOc:聲明`(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)'失敗。 中止
我的代碼是:
#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; }
}
}
您能幫我找出問題嗎?
我無法重現您收到的確切錯誤消息。 在我的計算機上,您的程序由於segmentation fault
停止。
這樣做的原因是,您正在訪問灰度圖像的像素,就好像它們是rgb圖像一樣。 所以代替
new_image.at<Vec3b>(y,x)[0]
你需要使用
new_image.at<uchar>(y,x)
因為在灰度圖像中,每個像素只有一個值,而不是3個值(紅色,綠色和藍色)的向量。 應用此更改后,您的程序運行沒有錯誤,並產生了閾值二進制圖像的預期輸出。
因此,您可能會覆蓋當前使用的其他一些內存opencv,然后此內存損壞會導致您出現錯誤消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.