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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Processing

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

Q&A

解決済

1回答

6052閲覧

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

mock

総合スコア7

Processing

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

0グッド

0クリップ

投稿2017/03/06 16:16

編集2017/03/06 16:19

###どういうプログラムを書いたか
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.heightp.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より少ない場合は全部読み込まれる。
自分は読み込み枚数の上限を設定していないはずですので、もし原因が分かる方がいらっしゃいましたら、教えて頂けると嬉しいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

質問・回答は見やすくするためのマークアップが可能です。
質問入力画面の右側(プレビュー)の上の方にある「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/07 02:09

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mock

2017/03/07 18:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問