freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

視頻監(jiān)控系統(tǒng)研究與畢業(yè)設計(編輯修改稿)

2025-07-19 17:05 本頁面
 

【文章內容簡介】 和視頻傳輸的基礎。本監(jiān)控系統(tǒng)由多個功能模塊構成,視頻服務器主要涉及到三部分功能,一部分是基于V4L2的圖像采集,一部分是建立嵌入式Web服務器,設計CGI程序,實現用戶遠程通過Web頁面控制視頻采集傳輸的功能,另外部分是建立視頻數據庫。本章主要對Linux下采用V4L2標準的USB攝像頭驅動程序的圖像采集過程進行介紹,同時建立視頻數據庫,以便瀏覽器端對圖像數據操作。3.1 基于V4L2的視頻采集模塊設計V4L(Video for Linux)是在linux內核中關于視頻設備的API接口,涉及開關視頻設備、采集并處理視頻圖像信息。V4L2(Video for Linux Two)是V4L接口標準的改進版本,修復了第一代的部分設計bug。,V4L2就被集成到了內核里。V4L2是音頻、視頻和其他輸出設備的內核接口。與V4L相比,它的擴展性和靈活性都得到了極大的提高,并且支持的硬件設備也更多,但由于它對V4L做了徹底的改造,使得它與V4L并不兼容.USB攝像頭在Linux中屬于字符設備,成功加載了USB攝像頭驅動程序后,插入攝像頭就會生成設備文件“/dev/video()”。因此,在應用程序中通過讀寫該文件取得攝像頭采集的圖像數據。對于USB口攝像頭,其驅動程序中需要提供基本的I/O操作接口函數open()、read()、write()、close()的實現,對中斷的處理實現,內存映射功能以及對I/O通道的控制接口函數ioctl()的實現等,并把它們定義在struct file_operations中。這樣當應用程序對設備文件進行諸如open()等系統(tǒng)調用操作時,Linux內核將通過file operations結構訪問驅動程序提供的函數。 V4L2視頻采集的數據結構在Linux系統(tǒng)的/usr/include/linux/videodev2.h中定義了v412常用的數據結構:struct v4l2_requestbuffers reqbufs。 //向驅動申請幀緩沖的請求,里面包含申請的個數struct v4l2capability cap。 //這個設備的功能,比如是否是視頻輸入設備struct v4l2_input input; //視頻輸入struct v4l2_standard; //視頻的制式,比如PAL,NTSCstruct v4l2_format fmt: //幀的格式,比如寬度,高度等struct v412_buffer buf。 //代表驅動中的一幀v4l2_std_id stdid。 //視頻制式,例如:V4L2_STD_PAI_Bstruct v4l2_querytrl。 //查詢的控制struct v4l2_control control。 //具體控制的值 V4L2視頻采集的流程Linux下基于V4L2 :初始化攝像頭打開視頻設備開始讀設備信息讀取映射buffer信息建立內存映開始一幀的圖像截取處理一幀圖像 編碼,拷貝到其他緩沖區(qū)等操作等待一幀結束是否結束視頻結束具體的視頻采集主要步驟為:1)打開視頻設備在Linux中,把視頻設備看作設備文件,即/dev,video0。通過調用open()函數來實現,open()函數帶有三個參數,第一個為設備文件名,第二個則是打開的類型。用非阻塞模式打開攝像頭設備:int cameraFd;cameraFd=open(“/dev/video0”,O_RDWR |O_NONBLOCK,O);如果用阻塞模式打開攝像頭設備,則:cameraFd=open(“/dev/video0”,O_RDWR,0);應用程序能夠使用阻塞模式或非阻塞模式打開視頻設備,如果使用非阻塞模式調用視頻設備,即使尚未捕獲到信息,驅動依舊會把緩存(DQBUFF)里的東西返回給應用程序。2)設定屬性及采集方式打開視頻設備后,可以設置該視頻設備的屬性,例如裁剪、縮放等。這一步是可選的。在Linux編程中,一般使用ioctl函數來對設備的I/O通道進行管理:Extem int ioctl(int_fd,unsigned long int_requst,...)_THROW。_fd:設備的ID,例如剛才用open函數打開視頻通道后返回的camer Fd。 _request:具體的命令標志符。在進行V4L2開發(fā)中,一般會用到以下的命令標志符:VIDIOC_REQBUFS:分配內存VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的數據緩存轉換成物理地址VIDIOC_QUERYCAP:查詢驅動功能VIDIOC_ENUM_FMT:獲取當前驅動支持的視頻格式VIDIOC_S_FMT:設置當前驅動的頻捕獲格式VIDIOC_DQBUF:把數據放回緩存隊列VIDIOC_STREAMON:開始視頻顯示函數VIDIOC_STREAMOFF:結束視頻顯示函數VIDIOC_QUERYSTD:檢查當前視頻設備支持的標準,例如PAL或NTSC。這些IO調用,有些是必須的,有些是可選擇的。①查當前視頻設備支持的標準在亞洲,一般使用PAL(720x576)制式的攝像頭,而歐洲一般使用NTSC(720x480),使用VIDIOC_QUERYSTD來檢測:v412_std_id std;do{ret=ioctl(fd,VIDl0C_QUERYSTD,amp。std);}wllile(ret==1amp。amp。errno==EAGAIN)。switch(std){case V4L2_STD_NYSC:case V4L2_STD_PAL:}②捕獲格式當檢測完視頻設備支持的標準后,還需要設定視頻捕獲格式:struct v4l2_format fmt;memset(amp。fmt,0,sizeof(fmt));=V4L2_BUF_TYPE_VIDEO_CAPTURE;=720;=576;=V4L2_PIX_FMT_YUYV。=V4L2_FIELD_INTERLACED。if(ioctl(fd,VIDIOC_S_FMT,amp。fmt)==1){returnl;}v4l2_format結構體定義如下:struct v4l2_format {enum v412_buf_type ; ∥數據流類型,必須永遠是∥v4L2_BUF_VIDEO_CAPTURE union{struct V412_pix_format pix;struct V412_window win;struct V412_vbi_format vbi;_u8 raw_data[200]; }fmt。};struct v412_pix_format{_u32 width; //寬,必須是16的倍數_u32 height; //高,必須是16的倍數_u322 pixelformat;//視頻數據存儲類型,例如是YUV4:2:2還是I沁Benum v412_field field;_u32 bytesperline;_u32 sizeimage;enum v4l2_colorspace colorspace;_u32 priv;};③分配內存視頻捕獲分配內存:struct v412_requestbuffers req;if(ioctl(fd,VIDIOC_REQBUFS,amp。req)== 1){return 1。}v412_requestbuffers定義如下:struct V412_requestbuffers{_u32 count。 //緩存數量,也就是說在緩存隊列里保持多少張照片enum v412_buf_type type; //數據流類型,必須永遠是//V4L2_BUF_TYPE_VIDEO_CAPTUREenum v412_memory memory; //V4L2_MEMORY_MMAP或//V4L2 MEMORY_USERPTR_u32 reserved[2];};④獲取并記錄緩存的物理空間使用VIDIOC_REQBUFS,下一步通過調用VIDIOC_QUERYBUF命令來獲取這些緩存的地址,然后使用mmap函數轉換成應用程序中的絕對地址,最后把這段緩存放入緩存隊列:080000005080000000080000001080000002080000003080000004010000004010000003010000002010000001010000000010000005VIDIOC_QUERYBUFmmap內核地址用戶地址⑤視頻采集方式操作系統(tǒng)一般把系統(tǒng)使用的內存劃分成用戶空間和內核空間,分別由應用程序管理和操作系統(tǒng)管理。應用程序可以直接訪問內存的地址,而內核空間存放的是供內核訪問的代碼和數據,用戶不能直接訪問。v412捕獲的數據,最初是存放在內核空間的,這意味著用戶不能直接訪問該段內存,必須通過某些手段來轉換地址。Linux系統(tǒng)下有三種視頻采集方式:使用read、write方式,mmap內存映射方式和用戶指針模式。read、write方式: 通過內核緩沖區(qū)來讀取數據,在用戶空間和內核空間不斷拷貝數據,占用了大量用戶內存空間,效率不高。mmap內存映射方式:mmap系統(tǒng)調用使得進程之間通過映射同一文件實現內存共享,訪問時只需要指針而不用調用文件操作函數。通過把設備文件映射到內存中,加速了I/o訪問。這是一種有效的方式。上面的mmap函數就是使用這種方式。用戶指針模式:內存片段由應用程序自己分配。這點需要在v412_ requestbuffers里將memory字段設置成V4L2_MEMORY_USERPTR.因此,本文在程序實現中采用了內存映射方式截取視頻圖像樣,捕獲到的視頻數據被映射到內存區(qū)域,該映射內容區(qū)可讀寫并且可供不同進程共享。要對視頻數據進行壓縮等處理工作則可通過訪問內存映射區(qū)域進行。3)處理采集數據V4L2有一個數據緩存。數據緩存采用FIFO的方式,當應用程序調用緩存數據時,緩存隊列將最先采集到的視頻數據緩存送出,并重新采集一張視頻數據。這個過程需要用到兩個ioctl命令,VIDIOC_DQBUF和VIDIOC_QBUF:struct v412_buffer buf。memset(amp。buf,O,sizeof(buf));=V4L2_BUF_TYPE_VIDEO_CAPATURE;=V4L2_MEMORY_MMAP;=0://讀取緩存 if(ioctl(cameraFd,VIDIOC_dqbuf, amp。buf)== 1){return1;}//????視頻處理算法//重新放入緩存隊列if(ioctl(cameraFd,VIDIOC_QBUF,amp。buf)==1){returnl;}4)關閉視頻設備使用close函數關閉一個視頻設備:close(cameraFd);本課題的視頻采集圖像效果。3.1.3視頻數據的存儲由于保存文件是保存在USB硬盤上,也就是需要不停的讀寫I/O設備,這樣的操作需要耗費大量的時間和資源,因此保存視頻文件模塊也是利用一個單獨線程來實現以提高程序的執(zhí)行效率。對于用戶而言,存儲的圖像能達到記錄的目的即可,對連續(xù)性的要求并不高,所以本系統(tǒng)以約10幀/秒的速度進行存儲,以此達到節(jié)省存儲空間的目的。存儲速率的控制是通過定時器來完成的。同樣,此功能模塊也有自己的循環(huán)緩沖區(qū)存放壓縮后的視頻數據,該線程不斷從該緩沖區(qū)讀取JPEG數據,通過調用avilib庫的相關函數把這些視頻數據保存為avi格式的文件。對于“avi格式文件,目前大多數播放器都能播放該格式的視頻文件。3.2視頻編碼通過USB攝像頭獲取的視頻圖像數據量較大,而網絡帶寬有限,不適合網絡實時傳輸,為了使視頻圖像在現有的網絡上有較高的傳輸速率和較好的視頻質量和有效的存儲視頻數據,需要將原始的視頻圖像進行壓縮編碼。3.2.1視頻編碼技術的選擇傳統(tǒng)的視頻壓縮編碼都是以香農信息論為基礎,用統(tǒng)計概率模型來描述信源,編碼實體是像素或像素塊。這種基于數理統(tǒng)計、旨在消除視頻數據相關冗余的編碼技術被稱為第一代視頻編碼技術,JPEG、MPEG。第一代視頻編碼技術沒有考慮接受者特性、視頻信息的重要程度和具體含義,只是以去除數據的冗余為出發(fā)點,是一種較低層次的編碼技術。由此,出現了基于內容的第二代視頻編碼技術,它是以去除視頻內容的冗余為出發(fā)點,在視頻編碼時充分考慮了人眼的視覺特性影像。目前監(jiān)控中主要采用MJPEG、MPEG1/MPEG4(SP/ASP)、。用戶關心的主要要素有:清晰度、存儲量(帶寬)、穩(wěn)定性和價格。1)MJPEGMJPEG(Motion JPEG)壓縮技術,主要是基于靜態(tài)視頻壓縮發(fā)展起來的技術,它的主要特點是基本不考慮視頻流中不同幀之間的變化,只單獨對某一幀進行壓縮。MJPEG壓縮技術可以獲取清晰度很高的視頻圖像,可以動態(tài)調整幀率、分辨率。但由于沒有考慮到幀間變化,造成大量冗余信息被重復存儲,因此單幀視頻的占用空間較大,目前流行的MJPEG技術最好的也只能做到3K字節(jié)/幀,通常要8~20K。2)MPEG1/2MPEGl標準主要針對SIF標準分辨率(NTSC制為352x240;PAL制為352x288)的圖像進行壓縮.壓縮位率主要目標為1.5Mb/S.較MJPEG技術,MPEGI在實時壓縮、每幀數據量、處理速度上有顯著的提高。但MPEGl也有較多不利地方:存儲容量還是過大、清晰度不夠高和網絡傳輸困難。MPEG2在MPEG.1基礎上進行了擴充和提升,和MPEG.1向下兼容,主要針
點擊復制文檔內容
試題試卷相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1