本文只發佈於利用OpenCV實現尺度不變性與角度不變性的特征找圖演算法和知乎 一般來說,利用OpenCV實現找圖功能,用的比較多的是模板匹配(matchTemplate)。筆者比較喜歡裡面的NCC演算法。但是模板有個很明顯的短板,面對尺度改變,角度改變的目標就無能為力了。因此本文旨在做到模板匹配做不到的 ...
C語言【數組】
一、數組的一些零碎的知識
1、數組在記憶體中的空間是連續的,數組下標從0開始;
數組中存儲的類型是一致的(只能存儲同一類型,這樣可以快速定位某元素)
2、指針可看作存儲地址的變數,數組名可看作地址那個常量,所以數組名不可修改 。可以改的是數組元素:a[0] 或 *a
二、一維數組
1、整型數組的定義
第一種。聲明後定義。聲明後數組的值是隨機的。
int arr1[3];
第二種。聲明的同時賦初始。這種情況賦值個數--少補0,多報錯
int arr2[3] = {4, 5, 6};
第三種。不指定元素個數,直接初始化。
int arr3[] = {4, 5, 6};
2、數組越界問題
C語言的數組越界是個特性。編譯和運行時都不會報錯。
一般情況,在棧種分配的變數記憶體,之前的變數在高地址,所以數組越界可能會修改或讀取到之前的數據。不建議故意越界。
3、數組長度
sizeof計算的是位元組數,所以一維數組的數組長度計算如下:
sizeof(arr) / sizeof(arr[0]);
4、字元型數組的定義
第一種。單個字元地賦值,需要手動加 '\0',不加'\0'的話會往下一直找,直到碰到有'\0'的地方,這樣後面的值會很隨機。
char str1[3] = {'h', 'e', 'l'}; // 長度3,不自動補'\0'
第二種。聲明並賦值時少賦值,利用 補0 的特性,讓它添加上0。略。
第三種。
char str3[] = {'a', 'b'}; // 長度2,不會自動補'\0'
第四種。
char str4[] = {"abc"}; // 長度4,自動補'\0'
char str4_1[] = "abc"; // 長度4,自動補'\0'
第五種。註意這個是上面的指定了長度。一般沒這樣寫的,千萬不要誤導,這個不自動補'\0'。
char str5[3] = "hel"; // 長度3,不自動補'\0'
三、二維數組
1、多維數組在記憶體中不是以矩陣形式存儲,而是 第一行存儲完後 第二行接著往下來 這樣存儲的。
2、對於int a [2] [3]; 這個數組來說,a [0] [3] 與 a [1] [0] 表示的是同一個元素。理解吧。
3、二維數組的聲明並初始化
第一種。
int a[2][3] = {
{1, 2, 3},
{1, 2, 3}
};
第二種。
int a[2][3] = {1, 2, 3, 4, 5, 6};
第三種。省略有幾行,即省略第一個[]里的長度指定。
int a[][3] = {1, 2, 3, 4, 5, 6};
int a[][3]; // 這樣肯定不行,既然省略了行,就不能省略總個數。
4、二維數組中長度的計算。
sizeof(arr)/sizeof(arr[0]); // 得到有幾行
sizeof(arr[0])/sizeof(arr[0][0]); // 得到每列的個數
sizeof(arr)/sizeof(arr[0][0]); // 得到數組總長度(個數),知道這個可以用一個for迴圈遍曆數組 a[0][0] -- a[0][個數-1]
// 解釋一下
sizeof(arr); // 得到列表 總位元組數
sizeof(arr[0][0]); // 得到每個元素的位元組數,即類型的位元組數
補
C語言沒有動態聲明變數的方法。