C#结合天敏VC4000采集卡视频监控

271 篇文章 2 订阅
215 篇文章 2 订阅

作者:wnety

转自:http://blog.csdn.net/wnety/article/details/7452303


准备:天敏VC4000视频采集卡的二次开发包有两个文件,分别是Sa7134Capture.dll和Mix.dll,缺一不可。

代码中使用的全是Sa7134Capture.dll中的方法,如果不添加Mix.dll会报Sa7134Capture.dll错误,截图:

确实很有意思,两个文件都放在bin/Debug目录下就OK了。

 

官方文档上说的是Sa7134Capture.dll为VC401P/404P的开发包,Sa7130Capture.dll为VC4000/8000的开发包,并且给出的例子都是基于VC401P/404P的。电话与其技术人员沟通后确认VC4000/8000也是用的Sa7134Capture.dll,因此参考Sa7134Capture.dll的开发文档。

 

C#中拖上Panel控件用作视频显示窗口,其中必须设置背景色:

如果不设置无论如何都不会显示摄像头内容的。试验了一下还有几种背景色也是可以的。切记!

 

VS2008中截图:

 

实现最基本的单摄像头功能,连接视频采集卡1号口(注意设备索引号为0):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
using Microsoft.Win32;
using System.Threading;
using System.Runtime.InteropServices;

