• ベストアンサー

画像の取り込みについてですが

プログラミングの初心者ですが、現在VC++2005でプログラムについて勉強しています。画像の取り込みを行うところで、わからなくなってしまったので、みなさんのご指導お願いいたします。 今、行いたいのは あるフォルダAの中に100枚の画像の中の何枚かに対し連続的に処理することです。この100枚の画像の名前は1から100までの番号です。例えば、50枚目から70枚目の20枚の画像に対して、二値化を行って、結果を保存したいです。保存する時の画像名前は元の番号に100を足して、(例:50+100=150)そうすると、元は何番なのかがわかります。 ここで、この50番から連続の20枚の画像をfor文で実現しようとしています。しかしながら、連続に取り込む方法がよくわからなくて困っています。 Bitmap^ bmap=gcnew Bitmap("C¥A"); ここでフォルダを指定します。 for(n=0;n<=20;n++){ ここから20枚の画像を処理する /ここで一番最初の50番の画像を取り込みます/(やり方がわからないです) /二値化処理をします/ /保存します(保存の仕方がわからないです)/ /取り込んだ50番をn足して次の51番になります(やり方がわからないです)。for文に戻り、続けて処理を行う/ } もしかして根本的な考え方も間違っているかもしれませんが、ご指導をいただければ感謝致します。 どうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

 こんにちは。  int fileNo = 50+n;  として、  fileNo.ToString() + ".bmp"  とすれば簡単に文字列に出来ます。  取り敢えず、アラもあるとは思いますが、以下参考程度に。 //グレースケール private: int ToGray(int R, int G, int B) { const int Y = 0.299 * R + 0.587 * G + 0.114 * B; return Y; } //2値化画像を作成する private: Bitmap^ CreateBinaryImage(Bitmap^ bmp) { Bitmap^ bmpGray = dynamic_cast<Bitmap^>(bmp->Clone()); for(int y = 0; y < bmp->Height; ++y) { for(int x = 0; x < bmp->Width; ++x) { Color color = bmp->GetPixel(x, y); //グレイスケールの計算 const int Y = this->ToGray(color.R, color.G, color.B); //127より大きければ白色を出力する const int Binary = Y > 127 ? 255 : 0; bmpGray->SetPixel(x, y, Color::FromArgb(Binary, Binary, Binary)); } } return bmpGray; } //50~70のイメージを探し出して、2値化してからセーブする private: System::Void SaveMyImage() { //画像の有るフォルダ名 String^ sFolder = gcnew String("c:\\a"); //回す for(int i = 0; i < 20; ++i) { const int fileNo = 50 + i; try { //ファイルへのフルパスを作成する String^ sPath = sFolder + "\\" + fileNo.ToString() + ".bmp"; //読み込む Bitmap^ bitmap = dynamic_cast<Bitmap^>(Bitmap::FromFile(sPath)); //2値化した画像を受け取る Bitmap^ bmpBin = this->CreateBinaryImage(bitmap); //例えば2値化画像には"_bin"を付属してセーブする sPath = sFolder + "\\" + fileNo.ToString() + "_bin.bmp"; //実際にセーブ bmpBin->Save(sPath); } catch(System::Exception^) { //ファイルが無かった } } }

pop119
質問者

お礼

machongolaさんへ ご丁寧に指導していただき、どうもありがとうございます。 教えて頂いたものをさっそく組んでみたいと思います。 また、結果が出たらご報告致します。

その他の回答 (2)

  • bkbkb
  • ベストアンサー率33% (97/289)
回答No.2

補足です。 保存するときも同様です。 n+100にした数字を文字列に変換して、.jpgを連結してファイル名を作ります。 そのファイル名を使って処理を終えた画像を保存してください。

  • bkbkb
  • ベストアンサー率33% (97/289)
回答No.1

そのロジックでいくなら ファイル名を文字列で作ればいいんです。 変数nを文字に変換して.jpgと連結して1.jpgのような文字列を作ります。 その文字列をファイル名として使って画像を開けば良いんです。 一連の処理を終えたら、画像ファイルを閉じて、次のループでまたg像ファイルを開きます。

