求简单的摄像头程序

yaozhiyong110 2011-03-12 10:30:22
打开自己电脑的摄像头 并将图像显示在窗口 我想实现多个窗口显示

我有vfm的一个例子 但是只有一个预览窗口 怎么控制可以有多个预览窗口?

请大侠 提供思路或代码(本人刚开始接触视频这块,所以尽量代码吧) 谢谢。。。。
...全文
128 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2011-03-14
  • 打赏
  • 举报
回复
yaozhiyong110 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hongh520 的回复:]
引用 5 楼 yaozhiyong110 的回复:
vfm 不能让 视频多窗口显示吗???? 有大侠知道吗?

可以的,
建议使用vfw
[/Quote]


佩服 就为了10分?
yaozhiyong110 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 singwhatiwanna 的回复:]
C/C++ code

#include <windows.h>
#include <vfw.h>
#include <commdlg.h>
#include "CapPicture.h"

LRESULT WINAPI MainWndProc( HWND, UINT, WPARAM, LPARAM );
LRESULT WINAPI SelCapDrvProc( HWND, U……
[/Quote]


我试试......谢谢...
贝隆 2011-03-14
  • 打赏
  • 举报
回复
我有一个VB的,你看看
http://download.csdn.net/source/2979383
jwybobo2007 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 yaozhiyong110 的回复:]
打开自己电脑的摄像头 并将图像显示在窗口 我想实现多个窗口显示

我有vfm的一个例子 但是只有一个预览窗口 怎么控制可以有多个预览窗口?

请大侠 提供思路或代码(本人刚开始接触视频这块,所以尽量代码吧) 谢谢。。。。
[/Quote]

用vfw获取数据时有视频帧回调,回调中得到的是原始的RGB图缓冲,接下来就用GDI或者DrawDib把缓冲绘制到你要的窗口里面就可以了
singwhatiwanna 2011-03-14
  • 打赏
  • 举报
回复

#include <windows.h>
#include <vfw.h>
#include <commdlg.h>
#include "CapPicture.h"

LRESULT WINAPI MainWndProc( HWND, UINT, WPARAM, LPARAM );
LRESULT WINAPI SelCapDrvProc( HWND, UINT, WPARAM, LPARAM );
int EnumCapDrv();
VOID APIENTRY HandlePopupMenu(HWND, POINT);
DWORD WINAPI videoThreadProc(LPVOID lParam);


HANDLE ghInstance;
HWND hwndMain;
HWND hwndVideo;
HWND hwndSelCapDrvDlg;
HWND hwndSelCapDrvDlg_LBox;
HWND hwndExit;
HWND hwndMin;
HWND hwndHelp;
HWND hwndRecord;
HANDLE hVideoThread;
HRGN hRegion1;
CAPDRIVERCAPS CapDrvCaps;
bool isRecordFileOpen = false;
char recordFile[260];
bool isPicFileOpen = false;
char pictureFile[260];
bool isRecording = false;
bool threadEnd = false;

int PASCAL WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,

LPSTR lpszCmdLine,
int nCmdShow )
{
WNDCLASS wc;
MSG msg;

if( !hPrevInstance )
{
wc.lpszClassName = "GenericAppClass";
wc.lpfnWndProc = MainWndProc;
wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = CreateSolidBrush (RGB(196, 200, 204));
wc.lpszMenuName = "GenericAppMenu";

wc.cbClsExtra = 0;
wc.cbWndExtra = 0;

RegisterClass( &wc );
}

ghInstance = hInstance;

hwndMain = CreateWindow( "GenericAppClass",
"Super Video",
WS_POPUP,
100,
100,
500,
500,
NULL,
NULL,
hInstance,
NULL
);

ShowWindow( hwndMain, nCmdShow );
SetWindowRgn(hwndMain,hRegion1,1);

while( GetMessage( &msg, NULL, 0, 0 ) ) {
TranslateMessage( &msg );

DispatchMessage( &msg );
}

return msg.wParam;
}

