如何在PB的窗口中实时显示摄像头获取的图像?
最近做系统需要在PB的窗口中显示摄像头所采集到的图像(连续的画面),没接触过这方面的东西,不知如何去做,能否提供点思路或具体的实例。 问题点数:50、回复次数:11Top
1 楼leio((郁闷中...))回复于 2005-11-08 00:24:30 得分 20
下面是以前在网上看到的一段代码,没试过。
用 api 调用 摄像头 源码
//定义变量
uint lhand
//定义常数
long WM_USER=1024
long WM_CAP_START = WM_USER
long WM_CAP_STOP = WM_CAP_START + 68
long WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10
long WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11
long WM_CAP_SAVEDIB = WM_CAP_START + 25
long WM_CAP_GRAB_FRAME = WM_CAP_START + 60
long WM_CAP_SEQUENCE = WM_CAP_START + 62
long WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20
long WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63
long WM_CAP_SET_OVERLAY =WM_CAP_START+ 51
long WM_CAP_SET_PREVIEW =WM_CAP_START+ 50
long WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6
long WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2
long WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3
long WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5
long WM_CAP_SET_SCALE=WM_CAP_START+ 53
long WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52
//定义api
function ulong capCreateCaptureWindowA(string lpszWindowName,ulong dwStyle,long x ,long y ,long nWidth ,long nHeight ,ulong ParentWin ,long nId ) LIBRARY 'AVICAP32.DLL'
//初始化代码
string lpszName
ulong l1
l1=handle(w_main)
lpszName='摄像头界面...'
lhand=capCreateCaptureWindowA(lpszName,262144+12582912+1073741824 + 268435456 ,0,0,200,200,l1,0)
if lhand <> 0 then
send(lhand, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0)
send(lhand, WM_CAP_SET_CALLBACK_ERROR, 0, 0)
send(lhand, WM_CAP_SET_CALLBACK_STATUSA, 0, 0)
send(lhand, WM_CAP_DRIVER_CONNECT, 0, 0)
send(lhand, WM_CAP_SET_SCALE, 1, 0)
send(lhand, WM_CAP_SET_PREVIEWRATE, 66, 0)
send(lhand, WM_CAP_SET_OVERLAY, 1, 0)
send(lhand, WM_CAP_SET_PREVIEW, 1, 0)
end if
//保存到文件
string s
s='c:\save.avi'
if lhand<>0 then
Send(lhand,WM_CAP_FILE_SET_CAPTURE_FILEA,0, s);
Send(lhand,WM_CAP_SEQUENCE, 0, 0) //开始捕捉
end if
//停止保存
send(lhand, WM_CAP_STOP, 0, 0)
//保存为图片
string s
s='c:\save.bmp'
if lhand <> 0 then
Send(lhand,WM_CAP_SAVEDIB,0,s);
end if
//没有摄像头的可以去下载一个如下的软件,可以虚拟摄像头(此软件可以放一个电影,代替正常摄像头的摄像内容)
Vandate Virtual Camera 虚拟摄像头 1.5.1.exe
Top
2 楼ljxsea(春雷)回复于 2005-11-13 19:39:23 得分 0
这个代码我试了下,完全可以的(我用的是普通摄像头)。。多谢了!
另外我还有个疑问:如果用数据采集卡来控制二路摄像头,原理是否是一样的呢?
厂家会提供dll吗?Top
3 楼ctgu420(星期五打开水)回复于 2005-12-06 14:25:51 得分 5
那我想问问楼上的,怎么才可以截屏呢?类似于qq里面拍照的功能一样?有没有思路?Top
4 楼ctgu420(星期五打开水)回复于 2005-12-06 14:34:09 得分 0
以前听人说过directshow可以实现这样的功能,不知道哪个大哥有这样的经验。分享一下
Top
5 楼21cnwzh(21cnwzh)回复于 2005-12-11 21:48:58 得分 5
可不可以直接保存影像文件,并按时间调取出来图像呢,有没有人作过?Top
6 楼nimittz(尼米兹---------努力升星GOGOGO)回复于 2005-12-12 09:55:23 得分 5
可以的,用api
先getdc,然后...自己看看gdi的例子吧
相关函数getdc,createcompatiblebitmap,bitbltTop
7 楼nimittz(尼米兹---------努力升星GOGOGO)回复于 2005-12-12 09:56:26 得分 5
注意是截屏,但是不能截取影像Top
8 楼fossil2000(黑手书生)回复于 2006-02-08 20:15:48 得分 5
我问一下,函数定义这句代码写在什么地方?我怎么COPY到PB到放在那儿都是报告错误?请指点下。function ulong capCreateCaptureWindowA(string lpszWindowName,ulong dwStyle,long x ,long y ,long nWidth ,long nHeight ,ulong ParentWin ,long nId ) LIBRARY 'AVICAP32.DLL'
Top
9 楼wtsinghai(纵行无忌)回复于 2006-03-16 13:06:24 得分 5
要放local external functions 或 Global external functions中
Top
10 楼baitao79()回复于 2006-05-02 10:42:10 得分 0
string s
s='c:\save.avi'
if lhand<>0 then
Send(lhand,WM_CAP_FILE_SET_CAPTURE_FILEA,0, s);
Send(lhand,WM_CAP_SEQUENCE, 0, 0) //开始捕捉
end if
//停止保存
send(lhand, WM_CAP_STOP, 0, 0)
//保存为图片
string s
s='c:\save.bmp'
if lhand <> 0 then
Send(lhand,WM_CAP_SAVEDIB,0,s);
end if
拍照&摄像功能为什么没用,但也不报错?在线等待,谢谢高手指点!急!Top
11 楼ctgu420(星期五打开水)回复于 2006-06-02 11:15:49 得分 0
继续想问一下,我调试了以上的代码是没有问题的。但是比如我希望在图象上面画一个框,截取框内的图象,这有没有啥好方法啊?Top




