Camera Vision - video surveillance on C#
http://www.codeproject.com/KB/audio-video/cameraviewer.aspx
?
?
開發的資源?
介紹:
縱觀當今的監控系統的發展趨勢,能很容易發現基于IP的解決方案正在迅速的普及。有許多的制造商,提供廣泛的IP視頻射像和視頻服務器,意味著個人的IP射像監控系統正在普及。更進一步,許多公司提供將CCTV視頻監控制系統轉換成基于IP的系統的解決方案,鞏固現有的設備和構造。對于這些公司提供的不僅是硬件設備,還有軟件,有許多其它公司針對于IP視頻監控系統的軟件開發,為小型企業提供完整的解決方案,同時也對個人提供這類服務。
在這里,我將分享一些關于我用各種IP射像頭和視頻服務器進行相關開發的經驗。提供的信息是關于如何用程序來使用射像頭,對于個人來說可能只是一個簡單的程序,或其他更加復雜的程序或直接和一些視頻監控軟件進行工作。
作為演示程序,我使用了C#,它允許射像頭和多射像頭一樣的同時進行拍攝。該程序允許同步成像,不僅是幾個視頻服務器上的幾個射像頭,而且允許許多不同的種類的射像頭在同一時刻進行拍照。該程序支持的視頻資源是:
不斷更新JPEG圖片資源;
MJPEG(動態JPEG)視頻流;
一些Axis射像頭和視頻服務器(205, 206, 2100, 2110, 2120, 2130R, 2400, 2401, 2460);?
D-Link射像頭(僅支持JPEG);
Panasonic射像頭;
PiXORD射像頭;
StarDot射像頭(NetCam, Express 6);?
本地設備,可以支持DirectShow;
MMS (Microsoft Media Services)流;
IP射像頭是什么?
IP射像頭的特征是可以提供數字信號輸出,并可以直接連接在以太網上通過IP網絡進行各種操作。為了達到這個目的,IP射像頭不僅擁有射像頭,而且還需要一臺計算機,通常運行的是Linux。計算機的意圖是:
將圖象壓縮成數字圖象(一些射像頭/服務器 處理CUP外還擁有一個附加的微型壓縮處理器);
可以通過IP網絡訪問圖片(通常這些射像頭運行在服務器之上,其不只提供訪問數字圖象的功能,而且還可以通過HTTP來設置射像頭的參數)。
視頻服務器是非常復雜的設備,通常不帶射像頭。而是會和若干個視頻輸入連接設備連接(一般是1到6個),用戶可以連接各種射像頭。作為IP射像頭,視頻服務器也將射像頭圖象轉換成數字圖象并通過網絡提供訪問。另外提供建立視頻黨案的選項(基于這些原因,視頻服務器作為一種硬件設備)。
實際上通過網絡來訪問射像頭和服務器是非常有用的。它允許監控不僅是在你安裝了射像頭的區域中,而且還允許在世界上所有使用監控軟件并擁有IP功能的地點進行監控,象瀏覽器(如以下圖片)。象在工作站上工作,或是PDA或其他的手提電話。IP視頻方案不僅僅使用在監控和視頻備案方面。這種射像頭/服務器的視頻輸出技術可以方便的和許多軟件綜合在一起:
動態勘測/跟蹤(基于完整的視頻框架,或相關領域);
交通控制和圖形識別
跟蹤行人并識別身份;
等。
視頻格式:
最簡單的視頻格式,幾乎所有的射像頭/服務器都能支持,不應該只被稱為一種視頻格式。該格式僅是通常的JPEG格式。許多射像頭允許通過一個URL來訪問一個圖片(由射像頭的制造商備案的)。例如,一個Axis的射像頭允許通過以下URL來訪問一個圖象:http://webcam.mmhk.cz/axis-cgi/jpg/image.cgi。
這種功能有優點也有缺點。缺點是每當你想射像頭服務器發送一個HTTP請求就可以得到一張當前圖象的圖片,由于一些附加數據會損失一些時間(如HTTP頭)。優點是監控軟件可以方便的控制自身最大數量的刷新率--可以用任意速度訪問URL來得到下一禎(每秒或每分鐘15次,如果網絡和射像頭的速度允許)。
第二種流行的格式是MJPEG(動態JPEG)。這種格式不僅僅是下載一張JPEG的圖片,而是一個JPEG的流。對一個普通的JPEG格式,客戶軟件發送HTTP請求到一個指定的射像頭URL,如:http://146.176.65.10/axis-cgi/mjpg/video.cgi。但是。在這里射像頭將不只是返回一個單一的JPEG,而是一個帶有JPEG格式界定的流,該流有HTTP的頭標記。當客戶不想繼續得到視頻數據時將關閉和射像頭的連接。
MJPEG方式看上去很不錯,因為它有個明顯的優點--發送HTTP請求就一次并且可以連續的從射像頭接受數據。但是用這種方式,你不能方便的控制刷新率。訪問一個MJPEG網址,你的射像頭將給你一系列預先定義的刷新率。如果你想改變,你需要在URL中增加一些額外的參數。這聽起來不是問題,但是實際上,這樣會導致一些問題。我先解釋一個最普遍的問題。假設你向射像頭要求(或默認設置)15個FPS。但是,碰巧,在你和射像頭之間的某處速度減慢而使FPS下降為5。假設你的射像頭有30禎的緩沖區,這樣你的射像頭每2秒處理30禎,,但是你在6秒鐘內處理完它們,這意味著你將在4秒鐘后看到最后一禎--這通常會變的很慢。當然這只是舉例來說,射像頭會不停刷新緩沖,或做一些其它的事來避免這類等待。但是,我確實遇到過一件事。某人一次進入一個有射像頭的屋子,在那呆了一會,然后去了另一間屋子,并在監控程序上看到了他自己的畫面(該程序是由射像頭制造商提供的)。
許多型號的射像頭支持除了JPEG和MJPEG以外的格式。有的支持MPEG-2,還有的支持MPEG-4。當然,一些射像頭不只支持視頻,同時也支持聲音,并且是雙向的。
說的更多一點,談一下關于訪問一些射像頭--訪問單一的JPEG禎,和MJPEG流(MPEG格式也介紹了)。更多的射像頭制造商提供了API和SDK,你可以在他們的網站上了解更多有關的信息。
訪問JPEG和MJPEG:
從一個JPEG資源(射像頭)顯示數據是很簡單的--你只需要向射像頭建立HTTP請求,下載返回的數據,解壓成位圖文件。這里有一個從IP射像頭快速獲得一個JPEG禎的例子:
string sourceURL = "http://webcam.mmhk.cz/axis-cgi/jpg/image.cgi";
byte[] buffer = new byte[100000];
int read, total = 0;
//建立HTTP請求
HttpWebRequest req = (HttpWebRequest) WebRequest.Create( sourceURL );
//得到響應
WebResponse resp = req.GetResponse( );
//得到響應流
Stream stream = resp.GetResponseStream( );
//讀取流數據
while ( ( read = stream.Read( buffer, total, 1000 ) ) != 0 )
{
??? total += read;
}
//得到位圖
Bitmap bmp = (Bitmap) Bitmap.FromStream(?
????????????? new MemoryStream( buffer, 0, total ) );
But, don't forget that most cameras are not free with open access like in the sample above. Most probably, you will want to protect your camera with a password, which should be specified somehow:?
不要忘記許多射像頭不是向以上代碼中那樣可以自由訪問的。通常是,你將用密碼保護你的射像頭,這將不知不覺被指定:
//建立HTTP請求
HttpWebRequest req =?
?? (HttpWebRequest) WebRequest.Create( sourceURL );
//設置登陸和密碼
req.Credentials = new NetworkCredential( login, password );
...
訪問MJPEG資源是很復雜的。首先,我們先看一下響應目錄類型。如下:
multipart/x-mixed-replace; boundary=--myboundary
也許,他們看上去并不一致,但是它們的類型是多部分/混合拼成,并有明顯的分界。這里分界符是"--myboundary"。現在看一個實際的流數據:
--myboundary
Content-Type: image/jpeg
... image binary data ...
--myboundary
Content-Type: image/jpeg
... image binary data ...
--myboundary
Content-Type: image/jpeg
...
將全部總結一下,訪問MJPEG資源的步奏已經很清晰了:
解析響應目錄類型分解為指定值;
讀取流的初始部分,搜索第一個分界;
讀取分界的值,然后是下個分解;
解壓圖片到緩沖區中;
處理圖片(顯示,或其它);
繼續重復3-5步。
事實上,訪問一個MJPEG資源的思路并不象開始我講的那么復雜,但是處理起來也不是象處理JPEG資源那么容易。
Axis射像頭和視頻服務器:
Axis射像頭和視頻服務器看上去是我遇到的最好的IP視頻射像頭。從用戶的觀點上看,這些射像頭提供了很好的視頻質量和刷新率,并且安裝和設置簡單。從開發者的角度來看,這些設備是比較不錯的--這家公司是我遇到的在IP射像頭方面提供最好的開發文黨的。公司提供了完整的文黨和用HTTP訪問射像頭的SDK。
以下是訪問Axis IP 射像頭/服務器端的JPEG和MJPEG流的URL:
JPEG:
http://<servername>/axis-cgi/jpg/image.cgi
MJPEG:
http://<servername>/axis-cgi/mjpg/video.cgi
兩個URL是允許一些參數的,會影響顯示效果。最普通的參數是定義(指定視頻輸出的大小),射像頭(指定視頻服務器上的射像頭數量),刷新率(只在MJPEG時):
Samples:
http://<servername>/axis-cgi/jpg/image.cgi?resolution=320x240
http://<servername>/axis-cgi/mjpg/video.cgi?camera=2
http://<servername>/axis-cgi/mjpg/video.cgi?camera=2&des_fps=5
獲得完整的HTTP API 和所有參數的列表,向Axis的網站提交請求。
StarDot 射像頭和視頻服務器:
看上去StarDot 射像頭和視頻服務器沒有提供廣泛的IP射像頭和視頻服務器,并且近兩年也沒變化。他們現有的全部是一個IP射像頭的模型和一個視頻服務器的模型。對于我來說,認為它們只有一個優點就是可以將對射像頭的支持提高的6個。其它方面和Axis比沒有任何競爭力。例如,刷新率非常的低(對于安全性沒保障)并且射像頭不支持MJPEG。相關開發人員的評論也很少。
U訪問他們產品的URL格式很簡單:
StarDot NetCam:
http://<servername>/netcam.jpg
StarDot Express 6 (video server)
http://<servername>/jpeg.cgi?<cameranumber>
http://<servername>/jpeg.cgi?3???????
PiXORD射像頭:
PiXORD的產品由各種不同模型的IP射像頭組成,看起來確實是個不錯的射像頭,提供很好的質量和刷新率并支持MJPEG流。公司提供產品的SDK,但必須用戶注冊后才能得到。
以下是訪問他們IP射像頭的URL格式:
JPEG:
http://<servername>/images<channel><resolution>
http://<servername>/images1sif
MJPEG:
http://<servername>/getimage?camera=<channel>[&fmt=<resolution>][&delay=<delay>]
http://<servername>/getimage?camera=1&fmt=sif&delay=10
Panasonic射像頭:
我沒過多的接觸Panasonic射像頭,只是在網上找到幾個射像頭,你也可以在提供的例子中找到。
訪問Panasonic射像頭的URL格式:
JPEG:
http://<servername>/SnapshotJPEG[?Resolution=<resolution>][&Quality=<quality>]
http://<servername>/SnapshotJPEG?Resolution=320x240&Quality=Standard
MJPEG:
http://<servername>/nphMotionJpeg[?Resolution=<resolution>][&Quality=<quality>]
http://<servername>/nphMotionJpeg?Resolution=320x240&Quality=Standard
At this moment, I know only one way to access D-Link cameras (JPEG format):
D-Link射像頭:
D-Link的IP視頻射像頭范圍很廣,并且是第一個開始在射像頭上使用MPEG-4的公司。事實上,這些射像頭是把MPEG做為首要應用的-不再支持其他類型。其中他們的大部分射像頭支持聲音處理,一些甚至支持雙向處理。從用戶的觀點來看,非常容易安裝和設置。支持很多的設置。從開發者的角度來看,這些射像頭并不容易使用。公司不希望共享大部分的開發資料,也很難找到一些開發者的資料。這使得開發一些用戶自己的監控軟件變的非常困難。另外,之前我提到的某人從一個房間進入另一個房間看見自己圖象的用的就是D-Link射像頭。
訪問D-Link射像頭(JPEG格式)的URL:
http://<servername>/cgi-bin/video.jpg
其它一些視頻資源:
很多其它的視頻資源可以用HTTP以外的方式訪問。比如,可以方便的訪問一個本地網絡射像頭通過USB端口,或遠程訪問視頻流通過MMS(Microsoft Media Services)。最一般的方式用來訪問這兩類視頻資源使用的是DirectShow。事例代碼使用的就是這種技術,你可以在別的文章里了解更多內容。
程序代碼:
程序的主要意圖是使其具有靈活性和擴展性。程序本身可以和任何視頻資源通信-可能是IP射像頭或是服務器。可以是本地USB射像頭,可以是遠程服務器的MMS視頻流,或是其它的視頻資源。該程序可以同時和這些資源進行工作,在屏幕上顯示。
另一個主要的特征是可以擴展功能。主程序模塊不知道任何視頻資源和如何定義它們;只知道怎樣顯示它們。全部特殊視頻資源的通信邏輯隱藏在不同的幾個模塊中,并且程序并不緊密的將他們連接在一起。如果你有一個新的視頻資源,并且你想要程序和其一起工作,你不需要改變任何程序本身的代碼。只是建立一個新的模塊并建立和視頻資源的響應就可以了,然后將模塊放置到程序的文件夾里。
處理該問題的關鍵是建立一個描述所有視頻資源功能的類。該類就是IVideoSource。然后,在類中建立成員并封裝所有和特殊視頻資源通信解壓縮圖片的命令。為程序提供每個類的圖表,帶的代碼不是程序的代碼,但是可以分別編譯,提供給程序模塊,可以方便的加到程序中來擴展其功能。
每個視頻資源模塊包含了一個所提供視頻的確定數字--類提供訪問視頻資源。大多數模塊包含僅視頻源,但其中一些擁有幾個--可能提供組視頻(所有視頻源訪問同一個制造商的射像頭/服務器規定到同一個模塊中,例如)。
所有這些視頻源可以作為完整的類,用來在程序中訪問不同的視頻資源。但仍然有兩個被遺忘的事情,使其具有擴展性和可配置性。首先,我們的視頻源應該有自我描述性和自我配置性。出于該目的,兩個類添加進來:IVideoSourceDescription 和 IVideoSourcePage。每個類,擁有成員,提供名稱和對資源的描述,允許保存和調用配置和對視頻資源的建立過程。IVideoSourcePage的成員提供了一個屬性頁以便對視頻資源進行配置。這些增加的類同樣和視頻資源模塊想聯系。將所有包裝到一起成為一個最簡單的模塊,包含僅一個視頻資源,應該包含三個類:資源描述,資源定義,和視頻自身處理。
最后使起工作還是要落實在程序方面--程序可以找到所有模塊并搜集所有關于視頻資源的信息。實際上通過鏡像可以輕易完成。首先,程序搜索所有的程序文件夾中DLL文件。然后,試圖作為匯編和媒舉調用每個文件,搜索IVideoSourceDescription 類成員的類型。一旦一個類型被發現,將提供視頻資源的名稱,描述和相關信息。該模塊的計算過程只在程序開始時調用一次,但程序可以方便的修改,用戶也可以調用該過程(如果用戶方便的添加一個新的視頻模塊,而不需要重新啟動程序)。
一些低層技術:
.NET1.0和1.1的framework存在BUG,事實上并不是BUG,而是一個特征。但該特征導致了很大的問題,在MJPEG模式下和射像頭進行通訊時。這個問題是一些MJPEG視頻資源不會100%確認HTTP。如果說句不好聽的--微軟太吹毛求疵,在他們的早期的framework版本中過分的對HTTP協議強調標準了。一些射像頭稍微丟失了一些HTTP頭信息,.NET立刻拒絕繼續工作,并包出網絡異常,如下:
The underlying connection was closed:?
??? The server committed an HTTP protocol violation.
幸運的是,這只是.NET的一個特征,以后可能會糾正。首先,你至少要用1.1的版本并安裝第一個服務包。然后,你再建立一個程序配置文件,并將其放到程序文件夾里。以下是一個使MJPEG資源工作的最小環境:
<configuration>
??? <startup>
??????? <supportedRuntime version="v1.1.4322" />
??? </startup>
??? <system.net>
??????? <settings>
??????????? <httpWebRequest useUnsafeHeaderParsing="true" />
??????? </settings>
??? </system.net>
</configuration>
另一個問題是.NET的HttpWebRequest類有一個作為連接組的特征。默認時,所有HTTP請求是建立在相同的連接組中的,但是每個連接組有一個并發連接的限制。所以,這就有個大問題,你不能同時監控制很多的射像頭。好消息是問題也可以方便的解決--HttpWebRequest類有一個屬性ConnectionGroupName,你可以安排你自己的連接組。
結論:
綁定程序演示了所有技術,允許監控很多不同的射像頭。程序允許你監控一個單一的射像頭,或在一個屏幕上監控幾個射像頭(在全屏下)。請不要把該程序作為一個完整的監控程序系統,著只是一個演示。是為了明白概念,但可以做為你自己程序的一個起點。盡管該程序可能出于個人原因而被使用。
你可以去找一些另外的這類程序代碼,同樣也是監控方面的 ,同樣基于我在這里介紹的技術。
演示程序包含了許多自由射像頭:Las Vegas, Stuttgart Airport,還有其它很多。你可以容易的發現更多方便訪問的射像頭,將它們添加到程序里,看看能不能監控。?
轉載于:https://www.cnblogs.com/xyzlmn/archive/2010/12/13/3168219.html
總結
以上是生活随笔為你收集整理的Camera Vision - video surveillance on C#的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国银行无限信用卡申请条件 并没有想象中
- 下一篇: 特斯拉碰撞起火受伤!林志颖已转到普通病房