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

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

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

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

OpenCV

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

Q&A

解決済

1回答

3466閲覧

マウスホイール操作の判別(C#,OpenCVSharp,Webカメラ)

ardin

総合スコア544

C#

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

OpenCV

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

0グッド

0クリップ

投稿2018/05/24 04:33

C#でOpenCVSharpを利用してOpenCVを使用しています。
Webカメラ画像を映す処理で生成したウィンドウ内でマウスホイール操作をした際の処理を作ろうと
しているのですが、マウスホイール操作を取得することができません。

C#

1 // デフォルトのカメラをオープン 2 var capture = new VideoCapture(0); 3 if (capture.IsOpened()) 4 { 5 var fs = FrameSource.CreateCameraSource(0); 6 using (var normalWindow = new Window("normal")) 7 { 8 capture.Set(3, 900); // 幅 9 capture.Set(4, 900); // 高さ 10 capture.Set(5, 30); // FPS 11 var normalFrame = new Mat(); 12 13 var grayMat = new Mat(); 14 15 Cv2.SetMouseCallback("normal", On_mouse); 16 while (true) 17 { 18 capture.Read(normalFrame); 19 if (normalFrame.Empty()) 20 { 21 break; 22 } 23 24 normalWindow.ShowImage(img: normalFrame); 25 26 -----略----- 27 28 } 29 } 30 } 31 32 private void On_mouse(MouseEvent @event, int x, int y, MouseEvent flags) 33 { 34 Console.WriteLine($"event: {@event}, (x, y)= ({x}, {y}), flags: {flags}"); 35 if (@event == MouseEvent.MouseWheel) 36 { 37 -----略----- 38 } 39 }

デバッグ文としてコンソール出力にて
マウスホイール操作をした際には
event: FlagRButton, MouseWheel, (x, y)= (***, ***), flags: -7864320
(***はマウス座標)
と来ていることは確認できています。
@eventにMouseWheelが来ているのは分かりますが、FlagRButtonも一緒になっているのがよくわからないところです。
flagsの値も怪しいのですが・・・
この状況でマウスホイール操作時の処理だけを書きたいので、判別を行いたいです。
どのようにすればよいでしょうか。

なお、MouseMoveは下記のように単独で来るため
event: MouseMove, (x, y)= (***, ***), flags: MouseMove
判別して取ることができます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

パッと見ですが、MouseEventはFlags属性が付いた列挙型みたいですね。
その場合

@event == MouseEvent.MouseWheel

ではなく
(@event & MouseEvent.MouseWheel) != 0
又は
(@event & MouseEvent.MouseWheel) == MouseEvent.MouseWheel
で判定します。

サンプルコード

C#

1class Program 2{ 3 static void Main(string[] args) 4 { 5 MyFlags myFlags = MyFlags.buzz | MyFlags.fuga; 6 7 Console.WriteLine(myFlags); 8 9 if((myFlags & MyFlags.fuga) != 0) 10 { 11 Console.WriteLine(MyFlags.fuga); 12 } 13 14 myFlags = (MyFlags)14; 15 16 Console.WriteLine(myFlags); 17 } 18 19 [Flags] 20 enum MyFlags 21 { 22 fizz = 0b0001, // = 1 23 buzz = 0b0010, // = 2 24 hoge = 0b0100, // = 4 25 fuga = 0b1000 // = 8 26 } 27}

投稿2018/05/24 08:59

hihijiji

総合スコア4150

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

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

ardin

2018/05/24 09:19

(@event & MouseEvent.MouseWheel) == MouseEvent.MouseWheel にて確認してみました。 正しく判定されていることが確認できました。 ありがとうございます。
ardin

2018/05/24 09:23

改めて提示されたソースを見てみました。 なるほど、イメージとしてはビット演算(操作)みたいなものということでしょうか。 もう少し勉強してみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問