999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于DirectShow的證件圖像采集設計與實現*

2010-05-11 03:48:32李宇譚洪舟
自動化與信息工程 2010年3期
關鍵詞:系統

李宇 譚洪舟

1 引言

在Windows下開發視頻采集系統時,通常有3種視頻采集的方法。分別為基于VFW(Video for Windows)、基于DirectX的DirectShow部件和基于視頻采集設備提供的SDK(Software Development Kit,軟件開發包)。

VFW 是微軟公司于 1992年推出的專門針對Windows平臺上視頻處理的軟件包,它不依賴于專用的硬件設備,提供了通用的數字視頻開發方案。使用VFW的優點是它隨從Windows操作系統一起安裝,可執行文件不需要附帶額外的庫文件就可以運行。文獻1用VFW實現了視頻圖像疊加與播放。目前新的采集設備通常使用WDM(Windows Driver Model)驅動模型,而VFW無法支持這種驅動模型,因而無法驅動相應的采集設備。這大大限制了VFW在視頻多媒體采集中的應用。此外,VFW的工作效率不高,這對于采集視頻質量日漸提高、數據量突飛增長的新設備來說明顯不吻合。

SDK是采集卡廠家提供的開發視頻監控系統的一組庫函數,使用SDK庫函數,用戶可以在不了解視頻壓縮、回放、網絡與存盤操作等技術的前提下,進行視頻程序開發(SDK中通常包含了這些技術的實現)。但是不同廠商提供的采集卡SDK通常無法兼容,因此編寫的程序無法移植到新的環境中。而且對于常見的攝像頭,則不一定會有提供相應的SDK。

DirectShow是基于Windows平臺的流媒體處理開發包,它與DirectX一起發布。DirectShow對流媒體的捕捉、回放提供了強大的支持,使用它還可以在基于WDM驅動的采集卡上進行數據捕捉。使用DirectShow能夠簡單、高效地對流媒體進行處理,降低處理的復雜性。不過,運行基于DirectShow開發出來的應用程序要求PC機系統中安裝有DirectX模塊。一般情況下Windows操作系統中都捆綁了對應版本的DirectX,使得用戶使用起來非常方便。相對前兩種方法,DirectShow簡單易用,比較適合于Windows環境下的開發圖像采集系統。

2 DirectShow捕捉原理

DirectShow是一套完全基于組件對象模型(Component Object Model,COM)的應用系統。圖1是 DirectShow的系統圖[2]。圖中央最大的一塊即為DirectShow系統。虛線以下是Ring 0特權級別的硬件設備,虛線以上是Ring 3特權級別的應用層。DirectShow系統位于應用層中。它使用一種叫做Filter Graph的模型來管理整個數據流的處理過程;參與數據處理的各個功能模塊叫做Filter;各個Filter在Filter Graph中按一定的順序連接成一條“流水線”協同工作[3]。

圖1 DirectShow系統圖

DirectShow通過Filter與各式各樣的設備,包括本地文件系統、TV調諧器、視頻采集卡、編解碼器、顯示器、聲卡等進行通信。因此DirectShow將應用程序與設備之間的多樣性和復雜性隔離開[4]。

按照功能來分,Filter大致分為3類:Source Filter,Transform Filters和Rendering Filters。Source Filters主要負責獲取數據,數據源可以是文件、Internet計算機里的采集卡(WDM驅動的或VFW 驅動的)、數字攝像機等,然后將數據往下傳輸;Transform Filters主要負責數據的格式轉換分離/合成,解碼/編碼等,然后將數據繼續往下傳輸;Rendering Filters主要負責數據的最終去向——將數據送給顯卡、聲卡進行多媒體的演示,或者輸出到文件進行存儲。每一個DirectShow的Filter至少有一個連接點,也稱為引腳(Pin)。Filter之間的連接和媒體數據的傳送正是通過Pin的連接得以實現的。

3 基于DirectShow圖像采集中的類設計

Filter是DirectShow應用程序數據處理的基本單元,各個 Filter在 Filter Graph中按一定的順序連接成一條“流水線”協同工作。DirectShow使用一種叫做 Filter Graph的模型來管理整個數據流的處理過程。基于面向對象程序設計的思想,我們的圖像采集模塊中設計了下面三個類對數據和操作進行封裝:CVGraph類,CVSampleGrabberCB類及CVCaptureGraph類。整個捕捉模塊的UML類框圖如圖2所示。

圖2 圖像采集模塊類框圖

3.1 CVGraph類和CVGraphEventHandle類

CVGraph類主要是實現一些對所有與 Filter Graph相關的應用中所必需的操作的封裝,通常作為其他針對特定領域應用的Filter Graph類的父類。如與采集應用相關的CVCaptureGraph即是繼承于該類。

