- ふらっと C#,C♯,C#(初心者用) Part114©2ch.net
659 :デフォルトの名無しさん[sage]:2015/02/16(月) 09:51:39.17 ID:usoCkHa9 - private void Form1_Load(object sender, EventArgs e)
{ Thread threadVideo = new Thread(new ThreadStart(Display)); threadVideo.Start(); } private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { bitmapBに描画; //(実際にはちゃんと書いてあります) bitmapC = bitmapA + bitmapB; //ここで合成(実際にはちゃんと書いてあります) pictureBox1.Image = bitmapC; //書き込み } private void Display() { bitmapA = QueryFrame(); while (bitmapA != null) { bitmapC = bitmapA + bitmapB this.Invoke((MethodInvoker)delegate { this.pictureBox1.Image = bitmapC; }); bitmapA = QueryFrame(); } } 背景に動画を表示したままにし、マウスが動いたときに上に重ねるずを変化させたいと思ってます。 QueryFrameで1コマ取り出せます。この処理は10ミリ秒で終わるときも5秒かかるときもあります。 ずっと10ミリ秒で動いているならスレッドのなかでマウス位置を読めばできると思うのですが、 5秒かかるときもあり、その間マウスに反応しなくなってしまいます。 この状態では色々な例外が出ますので、根本的な問題があるのだろうと思います。 どうすればいいのか分かりましたら助かります。よろしくお願いいたします。
|
- ふらっと C#,C♯,C#(初心者用) Part114©2ch.net
660 :659[sage]:2015/02/16(月) 09:54:02.12 ID:usoCkHa9 - >重ねるずを
重ねる図を でした。すみません。
|
- ふらっと C#,C♯,C#(初心者用) Part114©2ch.net
663 :659[sage]:2015/02/16(月) 17:51:29.41 ID:usoCkHa9 - 申し訳ありません。それでは質問を変えます。
Form1のpictureBox1に1秒1コマの動画が表示されています。 その上でマウスを動かすと動画とは非同期で動画の上のマウスの位置に点が次々と 表示され、残ったままにしたいのですが、どうすれば実現できるでしょうか? OpenCVSharpでサンプルを作りました。Thread.Sleep(1000)は遅い動画を作るための ダミーで、この中では処理ができないものとします(ソースはこれですべてです)。
|
- ふらっと C#,C♯,C#(初心者用) Part114©2ch.net
664 :659[sage]:2015/02/16(月) 17:52:05.09 ID:usoCkHa9 - public partial class Form1 : Form
{ public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { pictureBox1.MouseMove += new MouseEventHandler(Form1_MouseMove); Thread threadVideo = new Thread(new ThreadStart(Display)); threadVideo.Start(); } private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { // } private void Display() { CvCapture capture = new CvCapture("C:\\test.avi"); IplImage image = capture.QueryFrame(); while (image != null) { this.Invoke((MethodInvoker)delegate { this.pictureBox1.Image = BitmapConverter.ToBitmap(image); }); Thread.Sleep(1000); image = capture.QueryFrame(); } } }
|
- ふらっと C#,C♯,C#(初心者用) Part114©2ch.net
666 :659[sage]:2015/02/16(月) 18:05:36.56 ID:usoCkHa9 - すみません。マウスにリアルタイムに追従しなければならないのです。
それだと1秒遅れてうごきませんか?
|
- ふらっと C#,C♯,C#(初心者用) Part114©2ch.net
671 :659[sage]:2015/02/16(月) 20:55:34.00 ID:usoCkHa9 - 皆さん回答ありがとうございます。
670さんのような方法を試してみます。 最初はpictureBoxを重ねようと思ったのですが、透明処理は 親ウィンドウを透過したようになってしまうようです。
|
- ふらっと C#,C♯,C#(初心者用) Part114©2ch.net
674 :659[sage]:2015/02/16(月) 22:12:21.72 ID:usoCkHa9 - 670さんの方法のアレンジで出来ました。
サンプルで言えば、MouseMoveでマウス座標を記録、PictureBox_Paintでbitmapの上に描くという処理です。 他にもご回答くださいましてありがとうございました。
|