opencv學習之一


對有關opencv的基礎知識做一系列的總結,今天是第一節

第一章
1.1介紹
    OpenCV(Open Source Computer Vision Library)是一個基於BSD協議的開源庫,它包含了數百個計算機視覺的算法實現。這個文檔描述了OpenCV 2.x的API函數,這個版本的API是基於C++,而早期的1.x版本的OpenCV是基於C語言的。后者在opencv 1x.pdf中給出了描述。
    OpenCV具有模塊化結構,這意味着程序包中包含着一些動態和靜態的庫。以下列出的是可用的模塊:

  • core(核心)——這個緊湊的模塊定義了一些基礎的數據結構,包括密集型多維數組Mat和一些其他模塊將會用到的基礎函數。
  • imgproc(圖像處理)——在圖像處理模塊中包括了線性和非線性的圖像濾波功能,幾何變換(調整大小、仿射、透視、重映射等),色彩空間變換,以及直方圖操作等等。
  • video(視頻)——視頻分析模塊包括了包括了運動估計、背景提取、對象追蹤等功能。
  • calib3d(3D標定)——基本的多視角幾何算法、相機標定、目標姿勢估計、立體對應算法和3D重構等。
  • features2d(2D特征)——特征檢測、描述和模式匹配。
  • objdetect(目標檢測)——對預先定義好的的物體和實例進行檢測(例如人臉、眼睛、被子、人、汽車等等)。
  • highgui——一個簡單易用的視頻捕捉、圖片和視頻編碼接口,以及簡單的UI實現。
  • gpu——區別於其他OpenCV模塊的GPU加速算法。
  • ……一些其他的幫助模塊,例如函數鏈接型神經網絡、Google測試封裝、Python綁定等等。

    接下來的文檔描述了各個模塊的功能。但是首先要確保弄明白通常情況下庫中的API函數是怎樣使用的。
第二章
核心——核心函數
2.1 基礎結構
數據類型
類:DataType
    OpenCV原始數據類型的特征模版。OpenCV的原始數據類型包括unsigned char、bool、signed char、unsigned short、signed short、int、float、double以及由這些基礎類型組成的元組,這些元組中的所有值都屬於相同的類型。這個原始數據類型列表中的所有類型都可以使用一個標示符進行表示CV_<bit-depth>{U|S|F}C(<number_of_channels>),例如,uchar ~ CV_8UC1,3元素的浮點元組~ CV_32FC3,等等。一個一般的OpenCV結構體能夠被存儲到一個單獨的實例中,例如一個原始數據類型Vec。多個實例可以被存儲在std::vector、Mat、Mat_、SparseMat、OparseMat_或其他可以保存Vec實例的容器中。
    DataType類主要用來為原始數據類型提供描述,同時它不會給對應的類加入子段和方法(實際上不可能修改C/C++的原始數據類型)。這個技術依賴於C++的類特性。DataType本身並不會被使用,但是他的特殊版本會被使用,例如:

template<> class DataType<uchar>
{
    typedef uchar value_type;
    typedef int work_type;
    typedef uchar channel_type;
    enum { channel_type = CV_8U, channels = 1, fmt=’u’, type = CV_8U };
};
...
template<typename _Tp> DataType<std::complex<_Tp> >
{
    typedef std::complex<_Tp> value_type;
    typedef std::complex<_Tp> work_type;
    typedef _Tp channel_type;
    // DataDepth is another helper trait class
    enum { depth = DataDepth<_Tp>::value, channels=2,
    fmt=(channels-1)*256+DataDepth<_Tp>::fmt,
    type=CV_MAKETYPE(depth, channels) };
};
...

    這個類的主要的目的是為為OpenCV的兼容數據類型標示符轉換編譯類型信息,例如:
    // 申請一個 30x40 浮點矩陣
    Mat A(30, 40, DataType<float>::type);
    Mat B = Mat_<std::complex<double> >(3, 3);
    // 下邊將會打印出6,2,意思是depth == CV_64F,channels == 2
    cout << B.depth() << ", " << B.channels() << endl;

    所以這個特性用來告訴OpenCV你當前在使用什么數據類型,即使這個類型並非源自於OpenCV。例如,矩陣B將會被編譯,因為OpenCV定義了專門的模版類DataType<complex<_Tp> >。這個機制也用於泛型機制。

