又一个100分,还是摄像头捕获照相问题,散了几百分还没有解决.高手请进
在panel控件中显示了摄像头内容,现在就是想在panel中放置一个矩形框,可以用鼠标移动,移到哪个位置按"照相"按钮就把矩形框中的内容显示在picture控件中并保存为jpeg文件.
现在的问题是还没有解决,问题是在panel上画矩形框可以画,但是一旦显示摄像头内容后,矩形框到后面去了,停止显示摄像头内容后,矩形框还在.
有人说用两个panel,一个设为透明,但是在winForm中VS2005设置不了,有人说重画矩形框,但我试了也没用,高手,请帮忙解决,最好能给个例子 ,谢了.
问题点数:100、回复次数:10Top
1 楼Knight94(愚翁)回复于 2006-05-04 09:05:27 得分 30
to 有人说用两个panel,一个设为透明,但是在winForm中VS2005设置不了,有人说重画矩形框,但我试了也没用,
panel透明是没用的,因为vs得透明机制比较怪,如果设置panel透明,并不会透明显示下层控件内容,而是显示底层窗体内容;
重画矩形框,基本也不可取,仅适合于图像静止才有用,毕竟摄像头的内容是变化的,它的刷新并不会触发panel的onpaint事件。
目前想到最简单的方法,就是做一个transparent的form,然后把它加载到显示摄像头的panel中,并设为topmost,用它来代替原有透明panel的作用。Top
2 楼deninghe(毛毛虫ァ野战军->挺进中原)回复于 2006-05-04 11:49:20 得分 5
markTop
3 楼nangangshi(小米)回复于 2006-05-04 14:51:22 得分 0
还有没有更好的办法?或自己写控件,应该怎么写?Top
4 楼Knight94(愚翁)回复于 2006-05-04 16:36:55 得分 10
to 还有没有更好的办法?或自己写控件,应该怎么写?
如果是图像静止则比较简单,但是如果是动态显示则比较麻烦。
由于目前都是用directshow来显示从摄像头过来的数据,因此你无法直接在paint事件中去做处理,只能在directshow上处理,这方面需要去看directx的SDK了。
Top
5 楼Knight94(愚翁)回复于 2006-05-04 16:39:07 得分 10
如果不是抓取一帧一部分,也是比较容易的,这可以参看
http://www.codeproject.com/csharp/motion_detection.aspTop
6 楼nangangshi(小米)回复于 2006-05-04 21:57:46 得分 0
高手请进,自顶.Top
7 楼woanon(嗳老虎游)回复于 2006-05-04 23:04:51 得分 5
不错的讨论哦,关注Top
8 楼misvcom(零下一度)回复于 2006-05-05 01:12:32 得分 40
VS2005能不能把panel设成透明我没试过,我是在VS2003下面做的。的确可以将两个Panel的内容重叠,能看到下面那个Panel中的图片。
如果用到directx的SDK的话,你的问题会变得很麻烦,以前做过类似的应用,但手上没有现成的代码,无能为力。
再不行的话你可以在VS2005下面用.NET 1.1的Panel的啊,不过这我也没试过,不知实际效果如何Top
9 楼lockon123()回复于 2006-10-29 20:46:30 得分 0
这几天也碰到这个问题,暂时的解决方案:
每秒15次定时将视频窗口截屏,得到一个Bitmap,然后在这个Bitmap里面画矩形,放到一个pictureBox里面。
问题就是有两个窗口,有点怪。
还可以将pictureBox和视频窗口重叠起来,但有闪烁感。
private void timer1_Tick(object sender, EventArgs e)
{
CapScr cs = new CapScr();
Bitmap img = cs.CaptureScreen((int)pictureBox3.Handle,iwidth, iheight, 0, 0);
Graphics g = Graphics.FromImage(img);
Rectangle rect = new Rectangle(85, 40, 150, 200);
Pen pen1 = new Pen(Color.Red, 5);
g.DrawRectangle(pen1, rect);
g.Dispose();
pictureBox1.Image = img;
}
Top
10 楼lockon123()回复于 2006-10-30 10:57:45 得分 0
再研究了一下:
1。 Knight94(愚翁)
"目前想到最简单的方法,就是做一个transparent的form,然后把它加载到显示摄像头的panel中,并设为topmost,用它来代替原有透明panel的作用。"
这个办法是可行的。
2。做一个TransparentPanel类,从Panel继承:
class TransparentPanel : Panel
{
public TransparentPanel()
{
}
//This method makes sure that the background is what is directly behind the control
//and not what is behind the form...
override protected CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
}
}
override protected void OnPaintBackground(PaintEventArgs e)
{
// do nothing
}
}
Top




