###前提・実現したいこと
WindowsFormアプリケーションを開発しております.
Webカメラの画像を取得し,Particleフィルタによって特徴点検出を行おうと思います.
カメラの画像を表示する,写真を撮る,動画を撮影するといったことはできるのですが,フィルタの処理がある部分では,System.AccessViolationExceptionが発生し,機能が停止する.または,Webカメラが機能停止する,といったエラーが発生しています.
OpenCVSharpのMatは,メモリが壊れる現象によってSystem.AccessViolationExceptionが発生することがあるそうです.また,.NET 4.0以降から,System.AccessViolationExceptionはcatchすることができなくなったようで,例外処理ができません.
何とか,エラーを回避したいと思います.
どうぞよろしくお願い申し上げます。
###発生している問題・エラーメッセージ
型 'System.AccessViolationException' のハンドルされていない例外が OpenCvSharp.dll で発生しました
エラーメッセージ 型 'System.AccessViolationException' のハンドルされていない例外が OpenCvSharp.dll で発生しました 追加情報:保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
###該当のソースコード
C# public void M_Particle_Filter() { int counter = 0; //フィルタの数値をテキストボックスに表示するカウンター.100で表示更新 int camera_counter = 0; Thread.Sleep(1000); VideoCapture VC_Filter = new VideoCapture(Camera_Number_i); while (VC_Filter == null) { camera_counter++; if (camera_counter >= 5000) { break; } } ////カメラがオープンできたかの確認 if (VC_Filter == null) { M_Wr_Error_Log("M_Camera_Display_for_SatelliteTrack," + "カメラを開けませんでした"); return; } try { while (true) { if (State_Th_Filter == false) { if (State_Camera == false) { pictureBox_for_SatelliteTrack.Image = null; pictureBox_for_Star_Track.Image = null; Filter_ON_OFF_for_SatelliteTrack_button.BackColor = Color.LightSalmon; Filter_ON_OFF_for_SatelliteTrack_button.Text = "フィルタON"; Filter_ON_OFF_for_StarTrack_button.BackColor = Color.LightSalmon; Filter_ON_OFF_for_StarTrack_button.Text = "フィルタON"; } return; } try { VC_Filter.Read(Camera_Mat_Raw); Cv2.Flip(Camera_Mat_Raw, Camera_Mat_global, FlipMode.XY); Camera_Mat_Clone_ = Camera_Mat_global.Clone(); OpenCvSharp.Size size_of_picture = new OpenCvSharp.Size(); size_of_picture.Width = (int)(Camera_Mat_global.Width * Camera_Resize_db); size_of_picture.Height = (int)(Camera_Mat_global.Height * Camera_Resize_db); Cv2.Resize(Camera_Mat_global, Camera_Mat_Clone_, size_of_picture, 0, 0, InterpolationFlags.Linear); for (i = 0; i < N; i++) { OpenCvSharp.Point point_circle = new OpenCvSharp.Point((int)(X[0, i] * 0.5), (int)(X[1, i] * 0.5)); OpenCvSharp.Scalar color_scalar = new OpenCvSharp.Scalar(200, 0, 0); Cv2.Circle(Camera_Mat_Clone_, point_circle, 2, color_scalar, -1, LineTypes.Link8); } //~Particle Filterの作業(画素にアクセスして,フィルタ処理を行う.著作権の関係から開示できません)~ //表示 str = L_sum.ToString(); C_Calc.M_Calc_Transform_OpenCVtoCCD(Position_OpenCV, ref Position_Satellite_on_CCD); if ((L_sum < 0.01) || (L_sum >= 1.0)) { Position_Satellite_on_CCD[0] = -1000; Position_Satellite_on_CCD[1] = -1000; } if (State_SatelliteTrack_for_Filter_bool == true) { pictureBox_for_SatelliteTrack.Image = Camera_Mat_Clone_.ToBitmap(); if (counter == 10) { dlg_Display_Filter_Error_on_CCD dlg_Display_Filter_Error_on_CCD_Invoke = new dlg_Display_Filter_Error_on_CCD(M_Display_Filter_Error_on_CCD_for_SatelliteTrack); this.Invoke(dlg_Display_Filter_Error_on_CCD_Invoke, new object[] { str }); counter = 0; } } else if (State_StarTrack_for_Filter_bool == true) { pictureBox_for_Star_Track.Image = Camera_Mat_Clone_.ToBitmap(); if (counter == 10) { dlg_Display_Filter_Error_on_CCD dlg_Display_Filter_Error_on_CCD_Invoke = new dlg_Display_Filter_Error_on_CCD(M_Display_Filter_Error_on_CCD_for_Star_Track); this.Invoke(dlg_Display_Filter_Error_on_CCD_Invoke, new object[] { str }); counter = 0; } } } catch (System.AccessViolationException) { //このエラーはキャッチできない } Thread.Sleep(10); counter++; } } catch { //無視 } }
###試したこと
Matをグローバル変数ではなく,ローカル変数にして,M_Particle_Filter()の関数内で宣言した.
結果,変わらない.数分経過すると,Webカメラが落ちる.または,System.AccessViolationExceptionにより,ソフトが停止する.
###補足情報(言語/FW/ツール等のバージョンなど)
C#のWindowsFormアプリケーションを開発しています.
Particleフィルタによる画像トラッキングを行いたいのですが,数分間走らせると,System.AccessViolationExceptionが発生し,ソフトが落ちてしまいました.
OpenCV自体はC++用のもので,opencv3.0のdllファイルと,OpenCVSharpを使用しております.OpenCVSharpは,フリーのラッパーでして,C#でOpenCVと同様の機能が使えるようにしたものです.開発者によると,System.AccessViolationExceptionが発生する場合が確認されていて,.NETでは内容がわからないようなのですが,Matのメモリが壊されているようです.
そこで,ご質問させていただきたいのは,System.AccessViolationExceptionを回避する方法,またはこれを無視する方法,更には,上記のアルゴリズムで原因と思われる部分のご指摘をいただきたいと思います.
なお,開発環境はVisualStudio 2015 (vc14)です.OpenCVのヴァージョンはOpenCV3.0で,OpenCVSharpは,OpenCVSharpに対応したものを使用しています.
よろしくお願い申し上げます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。