winform 获取usb摄像头,每次都弹出摄像头源对话框,怎么不让它弹出呢

北京大白兔 2014-08-08 02:47:45
winform 获取usb摄像头,每次都弹出摄像头源对话框,怎么不让它弹出呢
...全文
842 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZhongGuanYao 2014-08-12
  • 打赏
  • 举报
回复
在codeproject找到了一份 http://www.codeproject.com/Articles/671407/Camera-Net-Library
泡泡龙 2014-08-12
  • 打赏
  • 举报
回复
引用 12 楼 xiangxinzijiwonen 的回复:
[quote=引用 11 楼 liucqa 的回复:] [quote=引用 10 楼 xiangxinzijiwonen 的回复:] 我也遇到这个问题,在网上找了很多资料都没解决 刚测试一下7楼的代码,也有这个问题,是不是跟系统有关呢,我用的是win7系统 希望有高手出来解决
7楼的就是VFW,当然有这毛病了,换direct show试试吧,有开源库[/quote] 我需要用摄像头拍一张图片,请问有没有direct show这方面的资源,可不可发一份给我598115778@qq.com,,谢谢[/quote] 百度 Aforge
ZhongGuanYao 2014-08-12
  • 打赏
  • 举报
回复
引用 11 楼 liucqa 的回复:
[quote=引用 10 楼 xiangxinzijiwonen 的回复:] 我也遇到这个问题,在网上找了很多资料都没解决 刚测试一下7楼的代码,也有这个问题,是不是跟系统有关呢,我用的是win7系统 希望有高手出来解决
7楼的就是VFW,当然有这毛病了,换direct show试试吧,有开源库[/quote] 我需要用摄像头拍一张图片,请问有没有direct show这方面的资源,可不可发一份给我598115778@qq.com,,谢谢
泡泡龙 2014-08-12
  • 打赏
  • 举报
回复
引用 10 楼 xiangxinzijiwonen 的回复:
我也遇到这个问题,在网上找了很多资料都没解决 刚测试一下7楼的代码,也有这个问题,是不是跟系统有关呢,我用的是win7系统 希望有高手出来解决
7楼的就是VFW,当然有这毛病了,换direct show试试吧,有开源库
ZhongGuanYao 2014-08-12
  • 打赏
  • 举报
回复
我也遇到这个问题,在网上找了很多资料都没解决 刚测试一下7楼的代码,也有这个问题,是不是跟系统有关呢,我用的是win7系统 希望有高手出来解决
mjp1234airen4385 2014-08-12
  • 打赏
  • 举报
回复
百度 C# directshow,能找到一堆,找找DShowNET,这个类库。一般有示例代码的。 directShow是directX的一个子集。DirectX是微软对硬件设备提供直接访问的一组API接口。 以前编写游戏,一般使用DirectX和OpenGL,以获得对设备的直接访问,加快游戏速度和更好的显示效果。
Ki1381 2014-08-09
  • 打赏
  • 举报
回复
关注一下,很快也要用到
save4me 2014-08-09
  • 打赏
  • 举报
回复
好像没有碰到过弹出对话框的情况

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

//添加引用
using System.Runtime.InteropServices;
using System.Drawing.Imaging;

namespace VideoCam
{
	public partial class WebCam : Form
	{
		WebCamera wc;
		//声明一个API函数
		[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
		private static extern bool BitBlt(
			IntPtr hdcDest, // 目标 DC的句柄
			int nXDest,
			int nYDest,
			int nWidth,
			int nHeight,
			IntPtr hdcSrc, // 源DC的句柄
			int nXSrc,
			int nYSrc,
			System.Int32 dwRop // 光栅的处理数值
		);
		
		public WebCam()
		{
			InitializeComponent();
		}
		
		private void btnPlay_Click(object sender, EventArgs e)
		{
			btnPlay.Enabled = false;
			btnStop.Enabled = true;
			//panelPreview.Size = new Size(330, 330);
			wc = new WebCamera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);
			wc.StartWebCam();
		}
		
