質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • Processing

    286questions

    Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

processingで、画像を最大6枚までしか読み込めない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 871

mock

score 1

どういうプログラムを書いたか

processingでディレクトリ内の画像を読み込み、色の平均値を求め、その値を3d空間に点で表示し、指定した範囲内にある点に当たる画像を保存する、というプログラムを作りました。

発生している問題

読み込める画像の枚数が最大6枚となっている。

実行したソースコード(とても読みにくく申し訳ございません)

/*selectFolderやloadImagesという関数の内容に問題があるはず*/
ArrayList<PImage> images = new ArrayList<PImage>(); 
String[] extensions = { 
".jpg",".gif",".tga",".png","JPG"
};
PVector[] ps = new PVector[0];
int a,b,c,r;

void setup() {
a=450;b=450;c=450;r=450;
size(750,300,P3D);
smooth(6);
noStroke();
selectFolder("フォルダの選択","loadImages");
//selectFolderで選んだファイルはloadImagesという関数で処理される
}

void draw() {
background(255);
fill(22,24,37);
rect(435,0,750-435,300);
rect(400,0,10,300);
fill(225,107,140);
rect(450,30,255,20);
rect(450,60,255,20);
rect(450,90,255,20);
rect(450,120,255,20);
rect(450,90,255,20);
sys();//操作画面の表示及び画像の保存
db();//3d空間の枠、選択範囲の球を描く
for(int i=0;i<ps.length;i++){
//空間内に画像の色の平均値のrgb値をxyz空間に点を置く形で表す
points(ps[i].x,ps[i].y,ps[i].z);
}
}

void loadImages(File selection){
File[] files = selection.listFiles();   
for(int i = 0; i < files.length; i++){
for(String extension : extensions){
if(files[i].getPath().endsWith(extension)){             PImage img=loadImage(files[i].getAbsolutePath()); 
images.add(img);
PVector q=new PVector(40, 20,20);
q=heikin(img);
ps = (PVector[]) append(ps,q); 
}
}
}

}
void sys(){
fill(225,107,140);
textSize(20);
text("X:",420,37);
text("Y:",420,67);
text("Z:",420,97);
text("R:",420,127);
text(images.size(),100,100);
text(ps.length,130,100);
if (mousePressed == true) {
if(mouseX>450&&mouseX<450+255){

if(mouseY>30&&mouseY<50){
a=mouseX;
}
if(mouseY>60&&mouseY<80){
b=mouseX;
}
if(mouseY>90&&mouseY<110){
c=mouseX;
}
if(mouseY>120&&mouseY<140){
r=mouseX;
}
if(mouseY>160&&mouseY<290){
for(int i=0;i<ps.length;i++){
if(((ps[i].x-a+450)*(ps[i].x-a+450)+(ps[i].y-b+450)*(ps[i].y-b+450)+(ps[i].z-c+450)*(ps[i].z-c+450))<(r-450)*(r-450)){           
PImage s = (PImage) images.get(i);
s.save("r"+ps[i].x+"g"+ps[i].y+"b"+ps[i].z+".png");
}     
}
}
}
}
noStroke();
fill(255,196,8);
rect(a,30,10,20);
rect(b,60,10,20);
rect(c,90,10,20);
rect(r,120,10,20);
fill(a-450,b-450,c-450);
rect(450,160,50,130);
fill(a-450+((r-450)/2),b-450,c-450);
rect(510,160,30,60);
fill(a-450+r-450,b-450,c-450);
rect(510,230,30,60);
fill(a-450,b-450+((r-450)/2),c-450);
rect(545,160,30,60);
fill(a-450,b-450+r-450,c-450);
rect(545,230,30,60);
fill(a-450,b-450,c-450+((r-450)/2));
rect(580,160,30,60);
fill(a-450,b-450,c-450+r-450);
rect(580,230,30,60);
fill(a-450-((r-450)/2),b-450,c-450);
rect(615,160,30,60);
fill(a-r,b-450,c-450);
rect(615,230,30,60);
fill(a-450,b-450-((r-450)/2),c-450);
rect(650,160,30,60);
fill(a-450,b-r,c-450);
rect(650,230,30,60);
fill(a-450,b-450,c-450-((r-450)/2));
rect(685,160,30,60);
fill(a-450,b-450,c-r);
rect(685,230,30,60);
}

