C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

メモリが蓄積される事への対処方を教えて下さい。

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■95810 / inTopicNo.1)  メモリが蓄積される事への対処方を教えて下さい。
  
□投稿者/ どんどんやき (1回)-(2020/09/28(Mon) 08:59:15)

分類:[C#] 

OpenCvSharpを使ってボタンを押すとカメラが起動し、リアルタイムで映像を表示するプログラムです。
ラジオボタンの切り替えで表示カラーを変えており、デフォルトでラジオボタン1にチェックが入っています。

ラジオボタン1の時はメモリが安定しているのですが、ラジオボタン2にチェックを入れて表示するとメモリが蓄積されてしまいます。ラジオボタン1にチェックを戻すと蓄積された所で安定します。
1と2の違いはCvtColorなのですがメモリを安定させるにはどうすればいいでしょうか?

private void button1_Click(object sender, EventArgs e)
{
var capture = new VideoCapture(0);
using (var win = new Window("cam"))
using (var mat = new Mat())

while (close_flag == false)
{
capture.Read(mat);

if (mat.Empty())
break;

_frame = mat;

if (radioButton1.Checked == true)
{
win.ShowImage(mat);
}
else if (radioButton2Checked == true)
{
win.ShowImage(mat.CvtColor(ColorConversionCodes.Lab2LBGR));
}

Cv2.WaitKey(100);
}
}
引用返信 編集キー/
■95811 / inTopicNo.2)  Re[1]: メモリが蓄積される事への対処方を教えて下さい。
□投稿者/ Hongliang (1093回)-(2020/09/28(Mon) 09:48:16)
CvtColorメソッドは、新しいMatを作成し、元の画像から色変換したのを書き込んで、その新しいMatを返します。
コードを見るに、変換元のmat変数に格納されたオブジェクトはusingによって破棄されていますが、変換先のMatオブジェクトは破棄されていません。

// まあ、多分最終的にはGCによって破棄されるとは思いますが。
引用返信 編集キー/
■95816 / inTopicNo.3)  Re[2]: メモリが蓄積される事への対処方を教えて下さい。
□投稿者/ どんどんやき (2回)-(2020/09/29(Tue) 08:28:58)
No95811 (Hongliang さん) に返信
> CvtColorメソッドは、新しいMatを作成し、元の画像から色変換したのを書き込んで、その新しいMatを返します。
> コードを見るに、変換元のmat変数に格納されたオブジェクトはusingによって破棄されていますが、変換先のMatオブジェクトは破棄されていません。

Matオブジェクトはどう記述すれば破棄できるのでしょうか?
最終的に破棄されるならそのまま放置しておくものなのでしょうか?
引用返信 編集キー/
■95817 / inTopicNo.4)  Re[3]: メモリが蓄積される事への対処方を教えて下さい。
□投稿者/ 魔界の仮面弁士 (2848回)-(2020/09/29(Tue) 08:50:47)
No95816 (どんどんやき さん) に返信
>>コードを見るに、変換元のmat変数に格納されたオブジェクトはusingによって破棄されていますが、変換先のMatオブジェクトは破棄されていません。
> Matオブジェクトはどう記述すれば破棄できるのでしょうか?

1 つ目の Mat を using で破棄しているのですから、
2 つ目の Mat も同じように処理すれば良いのでは。


using (var win = new Window("cam"))
using (var mat = new Mat()) // 1つ目の Mat は、この using ブロックを抜けた所で処分される
{
 while (!close_flag)
 {
  capture.Read(mat);
  if (mat.Empty()) { break; }
  _frame = mat;
  if (radioButton1.Checked)
  {
   win.ShowImage(mat);
  }
  else if (radioButton2Checked)
  {
   // 2 つ目の Mat は、この using ブロックを抜けた所で処分される
   using (var mat2 = mat.CvtColor(ColorConversionCodes.Lab2LBGR))
   {
    win.ShowImage(mat2);
   }
  }
  Cv2.WaitKey(100);
}
引用返信 編集キー/
■95818 / inTopicNo.5)  Re[4]: メモリが蓄積される事への対処方を教えて下さい。
□投稿者/ どんどんやき (3回)-(2020/09/29(Tue) 13:05:55)
無事にできました。
ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