namespace VideoCapture
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            if (VideoOperate.VCAInitSdk(this.Handle, VideoOperate.DISPLAYTRANSTYPE.PCI_MEMORY_VIDEOMEMORY, false))
            {
                int m_dwDevNum = VideoOperate.VCAGetDevNum();
                if (m_dwDevNum == 0)
                {
                    MessageBox.Show("采集卡驱动程序没有安装");
                }
                else
                {
                    VideoOperate.VCAOpenDevice(0, panel1.Handle);
                    VideoOperate.VCAStartVideoPreview(0);
                }
            }

        }

 

    }

    class VideoOperate
    {
        #region  视频采集卡中的枚举

        public enum DISPLAYTRANSTYPE
        {
            NOT_DISPLAY = 0,
            PCI_VIEDOMEMORY = 1,
            PCI_MEMORY_VIDEOMEMORY = 2
        }

        //视频预览和视频捕捉数据流格式,目前版本只支持UUY2格式
        public enum COLORFORMAT
        {
            RGB32 = 0x0,
            RGB24 = 0x1,
            RGB16 = 0x2,
            RGB15 = 0x3,
            YUY2 = 0x4,
            BTYUV = 0x5,
            Y8 = 0x6,
            RGB8 = 0x7,
            PL422 = 0x8,
            PL411 = 0x9,
            YUV12 = 0xA,
            YUV9 = 0xB,
            RAW = 0xE
        }

        /*视频预览及视频捕获的显示属性,其中:
            BRIGHTNESS为亮度,value范围:0~255,最佳:80
            CONTRAST为对比度,value范围:-128~127,最佳:0x44
            SATURATION为饱和度,value范围:-128~127,最佳:0x40
            HUE为色度,value范围:-128~127,最佳:0x0
                只有当COLORDEVICETYPE等于COLOR_DECODER时才有效
            SHARPNESS为锐度,value范围:-8~7,最佳:0x0
                只有当COLORDEVICETYPE等于COLOR_DECODER时才有效
        */
        public enum COLORCONTROL
        {
            BRIGHTNESS = 0,
            CONTRAST = 1,
            SATURATION = 2,
            HUE = 3,
            SHARPNESS = 4
        }

        /*显示设备的显示属性,其中:
            COLOR_DECODER为解码器的显示属性,它会影响视频预览和视频捕获的显示属性
            COLOR_PREVIEW为视频预览的显示属性
            COLOR_CAPTURE为视频捕获的显示属性
        */
        public enum COLORDEVICETYPE
        {
            COLOR_DECODER = 0,
            COLOR_PREVIEW = 1,
            COLOR_CAPTURE = 2,
        }

        /*音视频捕获方式,其中:
            CAP_NULL_STREAM 捕获无效
            CAP_ORIGIN_STREAM 捕获为原始流回调
            CAP_MPEG4_STREAM 捕获为MPEG4
        */
        public enum CAPMODEL
        {
            CAP_NULL_STREAM = 0,
            CAP_ORIGIN_STREAM = 1,
            CAP_MPEG4_STREAM = 2,
        }

        /*音视频MPEG4捕获方式,只有CAPMODEL等于CAP_MPEG4_STREAM时有效,其中:
           MPEG4_AVIFILE_ONLY 存为MPEG4文件
           MPEG4_CALLBACK_ONLY MPEG数据回调
           MPEG4_AVIFILE_CALLBACK 存为MPEG文件并回调
       */
        public enum MP4MODEL
        {
            MPEG4_AVIFILE_ONLY = 0,
            MPEG4_CALLBACK_ONLY = 1,
            MPEG4_AVIFILE_CALLBACK = 2,
        }

        /*MPEG4_XVID压缩模式,其中:
           XVID_CBR_MODE
           XVID_VBR_MODE
       */
        public enum COMPRESSMODE
        {
            XVID_CBR_MODE = 0,
            XVID_VBR_MODE = 1,
        }

        /*视频源的输入频率,其中:
           FIELD_FREQ_50HZ 50HZ,绝对多数为PAL制式
           FIELD_FREQ_60HZ 60HZ,绝对多数为NTSC制式
           FIELD_FREQ_0HZ 无信号
       */
        public enum eFieldFrequency
        {
            FIELD_FREQ_50HZ = 0,
            FIELD_FREQ_60HZ = 1,
            FIELD_FREQ_0HZ = 2,
        }

        /*电平状态,其中:
           HIGH_VOLTAGE 高电平
           LOW_VOLTAGE 低电平
       */
        public enum eVOLTAGELEVEL
        {
            HIGH_VOLTAGE = 0,
            LOW_VOLTAGE = 1,
        }

        #endregion

        #region  视频采集卡中的API函数

        //初始化系统资源
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCAInitSdk")]
        public extern static bool VCAInitSdk(IntPtr hWndMain, DISPLAYTRANSTYPE eDispTransType, bool bLnitAuDev);

        //释放系统资源
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCAUnInitSdk")]
        public extern static void VCAUnInitSdk();

        //打开指定卡号的设备,分配相应系统资源
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCAOpenDevice")]
        public extern static bool VCAOpenDevice(Int32 dwCard, IntPtr hPreviewWnd);

        //关闭指定卡号的设备,释放相应系统资源
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCACloseDevice")]
        public extern static bool VCACloseDevice(Int32 dwCard);

        //返回系统当中卡号数量,即为SAA7134硬件数目,为0时表示没有设备存在
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCAGetDevNum")]
        public extern static int VCAGetDevNum();

        //开始视频预览
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCAStartVideoPreview")]
        public extern static bool VCAStartVideoPreview(Int32 dwCard);

        //停止视频预览
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCAStopVideoPreview")]
        public extern static bool VCAStopVideoPreview(Int32 dwCard);

        //更新视频预览
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCAUpdateVideoPreview")]
        public extern static bool VCAUpdateVideoPreview(Int32 dwCard, IntPtr hPreviewWnd);

        //更新overlay窗口,当overlay窗口句柄改变或尺寸、位置改变时调用,overlay窗口就是包含
        //多路显示小窗口的大窗口,overlay窗口必须有一个,多路显示小窗口必须包含在其内部
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCAUpdateOverlayWnd")]
        public extern static bool VCAUpdateOverlayWnd(IntPtr hOverlayWnd);

        //保存快照为JPEG文件
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCASaveAsJpegFile")]
        public extern static bool VCASaveAsJpegFile(Int32 dwCard, string lpFileName, Int32 dwQuality);

        //保存快照为BMP文件
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCASaveAsBmpFile")]
        public extern static bool VCASaveAsBmpFile(Int32 dwCard, string lpFileName);

        //开始视频捕获
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCAStartVideoCapture")]
        public extern static bool VCAStartVideoCapture(Int32 dwCard, CAPMODEL enCapMode, MP4MODEL enMp4Mode, string lpFileName);

        //停止视频捕获
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCAStopVideoCapture")]
        public extern static bool VCAStopVideoCapture(Int32 dwCard);

        //设置视频捕获尺寸,dwWidth和dwHeight最好为16的倍数,否则,动态检测为16*16的一个检测小块,检测将会不准确
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCASetVidCapSize")]
        public extern static bool VCASetVidCapSize(Int32 dwCard, Int32 dwWidth, Int32 dwHeight);

        //得到视频捕获尺寸
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCAGetVidCapSize")]
        public extern static bool VCAGetVidCapSize(Int32 dwCard, Int32 dwWidth, Int32 dwHeight);

        //设置视频捕获频率
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCASetVidCapFrameRate")]
        public extern static bool VCASetVidCapFrameRate(Int32 dwCard, Int32 dwFrameRate, bool bFrameRateReduction);

        //设置MPEG压缩的位率
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCASetBitRate")]
        public extern static bool VCASetBitRate(Int32 dwCard, Int32 dwBitRate);

        //设置MPEG压缩的关键帧间隔,必须大于等于帧率
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCASetKeyFrmInterval")]
        public extern static bool VCASetKeyFrmInterval(Int32 dwCard, Int32 dwKeyFrmInterval);

        //设置MPEG4_XVID压缩的质量
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCASetXVIDQuality")]
        public extern static bool VCASetXVIDQuality(Int32 dwCard, Int32 dwQuantizer, Int32 dwMotionPrecision);

        //设置MPEG4_XVID压缩的模式
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCASetXVIDCompressMode")]
        public extern static bool VCASetXVIDCompressMode(Int32 dwCard, COMPRESSMODE enCompessMode);

        //设置视频颜色属性,它将影响视频预览和视频捕获的显示属性
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCASetVidDeviceColor")]
        public extern static bool VCASetVidDeviceColor(Int32 dwCard, COLORCONTROL enCtlType, Int32 dwValue);

        //得到视频源输入频率,即可得到视频源输入制式
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCAGetVidFieldFrq")]
        public extern static bool VCAGetVidFieldFrq(Int32 dwCard, eFieldFrequency eVidSourceFieldRate);

        //初始化视频设备,当视频不显示,只需视频录像获音频处理时,获通过VCAInitSdk()函数已经初始化完成,可以不初始化
        [DllImport("Sa7134Capture.dll", EntryPoint = "VCAInitVidDev")]
        public extern static bool VCAInitVidDev();

        #endregion
    }
}

 

