前提・実現したいこと
イクイレクタングラー形式の全方位映像をキューブマップ形式の全方位映像に変換し再生するプログラムを作っています。
動画の扱い等はopencvsharpのvideocaptureクラスを使っていて、毎フレーム毎に画像を変換しています。
変換と再生自体は一応上手く言っているので問題ないのですが、プロセスメモリを見るとGCが凄い勢いで発生しています。
GCの発生がどの程度、処理速度に影響を与えるのかよく知らないのですが、低下の一因にはなっていると思うのでこのGCを減らしたいと考えています。
発生している問題・エラーメッセージ
GCの発生頻度が高すぎる(気がする)。
(追記)
GCというよりは処理速度をどうすれば向上させられるかということの方が主題だったのかもしれません。
該当のソースコード
C#
1//capは変換したい映像が入ったVideocaptuer型 2//imgはMat型 3//pictはpictureBox 4//int[] 型のposは外側で計算させている変換のために必要な値です。 5//Play()をtimerで繰り返して映像を表示させています 6public void Play() 7 { 8 if(cap.PosFrames < cap.FrameCount - 1){ 9 cap.Read(img); 10 Cv2.Resize(img, img, new OpenCvSharp.Size(pict.Width, pict.Height * 2)); 11 var old = pict.Image; 12 pict.Image = cubechange(img.ToBitmap(), pos); 13 if (old != null) 14 old.Dispose(); 15 } 16 } 17 18 19 Bitmap cubechange(Bitmap img, int[] pos) 20 { 21 // Bitmapをロックし、BitmapDataを取得する 22 System.Drawing.Imaging.BitmapData srcBitmapData = 23 img.LockBits( 24 new System.Drawing.Rectangle(0, 0, img.Width, img.Height), 25 System.Drawing.Imaging.ImageLockMode.WriteOnly, img.PixelFormat); 26 27 // 変換対象のカラー画像の情報をバイト列へ書き出す 28 byte[] srcPixels = new byte[srcBitmapData.Stride * img.Height]; 29 byte[] copyPixels = new byte[srcBitmapData.Stride * img.Height]; 30 Marshal.Copy(srcBitmapData.Scan0, srcPixels, 0, srcPixels.Length); 31 Marshal.Copy(srcBitmapData.Scan0, copyPixels, 0, copyPixels.Length); 32 33 for (int i = 0; i < srcPixels.Length; i += 3) 34 { 35 if (i < srcPixels.Length / 2) 36 { 37 srcPixels[i] = copyPixels[pos[i / 3]]; 38 srcPixels[i + 1] = copyPixels[pos[i / 3] + 1]; 39 srcPixels[i + 2] = copyPixels[pos[i / 3] + 2]; 40 } 41 else 42 { 43 srcPixels[i] = 255; 44 srcPixels[i + 1] = 255; 45 srcPixels[i + 2] = 255; 46 } 47 48 } 49 Marshal.Copy(srcPixels, 0, srcBitmapData.Scan0, srcPixels.Length); 50 img.UnlockBits(srcBitmapData); 51 52 return img; 53 }
試したこと
補足情報(FW/ツールのバージョンなど)
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/17 10:59
2018/08/17 13:34