如何将USB摄像头的图像数据送到并显示在Image控件中?(50分)

  • 主题发起人 主题发起人 linxia
  • 开始时间 开始时间
L

linxia

Unregistered / Unconfirmed
GUEST, unregistred user!
哪位大侠, 知道USB的一些编程原理吗?教教我
 
参考:
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=278607
http://developer.intel.com/design/usb/
在ftp://166.111.53.55有USB的资料
http://www.delphibbs.com/delphibbs/dispq.asp?lid=192767
 
卷起千堆雪 你很棒, 不过我很笨( 有没有很具体的例子) 就是把USB摄像头的图像数据送到并显示在Image控件中
或者是别的控件
 
推荐一个控件,如:videocap .
自己写的代码我就不贴了,太长了!不过还好,该控件自己有DEMO!
你只要把USB的视频数据按帧抓取下来,然后在Image中显示即可!
 
两天了, 只好自个推了
 
分没人要了
 
真的没人要了
 
没人要了我可丢了
 
有谁知道
 
这是我的程序中的一段抓图,你看看吧
1、运行该程序,您将看不到主界面,点击鼠标左键即可关闭此帮助;
2、请激活您要抓取的窗口
3、在窗口上点击"A"键,您将看到一红色标记的区域;
4、在红色区域内,点击鼠标左键即可完成抓取;
5、"关闭"只是关闭显示界面;'
6、"退出"才是完全结束程序;'

unit cash;

interface

uses Classes, Dialogs, ExtDlgs,Windows,Messages,SysUtils,Graphics,Controls,Forms,
StdCtrls,ExtCtrls,Menus,ClipBrd,ShellApi,fenxi,help, CoolTrayIcon;

const
WM_ICONMESSAGE=WM_USER+100;

type
Tcashform = class(TForm)
CoolTrayIcon1: TCoolTrayIcon;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
//热键消息处理函数
procedure WMHOTKEY(var Message:TMessage);message WM_HOTKEY;
//任务栏消息处理函数
procedure WMBarIcon(var Message:TMessage);message WM_ICONMESSAGE;
{ Private declarations }
public
{ Public declarations }
end;
procedure CaptureControl;

var
cashform: Tcashform;
tmpBitmap:TBitmap;
iBitmapValide:Boolean;


implementation

{$R *.DFM}

procedure CaptureControl;
var
iTempWnd, iMeHwnd,iDC:LongWord;
tyRect :TRect;
tpRect : TPoint;
iWidth,
iHeight:integer;
begin
//获得光标位置
GetCursorPos(tpRect);
//获得光标所在位置的窗口句柄
iMeHwnd:=WindowFromPoint(tpRect);
//获得窗口的矩形区域
GetWindowRect(iMeHwnd,tyRect);
//获得桌面窗口的句柄
iTempWnd:=GetDesktopWindow;
iDC:=GetDC(iTempWnd);
iWidth:=tyRect.Right-tyRect.Left;
iHeight:=tyRect.Bottom-tyRect.Top;
//建立位图
tmpBitmap:=TBitmap.Create;
iBitmapValide:=True;
tmpBitmap.Width := iWidth;
tmpBitmap.Height := iHeight;
//复制窗口矩形区域到位图中
Bitblt(tmpBitmap.Canvas.Handle,0,0,iWidth,iHeight,iDC,
tyRect.Left,tyRect.Top,SRCCOPY);
ReleaseDC(iTempWnd,iDC);
cashForm.Visible := True;
//使Form1覆盖光标所在的窗口矩形
cashform.Left := tyRect.Left;
cashform.Top := tyRect.Top;
cashform.Width := iWidth;
cashform.Height := iHeight;
tyRect.Left:=0;
tyRect.Right := iWidth;
tyRect.Top:=0;
tyRect.Bottom:=iHeight;
//将位图绘制到cashform的Canvas中
cashform.Canvas.Draw(0,0,tmpBitmap);
//围绕cashform画出3个相素的红色边框
Frame3D(cashform.Canvas,tyRect,clRed,clRed,3);
end;

//响应热键,进行抓图
procedure Tcashform.WMHOTKEY(var Message:TMessage);
begin
if iBitmapValide then
begin
tmpBitmap.FreeImage;
tmpBitmap.Free;
iBitmapValide:=False;
end;
CaptureControl;
end;

procedure Tcashform.WMBarIcon (var Message:TMessage);
begin
if ((Message.LParam = WM_RBUTTONDOWN)or (Message.LParam = WM_LBUTTONDOWN)) then
//在任务栏图标上按下鼠标键退出
close;
end;

procedure Tcashform.FormCreate(Sender: TObject);
var
lpData:PNotifyIconData;
help:thelpform;
begin
help:=thelpform.create(self);
help.showmodal;
//注册热键为Ctrl+Shift+A
RegisterHotKey(cashform.handle,0,{MOD_SHIFT OR MOD_CONTROL}0,65);
//在任务栏上建立图标
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;
lpData.Wnd := cashform.Handle;
lpData.hIcon:=cashform.Icon.Handle;
lpData.uCallbackMessage := WM_ICONMESSAGE;
lpData.uID :=0;
lpData.szTip := '屏幕捕捉';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_ADD,lpData);
dispose(lpData);
end;

procedure Tcashform.FormClose(Sender: TObject; var Action: TCloseAction);
var
lpData:PNotifyIconData;
begin
//退出时删除任务栏图标
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;
lpData.Wnd := cashform.Handle;
lpData.hIcon := cashform.Icon.Handle;
lpData.uCallbackMessage := WM_ICONMESSAGE;
lpData.uID :=0;
lpData.szTip := '屏幕捕捉';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_DELETE,lpData);
dispose(lpData);
//退出时注销窗口热键
UnRegisterHotKey(cashform.Handle,0);
if iBitmapValide then
begin
tmpBitmap.FreeImage;
tmpBitmap.Free;
iBitmapValide:=False;
end;
end;

procedure Tcashform.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
fenxi:tfenxiform;
begin
//按下鼠标左键保存窗口图象
if (Button=mbLeft)then
// with SavePic do
// begin
// DefaultExt := 'Bmp';
// Execute;
// if FileName<>'' then
tmpBitmap.SaveToFile(Getcurrentdir+'/microscope.bmp');
// end;
//保存完图象后删除位图
tmpBitmap.FreeImage;
tmpBitmap.Free;
iBitmapValide:=False;
cashform.Visible := False;
fenxi:=tfenxiform.create(self);
fenxi.showmodal;
end;

end.

这里是显示窗口
procedure TfenxiForm.FormCreate(Sender: TObject);
begin
openpicturedialog1.InitialDir:=(getcurrentdir);
savepic.InitialDir:=(getcurrentdir);
image1.autosize:=true;
image1.picture.loadfromfile(Getcurrentdir+'/microscope.bmp');
repair:=Getcurrentdir+'/microscope.bmp';
image1.autosize:=false;
msHide:=True;
canvas.CopyMode:=cmSrcCopy;
end;
 
不想从底层做起的话,按YB_unique的方法上深度历险下载videocap控件,另外有个capmci的例子
也很好用,稍微改动一下就可以使用了,我就用他完成了一个项目。
找不到的话留下EMAIL,我发一个给你。
这个问题在论坛里很多人问,你可以搜索一下,很多可以参考的例子。
 
to xygz
给我发一个好吗?谢谢
chur@263.net
 
chur:给我发一个好吗?cqwjx@163.com
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
I
回复
0
查看
659
import
I
后退
顶部