Point_
類:Point_
    2D點的模板類,用來描述它的x和y坐標。這個類的實例可以與C結構體CvPoint和CvPoint2D32f之間進行互相轉換。其中有類型轉換運算符將點的坐標轉換成指定的類型。將浮點型坐標轉換成整形坐標要通過舍入來完成。通常,轉換工作會對每一個坐標執行這個操作。除了上邊提到的類成員,以下列出的其它對點的使用操作:

pt1 = pt2 + pt3;
pt1 = pt2 - pt3;
pt1 = pt2 * a;
pt1 = a * pt2;
pt1 += pt2;
pt1 -= pt2;
pt1 *= a;
double value = norm(pt); // L2 norm
pt1 == pt2;
pt1 != pt2;

    為了使用方便,還定義了下邊的類別名:

typedef Point_<int> Point2i;
typedef Point2i Point;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;

    例如:

Point2f a(0.3f, 0.f), b(0.f, 0.4f);
Point pt = (a + b)*10.f;
cout << pt.x << ", " << pt.y << endl;


Point3_
類:Point3_

    3D點的模板類,用來描述它的x、y和z坐標。這個類的實例可以與C結構體CvPoint2D32f之間進行互相轉換。與Point_相似,3D坐標可以被轉換成其他類型。同時這個類也支持vector和比較操作。
    Point3_<>有以下可用的別名:

typedef Point3_<int> Point3i;
typedef Point3_<float> Point3f;
typedef Point3_<double> Point3d;


Size_
類:Size_

    用於指定圖像和矩形尺寸的類模板。這個類包含兩個成員變量width和height。這個結構體可以與老版OpenCV中的CvSize和CvSizeD32f之間進行轉換。能夠應用於Point_類的算法和比較操作對Size_也是有效的。

    OpenCV定義了以下Size_<>的別名:

typedef Size_<int> Size2i;
typedef Size2i Size;
typedef Size_<float> Size2f;


Rect_
類:Rect_

    2D矩形的模板類,用以下參數進行描述:

  • 左上角的坐標。這是一個OpenCV中的內定的值Rect_::x和Rect_::y。但是在你的算法中可能會從左下角計算x和y。
  • 矩形的寬和高。

    OpenCV假設矩形的上邊沿和左邊沿是包含的,而右邊沿和下邊沿是不包含的。例如,如果符合以下情況,則方法Rect_::contains將返回true:
                        x <pt:x < x + width; y<pt:y < y + height
    實際上在OpenCV中循環瀏覽一個圖像的ROI(ROI被通過Rect_<int>指定)是這樣實現的:

for(int y = roi.y; y < roi.y + rect.height; y++)
for(int x = roi.x; x < roi.x + rect.width; x++)
{
// ...
}

    除了成員變量,以下對於矩形的操作也得到了實現:


  • rect = rect +/- point (通過某一偏移值移動矩形)
  • rect = rect +/-size (通過某一數量擴大或縮小矩形)
  • rect += point, rect -= point, rect += size, rect -= size (擴張操作)
  • rect = rect1 & rect2 (矩形相交)
  • rect = rect1 | rect2 (包含rect2和rect3的最小區域 )
  • rect &= rect1, rect |= rect1 (and the corresponding augmenting operations)
  • rect == rect1, rect != rect1 (矩形比較)

下邊是一個如何確定矩形包含關系的例子(rect1屬於rect2):
template<typename _Tp> inline bool
operator <= (const Rect_<_Tp>& r1, const Rect_<_Tp>& r2)
{
return (r1 & r2) == r1;
}
    為了便利,Rect_<>有以下別名:
typedef Rect_<int> Rect;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM