跪求C#程序如何能将摄像头的图像导入?

gelidwolf 2008-08-29 10:00:41
请问如何可以从摄像头获取数据并导入到c#的Form里,从这里:http://download.csdn.net/source/434425 下载了一个,总说要转换,转换后总是不能用,本人使用VS2005,转换后运行的结果总是一片黑,什么也看不到,望哪位专家高手给指点,在线等待您的解释!谢谢!
...全文
876 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
yipiantianys 2011-08-19
  • 打赏
  • 举报
回复
我也遇到同样的问题,C#在vs2005中调用摄像头显示一片黑,不能拍照,但能完成录像,头疼死了,还望那位仁义之士帮帮忙!
markfengyunzhou 2009-12-28
  • 打赏
  • 举报
回复
你用的方法不稳定 的。。换个带驱动 的摄像头绝对 就好了。。这个问题也困扰了我很长时间。。要么就换个方法,用http://www.codeproject.com/KB/directx/directxcapture.aspx,不过没有截图功能,我也研究了好长时间,本人强烈建议http://developer.51cto.com/art/200908/145646.htm,简单,实用。。
wangtju 2009-08-15
  • 打赏
  • 举报
回复
directshow不知道哪位大侠帮忙解释一下
wangtju 2009-08-15
  • 打赏
  • 举报
回复
http://www.codeproject.com/KB/directx/directxcapture.aspx
这个确实很不错,不知道能不能做成dll在其他工程里调用
龟仙 2009-03-06
  • 打赏
  • 举报
回复
密切关注中!!
楼主做的是成像截图!我做的是视频播放。。
对我的帮助很大。。

帮你顶。。。。。。。。。。。。
gelidwolf 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 jizhe 的回复:]
http://www.codeproject.com/KB/directx/directxcapture.aspx
[/Quote]谢谢!!!
jizhe 2008-09-22
  • 打赏
  • 举报
回复
http://www.codeproject.com/KB/directx/directxcapture.aspx
gelidwolf 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 jizhe 的回复:]
他们都推荐用DirectShow,速度很快
[/Quote]DirectShow是什么?我看文档里面没有啊……
jizhe 2008-09-04
  • 打赏
  • 举报
回复
他们都推荐用DirectShow,速度很快
jizhe 2008-09-04
  • 打赏
  • 举报
回复
我刚做完,用codeproject.com上的

你先用AmCap.exe看看能不能看到图像,有时候需要设置一下分辨率、色彩等等,24位还是16位的
slimfeng 2008-09-03
  • 打赏
  • 举报
回复
觉得应该跟摄像头驱动程序有关,帮顶
zhpmy1 2008-09-03
  • 打赏
  • 举报
回复
我也在做这方面的开发,帮忙顶,知道的来帮帮忙啊,
我的还是远程读取客户机上的摄像头数据,郁闷
hanyu0528 2008-09-03
  • 打赏
  • 举报
回复
不懂,帮顶
gelidwolf 2008-09-03
  • 打赏
  • 举报
回复
最近我几乎找遍了所有C#编制的摄像头程序,但是总是在框里显示一片漆黑,到底哪里有问题?谁能帮我解释啊!!! T_T
gelidwolf 2008-09-02
  • 打赏
  • 举报