		private void WebCam_Load(object sender, EventArgs e)
		{
			btnPlay.Enabled = false;
			btnStop.Enabled = true;
			//panelPreview.Size = new Size(330, 330);
			wc = new WebCamera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);
			wc.StartWebCam();
		}
		
		private void btnStop_Click(object sender, EventArgs e)
		{
			btnPlay.Enabled = true;
			btnStop.Enabled = false;
			wc.CloseWebcam();
		}
		
		private void btnPhoto_Click(object sender, EventArgs e)
		{
			//创建一个以当前控件区域屏幕为模板的图象
			Graphics gPanel = this.panelPreview.CreateGraphics();
			
			Bitmap bmSave = new Bitmap(this.panelPreview.Width, this.panelPreview.Height);     //用于保存图片的位图对象
			Graphics gSave = Graphics.FromImage(bmSave);
			//得到屏幕的DC
			IntPtr dcPanel = gPanel.GetHdc();
			//得到Bitmap的DC
			IntPtr dcSave = gSave.GetHdc();
			//调用此API函数,实现屏幕捕获
			BitBlt(dcSave, 0, 0, this.panelPreview.Width, this.panelPreview.Height, dcPanel, 0, 0, 13369376);
			//释放掉屏幕的DC
			gPanel.ReleaseHdc(dcPanel);
			//释放掉Bitmap的DC
			gSave.ReleaseHdc(dcSave);
			//以JPG文件格式来保存
			bmSave.Save(@"D:/Photo.jpg", ImageFormat.Jpeg);
			MessageBox.Show("当前图像已经保存为D盘Photo文件!");
		}
	}
	
	
	//show Video class
	public class showVideo
	{
		// showVideo calls
		[DllImport("avicap32.dll")]
		public static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
		[DllImport("avicap32.dll")]
		public static extern bool capGetDriverDescriptionA(short wDriver, byte[] lpszName, int cbName, byte[] lpszVer, int cbVer);
		[DllImport("User32.dll")]
		public static extern bool SendMessage(IntPtr hWnd, int wMsg, bool wParam, int lParam);
		[DllImport("User32.dll")]
		public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, int lParam);
		[DllImport("User32.dll")]
		public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, FrameEventHandler lParam);
		[DllImport("User32.dll")]
		public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref BITMAPINFO lParam);
		[DllImport("User32.dll")]
		public static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
		[DllImport("avicap32.dll")]
		public static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize );
		
		// Constants
		public const int WM_USER = 0x400;
		public const int WS_CHILD = 0x40000000;
		public const int WS_VISIBLE = 0x10000000;
		public const int SWP_NOMOVE = 0x2;
		public const int SWP_NOZORDER = 0x4;
		public const int WM_CAP_DRIVER_CONNECT = WM_USER + 10;
		public const int WM_CAP_DRIVER_DISCONNECT = WM_USER + 11;
		public const int WM_CAP_SET_CALLBACK_FRAME = WM_USER + 5;
		public const int WM_CAP_SET_PREVIEW = WM_USER + 50;
		public const int WM_CAP_SET_PREVIEWRATE = WM_USER + 52;
		public const int WM_CAP_SET_VIDEOFORMAT = WM_USER + 45;
		
		// Structures
		[StructLayout(LayoutKind.Sequential)] public struct VIDEOHDR
		{
			[MarshalAs(UnmanagedType.I4)] public int lpData;
			[MarshalAs(UnmanagedType.I4)] public int dwBufferLength;
			[MarshalAs(UnmanagedType.I4)] public int dwBytesUsed;
			[MarshalAs(UnmanagedType.I4)] public int dwTimeCaptured;
			[MarshalAs(UnmanagedType.I4)] public int dwUser;
			[MarshalAs(UnmanagedType.I4)] public int dwFlags;
			[MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] public int[] dwReserved;
		}
		
		[StructLayout(LayoutKind.Sequential)] public struct BITMAPINFOHEADER
		{
			[MarshalAs(UnmanagedType.I4)] public Int32 biSize ;
			[MarshalAs(UnmanagedType.I4)] public Int32 biWidth ;
			[MarshalAs(UnmanagedType.I4)] public Int32 biHeight ;
			[MarshalAs(UnmanagedType.I2)] public short biPlanes;
			[MarshalAs(UnmanagedType.I2)] public short biBitCount ;
			[MarshalAs(UnmanagedType.I4)] public Int32 biCompression;
			[MarshalAs(UnmanagedType.I4)] public Int32 biSizeImage;
			[MarshalAs(UnmanagedType.I4)] public Int32 biXPelsPerMeter;
			[MarshalAs(UnmanagedType.I4)] public Int32 biYPelsPerMeter;
			[MarshalAs(UnmanagedType.I4)] public Int32 biClrUsed;
			[MarshalAs(UnmanagedType.I4)] public Int32 biClrImportant;
		}
		
		[StructLayout(LayoutKind.Sequential)] public struct BITMAPINFO
		{
			[MarshalAs(UnmanagedType.Struct, SizeConst=40)] public BITMAPINFOHEADER bmiHeader;
			[MarshalAs(UnmanagedType.ByValArray, SizeConst=1024)] public Int32[] bmiColors;
		}
		
		public delegate void FrameEventHandler(IntPtr lwnd, IntPtr lpVHdr);
		
		// Public methods
		public static object GetStructure(IntPtr ptr,ValueType structure)
		{
			return Marshal.PtrToStructure(ptr,structure.GetType());
		}
		
		public static object GetStructure(int ptr,ValueType structure)
		{
			return GetStructure(new IntPtr(ptr),structure);
		}
		
		public static void Copy(IntPtr ptr,byte[] data)
		{
			Marshal.Copy(ptr,data,0,data.Length);
		}
		
		public static void Copy(int ptr,byte[] data)
		{
			Copy(new IntPtr(ptr),data);
		}
		
		public static int SizeOf(object structure)
		{
			return Marshal.SizeOf(structure);
		}
	}
	
	//Web Camera Class
	public class WebCamera
	{
		// Constructur
		public WebCamera(IntPtr handle, int width,int height)
		{
			mControlPtr = handle;
			mWidth = width;
			mHeight = height;
		}
		
		// delegate for frame callback
		public delegate void RecievedFrameEventHandler(byte[] data);
		public event RecievedFrameEventHandler RecievedFrame;
		
		private IntPtr lwndC; // Holds the unmanaged handle of the control
		private IntPtr mControlPtr; // Holds the managed pointer of the control
		private int mWidth;
		private int mHeight;
		
		private showVideo.FrameEventHandler mFrameEventHandler; // Delegate instance for the frame callback - must keep alive! gc should NOT collect it
		
		// Close the web camera
		public void CloseWebcam()
		{
			this.capDriverDisconnect(this.lwndC);
		}
		
		// start the web camera
		public void StartWebCam()
		{
			byte[] lpszName = new byte[100];
			byte[] lpszVer = new byte[100];
			
			showVideo.capGetDriverDescriptionA(0, lpszName, 100,lpszVer, 100);
			this.lwndC = showVideo.capCreateCaptureWindowA(lpszName, showVideo.WS_VISIBLE + showVideo.WS_CHILD, 0, 0, mWidth, mHeight, mControlPtr, 0);
			
			if (this.capDriverConnect(this.lwndC, 0))
			{
				this.capPreviewRate(this.lwndC, 66);
				this.capPreview(this.lwndC, true);
				showVideo.BITMAPINFO bitmapinfo = new showVideo.BITMAPINFO();
				bitmapinfo.bmiHeader.biSize = showVideo.SizeOf(bitmapinfo.bmiHeader);
				bitmapinfo.bmiHeader.biWidth = 352;
				bitmapinfo.bmiHeader.biHeight = 288;
				bitmapinfo.bmiHeader.biPlanes = 1;
				bitmapinfo.bmiHeader.biBitCount = 24;
				this.capSetVideoFormat(this.lwndC, ref bitmapinfo, showVideo.SizeOf(bitmapinfo));
				this.mFrameEventHandler = new showVideo.FrameEventHandler(FrameCallBack);
				this.capSetCallbackOnFrame(this.lwndC, this.mFrameEventHandler);
				showVideo.SetWindowPos(this.lwndC, 0, 0, 0, mWidth , mHeight , 6);
			}
		}
		
		// private functions
		private bool capDriverConnect(IntPtr lwnd, short i)
		{
			return showVideo.SendMessage(lwnd, showVideo.WM_CAP_DRIVER_CONNECT, i, 0);
		}
		
		private bool capDriverDisconnect(IntPtr lwnd)
		{
			return showVideo.SendMessage(lwnd, showVideo.WM_CAP_DRIVER_DISCONNECT, 0, 0);
		}
		
		private bool capPreview(IntPtr lwnd, bool f)
		{
			return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_PREVIEW , f, 0);
		}
		
		private bool capPreviewRate(IntPtr lwnd, short wMS)
		{
			return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_PREVIEWRATE, wMS, 0);
		}
		
		private bool capSetCallbackOnFrame(IntPtr lwnd, showVideo.FrameEventHandler lpProc)
		{
			return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_CALLBACK_FRAME, 0, lpProc);
		}
		
		private bool capSetVideoFormat(IntPtr hCapWnd, ref showVideo.BITMAPINFO BmpFormat, int CapFormatSize)
		{
			return showVideo.SendMessage(hCapWnd, showVideo.WM_CAP_SET_VIDEOFORMAT, CapFormatSize, ref BmpFormat);
		}
		
		private void FrameCallBack(IntPtr lwnd, IntPtr lpVHdr)
		{
			showVideo.VIDEOHDR videoHeader = new showVideo.VIDEOHDR();
			byte[] VideoData;
			videoHeader = (showVideo.VIDEOHDR)showVideo.GetStructure(lpVHdr,videoHeader);
			VideoData = new byte[videoHeader.dwBytesUsed];
			showVideo.Copy(videoHeader.lpData ,VideoData);
			if (this.RecievedFrame != null)
				this.RecievedFrame (VideoData);
		}
	}
}
会飞的溜溜 2014-08-08
  • 打赏
  • 举报
