0

コードは正常にコンパイルされますが、いくつかの画像を使用してコードを実行しようとすると、次のエラーが発生します。

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

}

問題の特定を手伝ってもらえますか?

4

1 に答える 1

0

表示されるエラー メッセージを正確に再現することはできません。私のコンピューターでは、あなたのプログラムはsegmentation fault.

これは、RGB 画像であるかのようにグレー値画像のピクセルにアクセスしているためです。だから代わりに

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

使用する必要があります

new_image.at<uchar>(y,x)

グレースケール画像では、すべてのピクセルが 3 つの値 (赤、緑、青) のベクトルではなく、1 つの値しか持たないためです。この変更を適用した後、プログラムはエラーなしで実行され、しきい値処理されたバイナリ イメージの期待される出力が生成されました。

このため、現在使用されている他のメモリ opencv を上書きし、このメモリの破損がエラー メッセージにつながる可能性があります。

于 2012-04-20T06:47:08.133 に答える