void points(float x,float y,float z){
pushMatrix();
translate(x,y,-z);
fill(x,y,z);  
ellipse(0,0,10,10);
popMatrix();
}
PVector heikin(PImage p){
float re = 0.0;
float gr = 0.0;
float bl = 0.0;
PVector q=new PVector(40, 20,20);
for ( int y = 0; y < p.height; y++){

for ( int x = 0; x < p.width; x++){

re+=red(p.get(x,y));
bl+=blue(p.get(x,y));
gr+=green(p.get(x,y));

}
}
q.x=re/(p.height*p.width);
q.y=gr/(p.height*p.width);
q.z=bl/(p.height*p.width);
return q;
}
void db(){

pushMatrix();

translate(255/2,255/2,-255/2);

noFill();
stroke(0);
box(255);
translate(a-450,b-450,-c+450);
popMatrix();
pushMatrix();
translate(a-450,b-450,-c+450);
sphere(r-450);
popMatrix();
}

その他

・実行はでき、目的どうりの動作もした。
・表示させた文字によると、上記のコードのimagesのサイズが6となっており、用意したファイル数が6を超えても6のまま。
・ファイル数が6より少ない場合は全部読み込まれる。
自分は読み込み枚数の上限を設定していないはずですので、もし原因が分かる方がいらっしゃいましたら、教えて頂けると嬉しいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

実行したソースコード(とても読みにくく申し訳ございません)

質問・回答は見やすくするためのマークアップが可能です。
質問入力画面の右側(プレビュー)の上の方にある「tips」を押してみてください。質問の際の基本的なヒントがポップアップされます。その中に「ソースコードはどうやって書けばいい?」という項目があるのでそれを参照してください。それをみてぜひ質問を編集してください。

読み込める画像の枚数が最大6枚

コードではディレクトリーに存在する全ての画像ファイルをPImageとして読み込み、PImage自体を全てArrayListに覚えています(つまり全てメモリー上に読み込んでいます)。そこで「リソース不足」が原因かも知れないと思い実際に上のプログラムをWindows10 Processing3の標準設定(最大メモリー量256MB)で動かしてみました。結果は100万画素程度の画像60枚弱しか読み込めませんでした。PImageのメモリー量を概算すると画素あたり4byte x 100万画素 x 60枚 = 240MBですので概ねPImageでメモリーを使い切っているといえるでしょう。

ゆえに環境設定がデフォルトのままと仮定するとあなたが読み込ませようとした画像ファイルは一枚当たり1000万画素オーダーだったのではないかと思います。

対処方法としてはProcessingの設定を変えて最大メモリー量を増やすことも一つの手ではありますが、搭載メモリーが4GBぐらいの普通のPCであればデフォルトの256MBに対してせいぜい数倍程度しか大きくできないでしょうからあまり有効な対処とは言えません。(なおProcessingが動作する際に稼働するJavaVMの実際のメモリー消費量の目安はこの値の倍程度はあると考えた方がよいと思います。)

そこで根本的な対処として1回に一つの画像(PImage)のみロードするようにプログラムを変更する方法が考えられます。ArrayListにはPImageそのものでなくファイル名を覚えておきます。画像の解析やセーブなど必要な場面で一つの画像のみをロードすれば画像枚数が増えてもメモリー消費量は大きく変動しないようにできます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/08 03:54

    ご回答ありがとうございました。上手くいけました。忙しいので今は丁寧に書けませんが、時間がある時に編集しようと思います。一先ず、以下のようにarrylistを消しLoadimages関数のArrylistにaddする部分を消しました。また、機能を維持させるため、loadimages関数内のfilesを関数外で宣言、またintの配列をグローバル変数として宣言し、取り込んだファイルの番号を格納する形に変更しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Processing

    286questions

    Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。