這個類主要記錄一些維護與 Filter Graph相關的一些接口的指針,如圖2中所示的:m_pGraph、m_pBuild、m_pControl和m_pEvent;還有視頻預覽顯示窗口句柄及事件通告窗口句柄,如 m_hVidWin (視頻窗口句柄,可以為NULL,表示不顯示)和m_hWnd(事件窗口句柄,通常不為NULL)。

該類相關的成員函數都是與設置視頻顯示窗口,事件通告窗口,啟動/停止Filter Graph相關的操作。值得注意的是該類的事件處理機制。從圖2可知CVGraph依賴于類CVGraphEventHandle,在CVGraph::HandleEvent中調用了后者的成員函數。

CVGraphEventHandle是一個定義為應用程序響應DirectShow的Filter Graph事件的回調的類。它的作用為:

(1)、 在應用程序窗口類中繼承該類;

(2)、調用CVGraph::SetEventWindow以設置事件響應窗口;

(3)、當應用程序從消息泵中得到CVGraph::WM_GRAPH_MESSAGE消息的時候, 以所實現的窗口類作為參數(根據C++類繼承機制,這是合法的[5])調用 CVGraph::HandleEvent,其內部調用了CVGraphEventHandler::OnGraphEvent函數,根據多態性,這時即將調用在窗口類中定義的 OnGraphEvent函數。

3.2 CVSampleGrabberCB類

在本模塊中,幀數據的獲取采用的是DirectShow自身提供的 SampleGrabber Filter(對應的類 ID為CLSID_SampleGrabber)。使用這個Filter時需要對其回調機制進行設置,其中設置的回調參數中就有具有ISampleGrabber接口的類。我們設計的CVSampleGrabberCB類即為一例。應用程序通過SetCallback(pSampleGrabberCB,1)設置回調函數,其中參數1表示使用BufferCB這個方法進行回調。

該類還用一個枚舉的類型 FUNCTIONARITY表示該SampbleGrabber Filter具有的功能:

enum FUNCTIONARITY

{ NON_FUN = NO_FUNCTION,

SNAP_ONLY = SG_SNAP,

ALIGN_ONLY = SG_ALIGN,

SNAP_ALIGN = SG_SNAP | SG_ALIGN

};

由此可見,一個SampleGrabber Filter具有SNAP(即單幀拍攝)或(和)ALIGN(對準,主要用于下一章中廣角鏡頭畸變建模)功能。

回調的過程的流程圖如圖 3所示(即BufferCB接口函數的實現)。

上述過程通告給應用程序的自定義消息為:WM_CAPTURE_BITM AP_FOR_PROCESSING 3.3 CVCaptureGraph類

該類繼承于CVGraph類,利用DirectShow中的ICaptureBuilder2接口提供的智能連接功能RenderStream進行Filter間互連。智能連接意即客戶只需要根據不同的應用場景,添加所需要的 Source Filter,Transform Filter和 Rendering Filter,系統便會自動實現連接。

在采集圖像過程中,應用程序可能提供不同的參數決定最終的工作模式,因此程序中定義了一個新的類型:

typedef unsigned long WORK_MODE;

并且使用宏定義語句定義了一些工作模式,不同模式對應的Filter Graph是不同的。如果該捕捉類以后需要進行擴展,僅需要使用類似的方法添加宏定義即可。下面列出其中的幾個宏定義語句:

#define NULL_MODE (EMPTY_MODE) //空模式

圖3 BufferCB回調流程圖

#define PREV_WIN (PREVIEW |RENDER_WINDOW) //用戶指定窗口預覽模式

#define PREV_WIN_SNAP (PREVIEW |RENDER_WINDOW | SNAP) // 使用用戶指定的窗口進行預覽,且提供單幀捕捉功能

#define PREV_WIN_SNAP_ALIGN(PREVIEW|RENDER_WINDOW|SNAP| ALIGN) // 使用用戶指定的窗口進行預覽,且提供單幀捕捉、對準功能

#define PREV_WIN_SNAP_STILL (PREVIEW |RENDER_WINDOW | SNAP | STILL_PIN) // 使用用戶指定的窗口進行預覽,且利用靜態引腳捕捉幀數據

#define PREV_NULL_RENDER_SNAP_STILL(PREVIEW|SNAP | STILL_PIN) // 不進行預覽顯示且利用靜態引腳捕捉幀數據

RecommendedWorkMode( )根據用戶所喜好的配置與及采集設備本身的硬件工作能力(如是否具有靜態引腳)返回一種系統推薦的工作模式;