LRESULT CALLBACK MainWndProc( HWND hwndMain, UINT msg, WPARAM wParam,
LPARAM lParam )
{
HDC hDC = GetDC(hwndMain);
RECT rc;
POINT pt;

switch( msg ) {
case WM_LBUTTONDBLCLK:
SetFocus(hwndMain);
break;
case WM_RBUTTONDOWN:
GetClientRect(hwndMain, (LPRECT) &rc);
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
if (PtInRect((LPRECT) &rc, pt))
HandlePopupMenu(hwndMain, pt);
break;
case WM_PAINT:
FrameRgn(hDC,hRegion1,CreateSolidBrush(RGB(0,0,0)),2,2);
BringWindowToTop(hwndSelCapDrvDlg);
return( DefWindowProc( hwndMain, msg, wParam, lParam ));
case WM_COMMAND:
CAPSTATUS CapStatus;
switch( wParam ) {

case SOURCE:
if(CapDrvCaps.fHasDlgVideoSource)
capDlgVideoSource(hwndVideo);
break;
case FORMAT:
if(CapDrvCaps.fHasDlgVideoFormat)
{
capDlgVideoFormat(hwndMain);
capGetStatus(hwndVideo, &CapStatus, sizeof(CAPSTATUS));
SetWindowPos(hwndVideo, NULL, 0, 0, CapStatus.uiImageWidth,
CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);
}
break;
case DISPLAY:
if (CapDrvCaps.fHasDlgVideoDisplay)
capDlgVideoDisplay(hwndVideo);
break;
case EXIT:
SendMessage(hwndMain, WM_SYSCOMMAND, SC_CLOSE, 0);
break;
case MINIMIZE:
SendMessage(hwndMain, WM_SYSCOMMAND, SC_MINIMIZE, 0);
break;
case HELP:
SendMessage(hwndMain, WM_SYSCOMMAND, SC_CONTEXTHELP, 0);
break;
case RECORDVIDEO:
if(HIWORD(wParam) == BN_CLICKED && (HWND) lParam == hwndRecord)
{
if (!isRecordFileOpen)
{
OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwndMain;
ofn.lpstrFile = recordFile;
ofn.nMaxFile = sizeof(recordFile);
ofn.lpstrFilter = "Video\0*.avi";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if(GetSaveFileName(&ofn) == TRUE)
{
strcpy(recordFile, ofn.lpstrFile);
strcat(recordFile, ".avi");
isRecordFileOpen = true;
DWORD id;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
hVideoThread = CreateThread(&sa, (ULONG)0,
videoThreadProc, (LPVOID)(ULONG)0, (ULONG)0, &id);
if(hVideoThread == NULL)
MessageBox(NULL, "Creation of Record Thread failed!", "Thread", MB_OK | MB_ICONEXCLAMATION);

break;
}
}

if (isRecordFileOpen)
{
if(isRecording)
{
threadEnd = true;
capFileSaveAs(hwndVideo, recordFile);
SetWindowText(hwndRecord, "Record Video");
isRecording = false;
break;
}

if(!isRecording )
{
int a = 0;

MessageBox(hwndMain, "Do you want to write over the open file?",
"File warning", MB_YESNO | MB_ICONWARNING);
if (a != IDYES)
{
isRecordFileOpen = false;
SendMessage(hwndMain, WM_COMMAND, MAKEWPARAM(RECORDVIDEO, BN_CLICKED), (LPARAM) hwndRecord);
}

if (a == IDYES)
{
capCaptureSequence(hwndVideo);
isRecording = true;
}

break;
}
}
}
break;
}
break;
case WM_CREATE:

RECT helpRect, minRect, exitRect;
HRGN helpRgn, minRgn, exitRgn;
hRegion1 = CreateRoundRectRgn(100,100,500, 500,20,20);
hwndVideo = capCreateCaptureWindow(
(LPSTR) "My Capture Window",
WS_CHILD | WS_VISIBLE,
150, 150, 300, 280,
(HWND) hwndMain,
(int) 1);
hwndExit = CreateWindow (
"button",
"x",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER,
470, 110, BUTTONSIZE, BUTTONSIZE,
hwndMain,
(HMENU) EXIT,
(HINSTANCE)ghInstance,
(LPVOID)NULL);
hwndMin = CreateWindow (
"button",
"-",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER,
450, 110, BUTTONSIZE, BUTTONSIZE,
hwndMain,
(HMENU) MINIMIZE,
(HINSTANCE)ghInstance,
(LPVOID)NULL);
hwndHelp = CreateWindow (
"button",
"?",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER,
430, 110, BUTTONSIZE, BUTTONSIZE,
hwndMain,
(HMENU) HELP,
(HINSTANCE)ghInstance,
(LPVOID)NULL);
hwndRecord = CreateWindow (
"button",
"录像",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER,
250, 464, 90, 28,
hwndMain,
(HMENU) RECORDVIDEO,
(HINSTANCE)ghInstance,
(LPVOID)NULL);

GetClientRect(hwndHelp, &helpRect);
GetClientRect(hwndMin, &minRect);
GetClientRect(hwndExit, &exitRect);

helpRgn = CreateEllipticRgnIndirect(&helpRect);
minRgn = CreateEllipticRgnIndirect(&minRect);
exitRgn = CreateEllipticRgnIndirect(&exitRect);

SetWindowRgn(hwndExit,exitRgn,1);
SetWindowRgn(hwndMin,minRgn,1);
SetWindowRgn(hwndHelp,helpRgn,1);

hwndSelCapDrvDlg = CreateDialog((HINSTANCE)ghInstance,
MAKEINTRESOURCE( SELCAPDRVDLG ),
0, (DLGPROC)SelCapDrvProc);
hwndSelCapDrvDlg_LBox = GetDlgItem(hwndSelCapDrvDlg,
SELCAPDRVDLG_LSTBOX);
EnumCapDrv();
break;
case WM_DESTROY:
capPreview(hwndVideo, FALSE);
capDriverDisconnect(hwndVideo);
PostQuitMessage( 0 );
break;
default:
return( DefWindowProc( hwndMain, msg, wParam, lParam ));

}

return 0;
}