回复
最近我看了一段delphi的片段代码,貌似也是摄像头的,但是我只有片段:
Const WM_CAP_START = WM_USER;\\1024 0x400
Const WM_CAP_STOP = WM_CAP_START + 68;\\1092 0x444
Const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;\\1034 0x40A
Const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;\\1035 0x40B
Const WM_CAP_SAVEDIB = WM_CAP_START + 25;\\1049 0x419
Const WM_CAP_GRAB_FRAME = WM_CAP_START + 60;\\1084 0x43C
Const WM_CAP_SEQUENCE = WM_CAP_START + 62;\\1086 0x43E
Const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;\\1044 0x414
Const WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;\\1087 0x43F
Const WM_CAP_SET_OVERLAY = WM_CAP_START + 51;\\1075 0x433
Const WM_CAP_SET_PREVIEW = WM_CAP_START + 50;\\1074 0x432
Const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;\\1030 0x406
Const WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;\\1026 0x402
Const WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;\\1027 0x403
Const WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;\\1029 0x405
Const WM_CAP_SET_SCALE = WM_CAP_START + 53;\\1077 0x435
Const WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;\\1076 0x434
(后面的数字是我根据C#的程序找规律算的十进制数字以及十六进制数字)

程序初始化获取图像:
hWndC := capCreateCaptureWindowA('My Own Capture Window', WS_CHILD Or WS_VISIBLE, CSCamFrm.Panel1.Left,
CSCamFrm.Panel1.Top,
CSCamFrm.Panel1.Width, CSCamFrm.Panel1.Height, CSCamFrm.Handle, 0);
If hWndC <> 0 Then
Begin
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
// SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
// SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
// SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
End;
(打//的是和C#类似的语句)
我看着差不多,所以就把程序里的:
if (Camera.SendMessage(hHwnd, 0x40a, intDevice, 0) > 0)
//if (hHwnd!=0)
{
Camera.SendMessage(this.hHwnd, 0x435, 1, 0);
Camera.SendMessage(this.hHwnd, 0x434, 0x42, 0);
Camera.SendMessage(this.hHwnd, 0x432, 1, 0);

Camera.SetWindowPos(this.hHwnd, 1, 0, 0, intWidth, intHeight, 6);
isOpen = true;
}


改成了:
if (Camera.SendMessage(hHwnd, 0x40a, intDevice, 0) > 0)
{
Camera.SendMessage(this.hHwnd, 0x406, 0, 0);
Camera.SendMessage(this.hHwnd, 0x402, 0, 0);
Camera.SendMessage(this.hHwnd, 0x403, 0, 0);
Camera.SendMessage(this.hHwnd, 0x40a, 0, 0);
Camera.SendMessage(this.hHwnd, 0x435, 1, 0);//
Camera.SendMessage(this.hHwnd, 0x434, 0x42, 0);//
Camera.SendMessage(this.hHwnd, 0x433, 1, 0);
Camera.SendMessage(this.hHwnd, 0x432, 1, 0);//
Camera.SetWindowPos(this.hHwnd, 1, 0, 0, intWidth, intHeight, 6);
isOpen = true;
}
结果:Camera.SendMessage(this.hHwnd, 0x432, 1, 0);//这句出现一个异常:SEHException,外部组件发生异常。
我看if的判断条件貌似和第四句发送代码一样,注释了前四句,结果和原来一样,程序可以运行,但是还是Panel控件里面一片漆黑
哪位高人能帮我解决下呢?我已经快想疯了……
gelidwolf 2008-09-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ki1381 的回复:]
傻办法,全屏截屏,再截取你要的部分,呵呵


C# codeImage myImage=newBitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics g=Graphics.FromImage(myImage);
g.CopyFromScreen(newPoint(0,0),newPoint(0,0),newSize(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height));
IntPtr dc1=g.GetHdc();
g.ReleaseHdc…
[/Quote]
这个把哪几句改掉呢?还有ShowImage是个方法还是什么?我怎么在帮助文档里找不到呢?
Adechen 2008-09-01
  • 打赏
  • 举报
回复
没有做过类似的,关注一下,
cnming 2008-09-01
  • 打赏
  • 举报
回复
mark
Ki1381 2008-09-01
  • 打赏
  • 举报
回复
傻办法,全屏截屏,再截取你要的部分,呵呵


Image myImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics g = Graphics.FromImage(myImage);
g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height));
IntPtr dc1 = g.GetHdc();
g.ReleaseHdc(dc1);
g.Dispose();
ShowImage((Bitmap)myImage); // 改成你的处理看看
gelidwolf 2008-09-01
  • 打赏
  • 举报
回复
又静下来了……
加载更多回复(8)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