1. 程式人生 > 實用技巧 >在DevExpress中使用CameraControl控制元件進行攝像頭影象採集

在DevExpress中使用CameraControl控制元件進行攝像頭影象採集

在我們以前的專案了,做攝像頭的圖片採集,我們一般還是需要做一個封裝處理的,在較新版本的DevExpress控制元件裡面,增加了一個CameraControl控制元件,可以直接呼叫攝像頭顯示的,因此也可以做頭像採集等功能,本文介紹如何基於這個控制元件做相關的影象採集操作。

1、CameraControl控制元件介紹

該控制元件從15.1開始,就開始加入控制元件組了,控制元件的使用很簡單,直接拖動到介面就可以在Winform介面上使用了。本案例基於16.1進行開發的,因此也都具有這些控制元件模組的。

例如我們直接把CameraControl控制元件拖動到介面上,然後執行介面就可以看到如下效果。

在攝像的介面上,有一個配置的選項,可以對攝像頭的解析度等引數進行設定處理。

同時在PictureEdit控制元件上,也可以開啟攝像頭採集功能,只需要在控制元件屬性裡設定一下即可:

執行介面得到效果如下所示。

這個採集圖片的選單項文字沒有漢化,因此有點怪異,我們也可以通過使用其內建的對話方塊(TakePictureDialog)進行圖片採集操作。

具體程式碼如下所示:

private void btnInternal_Click(object sender, EventArgs e)
{
    TakePictureDialog d = new TakePictureDialog();
    
if (d.ShowDialog() == System.Windows.Forms.DialogResult.OK) { this.pictureEdit1.Image = d.Image; } }

呼叫得到的對話方塊是內建的,介面也是無法修改調整,包括文字內容。

2、自定義採集對話方塊

為了更好的實現對頭像的採集操作,我們可以仿照這個對話方塊模組,做一個自定義的窗體,實現攝像頭影象的採集操作,如下所示。

同時我們在對話方塊窗體裡面設定一個Public的影象物件屬性,如下所示

        /// <summary>
        /// 採集圖片
        
/// </summary> public Image CameraImage { get; set; }

這樣我們就方便設定和提取影象資訊了。

捕獲影象的程式碼就是從攝像控制元件裡面獲取一個快照就可以了,如下所示。

        private void btnCapture_Click(object sender, EventArgs e)
        {
            this.CameraImage = this.cameraControl1.TakeSnapshot();
            this.pictureEdit1.Image = this.CameraImage;
        }

然後在窗體退出的時候,記得釋放攝像頭的資源,否則第二次就提示佔用,無法使用了。

        private void FrmCamera_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.cameraControl1.Dispose();
        }

整個對話方塊的完整程式碼如下所示。

public partial class FrmCamera : Form
    {
        /// <summary>
        /// 採集圖片
        /// </summary>
        public Image CameraImage { get; set; }

        public FrmCamera()
        {
            InitializeComponent();
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            this.DialogResult = System.Windows.Forms.DialogResult.OK;
        }

        private void btnCapture_Click(object sender, EventArgs e)
        {
            this.CameraImage = this.cameraControl1.TakeSnapshot();
            this.pictureEdit1.Image = this.CameraImage;
        }

        private void FrmCamera_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.cameraControl1.Dispose();
        }
    }

最後執行可以得到介面如下所示。

這種處理方式比較好,我在該控制元件出來之前,在基礎介面類庫裡面,使用肖像控制元件來處理攝像頭影象採集的,如在我部落格介紹《Winform開發框架之肖像顯示儲存控制元件的實現》所示。

例如在會員管理系統裡面,就是利用肖像管理控制元件,通過之前的攝像頭公用類庫實現的圖形採集操作的。

這裡其實是利用一個攝像頭類庫來實現的,不過現在既然DevExpress本身就提供控制元件支援,那麼我們也可以直接利用它了,這樣更加方便,更少程式碼。