2016-07-02 10 views
0

を凍結する原因となります。私は画像をロードしようとする前にフリーズしていることを示す印刷文を入れました。これは、私が合併症なしに実行する別の非常に似たアルゴリズムを書いたという事実に照らして、私には特に混乱します。もう1つのアルゴリズムは画像を読み取り、指定されたサイズの各タイルの色の平均をとり、平均色で平均化された領域に矩形を印刷して画像を効果的にピクセル化します。どちらのアルゴリズムも画像をロードし、それぞれのピクセルを調べます。問題のものは、何も描かないという点でほとんど違いがあります。私はそれが配列を持つために異なっていたと言うつもりだったが、pixelationアルゴリズムはint配列よりもはるかに多くのスペースを占有するカラー配列内のすべての色を保持しています。簡単な画像処理アルゴリズムは、私は次の操作を実行するための処理におけるアルゴリズムを書いた処理が

私のmacのconsole.appを見ると、このエラーが最初にあったことがわかります。「java.lang.OutOfMemoryError:GCオーバーヘッドの上限を超えました」。ウェブ上の他の提案/ソースから、メモリ割り当てを256MBから4000MBに増やすことを試みました(アルゴリズムの解析で同じ複雑さを示していましたが、やってみました)。これはフリーズするのを止めませんでしたが、 "Java例外記述の取得中にJavaNativeFoundationエラーが発生しました"と "java.lang.OutOfMemoryError:Java heap space"の組み合わせに変更されました。 次に、32ビットjdkで処理された64ビットjdkを利用することを希望するローカルjdkにポインティング処理を試みました。 Processing.app/Contents内から次のコマンドを実行しました: mv Java java-old ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk Java この試行後、次のエラーが発生して処理が開始されませんでした私のコンソール: "com.apple.xpc.launchd [1]:(org.processing.app.160672 [13559])サービスが異常コードで終了しました:1" を

以下

は私のコードです: まず非準拠アルゴリズム作品

int squareSize=50; 
int numRows = 10; 
int numCols = 10; 
PFont myFont; 
PImage img; 

//33-126 
void setup(){ 
    size(500,500); 
    count(); 
} 

void count(){ 
    ellipseMode(RADIUS); 
    int[][] asciiArea = new int[94][2]; 
    println("hello?"); 
    img=loadImage("countingPicture.jpg"); 
    println("image loaded"); 
    for(int i=0; i<(500/squareSize); i++){ 
    for(int j=0; j<(500/squareSize); j++){ 
     int currentValue=i+j*numCols; 
     if(currentValue+33>126){ 
     break; 
     } 
     println(i+", "+j); 
     asciiArea[currentValue][0]=currentValue+33; 
     asciiArea[currentValue][1]=determineTextArea(i,j,squareSize); 
     //fill(color(255,0,0)); 
     //ellipse(i*squareSize,j*squareSize,3,3); 
    } 
    } 
    println("done calculating"); 
    displayArrayContents(asciiArea); 
} 

int determineTextArea(int i, int j, int squareSize){ 
    int textArea = 0; 
    double n=0.0; 
    while(n < squareSize*squareSize){ 
    n+=1.0; 
    int xOffset = (int)(n%((double)squareSize)); 
    int yOffset = (int)(n/((double)squareSize)); 
    color c = img.get(i*squareSize+xOffset, j*squareSize+yOffset); 
    if(red(c)!=255 || green(c)!=255 || blue(c)!=255){ 
     println(red(c)+" "+green(c)+" "+blue(c)); 
     textArea++;   
    }  
    } 
    return textArea; 
} 

void displayArrayContents(int[][] arr){ 
    int i=0; 
    println("\n now arrays"); 
    while(i<94){ 
    println(arr[i][0]+" "+arr[i][1]); 
    } 
} 

ピクセル化アルゴリズム:

PImage img; 
int direction = 1; 
float signal; 
int squareSize = 5; 
int wideness = 500; 
int highness = 420; 
int xDimension = wideness/squareSize; 
int yDimension= highness/squareSize; 

void setup() { 
    size(1500, 420); 
    noFill(); 
    stroke(255); 
    frameRate(30); 
    img = loadImage("imageIn.jpg"); 
    color[][] colors = new color[xDimension][yDimension]; 
    for(int drawingNo=0; drawingNo < 3; drawingNo++){ 
    for(int i=0; i<xDimension; i++){ 
    for(int j=0; j<yDimension; j++){ 
     double average = 0; 
     double n=0.0; 
     while(n < squareSize*squareSize){ 
     n+=1.0; 
     int xOffset = (int)(n%((double)squareSize)); 
     int yOffset = (int)(n/((double)squareSize)); 
     color c = img.get(i*squareSize+xOffset, j*squareSize+yOffset); 
     float cube = red(c)*red(c) + green(c)*green(c) + blue(c)*blue(c); 
     double grayValue = (int)(sqrt(cube)*(255.0/441.0)); 
     double nAsDouble = (double)n; 
     average=(grayValue + (n-1.0)*average)/n; 
     average=(grayValue/n)+((n-1.0)/(n))*average; 
     } 
     //average=discretize(average); 
     println(i+" "+j+" "+average); 
     colors[i][j]=color((int)average); 
     fill(colors[i][j]); 
     if(drawingNo==0){ //stroke(colors[i][j]); } 
     stroke(210);} 
     if(drawingNo==1){ stroke(150); } 
     if(drawingNo==2){ stroke(90); } 
     //stroke(colors[i][j]); 
     rect(drawingNo*wideness+i*squareSize,j*squareSize,squareSize,squareSize); 
    } 
    } 
    } 
    save("imageOut.jpg"); 
} 

答えて

0

無限ループに入ると、println()ステートメントが信頼できなくなります。無限ループを修正すると、印刷ステートメントが再び機能します。このwhileループで

ルック:

while(i<94){ 
    println(arr[i][0]+" "+arr[i][1]); 
} 

iこれまで>= 94になるのだろうか?

iは増分しないので、その値は常に0です。あなたはwhileループ内println()ステートメントを追加することによって、これを証明することができます

while(i<94){ 
    println("i: " + i); 
    println(arr[i][0]+" "+arr[i][1]); 
} 

おそらくwhileループ内iをインクリメントしたかったです。代わりに、代わりにforループを使用してください。

+0

Yikes!どのように恥ずかしい。良いキャッチとありがとう。それでも、私は無限ループの前にステートメントを印刷しない理由を理解していません。あなたはそれについてもう少し詳しく知ることができますか? –

+0

@AustinWehn私は完全に自分自身ではない。しかし、処理は無限ループを非常にうまく処理しません(エディタ全体がフリーズする)ので、 'println()'もうまく動作しません。 –

+0

ありがとう@KevinWorkman。もう一つのことは、デバッグできるモードでProcessingを使用している経験はありますか?私はEclipseを使ってそれを実行することについて何かを見たと思うが、それが面倒であるかどうか疑問に思っている。驚くべきことに、処理にはデバッグがありません。 –

関連する問題