pop119
質問者

お礼

bkbkbさんへ 補足説明をしていただいてどうもありがとうございます。 とても勉強になりました。結果出せるようにがんばります。

関連するQ&A

  • 画像の連続取り込み

    Visual Studio 2005のC++を使ってプログラムしている者です。 C#で画像の連続した取り込みができるプログラムを見つけて、C++でもできないかと思い、とりあえず"000.bmp"という画像を読み込めるプログラムを組んで見たのですがどうもうまくいきません。 Visual Studio の検索で以下のようにできましたが"'System::Object::ToString' : 関数に 1 個の引数を指定できません。"といったエラーがでてしまいます。ある程度近いところまでいっているとは思うのですが・・・どこが間違っているのかわかる方おりましたらよろしくお願いします。 Object^ o = gcnew Object; o = (Object^)0; System::String^ filename = "C:/Documents and Settings/Owner/デスクトップ/"; //画像の場所ではなくファイルの場所(例:デスクトップ) filename += o->ToString("000") + ".bmp"; //ファイルの中の画像を指定 g = gcnew Bitmap(filename,true);

  • BMP画像を画像処理して連続に表示したいですが?

    プログラミングの初心者ですが、現在VC++2005のフォームアプリケーションでプログラムについて勉強しています。画像を連続表示するところで、わからなくなってしまったので、みなさんのご指導お願いいたします。 やりたい処理は、取り込んだ画像の色を変化させて、順番に表示したい 処理です。作成したプログラムは下記のようになります。 前略 for(n=0; n<256; n+=20){ for(y=0; y<480; y++){ for(x=0; y<640; x++){ bmp->Setpixel(x, y, Color::FromArgb(n, n, n)); } } pictureBox->Image = bmp; Thread::Sleep(2000); } nの値をbmpに入れてから一回表示し、さらにnを足してからbmpに入れて表示するといった流れですが、Sleepを入れても何にも表示されません。 どういったところは不具合なのかをよくわかりません。 ご指導をいただければ感謝致します。どうぞよろしくお願い致します。

  • ScanLineを使っての画像の色データ取得

    現在、Visual C++を使用して、ある画像のグレースケール化、二値化などの加工を行うプログラムを作成しています。 しかし、今は各ピクセルの値を1つずつとっている状態なので、(行の)for文の中に(列の)for文がある状態になっていて計算量が多くなっているため、加工画像を表示させるまでに時間が少しかかっています。 そこで、ScanLineを用いて1行のデータをとるようなプログラムを作っているのですが、「・・・のメンバーではありません」などのエラーが出て、実行することができない状態です。 現在、加工画像は Bitmap^ bmap_gray=gcnew Bitmap(pictureBox1->Image); としているのですが、ScanLineを使うにはどのようなプログラム文を書けばいいのでしょうか?

  • 画像取り込み

    ドコモの携帯N-02Bで画像を保存すると自動的に『移行可能フォルダ』というところに移動した画像を、パソコンに保存したいのですが、移行可能とは名ばかりで携帯の中でしか見ることが出来ません。 これをパソコンに移動させる方法は無いでしょうか? どなたか御存知であれば是非御教示お願いします。 パソコン初心者並ですので、出来るだけ解り易く説明していただけると助かります。

  • C++/CLIでの画像情報(RGB)の取得

    Visual C++ 2005のC++/CLI対応で、.NET Frameworkのクラスライブラリを使用し、画像処理のプログラムを作成しています。 pictureBox1->Image = gcnew Bitmap( ファイル名 ); で、画像を表示するところまではできたのですが、表示したBitmapデータのRGBカラー情報を取得する方法がわからず、困っています。 ご存知の方、教えてください。 また、このような情報が載っている書籍やサイトがありましたら、合わせて教えてください。 よろしくお願いします。 必要な情報が抜けていましたら、お手数ですが、ご指摘お願いします。

  • 画像読み込み時のOutOfMemory

    VC++2010ExpressのWindows Applicationで画像のサムネールを作るプログラムを作っています。 概略、つぎの様なコーディングです(細部は気にしないで下さい)。 for filePath in dlg->Files{ try{ String^ FileName = Path::GetFileName(filePath); Image^ img = Image::FromFiles(filePath); Bitmap^ bmp = gcnew Bitmap(Image, 48, 48); bmp->Save(FolderPath + "\\Thumbnails\\" + FileName); } chactch(System::Exception^ err){ Debug::Print("{0}", err->Massages); } } 問題は、数万件の画像を処理したときに、数千件までは順調に処理が進むのに、そのあと「OutofMemory」とか「メモリー不足」とか「GDI+で汎用エラー」といった例外が続発してしまうことです。マネージコードなのでリソースは自動的に解放されると思うのですが、それでも間に合わないのでしょうか?何か対処方法があれば、ご教示ください。

  • Bitmapデータ型の画像幅の拡大

    現在Visual studio 2005のフォームアプリケーションでプログラミグを行っている者です。以下のプログラムの中に画像の幅であるw,hという変数があるのですが、私の作ろうとしている画像処理の関係上、この画像データの幅を倍にしたいです(例:3*w,3*h)。しかし、変数宣言(例:int 3*w)やfor文の中で倍にしようとしても、ビルドはできるものの"アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。・・・パラメータは正の値で、高さより小さい値指定しなければなりません。"とでて、実行できません。おそらく倍にしてあげたとこで、倍になった部分の画像データがわからないためこういったエラーが出てしまうのだと考えています。どうにかして、BITMAPデータ型で読み込んだ画像の幅を倍の数値を得たいのですが、エラーのでないようにするためにはどのようにしてあげればいいのでしょうか?わかる方がいたらよろしくお願いします。 プログラムは以下のとおりです。 #pragma once // 省略 // } #pragma endregion private:Bitmap^ pic; private:array< Bitmap^>^ bmp; // 原画像格納 // private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { bmp[0] = gcnew Bitmap("画像ファイル1",true); pictureBox1->Image = bmp[0]; pic = gcnew Bitmap("画像ファイル2",true); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { int x,y,a,b; /* x,y: 画像の座標 a,b: 複合画像の座標 */ int w = pic->Width; //ここでpic->Width*3としてもエラー /* 複合画像の横幅 */ int h = pic->Height; /* 複合画像の縦幅 */ x = 0; y = 0; a = 0; b = 0; for(y = 0; y < h; y++){ //ここで3*hとしてもエラー for(x = 0; x < w; x+=3){ pic->SetPixel( x, y, bmp[1]->GetPixel( x, y ) ); } } pictureBox2->Image = pic; } }; }

  • Octave画像ファイルの向きを上下逆さまにしたい

    % lec5_2.m % bmp画像出力(画像*****のプログラム) % % Input.bmp : 処理したい画像(モノクロ)BMPファイル % Output.bmp : 処理したい画像(モノクロ)BMPファイル clear all, close all % おまじない Iin=imread('LENNA.bmp'); % 画像の入力 figure, imshow(Iin) % 画像表示 [y_size,x_size]=size(Iin); %縦横のサイズ % 配布資料を参考にして以下の2重for文の % 中のプログラムを完成させよ for n=3:y_size for m=3:x_size n2=y_size-n+1; Iout(n,m)=Iin(n2,m); end end % プログラム修正ここまで figure, imshow(Iout) % 画像表示 bmpwrite_bk(Iout,'LENNA.bmp','Output.bmp'); % End of file 上記はOctaveのmファイルの中身ですが、これを使用すると画像の上下を反転させることができます。 これを、『画像を上下逆さまに回転』させ、元の画像を下向きにして表示させたいです。それをするには二重for文の内容を変えるみたいなのですが、どう変えればいいかわからず途方に暮れています。 二重for文の内容をどう変えたら成功するのでしょうか。 mファイルをどう弄ったらいいかもわからない初心者の質問です。よろしくお願いします。

  • イメージボックスについて

    こんにちわ、Visual Studio 2005のC++を使ってプログラミングしているものです。イメージボックスについてお聞きしたいのですが、 private:array< PictureBox^>^ picture; int n = 0; int m = 0; int l = 0; for ( int n = 0; n < 4; n++ ) { if(n % 4 == 0){m = m + 60; l = 0;} /** 4つずつImageboxを表示 **/ picture[n] = gcnew PictureBox(); /** イメージボックス生成 **/ picture[n]->Size = Drawing::Size( 50, 50 );  /** イメージボックスのサイズ **/ picture[n]->SizeMode = System::Windows::Forms::PictureBoxSizeMode::StretchImage; picture[n]->Location = Drawing::Point( 10+50*l,10+m);  /** イメージボックスの位置座標 **/ picture[n]->Name = String::Format( L"pictures{0}", n );  /** イメージボックスの名前 **/ this->Controls->Add( picture[n] ); Int32^ o = gcnew Int32( 0 ); System::String^ filename = "C:/Documents and Settings/user/デスクトップ/画像/"; filename += o->ToString("000") + ".bmp";  /** フォルダ内の画像 **/ bmp[n] = gcnew Bitmap(filename,true);   picture[n]->Image = bmp[n];  /** イメージボックスnにイメージn表示 **/ l++; } といった感じで、とりあえず4つのイメージボックスを作ろうとしているのですがうまくいきません。画像ファイルの名前の足し方に問題があるのでしょうか@@; もしこのプログラムが通るようになったとしてもループ中に画像がなかったらエラーが起こってしまいますね。もし指定のフォルダを選んで、そのフォルダ内の画像を全て表示させるといったことはできないのでしょうか??それと今までデザイン時にピクチャボックスをダブルクリックすると、 private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) {} といったクリック処理のための関数が現れるのですが、この場合はどう処理すればよいのでしょう? さらに言うとこれをパネルの上でやりたいのですが・・・ private: System::Void panel1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { panel1->Controls->Add( picture[0] ); } とりあえずこれは置いといて、どうプログラムすればよいのか分かる方がいればご教授お願いします。

  • iPhotoの画像取り込みのトラブル

    カメラから画像を取り込んでいる際に、iPhotoが落ちてしまい、 再取り込みをしましたが、その際、二重にフォルダ「A」「A_2」が出来ました。 そのままで実害は無かったのですが、気になって、片方のフォルダ「A_2」を削除しようと ゴミ箱に入れたとたん、iPhoto上で画像が見えなくなったので、 慌てて元に戻しました。 現在、部分的にデータが消えたのか、 iPhoto上で表示されない画像も出ています。 きちんとした表示が出来るようには、どうしたら宜しいのでしょうか? iPhoto Libraryの Data内、 「A」と『A_2」のフォルダがあり、中の画像は、「A」は全て揃っており、 「A_2」は同一画像が二つ取り込まれていたり(全て縦画像)、 一定番号以降、欠落があります Modified内(全て縦画像) 同じく「A」と『A_2」のフォルダがあり、中の画像は、「A」は全て揃っており、 『A_2」は一定番号以降欠落があり、一部を除き、個々の画像の名称は、 「A」の画像の名称に「_2」がついています。 Originals内 同じく「A」と『A_2」のフォルダがあり、中の画像は、「A」は全て揃っており、 「A_2」は同一画像が二つ取り込まれていたり(全て縦画像)、一定番号以降、欠落があったりします。 iPhotoを起動させると、「ライブラリ」「最後のロール」作製したアルバムの全てで、 上記欠落部分の画像が表示されません。(一瞬表示されますが、すぐ点線表示の四角に替わります。) 1)iPhoto上で、きちんと表示させるためには、どうしたら良いでしょうか。 2)容量の関係で、同一画像の二重の保存は避けたいと思っています。   ピクチャなどを、どのように整理すれば宜しいでしょうか?

    • ベストアンサー
    • Mac

専門家に質問してみよう