本人欲将两个摄像头(WEBEYE V2000)摄下的内容显示到窗体的两个IMAGE组件上。
对于一个摄像头,目前采用的方法是:
1. WinExec("C:\\WINNT\\vidcap32.exe",SW_HIDE);//在后台打开window自带的
摄像软件,该软件可以用热键ctrl+c复制图像。
2. HCAP1=FindWindow("vidcapapp","vidcap");//找到摄像软件窗口句柄
3. SetForegroundWindow(HCAP1);//设置此软件到前台
4. keybd_event(VK_CONTROL,MapVirtualKey
(VK_CONTROL,0),KEYEVENTF_EXTENDEDKEY | 0,0);
keybd_event(VkKeyScan(c),0,0,0);
keybd_event(VkKeyScan(c),0,KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL,MapVirtualKey
(VK_CONTROL,0),KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
//虚拟键入ctrl+c,复制当前时刻图像到剪切板
5. Image1->Picture->Assign(Clipboard());//将图像粘贴到IMAGE中
程序不让用户见到和操作摄像软件。
这种实现方法存在三个缺陷:
1. 打开摄像软件必须等待其完全打开
2. 摄像软件在后台,所以不会刷新,每次抓取必须重起摄像软件。
前两个倒还可以勉强
3. 当使用两个摄像头时本人不知道如何在程序中让摄像软件自动选择设备。
问题:
1. 如果仍使用此方法,如何解决缺陷3?
2. 最好能实现直接操作摄像头。
使用什么控件显示图像,用什么函数,如何获取摄像头的设备ID?
我正在做这个东西,用API函数可以解决问题:
向创建一个窗口:
hWndC = capCreateCaptureWindow (
(LPSTR) "My Capture Window", // window name if pop-up
WS_CHILD | WS_VISIBLE, // window style
0, 0, 160, 120, // window position and dimensions
(HWND) hwndParent,
(int) nID /* child ID */);
在连接设备:
capDriverDisconnect (hWndC);
然后就可以预览图片了:
capPreviewRate(hWndC, 66); // rate, in milliseconds
capPreview(hWndC, TRUE); // starts preview
// Preview
capPreview(hWnd, FALSE); // disables preview
如果你要保存数据,可以这样做:
char szNewName[] = "NEWFILE.AVI";
// Set up the capture operation.
capCaptureSequence(hWndC);
// Capture.
capFileSaveAs(hWndC, szNewName);
如果你想了解更多的,请参看MSDN:平台SDK\Graphics sand Multimedia Services\Video for window \video capture
to : yxdm(杨云天)
注册一个回调函数FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
然后在回调函数中用DrawDibDraw函数应该可以实现你要的功能了。