Visual C++のWindowsフォームアプリケーションで、Kinectの映像を録画したONI形式のファイルを再生し、そこから骨格情報を抽出しようと考えています。
ファイルを再生するまでは成功したのですが、骨格情報を抽出するコードを追加するとうまくいかなくなってしまいました。
button13をクリックするとONIファイルを読み込んで表示するようにします。以下にその部分のコードを示します。
System::Void Form1::button13_Click(System::Object^ sender, System::EventArgs^ e){
XnStatus nRetVal = XN_STATUS_OK;
int nType = 0; // ノードのタイプ
char* filePath; // ファイル名
// [ファイルを開く]ダイアログ
openFileDialog1->Filter = "ONIファイル(*.oni)|*.oni";
if (openFileDialog1->ShowDialog() != Windows::Forms::DialogResult::OK) {
return;
}
else {
// ファイル名を取得
filePath = (char*)Marshal::StringToHGlobalAnsi(openFileDialog1->FileName).ToPointer();
}
//----------
// Kinect初期化
context.Init();
// プレイヤーの作成
nRetVal = context.OpenFileRecording(filePath, player);
if (nRetVal != XN_STATUS_OK) {
MessageBox::Show("ファイルを開くことができません");
return;
}
// 再生終了コールバックを登録
XnCallbackHandle hCallback;
player.RegisterToEndOfFileReached(OnEndOfFileReached, NULL, hCallback);
//----------
// RGBカメラ
context.FindExistingNode(XN_NODE_TYPE_IMAGE, image);
if (image.IsValid() == true){
nType = 1;
}
// 奥行き情報
context.FindExistingNode(XN_NODE_TYPE_DEPTH, depth);
if (depth.IsValid() == true) {
nType = 2;
}
//ユーザー
context.FindExistingNode(XN_NODE_TYPE_USER, user);
if (user.IsValid() == true) {
nType = 3;
}
// ノードの確認
switch (nType){
case 1:
generator = image;
break;
case 2:
generator = depth;
break;
case 3:
generator = user;
break;
default:
MessageBox::Show("有効なノードが見つかりません");
return;
}
//ユーザー検出コールバック関数を登録
XnCallbackHandle hUserCallbacks;
user.RegisterUserCallbacks(
User_NewUser, User_LostUser, NULL, hUserCallbacks);
//ポーズ検出コールバック関数を登録
XnCallbackHandle hPoseCallbacks;
user.GetPoseDetectionCap().RegisterToPoseCallbacks(
Pose_Detected, NULL, NULL, hPoseCallbacks);
//キャリブレーションコールバック関数を登録
XnCallbackHandle hCalibrationCallbacks;
user.GetSkeletonCap().RegisterCalibrationCallbacks(
Calibration_Start, Calibration_End, NULL, hCalibrationCallbacks);
//全ての関節を有効に
user.GetSkeletonCap().SetSkeletonProfile(XN_SKEL_PROFILE_ALL);
//キャリブレーションポーズを取得
user.GetSkeletonCap().GetCalibrationPose(strPose);
//----------
// 全フレーム数を取得
XnUInt32 frames;
player.GetNumFrames(generator.GetName(), frames);
// テキストボックスとトラックバーの初期化
textBox1->Text = "0";
trackBar1->Minimum = 0;
trackBar1->Maximum = frames;
trackBar1->Value = 0;
lblframe->Text = frames.ToString();
// すべてのデータの更新を待つ
context.WaitAndUpdateAll();
// 1フレーム分の画像を表示
ShowOneFrame();
}
実行すると、
「'System.AccessViolationException' のハンドルされていない例外が発生しました。
追加情報: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」
というエラーが出て終了してしまいます。調べてみるとユーザー検出コールバック関数を登録するところで止まってしまうようです。
ネットで原因を調べてみると、保護されているメモリにアクセスしたからであるとか、ポインタが間違っているのが原因であると書かれていますが、よく分かりません。
ONIにユーザー情報は入っていませんが、奥行き情報は入っており、それさえあれば骨格抽出はできるらしいのですが、ユーザーのジェネレーターを作る段階で問題があるのでしょうか。
どなたか原因が分かる人はいらっしゃいますでしょうか。ここで示したソースコードは全体の一部だけなので分かりにくいと思いますが、ご助言を伺いたいと思います。
よろしくお願いします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
昔、一度C++でプログラムを作ったのですが、全く動かず、あきらめました。
ですから、この書き込みは適当に読み流してください。
'System.AccessViolationException' のハンドルされていない例外が発生しました。
追加情報: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」
で検索したらいっぱいヒットしたサイトが出てきましたけど。
たとえば、C#のようですが
http://bbs.wankuma.com/index.cgi?mode=al2&namber …
で、
> AccessViolationException が発生すると言うことは、本来、確保しておくべきメモリを確保していなかったり、足りなかったり、あるいは間違った渡し方をすることでその関数の実行に失敗するか、他のオブジェクトなどが使っているメモリを壊してしまうかという被害が発生します。
> 今回のケースでは StringBuilder にあらかじめ確保しておく文字列バッファ(260 文字ぐらい?)を用意していなかったため、別の場所のメモリが破壊され...
といった記述があります。
shoboyさんのプログラムは私にはさっぱりわからないので、どこが間違っているかはわかりませんが...
もっと詳しいことを求められているのでしたらごめんなさい。
私の場合、ユーザージェネレーターが作れていないのが原因だと思われます。あれからその部分のコードを変更したりしてみたのですが、うまくいかないようです。
情報ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- PHP php ログイン 1 2022/11/01 00:24
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
sil_rew_memのメモリアクセスに...
-
【C言語】再帰が時間がかかる...
-
C言語初心者です。debug assert...
-
エクセルのメモリ使用状況/Appl...
-
マインスイーパ、自動解析プロ...
-
メモリを解放しないとどうなる?
-
バッチファイルでの実行EXEのメ...
-
メモリ不足
-
ターボDelphi 独自カーソルの設定
-
C言語における再帰呼び出しの...
-
メモリのセグメント違反の解決...
-
メモリの解放の仕方
-
VB.netでUSBメモリの固有I...
-
GPUプログラミング時の表示用GPU
-
EXCEL-VBAにてADOのレコードセ...
-
ExitProcessの関数コールについ...
-
エクセルVBA 大容量CSVファイル...
-
C,C++プログラムの強制終了時の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
「ヒープサイズの設定」て何?
-
C言語における再帰呼び出しの...
-
エクセルVBA 大容量CSVファイル...
-
動的メモリとexit(C言語)
-
エクセルのメモリ使用状況/Appl...
-
メモリが不足しています(VBA)
-
ファイルマッピング関数で失敗
-
大容量のメモリ確保をスワップ...
-
メモリのセグメント違反の解決...
-
EXCEL-VBAにてADOのレコードセ...
-
メモリ不足
-
エクセル キャッシュメモリー...
-
【C言語】再帰が時間がかかる...
-
C#のOutOfMemoryException発生...
-
closeとメモリの開放について
-
バッチファイルでの実行EXEのメ...
-
メモリの解放について VB6 VBA
-
「memcpy」と「strcpy」について
おすすめ情報