RenderPreview( )函數完成只有預覽功能的 Filter Graph的建立;

RenderAviCapture( )函數完成將視頻流采集到 AVI文件的Filter Graph的搭建,在本系統中并未使用;

RenderStillPin( )完成使用靜態引腳實現單幀數據采集的Filter Graph中與靜態引腳相關的子Filter Graph的搭建;

RenderWholeGraph( )根據用戶設置的工作模式搭建整個Filter Graph。

4 圖像幀數據采集

4.1 采集流程

從攝像頭中獲取幀數據最常見的辦法是從預覽的視頻流中插入一個SampleGrabber Filter,這樣由于視頻流中的每一幀數據都會經過該Filter,只要讓該Filter通過回調機制通告上層應用程序進行對當前幀進行處理便可實現圖像采集。此外,現在的 USB攝像頭都是基于WDM,并且有一些還提供了靜態引腳捕獲(Still Pin Capture)這種類似于相機快門的拍照接口(通常這種接口拍攝到的圖片會比視頻流中取出一幀的圖片的質量要好)。不管是視頻流中進行幀數據捕獲,還是從靜態引腳進行捕獲,均采用回調函數的形式將幀數據的傳遞給應用程序,這兩種情況均是通過在 Filter Graph中插入SampleGrabber Filter來實現的[6]。上層應用程序只需要按圖4所示的流程進行調用即可實現所需的功能。

由此,我國當下通過“一帶一路”倡議推行國際經貿合作,需要轉變理念和方式,重視法律合作,適時跟上世界發展趨勢,借著法律自發趨同的世界法律合作潮流開展國際經貿活動,實現“一帶一路”所涉國家長久的互利共贏。該理念和方式的轉變也是我國的必然選擇。

圖4 圖像捕獲模塊調用流程

4.2 兩種方法對比分析

由于DirectShow的視頻采集與上層應用程序的工作線程邏輯上是獨立的兩個線程,它們按照設定的工作模式進行工作。雖然兩種幀數據的獲取均是通過插入Sample Grabber Filter并回調應用程序來實現,但從技術細節上看還是存在不同之處:

(1)、對于從預覽視頻流中獲取幀數據的方式來說,攝像頭硬件設備每產生一幀視頻并且通告操作系統后,操作系統根據負載的情況,盡可能通過驅動程序獲取該幀數據并通過設定的預覽 Filter路徑進行處理。但是允許在負載較重的情況下丟棄部分預覽視頻幀。這樣,由于預覽視頻流源源不斷地從攝像頭設備處產生,按前述的回調方式,DirectShow采集線程會不斷地發送消息給應用程序窗口。因而上層應用程序必須進行相應的過濾操作。

(2)、在使用靜態引腳捕獲幀數據時,只有用戶發送了捕獲命令后,才能夠觸發攝像頭進行拍攝,在拍攝完成之后才發送消息通告應用程序窗口。因而這種情況下不存在DirectShow捕獲線程頻繁發送通告消息。從邏輯上講,只有用戶啟動捕捉命令,DirectShow在收集完數據后才發送消息,這類似于照像機中的快門。使用靜態引腳捕獲幀數據非常節省系統資源,適合當系統負載較重的時候使用。

圖5與圖6分別描述了圖形用戶界面下采集模塊在通過預覽視頻流獲取幀數據和靜態引腳獲取幀數據的UML時序圖,其中采集命令的發送都是由用戶指定。

圖5 預覽視頻流獲取幀數據的UML時序圖

圖6 靜態引腳獲取幀數據的UML時序圖

5 實驗

本圖像采集模塊用于我們開發的證件信息識別系統中實現證件的圖像輸入。實驗采用了Windows XP操作系統和Visual C++ 6.0作為開發平臺,硬件為普通市面USB攝像頭和Lenovo 奔騰雙核CPU的啟天M6900 PC機器。該識別系統具有鏡頭的畸變補償功能。圖7是用本圖像采集模塊得到的身份證原始圖像。由于采集到的圖像會發生桶形失真,直接對采集到的證件圖像進行OCR會影響識別效果,系統要先對采集到的圖像進行樣條函數畸變補償校正[8],處理后的身份證圖像為圖8所示。最后對身份證圖像進行識別采集到證件的信息內容(圖 9)。從整個采集識別情況來看,本圖像采集模塊能有效地實現圖像的輸入功能,滿足證件信息識別的圖像要求。

圖7 桶形失真原始圖像

圖8 使用雙線性插值法的畸變補償效果

圖9 證件采集識別效果

6 結束語

