2016-11-17 16 views
0

私はいくつかの画像処理機能を開発する必要があるプロジェクトを持っています。関数の1つは画像を縮小することです。 NONE この関数が呼び出されると、あなたが構成されます新しいイメージを作成する必要があります? 出力を平均化するために、ブロックの幅と高さを示す整数: これは、機能の説明イメージを縮小するC++ - 'System.AccessViolationException'

void averageRegions(int blockWidth, int blockHeight) 

入力がありますサイズのブロックごとに1ピクセルのブロックサイズ blockWidth元のイメージのblockHeightピクセル。各ピクセルは元のイメージ内の 領域内のピクセルの平均カラーです。 これを2つの関数に分割し、この関数内からヘルパー関数を呼び出す方が簡単かもしれないことに注意してください。 2番目の関数は、与えられたピクセルのブロックの平均値を計算し、使用する元の関数にそれを返します。しかし、この実装はあなた次第です!あなたが適切と思うようにそれを完了してください。

私はしかし、アプリを閉じた後、私はこのエラー

型「System.AccessViolationException」の未処理の例外がMCS2514Pgm2.exe で発生しました追加情報を得ることのコードを完了している

:読み取りまたは書き込みをしようとしました保護されたメモリ。これはしばしば、他のメモリが壊れていることを示します。

又はこれ

ヒープ破損検出:0x004cF6c0 CRTで通常ブロック(#126)の後に、アプリケーションがヒープ時間を浪費の終了後にメモリに書き込んだことを検出しました。

この

が、これはimage.h

#ifndef IMAGE 
#define IMAGE 

#include <atlimage.h> 
#include <string> 
#include <cstdlib> 
#include "globals.h" 
#include "pixel.h" 

using namespace std; 

class image { 
    public: 
     image();   //the image constructor (initializes everything) 
     image(string filename); //a image constructor that directly loads an image from disk 
     ~image();   //the image destructor (deletes the dynamically created pixel array) 

     void createNewImage(int width, int height); //this function deletes any current image data and creates a new blank image 
                //with the specified width/height and allocates the needed number of pixels 
                //dynamically. 
     bool loadImage(string filename);  //load an image from the specified file path. Return true if it works, false if it is not a valid image. 
               //Note that we only accept images of the RGB 8bit colorspace! 
     void saveImage(string filename);  //Save an image to the specified path 
     pixel** getPixels();     //return the 2-dimensional pixels array 
     int getWidth();      //return the width of the image 
     int getHeight();     //return the height of the image 

     void viewImage(CImage* myImage); //This function is called by the windows GUI. It returns the image in format the GUI understands. 


    private: 
     void pixelsToCImage(CImage* myImage); //this function is called internally by the image class. 
               //it converts our pixel struct array to a standard BGR uchar array with word spacing. 
               //(Don't worry about what this does) 
     pixel** pixels;    // pixel data array for image 
     int width, height;  // stores the image dimensions 




}; 

#endif 

ある

void averageRegions(int blockWidth, int blockHeight) 
{ 
     //please add the code 

     int height = inImage.getHeight(); 
     int width = inImage.getWidth(); 
     pixel** myPixels = inImage.getPixels(); 
     pixel* pixelptr; 
     int Rsum = 0, Gsum = 0, Bsum = 0; 
     int Ravg, Gavg, Bavg, pcount = 0, m, n; 
     outImage.createNewImage(width/blockWidth, height/blockHeight); 
     pixel** outPixels = outImage.getPixels(); 

     //pixelptr = &myPixels[0][4]; 
     for(int x = 0; x < height; x +=blockHeight) 
     { 
       for(int y = 0; y < width; y += blockWidth) 
       { 
         for(int i = x; i < blockHeight+x; i++) 
         { 
           for(int j = y; j < blockWidth+y; j++) 
           { 
             Rsum += myPixels[i][j].red; 
             Gsum += myPixels[i][j].green; 
             Bsum += myPixels[i][j].blue; 

             pcount++; 
           } 
         } 


         Ravg = Rsum/pcount; 
         Gavg = Gsum/pcount; 
         Bavg = Bsum/pcount; 

         for(int i = x; i < blockHeight+x; i++) 
         { 
           for(int j = y; j < blockWidth+y; j++) 
           { 
             myPixels[i][j].red = Ravg; 
             myPixels[i][j].green = Gavg; 
             myPixels[i][j].blue = Bavg; 

             m = x/blockHeight; 
             n = y/blockWidth; 

             outPixels[m][n].red = myPixels[i][j].red; 
             outPixels[m][n].green = myPixels[i][j].green; 
             outPixels[m][n].blue = myPixels[i][j].blue; 
           } 
         }  
         pcount=0; 
         Rsum = 0; 
         Gsum = 0; 
         Bsum = 0; 
       } 
     } 

     inImage = outImage; 
} 

機能コードであり、これはいずれかの理由を教えてもらえますPixel.h

#ifndef PIXEL_H 
#define PIXEL_H 

class pixel 
{ 
public: 
    unsigned char red;  //the red component 
    unsigned char green; //the green component 
    unsigned char blue;  //the blue component 
}; 

#endif 

ですこのエラーが発生しました

また

: エラーは、アレイに割り当てられたメモリの外にアクセスしているため、このエラーが発生し

  /* verify block type */ 
     _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)); 

答えて

0

dbgdel.cppにこのラインに私を取っています。これが起こることができるコードにはいくつかの場所があります。

heightblockHeightの倍数でない、またはwidthblockWidthの倍数でない場合は、お使いのi/jループはmyPixelsのために割り当てられたメモリの外の要素にアクセスします。

blockHeightblockWidthが等しくない場合、outPixelsに書き込む可能性もあります。mnの計算にはblockHeightblockWidthがスワップされている場合があります(xblockHeightで区切っています)。

for (int x = 0; x < height; x += blockHeight) 

+0

は、画像要件の1つは、幅と高さに等しいを持つことはありません。 blockHeightの倍数になるように高さを試していても、私は同じエラーが発生しています – user2919378

0

heightが100であるとblockHeightは33

  1. x == 0であると言います。 0 < 100なので、本文は入力され、0 - > 32
  2. x == 33を繰り返します。 33 < 100であるため、本文が入力され、33 - > 65
  3. x == 66を繰り返します。 66 < 100であるため、本文が入力され、66 - > 98
  4. x == 99を繰り返します。本体は99入力と反復されるよう99 < 100は、 - 悲しいことが> 131

を全く100 - > 131

関連する問題