1. 程式人生 > >OpenCV關於視訊處理的學習(VideoCapture類)-在檢測中一些必要的影象操作

OpenCV關於視訊處理的學習(VideoCapture類)-在檢測中一些必要的影象操作

前言知識

在OpenCV中我們處理視訊是先將視訊儲存成影象,然後再處理影象,將處理完的影象再生成視訊這樣子操作的。但是OpenCV中常見的影象操作有關容器有Mat,cvMat,IplImage等。在這些中,我們在選擇的時候應該將哪一種作為處理影象的容器呢?
- Mat型別較CvMat與IplImage型別來說,有更強的矩陣運算能力,支援常見的矩陣運算。Mat型別側重於計算,數學性高,OpenCV對Mat型別的計算也進行了優化。在計算密集型的應用當中,將CvMat與IplImage型別轉化為Mat型別將大大減少計算時間花費。
- CvMat和IplImage型別更側重於“影象”,OpenCV對其中的影象操作(縮放,單通道提取,影象閾值操作等)進行了優化。
- CvMat和IplImage的定義是結構體,而Mat的定義是類。從型別上就使得他們有很大的區別。結構體大多都是成員變數,而類中有成員變數、成員函式和過載函式。所以Mat利用自身的一些成員函式就可以進行很多的處理,但是CvMat和IplImage還需要一些輔助的函式去處理圖片。

接下來再簡單看一下如何初始化定義這三種類型的影象。
- Mat

Mat image = imread(const string& filename, intflags = 1);
  1. 這裡第一個引數需要我們填寫載入圖片的名字,如果圖片跟程式檔案不在同一個資料夾下還需要加入圖片的路徑。
  2. 第二個引數定義的是指定一個載入影象的顏色型別。取0時為灰度圖;取1時為彩色影象;取2時,若載入的影象的深度為16位或者32位,就返回對應深度的影象,否則,就轉換為8點陣圖像再返回;取4時,代表保持顏色通道不變。

    • CvMat
CvMat* image = cvCreateMat(int
rows, int cols, int type);
  • IplImage
IplImage* image = cvLoadImage(const char* filename, int iscolor = 1)
  1. 第一個引數還是讀取圖片的名字。
  2. 第二個引數讀取圖片的方式,而其中每個方式所定義的數字與imread相同,如果觀察原始碼不難發現,其實cvLoadImage在使用時呼叫了imread函式。

這裡需要注意一點,當使用完定義的CvMat和IplImage時,得需要分別使用cvReleaseImage(&image)、cvReleaseMat(&image)將其所佔用的記憶體給釋放。

相關基礎知識學習

我們在檢測的過程中,需要對檢測目標進行框選,這個時候就需要用到OpenCV中畫矩形的函式,下面介紹一下這兩個函式
- cvRectangle

void cvRectangle(CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness = 1, int line_type=8, int shift=0)

引數介紹:
1. img 需要輸入的影象,這裡需要是由IplImage或CvMat所定義的影象。
2. pt1 矩形的一個頂點。
3. pt2 矩形對角線上的另一個頂點。
4. 由CvScalar所定義的color顏色,CvScalar是一個可以用來存放4個double數值的陣列。如果是三維陣列則為彩色線條,如果是一維陣列則是灰度影象。
5. thickness是組成矩形線條的粗細程度。如果取-1的話會將矩形框填充滿所取的顏色。
6. line_type邊框的線型(8-8鄰接連線線,4-4鄰接連線線,CV_AA-antialiased線條),不過這三種線條在畫出來之後基本看不到什麼區別,一般預設用8.
7. shift-座標點的小數點位數。
- rectangle

void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
void rectangle(Mat& img, Rect rec, const Scalar& color, int thickness=1, int lineType=8, int shift=0)

rectangle裡面的引數跟上面所講的基本一樣,只是這裡面需要注意輸入的圖片得是由Mat定義的即可,除了直接輸入矩陣對角線的兩個點之外,也可以通過Rect進行定義

