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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

2回答

1147閲覧

HSVの値の参照ができません

kaihatu

総合スコア7

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2017/02/14 08:12

マウスイベントでHSVの値を参照するプログラムを作成したいのですが
ハンドルされない例外が 0x00C166ED (NO1.exe) で発生しました: 0xC0000005: 場所 0x0000001D の読み取り中にアクセス違反が発生しました。とでてプログラムが止まります
マウスイベント内のプログラムをコメント文にするとプログラムが止まらないので下記に載せる部分が悪いことだけはわかっています
HSVの値の書式はint型ではないということでしょうか?

C++

1void onMouse1(int event, int x, int y, int flags, void* param){ 2 printf("x:%d y:%d H:%d S:%d V:%d", x, y, // マウス座標とHSVを出力 3 hsv_img1.data[hsv_img1.step*y + (x * 3) + 0], 4 hsv_img1.data[hsv_img1.step*y + (x * 3) + 1], 5 hsv_img1.data[hsv_img1.step*y + (x * 3) + 2], 6 "\n"); 7}

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

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

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

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

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

guest

回答2

0

hsv_img1.step*y + (x * 3) + ?

が配列のサイズをオーバーしてるからじゃないですか?
HiroshiWatanabeさんへのコメントで、0 ≦ y <240, 0 ≦ x <320の範囲では問題ないとおっしゃってますが、この範囲を超えたxまたはyが入力されているんだと思いますが。

投稿2017/02/14 09:11

PineMatsu

総合スコア3579

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

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

kaihatu

2017/02/14 09:32

カメラサイズを cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, 320); cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, 240); と指定しそれをHSV変換したものを入れているのでx,yの値は超えていないとはおもいます
PineMatsu

2017/02/15 08:17

思うんじゃなくてonMouse1に入ってきたところでxとyの値を確認すべきです。そこが大丈夫ならアクセス違反の例外は出ないはず。
guest

0

ベストアンサー

hsv_img1 もしくは hsv_img1.data が NULL なんじゃないですか?
ちゃんとデータセットされてますか?
hsv_img1.step や x, y の値も表示確認してみるとかしてみると何かわかるかもしれませんよ

投稿2017/02/14 08:27

編集2017/02/14 08:28
HiroshiWatanabe

総合スコア2160

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

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

kaihatu

2017/02/14 08:53 編集

こちらの値を使って色抽出を実際に行っているので 値は入っているはずなのですが /////////////////////////////////////////////////// for(int y=0; y<240;y++) { for(int x=0; x<320; x++) { int a = hsv_img.step*y+(x*3); if(hsv_img.data[a] >=0 && hsv_img.data[a] <=15 &&hsv_img.data[a+1] >=50 && hsv_img.data[a+2] >= 50 ) //HSVでの検出 { hsv_skin_img.data[a] = 255; //肌色部分を青に } } } //////////////////////////////////////////////////// このような橙色のところを青く塗りつぶし表示するものはできていたので
kaihatu

2017/02/14 09:51

すみません void onMouse1(int event, int x, int y, int flags, void* param){ if (hsv_img1.data != NULL&&hsv_img1.data != NULL&&hsv_img1.data != NULL) printf("x:%d y:%d H:%d S:%d V:%d\n", x, y, // マウス座標とHSVを出力 hsv_img1.data[hsv_img1.step*y + (x * 3) + 0], hsv_img1.data[hsv_img1.step*y + (x * 3) + 1], hsv_img1.data[hsv_img1.step*y + (x * 3) + 2]); } このようにプログラムを書き換えたところ条件を満たしていなかったのであなたのおっしゃる通り 中身がありませんでしたすみません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問