0

このコードを使用してファイルをメモリストリームに保存しています

using System.Drawing.Imaging;

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

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

bmp.Save(dict["mypicture.png"], ImageFormat.Bmp);

その後、このファイル名を受け入れる関数があります

result = DrawMatches.Draw("box.png", "mypicture.png", out matchTime,i);

メモリ ストリームからファイルに正しくアクセスしていますか? それが言っている機能で

無効な引数

メモリストリームから正しい方法でファイルにアクセスしていないと思います

これは Drawmatches.Draw です。

public static Image<Bgr, Byte> Draw(String modelImageFileName, String observedImageFileName, out long matchTime,int i)
{
   Image<Gray, Byte> modelImage = new Image<Gray, byte>(modelImageFileName);
   Image<Gray, Byte> observedImage = new Image<Gray, byte>(observedImageFileName);
}

エラーはコンパイル時ではなく、実行時です

「パラメーターが無効です」と表示され、観察された画像を指しています

4

1 に答える 1

1

クラスとは何か、Image<Gray, byte>どのように実装されているのかはよくわかりませんが、コンストラクターにを渡しています。stringこれが正しいかどうかはわかりますか?(編集:それがEMGU実装の一部であることがわかりました)。ストリームから通常どのように画像を作成するかを説明します。

MemoryStream ms = dict["mypicture.png"]; // This gives you the memory stream from the dictionary
ms.Seek(0, SeekOrigin.Begin); // Go to the beginning of the stream
Bitmap bmp = new Bitmap(ms); // Create image from the stream

次のコンストラクターを使用して、使用しているストリームから新しい「emguイメージ」を作成したいと思います。

Image<Bgr, Byte> img1 = new Image<Bgr, Byte>("MyImage.jpg");

これは、EMGUのドキュメントによると、ファイルから画像を読み取ることになっています。「mypicture.png」という名前のファイルはありません。辞書内に「mypicture.png」というキーの下にストリームがありますが、これはまったく異なるものです。クラスがストリームから読み取ることができるかどうかは疑わしいImage<t1, t2>です-少なくとも、ドキュメントにはそのようなものはありませんでした。

あなたが呼び出す必要があるのは(私が上で提供したコードを使用して):

Image<Gray, Byte> img1 = new Image<Gray, Byte>(bmp);

そうは言っても、Drawメソッドのコード(ちなみに静的にすることはできません)は次のようになります。

private Bitmap GetBitmapFromStream(String bitmapKeyName)
{
    MemoryStream ms = dict[bitmapKeyName];
    ms.Seek(0, SeekOrigin.Begin);
    return new Bitmap(ms);
}

public Image<Bgr, Byte> Draw(String modelImageFileName, String observedImageFileName, out long matchTime,int i)
{
   Image<Gray, Byte> modelImage = new Image<Gray, byte>(GetBitmapFromStream(modelImageFileName));
   Image<Gray, Byte> observedImage = new Image<Gray, byte>(GetBitmapFromStream(observedImageFileName));
}

編集
以下のコメントで、ディスクに書き込む代わりにビットマップをメモリストリームに保存することにより、処理時間を短縮したいとおっしゃっています。

私はあなたに次のことを尋ねる必要があります:なぜあなたはそもそもそれをするのですか?あなたが上に投稿したコードから、明らかにあなたはすでにBitmapメモリストリームに保存しているものを持っていることに気づきました。ビットマップ自体を辞書に入れてみませんか?

Dictionary<string, Bitmap> dict = new Dictionary<string, Bitmap>();
dict.Add("mypicture.png", bmp);

そうすれば、ストリームからの画像の保存と読み取りに費やされる時間をさらに短縮して、すぐに取得できます。そのDraw場合、メソッドは次のようになります。

public Image<Bgr, Byte> Draw(String modelImageFileName, String observedImageFileName, out long matchTime,int i)
{
   Image<Gray, Byte> modelImage = new Image<Gray, byte>(dict[modelImageFileName);
   Image<Gray, Byte> observedImage = new Image<Gray, byte>(dict[observedImageFileName]);
}
于 2013-02-06T12:49:01.460 に答える