首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

用VFP捕捉图像的有关问题

2012-04-19 
用VFP捕捉图像的问题我的程序是用一个视频控件ezvidc60.ocx捕捉视频图像,通过timer 每秒钟转换一次图像到i

用VFP捕捉图像的问题
我的程序是用一个视频控件ezvidc60.ocx捕捉视频图像,通过timer 每秒钟转换一次图像到image中,再用shape 从image中裁剪,问题这样就是等于开了二个视频捕捉,占用资源很大,我想直接从视频流中捕捉,不用image转换,但是直接的视频流是不能用shape在上面裁的(不在一个层)不知道大家有没有什么别的好思路

[解决办法]
转换图像你控件本身没有这个功能吗?

你参考一下VFP+API实现的

*--前提:VFP7.0以上;Windows 2K及以上

*--定义:

PUBLIC WM_CAP_DRIVER_DISCONNECT
PUBLIC hwndc,WM_CAP_SAVEDIB,WM_CAP_FILE_SET_CAPTURE_FILEA,WM_CAP_SEQUENCE,WM_CAP_STOP

DECLARE INTEGER capCreateCaptureWindowA IN "AVICAP32.DLL" STRING lpszWindowName ,INTEGER dwStyle , INTEGER x, INTEGER Y, INTEGER nWidth ,INTEGER nHeight,INTEGER ParentWin,INTEGER nId

DECLARE INTEGER SendMessage IN "user32" INTEGER HWND, INTEGER wmsg,INTEGER wpar1, INTEGER wpar2
DECLARE INTEGER SendMessage IN "user32" AS SendMessageA INTEGER HWND, INTEGER wmsg,INTEGER wpar1, STRING wpar2


*--显示:

WM_USER = 1024
WM_CAP_START = WM_USER
WM_CAP_STOP = WM_CAP_START + 68
WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10

WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11
WM_CAP_SAVEDIB = WM_CAP_START + 25
WM_CAP_GRAB_FRAME = WM_CAP_START + 60
WM_CAP_SEQUENCE = WM_CAP_START + 62
WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20
WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63
WM_CAP_SET_OVERLAY =WM_CAP_START+ 51
WM_CAP_SET_PREVIEW =WM_CAP_START+ 50
WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6
WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2
WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3
WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5
WM_CAP_SET_SCALE=WM_CAP_START+ 53
WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52

*第3、4个参数是定义显示位置,第5、6个参数是定义显示大小。
hWndC = capCreateCaptureWindowA('My Own Capture Window',1342177280,0,0,320,240,THISFORM.HWND ,0)

IF hWndC <> 0
 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)
* THISFORM.ACTIVATE
ENDIF


*--关闭:

SendMessage(hWndC,WM_CAP_DRIVER_DISCONNECT, 0, 0)
hWndC=0


*--保存图像:
*--无法控制生成的文件尺寸,因为是由摄像头本身默认的,不过可用Image控件显示时进行等比缩小的。
ss=GETFILE("bmp;Jpg")
IF !EMPTY(ss)
 SendMessageA(hWndC,WM_CAP_SAVEDIB,0,SS)
ENDIF



*--开始录像:

ss = GETFILE("avi")
IF !EMPTY(ss)
 SendMessageA(hWndC,WM_CAP_FILE_SET_CAPTURE_FILEA,0,ss)
 SendMessageA(hWndC, WM_CAP_SEQUENCE, 0, 0)
 THIS.ENABLED=.F.
 THISFORM.MOUSEPOINTER= 0
 THISFORM.停止录像按钮.ENABLED=.T.

*--停止录像:
SendMessage(hWndC, WM_CAP_STOP, 0, 0)
THISFORM.开始录像按钮.ENABLED=.T.
THIS.ENABLED=.F.

热点排行