首页 > 其他分享 >winfrom控制相机拍照

winfrom控制相机拍照

时间:2024-03-05 15:58:23浏览次数:21  
标签:拍照 SET const int winfrom WM CAP private 相机

using System;
using System.Runtime.InteropServices;

// public delegate void SaveImg(Pick Pick1);
/// <summary>
/// 一个控制摄像头的类
/// </summary>
public class CameraManager
{
    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;



    /// <summary>
    /// 初始化摄像头
    /// </summary>
    /// <param name="handle">控件的句柄</param>
    /// <param name="left">开始显示的左边距</param>
    /// <param name="top">开始显示的上边距</param>
    /// <param name="width">要显示的宽度</param>
    /// <param name="height">要显示的长度</param>
    public CameraManager(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, long lParam);

    /// <summary>
    /// 开始显示图像
    /// </summary>
    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;

    }

    /// <summary>
    /// 停止显示
    /// </summary>
    public void Stop()
    {
        SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
        bStat = false;
    }

    /// <summary>
    /// 抓图
    /// </summary>
    /// <param name="path">要保存bmp文件的路径</param>
    public void CatchImage(string path)
    {

        IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
        SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64());

    }

    /// <summary>
    /// 录像
    /// </summary>
    /// <param name="path">要保存avi文件的路径</param>
    public void Kinescope(string path)
    {
        IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
        SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64());
        SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
    }

    /// <summary>
    /// 停止录像
    /// </summary>
    public void StopKinescope()
    {
        SendMessage(hWndC, WM_CAP_STOP, 0, 0);
    }

}

 

标签:拍照,SET,const,int,winfrom,WM,CAP,private,相机
From: https://www.cnblogs.com/Transmuter/p/18054211

相关文章

  • 模拟水印相机
    上效果图  publicvoidWaterMark(){stringsourcePath=@"D:\0.测试图片\微信图片_20230829184000.jpg";stringsaveFilePath=@"D:\0.测试图片\WaterMarkImg\";using(StreamReadersr=newStreamRead......
  • 根据CXP XML文件配置相机
     1    说明GenICam定义了相机需要实施一个xml文件用于描述相机的功能、寄存器等详细信息,有了这些信息,host才能利用这些信息完成对相机的配置。 对于CoaxPress接口的Device相机而言,xml信息是如何存储的呢?Xml一般情形下都会存在bootstrap寄存器的用户区间内。1.1......
  • VisionPro相机掉线问题
    最近有一个项目用到visionpro,遇到一个问题记录一下。就是相机频繁掉线。报错信息:在网上查找原因,关闭防火墙、设置巨帧模式、调大接收缓存区都试过,没有改善。因为其他原因,我们中途换了海康相机。但是两款相机都有掉线的问题。所以排除相机的因素。 并且这个项目我们有两台......
  • Halcon无法连接Basler相机及图像不稳定的解决办法
      情况一:出现检测图片接口可以检测到GigE接口,但连接时显示不能初始化。解决办法:这种首先确保相机网口连接稳定,并在Basler的自带驱动软件Pylon中将TriggerMode改为Off(Halcon中也可在参数中更改)。然后打开——控制版面——系统和安全——WindowsDefender防......
  • 相机内参外参的概念
    焦距也称为焦长,是光学系统中衡量光的聚集或发散的度量方式,指从透镜中心到光聚集之焦点的距离。亦是照相机中,从镜片光学中心到底片、CCD或CMOS等成像平面的距离。具有短焦距的光学系统比长焦距的光学系统有更佳聚集光的能力。内参(IntrinsicParameters):内参是描述相机内部属性的参......
  • 元宵节家里煮了多少汤圆?合合信息扫描全能王“拍照计数”一键盘点
    元宵将至,新春节庆氛围浓厚依旧。厨房里,餐桌上,一碗碗热气腾腾的汤圆、皮薄馅足的饺子,织就了年节温暖幸福的画面。近期,合合信息旗下扫描全能王APP“拍照计数”功能获得广大用户的关注。该功能基于图像AI技术,可以对图片中用户指定的目标物体进行统计,快速“点出”出图片中的物体数量......
  • 循环可变化的集合 数组 datatable 等 || c# winfrom DataGridView 动态UI下载功能
    Gif演示   分解步骤1,使用组件DataGridView2,使用DataSource来控制表格展示的数据来源(注意:来源需要是DataTable类型)3,需要用到异步线程。如果是不控制数据源的话,需要使用UI安全线程;(使用Control.Invoke或Control.BeginInvoke方法)4,DataGridView的列如果设置图片,尽量代码......
  • 激光雷达和相机传感器装置的自动外部校准方法(下)
    激光雷达和相机传感器装置的自动外部校准方法(下)D.单目数据如果要校准的传感器是单眼相机,则提取参考点需要检测ArUco标记,这提供了检索目标几何形状所需的线索。ArUco标记是由黑色边界和内部二进制矩阵组成的合成正方形标记,旨在实现其明确的识别。在校准目标中,使用了四个ArUco标......
  • 激光雷达和相机传感器装置的自动外部校准方法(上)
    激光雷达和相机传感器装置的自动外部校准方法(上)AutomaticExtrinsicCalibrationMethodforLiDARandCameraSensorSetups摘要——用于机载自主感知的大多数传感器设置由激光雷达和视觉系统组成,因为它们提供了互补信息,提高了获得稳健场景理解所需的不同算法的可靠性。然而,有......
  • 基于目标的三维激光雷达相机校准的改进
    基于目标的三维激光雷达相机校准的改进https://arxiv.org/pdf/1910.03126.pdfImprovementstoTarget-Based3DLiDARtoCameraCalibration摘要激光雷达和单眼相机之间的刚体变换是传感器融合任务(如SLAM)所必需的。虽然确定这样的转变在任何意义上都不被认为是迷人的,但它对许......