再畫出檢測框之後,我們還需要顯示出目標的類別,這就需要我們使用putText函式在圖片上新增文字
- PutText

void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false)

引數介紹
1. img 需要將文字輸入的影象名
2. text 需要顯示的文字
3. org 文字在影象中左下角座標
4. fontFace 字型型別,可選字型(ONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_DUPLEX,FONT_HERSHEY_COMPLEX, FONT_HERSHEY_TRIPLEX, FONT_HERSHEY_COMPLEX_SMALL,FONT_HERSHEY_SCRIPT_SIMPLEX,orFONT_HERSHEY_SCRIPT_COMPLEX,以上所有型別都可以配合 FONT_HERSHEY_ITALIC使用,產生斜體效果。)一共有0——7個int數字可以選擇。
5. fontScale 字型大小,該值和字型內建大小相乘得到字型大小。
6. color 文字顏色
7. thickness 寫字的線的粗細
8. lineType 線的型別
9. bottomLeftOrigin -true時,影象資料原點在左下角. -false 影象資料原點在左上角.

正題 - VideoCapture類介紹

OpenCV將它的定義寫在了highgui.hpp檔案中,我們可以先檢視一下這個類中都定義了什麼成員函式

class CV_EXPORTS_W VideoCapture
{
public:
    CV_WRAP VideoCapture();
    CV_WRAP VideoCapture(const string& filename);  //讀取視訊檔案
    CV_WRAP VideoCapture(int device);  //開啟攝像頭,一般預設為0

    virtual ~VideoCapture();
    CV_WRAP virtual bool open(const string& filename);  //另一種新增開啟視訊檔案的方式
    CV_WRAP virtual bool open(int device);  //開啟攝像頭,一般預設為0
    CV_WRAP virtual bool isOpened() const;  //判斷視訊是否開啟
    CV_WRAP virtual void release();         //在程式結束的時候需要執行這個函式釋放記憶體

    CV_WRAP virtual bool grab();
    CV_WRAP virtual bool retrieve(CV_OUT Mat& image, int channel=0);
    virtual VideoCapture& operator >> (CV_OUT Mat& image);
    CV_WRAP virtual bool read(CV_OUT Mat& image);    //讀取視訊

    CV_WRAP virtual bool set(int propId, double value);  //讀取視訊時的一些設定
    CV_WRAP virtual double get(int propId);   // 得到所新增視訊中的大部分資訊

protected:
    Ptr<CvCapture> cap;
};

可以有兩種方式開啟視訊

1. VidoeCapture capture();  capture.open("filename");
2. VideoCapture capture("filename");

在開啟視訊之後我們就可以定義一個Mat,然後利用read函式去讀取視訊,但是在這之前還需要用set函式去設定一些引數

capture.set(CV_CAP_PROP_POS_FRAMES,0);   //設定視訊從第0幀開始讀取
Mat frame;
capture.read(frame);                     //讀取視訊的當前幀到Mat frame中
imshow("video",frame); waitKey(0);       //讀取視訊

我們還可以利用capture.get()獲得視訊中的很多資訊,下面列出一些OpenCV裡的一些巨集定義,這些都可以利用get或set成員函式來設定或獲取

