以下是整理出的視覺入門opencv學習的C++知識點總結,畢竟之後主要要講的是計算機視覺方面的東西,其中的概念只是點到爲止,希望大家可以將模糊的概念百度一下,最好也能總結一下,C++的學習是基礎中的基礎,筆者會不定期更新和完善。(其中帶*的內容爲可選學內容)
一、預備
- 瞭解C++標準(C99、C11等)(視覺新手經常會遇到的錯誤往往不是opencv的,而是不熟悉IDE或者C++標準版本所致)
- C++風格註釋(偷懶代碼不寫註釋?後期調車呵呵呵,寫註釋不僅僅是爲了眼前,更爲了傳承,強校的視覺開源代碼註釋寫的都很棒,不僅要站在巨人的肩膀上,也要學習巨人的工作方式)
- 頭文件是什麼?(就只會
#include <iostream>
可不行,我們要自己寫自己的頭文件,自己調用) - 命名空間*(當工程比較複雜時,用命名空間可以節省一些寫代碼的力氣,但是還是推薦儘量在主要變量或者函數前加上對應命名空間
namespace::method()
) - 基本數據類型(
int、float、double
……) - 代碼規範( 很重要!! 多人聯合編寫代碼的時候必須保證步調統一,水平高不高一看寫的代碼就看出來了)
- 函數式編程(比起面向對象編程,首先要學會函數式編程)
二、基礎
-
分支語句(簡單常用必會)
-
循環結構(學會增強for循環,迭代器等)
-
三元運算符(布爾表達式 ?a情況:b情況,常用在return語句中)
-
++和 - -(a++和++a的區別要熟練掌握)
-
break和continue(這部分記住一點,就是發揮作用時跳出的就是離關鍵詞最近的一個
for
或者while
循環,在燈條和裝甲板篩選的時候會經常看到它們的身影,最大的作用就是節省性能)
-
浮點誤差(你可以輸出
double(1)
小數後十幾位試試,具體的百度吧,難兄難弟一大把) -
類型轉換(用的不多,但是簡單,還是有必要學一下的)
-
實參和形參(簡單常用必會)
-
局部和全局(簡單常用必會)
-
運算符優先級(其實多加括號可以解決這個問題,但是最好還是看看)
-
邏輯表達式(簡單常用必會)
-
輸入輸出流(搞明白流的原理,之後常用)
-
const修飾符和#define修飾符(都可以充當自定義常量的功能,當然
const
的功能不止這些) -
函數的返回值(函數的返回值遠不止
int
幾個基本類型,還會返回Mat
、數組等) -
函數的參數列表(和返回值一樣,也很重要,因爲常用,所以要喫透)
-
函數重載(尤其是構造函數重載,用到的地方也很多)
-
數組(數組是基礎班釘子戶,因爲這時候指針可能進來攪和了,並不容易一下完全掌握,最好在應用中學習,用到哪查到哪,因爲使用率高,漸漸也就學會了,注意學一下如何把數組在各個函數中傳來傳去)
-
面向對象編程(這部分比較難,內容也比較多,但是成熟的視覺代碼都是用面向對象寫的,這裏有些疑難問題可以先跳過,不要浪費過多時間,最後回頭再看往往會有恍然大悟之感)
-
繼承(三種繼承方式、構造函數、析構函數)
-
封裝(
private
、public
、protected
,公有和私有,增加代碼安全性) -
多文件編程(RM視覺部分的代碼量也可以算是一個小項目,我們一般創建一個工程,在工程中使用頭文件和源文件配合編程)
-
模版類vector( 非常重要!非常常用!數組的替代品!)
-
指針(事故多發區!多看多學多查多總結,還是說不要浪費時間死磕,你儘管多犯錯誤,其他的交給時間)
-
C++的引用(這部分是重點也是難點,但是引用就是變量的別名,比傳指針要簡單一些,用的也比較多)
-
String類*(用的很少,但是不學這個難說學會C++了吧,算法題的瑞士軍刀)
三、進階
-
結構體(學完類學這個就簡單很多,有些源代碼還在用着結構體,也要學會)
-
枚舉(有時會用來將裝甲板和數字做一個映射)
-
如何獲取系統時間?(用來測試程序耗時)
-
二維數組,vector嵌套(
vector<vector<Point2d>>
常用來表示一個點) -
異常機制(這部分關乎你寫的程序的健壯性和安全性,雖然會變複雜一些,但是在一些關鍵部分必須上)
-
智能指針(智能指針出了作用域自動釋放,你說香不香?)
-
STL模版庫(都瞭解瞭解,主要用其中的
vector
) -
多線程(中級編程必學併發編程,cpu有的是力氣,合理安排提高效率)
-
if define-endif用法(一般用來指定編譯代碼塊,可以用來選擇是否開啓調試或者其他模式)
-
遞歸*(瞭解一下)
-
IO流*(可以用來保存珍貴的實戰比賽第一視角視頻,機器學習等方向也要用到讀寫文件)
好了,今天這篇文章就到這裏啦,筆者會不定期做一些技術分享和工具使用心得,歡迎大家點贊和收藏!
參考資料:C++ Primer Plus
致謝:感謝馬同學和章同學提出的見解和補充!