VC++怎么控制电脑摄像头?

时间:2022-09-07 23:26:52
最近有一个想法,想通过VC来控制摄像头,进行拍照等操作  ,不知道要用到哪些方面的知识。望前辈们给点资料。

28 个解决方案

#1


DirectShow

#2


该回复于2014-04-23 08:18:38被管理员删除

#3


看看是怎么做的

#4


引用 2 楼 zhouzhangkui 的回复:
vc下用directshow开发usb摄像头的例子


谢谢

#5


很多资料。

#6


我这有源代码

#7


该回复于2016-07-25 13:41:19被管理员删除

#8


控制摄像头?必须知道步进电机。

#9



#include <AFX.h>
#include "StdAfx.h"
#include <VFW.H>
#include <stdio.h>
#pragma comment(lib,"VFW32.LIB")

HWND AVIhWnd = 0;
HWND hWnd = 0;
HDC hDC = 0;
HDC ScenehDC = 0;
DWORD AVIWidth = 640;
DWORD AVIHeight = 480;
DWORD DCColorBits = 32;
BYTE BmpByte[1920*480];

BITMAPINFO DCitmap;
HBITMAP SceneBitmap;
HGDIOBJ AboriginaalObject;
LPCSTR szClassName;
LPCSTR szWindowTitle;

long X;
long Y;
long OutWidth;
long InputWidth;
long cR;
long cG;
long cB;

static LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
static LRESULT CALLBACK FrameCallbackProc(HWND, LPVIDEOHDR);


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    szClassName = "myClass";
    szWindowTitle = "MyWindow";

    WNDCLASS  wc;
    wc.style = CS_HREDRAW|CS_VREDRAW;
    wc.lpfnWndProc = MainWndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_3DSHADOW);
    wc.lpszMenuName =  NULL;
    wc.lpszClassName = szClassName;
    RegisterClass(&wc);

    hWnd = CreateWindow(szClassName,
                        szWindowTitle,
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        AVIWidth,
                        AVIHeight,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);

    if (!hWnd){
        MessageBox(0,TEXT("创建窗口失败!\r\n"),"", MB_OK); 
        return (FALSE);
    }
    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    ScenehDC = CreateCompatibleDC(hDC);
    ZeroMemory(&DCitmap.bmiHeader, sizeof(BITMAPINFOHEADER));
    DCitmap.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    DCitmap.bmiHeader.biBitCount = 24;
    DCitmap.bmiHeader.biWidth = AVIWidth;
    DCitmap.bmiHeader.biHeight = AVIHeight;
    DCitmap.bmiHeader.biPlanes = 1;
    DCitmap.bmiHeader.biClrUsed = 0;
    DCitmap.bmiHeader.biClrImportant = 0;
    DCitmap.bmiHeader.biSizeImage = AVIWidth * AVIHeight * (DCitmap.bmiHeader.biBitCount / 8);
    SceneBitmap = CreateDIBSection(ScenehDC, &DCitmap, DIB_RGB_COLORS, NULL ,0 , 0);

    AboriginaalObject = SelectObject(ScenehDC, (HGDIOBJ)SceneBitmap);

    OutWidth = AVIWidth * 3;
    InputWidth = AVIWidth * 3;


    int rd;
    BITMAPINFOHEADER bmpFormat;
    AVIhWnd = capCreateCaptureWindow((LPSTR)"视频追踪", 
                                    WS_CHILD  | WS_VISIBLE, 
                                    0, 0, AVIWidth, AVIHeight, 
                                    hWnd, 
                                    1);
    if (AVIhWnd==0)
    {
        MessageBox(hWnd, "创建AVI窗口失败","提示",64);
    }else{
        hDC = GetWindowDC(hWnd);

        capSetCallbackOnFrame(AVIhWnd,(FARPROC)FrameCallbackProc);
        rd = capDriverConnect(AVIhWnd,0);

        if(rd != 0){
            CAPDRIVERCAPS *Caps;
            capDriverGetCaps(AVIhWnd,sizeof(CAPDRIVERCAPS),&Caps);
            capPreviewRate(AVIhWnd, 30);
        }else{
            MessageBox(hWnd, "不能打开设备驱动。","提示",64);
        }
    }

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

    SelectObject(ScenehDC, AboriginaalObject);
    DeleteObject((HGDIOBJ)SceneBitmap);
    DeleteDC(ScenehDC);
    return 0;
}

LRESULT CALLBACK MainWndProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
    switch (Message) {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return (DefWindowProc(hWnd, Message, wParam, lParam));
    }
    return 0;
}

LRESULT CALLBACK FrameCallbackProc(HWND ghWnd,LPVIDEOHDR lpVData)
{
    for(Y=1; Y<=AVIHeight; Y++)
    {
        for(X=1; X<=AVIWidth; X++)
        {
            cB = lpVData->lpData[((AVIHeight-Y)*InputWidth)+(X*3)];
            cG = lpVData->lpData[((AVIHeight-Y)*InputWidth)+(X*3)+1];
            cR = lpVData->lpData[((AVIHeight-Y)*InputWidth)+(X*3)+2];
            BmpByte[((Y-1)*OutWidth)+(X*3)]=cB;
            BmpByte[((Y-1)*OutWidth)+(X*3)+1]=cG;
            BmpByte[((Y-1)*OutWidth)+(X*3)+2]=cR;
        }
    }
    SetBitmapBits(SceneBitmap,sizeof(BmpByte),BmpByte);
    BitBlt(hDC, 0, 0, AVIWidth, AVIHeight, ScenehDC, 0, 0, SRCCOPY);
    return 0;
}

