トップページ > プログラム > 2015年02月16日 > usoCkHa9

書き込み順位&時間帯一覧

1 位/216 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000002000000021010107



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
659
ふらっと C#,C♯,C#(初心者用) Part114©2ch.net

書き込みレス一覧

ふらっと 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の上に描くという処理です。

他にもご回答くださいましてありがとうございました。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。