2

私は画像処理用のプログラムを開発しています。ビデオからいくつかの画像を保存し、それらに対して何らかの処理を行う必要があります。1枚の写真を扱うときはそれほど時間はかかりませんが、100枚の写真を扱うときは違いますファイルをハードディスクに保存しているので、時間がかかります. m using は既製の関数であり、(ファイル名) のみを受け入れます。関数は非常に複雑であるため、独自の関数を作成することはできません (それがあなたが考えている場合)

現在、以下の2点を考えておりますので、ご意見をお聞かせください。

  1. 関数の入力を変更しますが、どのように?この入力を (ファイル名) からこれらの画像を保持する配列に変更する方法はありますか?
  2. ファイルをRAMに保存します。しかし、ファイルを名前でRAMに保存し、それらを関数で(ファイル名)として使用できるようにする方法は?

私はあなたの助けに感謝します、どうもありがとう

これは私のコードですが、まだ問題があります:

            Capture video = new Capture("c:\\5.avi");
            Image<Bgr, Byte> Imageframe ;

            Dictionary<string, MemoryStream> dict = new Dictionary<string, MemoryStream>();

                Imageframe = video.QueryFrame();
                Bitmap bmp = Imageframe.ToBitmap();
                dict.Add("mypicture.png", new MemoryStream());
                bmp.Save(dict["mypicture.png"],imageformat.png);    

imageformat がコンテキストに存在しないと言っている

そして、これは私が使用している関数です:

Image<Bgr, byte> result;
                 result = DrawMatches.Draw("box.png", "box_in_scene.png", out matchTime,i); 
4

3 に答える 3

5

を使用して(最も緩い意味で)RAMに保存できますMemoryStream。それらに名前を付けたい場合は、次Dictionary<string,MemoryStream>のように使用できます。

Dictionary<string,MemoryStream> dict = new Dictionary<string,MemoryStream>();

dict.Add("mypicture.png",new MemoryStream());

image.Save(dict["mypicture.png"]);

ただし、これらのストリームのクリーンアップコードを作成する必要があります。これは、最終的にすべての物理RAMを使い果たしてから、ディスクベースのページングファイルにアクセスし始める可能性があることを考慮していません。

余談ですが、これが制御するサーバー上にあり、このソフトウェアをエンドユーザーにリリースしない場合は、Windowsで使用可能な実際のディスクとして物理RAMを使用するRAMディスクドライブ(Googleだけで十分)を入手できます。次に、それにロード/保存することができます。

非常に大まかなEmguCvバリアント:

// Global dictionary of memory streams
Dictionary<string,MemoryStream> dict = new Dictionary<string,MemoryStream>();

// Add image memory stream to dictionary
dict.Add("mypicture.png",new MemoryStream());

// Get bitmap from EmguCv
Bitmap bmp = image.ToBitmap();

// Save bitmap to image memory stream
bmp.Save(dict["mypicture.png"],ImageFormat.Png);

// Get bitmap from memory stream
dict["mypicture.png"].Seek(0,SeekOrigin.Begin);
Bitmap new_bmp = Image.FromStream(dict["mypicture.png"]);

// Convert bitmap to EmguCv image
Image<Bgr,Byte> new_img = new Image<Bgr,Byte>(new_bmp);
于 2013-01-28T12:34:26.700 に答える
1

ファイルのようにメモリを操作するためにMemoryStreamを使用してみてください。また、スレッドごとにハードディスクにファイルを保存してみてください。

于 2013-01-28T12:35:16.253 に答える
0

ソースがないDLLを使用しているとのことですが。それをリフレクターにロードし、ファイル名の代わりに引数として画像を取得するように変更できる場合があります。私は過去にRedGateのリフレクターを使用しましたが、それは私のために機能しました:http: //www.reflector.net/

于 2013-01-28T12:37:46.277 に答える