#10


友情帮顶。。。

#11


引用 2 楼 zhouzhangkui 的回复:
vc下用directshow开发usb摄像头的例子

我勒个去,里面是神马东西啊。。。

#12


里边就是实现控制拍照的东西,不过窗体消息哪些函数你看不懂也没法了

#13


前些天用VFW做了拍照的
调用一下很简单哩
引用 9 楼 supermanking 的回复:
C/C++ code

#include <AFX.h>
#include "StdAfx.h"
#include <VFW.H>
#include <stdio.h>
#pragma comment(lib,"VFW32.LIB")

HWND AVIhWnd = 0;
HWND hWnd = 0;
HDC hDC = 0;
HDC ScenehDC = 0;
DWORD……

#14


directshow or vfw 或者有些摄像头提供的库函数

#15


有没有远程的摄像头监控例子啊?

#16


在我的资源里面有两个摄像头的完整源程序,控制一个的和控制两个摄像头的,你可以下下来看看,用VFW写的

#17


学习Tain协议也可以帮你完成。

#18


路过 帮顶

#19


今天又学习了,顶……

#20


能实现吗 ? 看来的检验下

#21


引用 6 楼 dljun 的回复:
我这有源代码

能给我份吗 

我的邮箱:  cc5412330@163.com  或者 10068170932@qq.com

#22


引用 8 楼 vnking 的回复:
控制摄像头?必须知道步进电机。


还得懂硬件吗??

#23


引用 16 楼 yuchongjike 的回复:
在我的资源里面有两个摄像头的完整源程序,控制一个的和控制两个摄像头的,你可以下下来看看,用VFW写的


谢谢   

#24


用这个: http://www.anychat.cn/

#25


很有用呀~

#26


二楼给的链接(http://download.chinaprj.cn/detail/BqTDqDs)是个垃圾网站,点下链接一下子跳出N多广告,而且没有想要的东西下载,下载下来居然是个EXE文件,不知道是什么东西。

#27


引用 6 楼  的回复:
我这有源代码

代码可以发我一份吗?690905084@qq.com

#28


不得不说  2楼给的地址无法下载到源码了,可能失效了吧,描述状况同26楼

#1


DirectShow

#2


该回复于2014-04-23 08:18:38被管理员删除

#3


看看是怎么做的

#4


引用 2 楼 zhouzhangkui 的回复:
vc下用directshow开发usb摄像头的例子


谢谢

#5


很多资料。

#6


我这有源代码

#7


该回复于2016-07-25 13:41:19被管理员删除

#8


控制摄像头?必须知道步进电机。

#9



#include <AFX.h>
#include "StdAfx.h"
#include <VFW.H>
#include <stdio.h>
#pragma comment(lib,"VFW32.LIB")

HWND AVIhWnd = 0;
HWND hWnd = 0;
HDC hDC = 0;
HDC ScenehDC = 0;
DWORD AVIWidth = 640;
DWORD AVIHeight = 480;
DWORD DCColorBits = 32;
BYTE BmpByte[1920*480];

BITMAPINFO DCitmap;
HBITMAP SceneBitmap;
HGDIOBJ AboriginaalObject;
LPCSTR szClassName;
LPCSTR szWindowTitle;

long X;
long Y;
long OutWidth;
long InputWidth;
long cR;
long cG;
long cB;

static LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
static LRESULT CALLBACK FrameCallbackProc(HWND, LPVIDEOHDR);


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    szClassName = "myClass";
    szWindowTitle = "MyWindow";

    WNDCLASS  wc;
    wc.style = CS_HREDRAW|CS_VREDRAW;
    wc.lpfnWndProc = MainWndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_3DSHADOW);
    wc.lpszMenuName =  NULL;
    wc.lpszClassName = szClassName;
    RegisterClass(&wc);

    hWnd = CreateWindow(szClassName,
                        szWindowTitle,
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        AVIWidth,
                        AVIHeight,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);

    if (!hWnd){
        MessageBox(0,TEXT("创建窗口失败!\r\n"),"", MB_OK); 
        return (FALSE);
    }
    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    ScenehDC = CreateCompatibleDC(hDC);
    ZeroMemory(&DCitmap.bmiHeader, sizeof(BITMAPINFOHEADER));
    DCitmap.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    DCitmap.bmiHeader.biBitCount = 24;
    DCitmap.bmiHeader.biWidth = AVIWidth;
    DCitmap.bmiHeader.biHeight = AVIHeight;
    DCitmap.bmiHeader.biPlanes = 1;
    DCitmap.bmiHeader.biClrUsed = 0;
    DCitmap.bmiHeader.biClrImportant = 0;
    DCitmap.bmiHeader.biSizeImage = AVIWidth * AVIHeight * (DCitmap.bmiHeader.biBitCount / 8);
    SceneBitmap = CreateDIBSection(ScenehDC, &DCitmap, DIB_RGB_COLORS, NULL ,0 , 0);

    AboriginaalObject = SelectObject(ScenehDC, (HGDIOBJ)SceneBitmap);

    OutWidth = AVIWidth * 3;
    InputWidth = AVIWidth * 3;


    int rd;
    BITMAPINFOHEADER bmpFormat;
    AVIhWnd = capCreateCaptureWindow((LPSTR)"视频追踪", 
                                    WS_CHILD  | WS_VISIBLE, 
                                    0, 0, AVIWidth, AVIHeight, 
                                    hWnd, 
                                    1);
    if (AVIhWnd==0)
    {
        MessageBox(hWnd, "创建AVI窗口失败","提示",64);
    }else{
        hDC = GetWindowDC(hWnd);

        capSetCallbackOnFrame(AVIhWnd,(FARPROC)FrameCallbackProc);
        rd = capDriverConnect(AVIhWnd,0);

        if(rd != 0){
            CAPDRIVERCAPS *Caps;
            capDriverGetCaps(AVIhWnd,sizeof(CAPDRIVERCAPS),&Caps);
            capPreviewRate(AVIhWnd, 30);
        }else{
            MessageBox(hWnd, "不能打开设备驱动。","提示",64);
        }
    }

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

    SelectObject(ScenehDC, AboriginaalObject);
    DeleteObject((HGDIOBJ)SceneBitmap);
    DeleteDC(ScenehDC);
    return 0;
}

