问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用C#如何实现启动摄像头?

发布网友 发布时间:2022-10-15 20:37

我来回答

3个回答

热心网友 时间:2023-10-11 20:45

安装像头后,一般可以找到一个avicap32.dll文件 这是一个关于像头的类 using system; using System.Runtime.InteropServices; namespace webcam { /// /// avicap 的摘要说明。 /// 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); } } } 具体调用 using system; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using webcam; namespace webcam { /// /// Form1 的摘要说明。 /// public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.Panel panelPreview; private System.Windows.Forms.Button b_play; private System.Windows.Forms.Button b_stop; /// /// 必需的设计器变量。 /// private System.ComponentModel.Container components = null; WebCamera wc; public form1() { // // Windows 窗体设计器支持所必需的 // InitializeComponent(); // // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 // } /// /// 清理所有正在使用的资源。 /// protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region windows 窗体设计器生成的代码 /// /// 设计器支持所需的方法 - 不要使用代码器修改 /// 此方法的内容。 /// private void InitializeComponent() { this.b_play = new System.Windows.Forms.Button(); this.panelPreview = new System.Windows.Forms.Panel(); this.b_stop = new System.Windows.Forms.Button(); this.SuspendLayout(); // // b_play // this.b_play.Location = new System.Drawing.Point(280, 368); this.b_play.Name = b_play; this.b_play.TabIndex = 0; this.b_play.Text = &Play; this.b_play.Click += new System.EventHandler(this.button1_Click); // // panelPreview // this.panelPreview.Location = new System.Drawing.Point(8, 8); this.panelPreview.Name = panelPreview; this.panelPreview.Size = new System.Drawing.Size(344, 272); this.panelPreview.TabIndex = 1; // // b_stop // this.b_stop.Enabled = false; this.b_stop.Location = new System.Drawing.Point(360, 368); this.b_stop.Name = b_stop; this.b_stop.TabIndex = 2; this.b_stop.Text = &Stop; this.b_stop.Click += new System.EventHandler(this.b_stop_Click); // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(464, 413); this.Controls.Add(this.b_stop); this.Controls.Add(this.panelPreview); this.Controls.Add(this.b_play); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = Form1; this.Text = GoodView test Web Camera; this.Load += new System.EventHandler(this.Form1_Load); this.ResumeLayout(false); } #endregion /// /// 应用程序的主入口点。 /// [STAThread] static void Main() { Application.Run(new Form1()); } private void form1_load(object sender, system.eventargs e) { b_play.Enabled = false; b_stop.Enabled = true; panelPreview.Size = new Size(330,330); wc = new WebCamera( panelPreview.Handle,panelPreview.Width,panelPreview.Height); wc.StartWebCam(); } private void button1_click(object sender, system.eventargs e) { b_play.Enabled = false; b_stop.Enabled = true; panelPreview.Size = new Size(330,330); wc = new WebCamera( panelPreview.Handle,panelPreview.Width,panelPreview.Height); wc.StartWebCam(); } private void b_stop_click(object sender, system.eventargs e) { b_play.Enabled = true; b_stop.Enabled = false; wc.CloseWebcam(); } } }

热心网友 时间:2023-10-11 20:46

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using webcam;
using PickHead;
namespace test_avicap
{
public partial class Form1 : Form
{
// WebCamera wc;
Pick pick;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//b_play.Enabled = false;
//b_stop.Enabled = true;
//panelPreview.Size = new Size(330, 330);
//wc = new WebCamera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);
//wc.StartWebCam();
int left=0;
int top=0;
int width=352;
int height=288;
pick = new Pick( panelPreview.Handle, left,top, width, height );
pick.Start();
}
private void b_play_Click(object sender, EventArgs e)
{
//b_play.Enabled = false;
//b_stop.Enabled = true;
//panelPreview.Size = new Size(330, 330);
//wc = new WebCamera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);
//wc.StartWebCam();
int left = 0;
int top = 0;
int width =352;
int height = 288;
pick = new Pick(panelPreview.Handle, left, top, width, height);
pick.Start();
}
private void b_stop_Click(object sender, EventArgs e)
{

//wc.CloseWebcam();
pick.Stop();
}

protected override void OnClosing(CancelEventArgs e)
{
if (MessageBox.Show("退出本系统?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
Application.Exit();
else
e.Cancel = true;
}
private void b_pic_Click(object sender, EventArgs e)//拍摄
{
if (this.b_pic.Text == "拍摄&A") //用于摄像的
{
b_pic.Text = "重照&C";
string path;
sdf1.Filter = "图片*.bmp;*.jpg;.jpeg;*.gif|*.bmp|所有文件(*.*)|*.*";
if (sdf1.ShowDialog() == DialogResult.OK)
{
path = sdf1.FileName;
pick.GrabImage(path);
pic_show.ImageLocation = path; //并显示在方框中
pic_show.Location = new Point(110, 12);
pic_show.Visible = true;
panelPreview.Visible = false;
pick.Stop();
}
}
else
{
b_pic.Text = "拍摄&A";
pic_show.Visible = false;
panelPreview.Location = new Point(110, 12);
panelPreview.Visible = true;
pick.Start();
}
}
}
}

调用的类(class1.cs)
//本文是借助avicap32.dll库来驱动摄像头。做到了抓图、录像功能。
using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
namespace PickHead
{
///
/// 一个控制摄像头的类
///
public class Pick
{
private const int WM_USER = 0x400;
private const int WS_CHILD = 0x40000000;
private const int WS_VISIBLE = 0x10000000;
private const int WM_CAP_START = WM_USER;
private const int WM_CAP_STOP = WM_CAP_START + 68;
private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
private const int WM_CAP_SAVEDIB = WM_CAP_START + 25;
private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;
private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
private const int WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63;
private const int WM_CAP_SET_OVERLAY =WM_CAP_START+ 51;
private const int WM_CAP_SET_PREVIEW =WM_CAP_START+ 50;
private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6;
private const int WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2;
private const int WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3;
private const int WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5;
private const int WM_CAP_SET_SCALE=WM_CAP_START+ 53;
private const int WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52;
private IntPtr hWndC;
private bool bStat = false;
private IntPtr mControlPtr;
private int mWidth;
private int mHeight;
private int mLeft;
private int mTop;
///
/// 初始化摄像头
///
/// 控件的句柄
/// 开始显示的左边距
/// 开始显示的上边距
/// 要显示的宽度
/// 要显示的长度
public Pick(IntPtr handle, int left, int top, int width,int height)
{
mControlPtr = handle;
mWidth = width;
mHeight = height;
mLeft = left;
mTop = top;
}
[DllImport("avicap32.dll")]
private static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
[DllImport("avicap32.dll")]
private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize );
[DllImport("User32.dll")]
private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);
///
/// 开始显示图像
///
public void Start()
{
if (bStat)
return;
bStat = true;
byte[] lpszName = new byte[100];
hWndC = capCreateCaptureWindowA(lpszName,WS_CHILD|WS_VISIBLE ,mLeft,mTop,mWidth,mHeight,mControlPtr,0);
if (hWndC.ToInt32() != 0)
{
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
}
return;
}
///
/// 停止显示
///
public void Stop()
{
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
bStat = false;
}
///
/// 抓图
///
/// 要保存bmp文件的路径
public void GrabImage(string path)
// public void GrabImage( )
{
IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
SendMessage(hWndC,WM_CAP_SAVEDIB,0,hBmp.ToInt32());
}
///
/// 录像
///
/// 要保存avi文件的路径
public void Kinescope(string path)
{
IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
SendMessage(hWndC,WM_CAP_FILE_SET_CAPTURE_FILEA,0,hBmp.ToInt32());
SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
}
///
/// 停止录像
///
public void StopKinescope()
{
SendMessage(hWndC, WM_CAP_STOP, 0, 0);
}
}
}

