SIFT算法【1.1】尺度空間構建中用到的一些openCV基礎函數

resize

resize函數是openCV中用於下采樣改變圖像尺寸的函數。調用方式如下:

void cv::resize ( InputArray src,
OutputArray dst,
Size dsize,
double fx = 0,
double fy = 0,
int interpolation = INTER_LINEAR
)

src:輸入,原圖像,即待改變大小的圖像;

dst:輸出,改變大小之後的圖像,這個圖像和原圖像具有相同的內容,只是大小和原圖像不一樣而已;

dsize:輸出圖像的大小。如果這個參數不爲0,那麼就代表將原圖像縮放到這個Size(width,height)指定的大小;如果這個參數爲0,那麼原圖像縮放之後的大小就要通過下面的公式來計算:

dsize = Size(round(fxsrc.cols), round(fysrc.rows))

其中,fx和fy就是下面要說的兩個參數,是圖像width方向和height方向的縮放比例。

fx:width方向的縮放比例,如果它是0,那麼它就會按照(double)dsize.width/src.cols來計算;

fy:height方向的縮放比例,如果它是0,那麼它就會按照(double)dsize.height/src.rows來計算;

interpolation:這個是指定插值的方式,圖像縮放之後,肯定像素要進行重新計算的,就靠這個參數來指定重新計算像素的方式,有以下幾種:

INTER_NEAREST - 最鄰近插值
INTER_LINEAR - 雙線性插值,如果最後一個參數你不指定(可以省略),默認使用這種方法(通常我使用的都是雙線性插值,因爲線性的插值性質比較單純)
INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
INTER_CUBIC - 4x4像素鄰域內的雙立方插值
INTER_LANCZOS4 - 8x8像素鄰域內的Lanczos插值

GaussianBlur

GaussianBlur
高斯模糊函數,根據高斯核卷積原理,用邊長爲6σ的高斯覈對圖像進行掩膜操作,獲得模糊後的圖像。σ越大,高斯核的分佈越“矮胖”,模糊越嚴重。
使用C++編程:

 void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, 
 double sigmaY = 0int borderType = BORDER_DEFANDLT )

參數:

src:輸入圖像,可以是多通道的圖像,每個通道會單獨處理。圖像的深度應該是:CV_8U, CV_16U, CV_16S, CV_32F 或者CV_64F。

dst:輸出圖像,圖像大小和圖像類型完全相同。

ksize,高斯內核的大小。其中ksize.width和ksize.height可以不同,但他們都必須爲正數和奇數(並不能理解)。或者,它們可以是零的,它們都是由sigma計算而來。

sigmaX,表示高斯核函數在X方向的的標準偏差。

sigmaY,表示高斯核函數在Y方向的的標準偏差。若sigmaY爲零,就將它設爲sigmaX,如果sigmaX和sigmaY都是0,那麼就由ksize.width和ksize.height計算出來。

borderType:像素外擴方法,BORDER_TRANSPARENT,BORDER_ISOLATED,BORDER_CONSTAND

vector(向量)

C++中的一種數據結構,確切的說是一個類.它相當於一個動態的數組,當程序員無法知道自己需要的數組的規模多大時,用其來解決問題可以達到最大節約空間的目的.(https://blog.csdn.net/hancunai0017/article/details/7032383

用法:
1.文件包含:
首先在程序開頭處加上#include以包含所需要的類文件vector,還有一定要加上using namespace std;

2.變量聲明:
2.1 例:聲明一個int向量以替代一維的數組:vector a;(等於聲明瞭一個int數組a[],大小沒有指定,可以動態的向裏面添加刪除)。
2.2 例:用vector代替二維數組.其實只要聲明一個一維數組向量即可,而一個數組的名字其實代表的是它的首地址,所以只要聲明一個地址的向量即可,即:vector <int > a.同理想用向量代替三維數組也是一樣,vector <int*>a;再往上面依此類推.

3.具體的用法以及函數調用:
3.1 如何得到向量中的元素?其用法和數組一樣:
例如:
vector <int *> a
int b = 5;
a.push_back(b);//該函數下面有詳解
cout<<a[0]; //輸出結果爲5

1.push_back 在數組的最後添加一個數據
2.pop_back 去掉數組的最後一個數據
3.at 得到編號位置的數據
4.begin 得到數組頭的指針
5.end 得到數組的最後一個單元+1的指針
6.front 得到數組頭的引用
7.back 得到數組的最後一個單元的引用
8.max_size 得到vector最大可以是多大
9.capacity 當前vector分配的大小
10.size 當前使用數據的大小
11.resize 改變當前使用數據的大小,如果它比當前使用的大,者填充默認值
12.reserve 改變當前vecotr所分配空間的大小
13.erase 刪除指針指向的數據項
14.clear 清空當前的vector
15.rbegin 將vector反轉後的開始指針返回(其實就是原來的end-1)
16.rend 將vector反轉構的結束指針返回(其實就是原來的begin-1)
17.empty 判斷vector是否爲空
18.swap 與另一個vector交換數據

3.2 詳細的函數實現功能:其中vector c.
c.clear() 移除容器中所有數據。
c.empty() 判斷容器是否爲空。
c.erase(pos) 刪除pos位置的數據
c.erase(beg,end) 刪除[beg,end)區間的數據
c.front() 傳回第一個數據。
c.insert(pos,elem) 在pos位置插入一個elem拷貝
c.pop_back() 刪除最後一個數據。
c.push_back(elem) 在尾部加入一個數據。
c.resize(num) 重新設置該容器的大小
c.size() 回容器中實際數據的個數。
c.begin() 返回指向容器第一個元素的迭代器
c.end() 返回指向容器最後一個元素的迭代器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章