LRESULT CALLBACK MainWndProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
    switch (Message) {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return (DefWindowProc(hWnd, Message, wParam, lParam));
    }
    return 0;
}

LRESULT CALLBACK FrameCallbackProc(HWND ghWnd,LPVIDEOHDR lpVData)
{
    for(Y=1; Y<=AVIHeight; Y++)
    {
        for(X=1; X<=AVIWidth; X++)
        {
            cB = lpVData->lpData[((AVIHeight-Y)*InputWidth)+(X*3)];
            cG = lpVData->lpData[((AVIHeight-Y)*InputWidth)+(X*3)+1];
            cR = lpVData->lpData[((AVIHeight-Y)*InputWidth)+(X*3)+2];
            BmpByte[((Y-1)*OutWidth)+(X*3)]=cB;
            BmpByte[((Y-1)*OutWidth)+(X*3)+1]=cG;
            BmpByte[((Y-1)*OutWidth)+(X*3)+2]=cR;
        }
    }
    SetBitmapBits(SceneBitmap,sizeof(BmpByte),BmpByte);
    BitBlt(hDC, 0, 0, AVIWidth, AVIHeight, ScenehDC, 0, 0, SRCCOPY);
    return 0;
}

#10


友情帮顶。。。

#11


引用 2 楼 zhouzhangkui 的回复:
vc下用directshow开发usb摄像头的例子

我勒个去,里面是神马东西啊。。。

#12


里边就是实现控制拍照的东西,不过窗体消息哪些函数你看不懂也没法了

#13


前些天用VFW做了拍照的
调用一下很简单哩
引用 9 楼 supermanking 的回复:
C/C++ code

#include <AFX.h>
#include "StdAfx.h"
#include <VFW.H>
#include <stdio.h>
#pragma comment(lib,"VFW32.LIB")

HWND AVIhWnd = 0;
HWND hWnd = 0;
HDC hDC = 0;
HDC ScenehDC = 0;
DWORD……

#14


directshow or vfw 或者有些摄像头提供的库函数

#15


有没有远程的摄像头监控例子啊?

#16


在我的资源里面有两个摄像头的完整源程序,控制一个的和控制两个摄像头的,你可以下下来看看,用VFW写的

#17


学习Tain协议也可以帮你完成。

#18


路过 帮顶

#19


今天又学习了,顶……

#20


能实现吗 ? 看来的检验下

#21


引用 6 楼 dljun 的回复:
我这有源代码

能给我份吗 

我的邮箱:  cc5412330@163.com  或者 10068170932@qq.com

#22


引用 8 楼 vnking 的回复:
控制摄像头?必须知道步进电机。


还得懂硬件吗??

#23


引用 16 楼 yuchongjike 的回复:
在我的资源里面有两个摄像头的完整源程序,控制一个的和控制两个摄像头的,你可以下下来看看,用VFW写的


谢谢   

#24


用这个: http://www.anychat.cn/

#25


很有用呀~

#26


二楼给的链接(http://download.chinaprj.cn/detail/BqTDqDs)是个垃圾网站,点下链接一下子跳出N多广告,而且没有想要的东西下载,下载下来居然是个EXE文件,不知道是什么东西。

#27


引用 6 楼  的回复:
我这有源代码

代码可以发我一份吗?690905084@qq.com

#28


不得不说  2楼给的地址无法下载到源码了,可能失效了吧,描述状况同26楼