热心网友 时间:2023-10-11 20:46

启动吗???你说的,直接用厂家的接口文件打开设备还是调用安装好的程序来打开设备?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
低温还原粉化性检验方法 ...播放量破50亿,大胃王“浪胃仙”是如何在抖音崛起的? 网络直播间:新部落的建构及其亚文化特征 网络直播中吃播的文化输出 我用圆通快递从河南商丘发到洛阳几天能到 商丘圆通快递几点下班? 河南商丘到江苏南京圆通快递,大概要多久? 四大名著语录 “命中注定我爱你”真的好看么? 好看的偶像剧 命中注定我爱你 农村商业银行是不是农业银行 WM的手机怎么截图 WM Capture 软件使用教程 建设银行怎么样知道自己本月是不是最低还款 Win8系统窗口设置单独输入法 经典历史故事典故 我想问一下梅雨天鞋子洗了臭了怎么办 形容一家人温馨的诗句 50条农业谚语 50条农业谚语有什么 家里挂荷花禁忌 家里挂荷花有什么禁忌 梦见弄拉及什么意思 韩语读音弄拉塌古力是什么意思 求助电脑怎么玩ps2游戏这是下载好后的图片? 电视开机画面黑屏 PS2张图片,P在一起,高分跪求。 ps2个图片文件,一个是照片,一个是签名,把签名的,贴到照片上。 哪位高手能帮我PS2张图片?急呀!!! 谁帮我PS2张图片! ps2图片。一个事签名,一个是照片, 24节气中第22个节气冬至的由来 太阳高度变化规律 融资融券余额突然大增的原因 用VB怎么制作摄像头拍照并保存到本地的程序? delphi 控制摄像头 无驱摄像头视频显示区黑屏无显示 十二生肖的鸡怎么画 映客怎么把自己的二维码给别人分享 招联好期贷联通合约机专用额度去哪里买手机 三星c5拍照怎么能带上日期 lte为什么不能开热点 毛琢自存什么字错了 毛逐自荐中哪个字错了。 毛遂自荐那个字错了 毛逐字荐是什么意思 改错别字.毛逐自荐 凶有成竹 从容正定 一声不坑 报怨不已 排优解难 情不自尽 清析可见 毛遂自荐,打一字 毛遂自荐,打一字!不要告诉我是“阉”,这是错的! 解梦,男性,梦见一个又像是老鼠又像是蛇的动物在咬一只鸡的脚想把鸡拖走,有两只鸡 农业发展有限公司经营范围 这里提供三种参考 奥迪q7行车记录仪安装在哪儿 麦哲龙Q7行车记录仪怎样语音唤醒- 问一问 奥迪q7安装隐形行车记录仪会不会造成车报警? 奥迪Q7哪些地方需要设置密码