1。第一回使用Opencv的目的是爲了能採集筆記本的視頻,想要做一個視頻聊天的軟件,大概思路是採集到的碼流轉成H.264,然後再加上轉成TS或者PS通過RTP協議或者RTP在TCP上來發送給另外一個用戶,另一個用戶收到視頻流後,反向得到碼流,然後顯示到軟件上,最終實現視頻聊天的目的。
2.最簡單的代碼如下:
首先定義一個採集的類對象VideoCapture inputVideo(0);
下面是顯示部分,通過一個MFC的定時器,定時40ms來觸發一次,最終在界面上顯示,大概是1000/40ms=25幀,一秒25幀的數據。
void CMFCApplication1Dlg::OnBnClickedButton1()
{
SetTimer(1, 40, NULL);
return;
}
void CMFCApplication1Dlg::OnBnClickedButton2()
{
KillTimer(1);
}
void CMFCApplication1Dlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息處理程序代碼和/或調用默認值
Mat src;
inputVideo >> src;
if (src.empty()) return;
imshow("view", src);
CDialogEx::OnTimer(nIDEvent);
}
最終就能出來視頻了。大概界面效果如下:(比較宅,不曬本人照片了)在學習調用opencv的過程中瞭解到下面的東西:
opencv是個圖像處理庫,它封裝了大量圖像處理算法,與視頻採集沒有關係,但這個庫的使用者爲了方便,把VFW(Video for windows)也集成到了opencv,已達到視頻採集和圖像處理的封裝到一起的目的;
而DirectShow是微軟公司在VFW的基礎上推出了新一代基於COM的流媒體處理的開發包,在視頻開發中,不論從效率還是實用性上都好於VFW。
編碼,解碼 把圖像編製成視頻流,或把視頻流解碼成圖像的算法,H.264只是其中的一種,比較常用的編碼器還有VCD,DVD,MEEG4,不過爲了在網上傳輸,H.264算法基本已成爲一種趨勢了,它主要特點是編碼後視頻文件小而清晰;使用264通常可以使用現成封裝好的庫,同264庫,也有好多種,有免費的,有收費的,也可以自己寫,不過好像很難,沒必要。
發送端:
directshow--》從攝像頭採集圖像--》發送h。264編碼器壓制成視頻文件--》網絡傳輸--》接收端
接收端:
directshow-》從網絡採集圖像--》通過H。264編碼器在本地播放視頻或保存視頻。
directshow是由大量的fileter構成的,如果只是採集,通現成的fileter即可。
opencv簡介:
Opencv(Open Source Computer Vision Library)是一個基於(開源)發行的跨平臺計算機視覺庫,可以運行在Linux,Windows,android,ios等操作系統上,它輕量級而且高效--由一系列C語言和少量C++類構成,同時提供了Python,Ruby,MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的諸多通用算法。
【calib3d】--Calibration和3D,相機校準和三維重建相關
【contrib】--新增人臉識別,立體匹配,人工視網膜模型等技術
【core】--核心功能模塊,包含Opencv基本數據結構和繪圖函數等
【imgproc】--Image/Process,包含濾波,幾何變換,直方圖相關,特徵檢測,運動分析和形狀描述等
【features2d】--2D功能框架,主要包含特徵檢測和描述及接口
【Flann】--高維的近似金鄰快速搜索算法庫
【gpu】--運用GPU加速的計算機視覺模塊
【highgui】--高層圖形用戶界面,包含媒體輸入輸出,視頻捕獲,圖像和視頻的編碼和解碼,圖形交互界面接口等
【legacy】--包含運動分析,平面細分,描述符提取等
【ml】--Machine learning,機器學習模塊
【objdetect】--目標檢測模塊
【photo】--包含圖像修復和圖像去噪兩部分
【。。。。】