回复
http://download.csdn.net/download/guqiwei/2844944
北京大白兔 2014-08-08
  • 打赏
  • 举报
回复
引用 4 楼 mjp1234airen4385 的回复:
这个情况是因为,你们调用的类库都是系统类库。 而系统类库里就有个功能,是多个视频或图片采集源的话,就弹出选择对话框。 你还是使用directShow来做,directshow自动捕捉采集源,以文本的形式提供给调用者。 你自己可以用程序自己选择某个固定的采集源。
好陌生的directShow,大哥哥有代码啵
mjp1234airen4385 2014-08-08
  • 打赏
  • 举报
回复
这个情况是因为,你们调用的类库都是系统类库。 而系统类库里就有个功能,是多个视频或图片采集源的话,就弹出选择对话框。 你还是使用directShow来做,directshow自动捕捉采集源,以文本的形式提供给调用者。 你自己可以用程序自己选择某个固定的采集源。
北京大白兔 2014-08-08
  • 打赏
  • 举报
回复
好像网上有很多人问,从来没有给过答案,我也碰到这个问题了,愁死我了
北京大白兔 2014-08-08
  • 打赏
  • 举报
回复
USB免驱动,不是用VFW写的,是正常的winform
泡泡龙 2014-08-08
  • 打赏
  • 举报
回复
是不是用VFW写的,别用这个了 要不你就换个驱动

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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