//

改进:

1、获取设备数目后通过循环动态的将多摄像头绑定到不同的Panel中。

2、窗口移动时视频窗口不动,可以通过开发包方法更新视频窗口。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C# 开发案例,演示如何使用天敏 SDK2000 视频采集卡进行视频采集: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; namespace VideoCapture { class Program { [DllImport("TDVidCap.dll")] public static extern int TDVC_OpenDevice(int nDeviceID, int nWidth, int nHeight, int nFps); [DllImport("TDVidCap.dll")] public static extern int TDVC_CloseDevice(int nDeviceID); [DllImport("TDVidCap.dll")] public static extern int TDVC_StartCapture(int nDeviceID); [DllImport("TDVidCap.dll")] public static extern int TDVC_StopCapture(int nDeviceID); [DllImport("TDVidCap.dll")] public static extern int TDVC_GetFrame(int nDeviceID, IntPtr pBuf); static void Main(string[] args) { int nDeviceID = 0; // 设备 ID int nWidth = 640; // 采集宽度 int nHeight = 480; // 采集高度 int nFps = 30; // 采集帧率 int nRet = TDVC_OpenDevice(nDeviceID, nWidth, nHeight, nFps); // 打开设备 if (nRet != 0) { Console.WriteLine("Open device failed!"); return; } nRet = TDVC_StartCapture(nDeviceID); // 开始采集 if (nRet != 0) { Console.WriteLine("Start capture failed!"); TDVC_CloseDevice(nDeviceID); return; } IntPtr pBuf = Marshal.AllocHGlobal(nWidth * nHeight * 3); // 分配图像缓存 while (true) { nRet = TDVC_GetFrame(nDeviceID, pBuf); // 获取一帧图像 if (nRet != 0) { Console.WriteLine("Get frame failed!"); break; } // 这里可以对图像进行处理,比如显示、保存等 // ... // 退出循环 if (Console.KeyAvailable) { Console.ReadKey(true); break; } } Marshal.FreeHGlobal(pBuf); // 释放图像缓存 TDVC_StopCapture(nDeviceID); // 停止采集 TDVC_CloseDevice(nDeviceID); // 关闭设备 } } } ``` 在上面的示例中,我们使用了 `TDVidCap.dll` 的几个函数来实现视频采集: - `TDVC_OpenDevice(int nDeviceID, int nWidth, int nHeight, int nFps)`:打开设备,并设置采集参数。 - `TDVC_CloseDevice(int nDeviceID)`:关闭设备。 - `TDVC_StartCapture(int nDeviceID)`:开始采集。 - `TDVC_StopCapture(int nDeviceID)`:停止采集。 - `TDVC_GetFrame(int nDeviceID, IntPtr pBuf)`:获取一帧图像。 在主函数中,我们首先打开设备,并开始采集。然后在一个死循环中,不断地获取图像并对其进行处理(这里只是简单地演示了如何获取图像)。当用户按下任意键时,程序退出循环,并停止采集、关闭设备。 需要注意的是,这里的图像数据是以 RGB 格式存储的,每个像素占用 3 个字节,即 R、G、B 三个分量。如果需要将图像保存为文件,可以使用 `System.Drawing.Bitmap` 类来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值