質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Q&A

1回答

12725閲覧

OpenCVSharpにて,System.AccessViolationExceptionが発生する,Webカメラが落ちる.

maidomasuo

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

0グッド

0クリップ

投稿2016/07/29 03:48

編集2016/07/29 04:08

###前提・実現したいこと

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に対応したものを使用しています.
よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

OpenCVSharpは詳しくないので恐縮ですが、.NET Framework 4.0以降のAccessViolationExceptionのCatchについて調べてみましたが、以下のサイトが参考になるかと思われます。

AccessViolationExceptionを捕捉できるようにする

ただ、こちらのサイトでも書かれていますが、

.NET Framework 4 以降で挙動が変更されたことにはそれなりに理由があります。というのも、すでにメモリアクセス違反が発生してしまったものを復旧しつつ挙動させることは極めて困難だということです。保証できない状態になっているのを無視してアプリケーションを継続してしまう場合がほとんどなので、それぐらいならアプリケーションをクラッシュさせる方がよほどマシとの考えでしょう。中途半端になって 2 次災害を引き起こすよりも突然の死を選ぶ方が安全である、と。

とあるので、実装にはご注意ください。

投稿2016/07/29 06:35

gusao

総合スコア185

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問