#define CV_CAP_PROP_POS_MSEC 0 //以毫秒計算的當前的位置
#define CV_CAP_PROP_POS_FRAMES 1 //以幀計算當前的位置
#define CV_CAP_PROP_POS_AVI_RATIO 2 //視訊的相對位置,從0到1前面這三個引數應該是跟視訊播放,讀取相關的動態資訊
#define CV_CAP_PROP_FRAME_WIDTH 3 //幀寬
#define CV_CAP_PROP_FRAME_HEIGHT 4 //幀高度
#define CV_CAP_PROP_FPS 5 //幀率
#define CV_CAP_PROP_FOURCC 6 //4 字元編碼方式
#define CV_CAP_PROP_FRAME_COUNT 7 //視訊幀數
#define CV_CAP_PROP_FORMAT 8 //視訊格式
#define CV_CAP_PROP_MODE 9 //後端指定值指示當前捕捉的模式.
#define CV_CAP_PROP_BRIGHTNESS 10 //影象亮度 (只對攝像頭).
#define CV_CAP_PROP_CONTRAST 11 //影象對比度(只對攝像頭).
#define CV_CAP_PROP_SATURATION 12 //影象飽和度(只對攝像頭).
#define CV_CAP_PROP_HUE 13 //色調(只對攝像頭)
#define CV_CAP_PROP_GAIN 14 //增益(只對攝像頭)
#define CV_CAP_PROP_EXPOSURE 15 //曝光(只對攝像頭)
#define CV_CAP_PROP_CONVERT_RGB 16 //布林型標記影象是否應該被轉換為RGB.
#define CV_CAP_PROP_WHITE_BALANCE 17 //白平衡
#define CV_CAP_PROP_RECTIFICATION 18 //立體相機的矯正標記

相關推薦

OpenCV關於視訊處理學習(VideoCapture)-在檢測一些必要影象操作

前言知識 在OpenCV中我們處理視訊是先將視訊儲存成影象,然後再處理影象,將處理完的影象再生成視訊這樣子操作的。但是OpenCV中常見的影象操作有關容器有Mat,cvMat,IplImage等。在這些中,我們在選擇的時候應該將哪一種作為處理影象的容器呢?

學習筆記之——Opencv視訊處理模組

視訊訊號是重要的視覺資訊來源。視訊由一系列影象構成,這些影象稱為幀。幀以固定的時間間隔獲取(稱為幀速率,通常用幀/秒表示)。大多數計算機視覺方面的應用都是基於視訊來處理的,為此本博文作為Opencv視訊處理模組的學習筆記~ 幀的資料型別也是Mat。 讀取視訊序列。要從視訊序列讀取幀,只需

opencv-視訊處理--實時前景檢測-二幀差法

原視訊主要思想:通過當前幀的灰度圖(currentGrayFrame)和前一幀的灰度圖(previousGrayFrame)的差,進行畫素級的比較。符號::代表當前幀(x,y)處的灰度值:代表前一幀(x,y)處的灰度值:代表當前幀和上一幀在(x,y)處的差的絕對值如果:差值大

Python結合OpenCV視訊處理、逐幀修改圖片

前言 2015年7月畢業至今,已有三年半時間了。這麼長的時間裡,非常感激CSDN、部落格園、簡書等眾多平臺及眾多作者提供了無數的幫助。這篇文章是我的第一篇文章,一方面希望能總結、沉澱一些知識,另一方面,也希望從今天開始,能或多或少地幫助一些有需要的朋友。 背景 OpenCV中,讀

深度學習在目標檢測的應用及其tensorflowAPI實踐(二)

這系列文章的內容目錄如下: 目標檢測的任務 深度學習在目標檢測中的應用 RCNN fast RCNN faster RCNN RFCN yolo yolo V2 SSD tensorflow目標檢測API的使用 在第一篇裡說完了RCNN和fast RC

利用OpenCV和深度學習實現人臉檢測

// Summary: 使用OpenCV3.3.1中的face_detector // Author: Amusi // Date: 2018-02-28 // Reference: http://blog.csdn.net/minstyrain/article/details/78907425 #in

opencv-視訊處理--畫線(越線、拌線)

視訊處理中,經常有做一些行人、車輛或者其它運動物體越線檢測,越界檢測。原視訊流:下面用opencv介紹兩種方式,畫直線(越線、拌線):第一種:固定第一幀,或者暫停視訊,在固定的一幀中完成畫直線的功能#include<iostream> using namespac

學習uml的表示(介面卡模式)

學習設計模式,感覺首先要學習uml類圖,在學習介面卡模式時學習了一小小點: 1,兩個類之間的關係,如果一個類依賴於另一個類,那麼表明:被依賴的類在另一個類中是區域性的變數、方法的引數或者是對靜態方法的呼叫;帶箭頭的虛線,指向依賴類 2,如果一個類關聯另一個類,那麼表明:被關

