网络摄像头捕获解决问题

时间:2010-01-11 21:36:00

标签: c# webcam resolution vfw

我正在制作自己的网络摄像头timelapsing应用程序,但遇到一些网络摄像头的问题。特别值得一提的是,它可以拍摄500万张照片,但它运行的是原生的320x240(或者可怕的东西),这是我得到的。

我使用的代码似乎很好地在网络上复制和粘贴,我用来访问网络摄像头的化身就在这里 http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=1339&lngWId=10 并使用avicap32访问网络摄像头,看起来像这样的呼叫

mCapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, m_Width, m_Height, this.Handle.ToInt32(), 0);
SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0);
SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, 0, 0);

我已经测试了另外两个网络摄像头(一个内置于我的笔记本电脑中,一个我曾经踢过的老人),这两个看起来都得到了可观的分辨率。

我修改了Webcam_Capture代码以尝试拍摄高分辨率的高分辨率图像

//private int m_Width = 320;
//private int m_Height = 240;
private int m_Width = 1600;
private int m_Height = 1200;
//private int m_Width = 3200;
//private int m_Height = 2400;

使用一些不同的分辨率,如上所示。

我的直觉告诉我,我需要做一些事情来使网络摄像头使用不同的分辨率,因为它似乎默认为某些本机值。

思想?

我很乐意发布更多我正在使用的代码,但这似乎是它的核心。 WM_SET_PREVIEW可能需要一些解释,它是一个API常量。

public const int WM_CAP_CONNECT = 1034;
public const int WM_CAP_DISCONNECT = 1035;
public const int WM_CAP_GET_FRAME = 1084;
public const int WM_CAP_COPY = 1054;
public const int WM_CAP_START = WM_USER;
public const int WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41;
public const int WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42;
public const int WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 43;
public const int WM_CAP_GET_VIDEOFORMAT = WM_CAP_START + 44;
public const int WM_CAP_SET_VIDEOFORMAT = WM_CAP_START + 45;
public const int WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START + 46;
public const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;

欢迎任何想法! robg

1 个答案:

答案 0 :(得分:0)

没有显示设置相机的代码。因此可能会应用默认的低分辨率。思路:

  1. 不使用Video for Windows - API已过时,有限且无法以编程方式灵活处理。无论如何,WM_CAP_SET_VIDEOFORMAT消息将设置网络摄像头并更改分辨率。请考虑使用DirectShow或Media Foundation。

  2. Windows SDK为您提供GraphEdit工具,您可以在其中以交互方式构建捕获管道,特别是检查可用的分辨率。

  3. 检查相机规格:5 MP静止图像并不表示此分辨率可用于流式视频。视频资源可能是1/4,但它肯定会比320x240更好。