本文設計了用于圖像采集的 CVGraph類,CVSampleGrabberCB類與CVCaptureGraph類,并基于這些類開發了使用USB攝像頭的圖像采集模塊。通過自行開發的證件信息采集系統測試了該圖像采集模塊輸入功能。采集到的圖像達到了實際圖像應用系統的要求。

[1] 徐從東,羅家融,王樹坤.基于VFW 的視頻圖像疊加與播放方法[J].計算機工程與設計,2007,28(1):100-102

[2] DirectX. Documentation for C++ [EB/OL]. Microsoft Corporation,2005

[3] 陸其明.DirectShow開發指南[M]. 北京:清華大學出版社. 2003

[4] Mark D. Pesce. Programming Microsoft DirectShow for Digital Video and TV [M]. Washington: Microsoft Press. 2003.04

[5] David J.Kruglinski, Scot Wingo, George Shepherd著, 希望圖書創作室譯. Visual C++ 6.0技術內幕(第五版)[M] . 北京:希望電子出版社. 1999.05

[6] Eric Rudolph. How To Get Data from a Microsoft DirectShow Filter Graph [EB/OL]. http://msd n.microsoft.com/zh-cn/library/ms867162(en-us).aspx

[7] 孫鑫, 余安萍. VC++深入詳解[M]. 北京:電子工業出版社.2006.06

[8] 王占斌, 趙輝, 陶衛, 唐燕. 廣角鏡頭桶形畸變的樣條函數修正方法[J]. 光電工程. 2008.35(4). 140-144

猜你喜歡
系統
Smartflower POP 一體式光伏系統
工業設計(2022年8期)2022-09-09 07:43:20
WJ-700無人機系統
ZC系列無人機遙感系統
北京測繪(2020年12期)2020-12-29 01:33:58
基于PowerPC+FPGA顯示系統
基于UG的發射箱自動化虛擬裝配系統開發
半沸制皂系統(下)
FAO系統特有功能分析及互聯互通探討
連通與提升系統的最后一塊拼圖 Audiolab 傲立 M-DAC mini
一德系統 德行天下
PLC在多段調速系統中的應用
主站蜘蛛池模板: www.亚洲一区| 全部免费毛片免费播放| 久久精品亚洲热综合一区二区| 国产微拍精品| 国产精品视频白浆免费视频| 午夜精品一区二区蜜桃| 日韩欧美在线观看| 亚洲天堂日本| 亚洲无线视频| 亚洲欧洲日产国产无码AV| 国产人在线成免费视频| 亚洲天堂日韩在线| 国产中文一区a级毛片视频 | 久久一本日韩精品中文字幕屁孩| 欧美一级在线播放| 国产精品无码久久久久AV| 香蕉综合在线视频91| 欧美激情福利| 色AV色 综合网站| AV不卡国产在线观看| 亚洲 欧美 中文 AⅤ在线视频| 日韩精品成人在线| 亚洲第一国产综合| 国产在线麻豆波多野结衣| a色毛片免费视频| 久久综合结合久久狠狠狠97色| 在线无码av一区二区三区| 国产欧美日韩综合一区在线播放| 性网站在线观看| 婷婷色丁香综合激情| 黄色a一级视频| 婷婷色丁香综合激情| 久久国产精品77777| 91福利免费| 69国产精品视频免费| 日本少妇又色又爽又高潮| 97视频在线观看免费视频| 91丝袜乱伦| 久久一日本道色综合久久| 亚洲第一成网站| 伊人久热这里只有精品视频99| 久久这里只有精品66| 国产色婷婷| 久久熟女AV| 午夜福利视频一区| 欧美a级完整在线观看| 大陆精大陆国产国语精品1024 | 国产三区二区| 亚洲三级影院| 久久久久久尹人网香蕉| 国产白浆一区二区三区视频在线| 久久青草免费91线频观看不卡| 免费国产福利| 在线高清亚洲精品二区| 亚洲无码高清一区二区| 中文字幕第1页在线播| 亚洲中文字幕手机在线第一页| 色综合中文字幕| 亚洲天堂网在线播放| 丝袜无码一区二区三区| 中文字幕亚洲精品2页| 日本三级欧美三级| 99爱视频精品免视看| 五月天福利视频| 黄片一区二区三区| 欧美国产精品不卡在线观看 | 国产成人精品18| 国产福利微拍精品一区二区| 免费国产无遮挡又黄又爽| 好吊妞欧美视频免费| 国产一在线| www.91在线播放| 亚洲欧洲国产成人综合不卡| 黄色三级毛片网站| 五月天久久婷婷| 国产成人精品高清不卡在线| 国产欧美另类| 国产一区亚洲一区| 4虎影视国产在线观看精品| 亚洲永久色| 欧美午夜视频在线| 亚洲人精品亚洲人成在线|