opencv基於深度學習的人臉檢測

opencv3.4 版之前自帶的人臉檢測器是基於Haar+Adaboost的,速度還可以,但是檢出率很低,誤檢也很多,臉的角度稍大就檢不出來,還經常會把一些亂七八糟的東西當做人臉,實在不敢恭維。好在隨著深度學習領域的發展,湧現了一大批效果相當不錯的人臉檢測演算法,比如MTCN

深度學習在目標檢測的應用及其tensorflowAPI實踐(一)

近些年深度學習在影象領域大放光彩,這篇文章先對目標檢測領域深度學習的發展做一個總結,再結合一個例子對tensorflow model zoo中的目標檢測API使用做一個說明。 本文內容如下(會分幾次發出來): 目標檢測的任務 深度學習在目標檢測中的應用

Readis一些常見的操作有哪些

key操作: key * 檢視所有的key del keyname 刪除名字為keyname的key expire keyname time 設定名為keyname的key的有效時間為time ttl keyname 檢視名為keyname的 key

0007-用OpenCVVideoCapture讀取avi視訊檔案,並以幀流的形式顯示出來!

OpenCV用VideoCapture類實現avi視訊讀取的相關操作,具體怎麼使用,大家看程式碼便知! 示例程式碼如下: 程式碼中用的視訊下載連結:http://pan.baidu.com/s/1qYbRtqW 密碼:5bcu //opencv版本:OpenCV3.0 //VS版本:VS20

opencv 視訊人臉檢測

                                      opencv  視訊中人

程式碼C++, opencv實現人臉識別,人臉檢測,人臉匹配,視訊的人臉檢測,攝像頭下的人臉檢測

前一段時間寫了一個人臉相關的演算法,包括視訊中的人臉檢測,相機的人臉檢測,影象中人臉檢測,還有人臉識別。使用的是VS2013和opencv。首先建立標頭檔案common.h#ifndef _COMMON_H #define _COMMON_H #include <op

OpenCV開發】OpenCV:使用VideoCapture進行視訊讀取和顯示

註釋比較詳盡,相信大家都能看得懂,這裡再做幾點補充: 1.由於原視訊是網路攝像頭採集的,所以有很多雪花點,在這裡進行了簡單的均值濾波處理。 2.雖然VideoCapture類中有grab(捕獲下一幀)和retrieve(對該幀進行解碼)操作,但是直接用read比較簡單。 3.get函式的功能很強大,

深度學習影象處理(分類or檢測結果的評價方法-mAP簡介

多標籤影象分類(Multi-label Image Classification)任務中圖片的標籤不止一個,因此評價不能用普通單標籤影象分類的標準,即mean accuracy,該任務採用的是和資訊檢索中類似的方法—mAP(mean Average

視訊目標檢測關於對檢測出的目標進行”安全處理“問題

最近做視訊的目標識別和追蹤計數,編譯連線均沒有問題,但是在測試時出現了問題,只要標出的box與視訊的邊界接觸就會出現程式崩潰,並提示出opencv的斷言提示:OpenCV Error: Assertion failed (0 <= roi.x && 0

OpenCV:使用VideoCapture進行讀取視訊

// readvideo.cpp : 定義控制檯應用程式的入口點。 #include <cv.h> #include "stdafx.h" #include <opencv2\opencv.hpp> using namespace cv; i

OpenCV計算機視覺學習(4)——影象平滑處理(均值濾波,高斯濾波,值濾波,雙邊濾波)

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice   “平滑處理”(smoothing)也稱“模糊處理”(bluring),是一項簡單且使用頻率很高的影象

OpenCV計算機視覺學習(5)——形態學處理(腐蝕膨脹,開閉運算,禮帽黑帽,邊緣檢測

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice   形態學操作簡單來說,就是改變物體的形狀,下面學習一下,首先本文的目錄如下: 1,定義結構元素 2,