LRESULT CALLBACK SelCapDrvProc( HWND hWnd, UINT msg,
WPARAM wParam, LPARAM lParam )
{

switch(msg)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch ( wParam )
{
case SELCAPDRVDLG_BUTTON:
int sel = 0;
SendMessage( hwndSelCapDrvDlg_LBox, LB_GETSELITEMS, 1, sel);
SendMessage( hwndVideo, WM_CAP_DRIVER_CONNECT, sel, 0L);
SendMessage( hwndSelCapDrvDlg, WM_CLOSE, 0, 0);
SendMessage( hwndVideo, WM_CAP_DRIVER_GET_CAPS,
sizeof(CAPDRIVERCAPS), (LONG) (LPVOID) &CapDrvCaps);
capPreviewRate( hwndVideo, 66 );
capPreview( hwndVideo, TRUE );
}
return TRUE;
case WM_CLOSE:
DestroyWindow(hwndSelCapDrvDlg);
return TRUE;
}

return( 0L );
}

int EnumCapDrv()
{
char szDeviceName[80];
char szDeviceVersion[80];
char item[161];
int i;

for (i=0; i<10; i++)
{
if ( capGetDriverDescription(i, szDeviceName, sizeof(szDeviceName),
szDeviceVersion, sizeof(szDeviceVersion)) )
{
strcpy(item, szDeviceName);
strcat(item, " ");
strcat(item, szDeviceVersion);
SendMessage(hwndSelCapDrvDlg_LBox, LB_ADDSTRING, 0,
(LPARAM) item);
SendMessage(hwndSelCapDrvDlg_LBox, LB_SETITEMDATA, i, (LPARAM) i);
}
}

return 0;
}

VOID APIENTRY HandlePopupMenu(HWND hwnd, POINT pt)
{
HMENU hmenu;
HMENU hmenuTrackPopup;
hmenu = LoadMenu((HINSTANCE)ghInstance, "PopupMenu");
if (hmenu == NULL)
return;
hmenuTrackPopup = GetSubMenu(hmenu, 0);
ClientToScreen(hwnd, (LPPOINT) &pt);
TrackPopupMenu(hmenuTrackPopup, TPM_LEFTALIGN | TPM_LEFTBUTTON,
pt.x, pt.y, 0, hwnd, NULL);
DestroyMenu(hmenu);
}

DWORD WINAPI videoThreadProc(LPVOID lParam)
{
SetWindowText(hwndRecord, "停止");
capCaptureSequence(hwndVideo);
isRecording = true;
while (!threadEnd)
;
MessageBox(NULL, "Leaving Thread", "thread", NULL);
return 0;
}


这个可以用,改改。
yaozhiyong110 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 visualeleven 的回复:]
http://download.csdn.net/source/2529616
[/Quote]

没下下来不要紧 还扣了我的分 都无所谓 关键是这个程序说明了 要选2个摄像头才有两个画面!!

大哥 我是要一个摄像头 出来多个画面啊.....
hongh520 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yaozhiyong110 的回复:]
vfm 不能让 视频多窗口显示吗???? 有大侠知道吗?
[/Quote]
可以的,
建议使用vfw
yaozhiyong110 2011-03-13
  • 打赏
  • 举报
回复
vfm 不能让 视频多窗口显示吗???? 有大侠知道吗?
疯狂石头_ 2011-03-12
  • 打赏
  • 举报
回复
DirectX的SDK不是有摄像头的例子吗?
yaozhiyong110 2011-03-12
  • 打赏
  • 举报
回复
没人?????????
愤怒的熊猫007 2011-03-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dizuo 的回复:]
vfm不清楚
opencv中highgui做这个很简单。
[/Quote]
UP Opencv 中文网 网址 里面有个 例子就有
http://www.opencv.org.cn
ryfdizuo 2011-03-12
  • 打赏
  • 举报
回复
vfm不清楚
opencv中highgui做这个很简单。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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