【AI白身境】搞计算机视觉必备的OpenCV入门基础
文章首發于微信公眾號《有三AI》
【AI白身境】搞計算機視覺必備的OpenCV入門基礎
今天是新專欄《AI白身境》的第五篇。
曾經看過一個視頻,樹莓派自平衡機器人自動追著小球跑。不經讓我腦子蹦出一個有趣的想法,可以做一個識別貓的機器人,讓機器人跟著貓跑,有這樣一個小東西陪伴喵星人一定很有意思。
不過,首先你要有一只貓,其次,這個機器人不僅要有一雙會視覺處理的眼睛,還一定要有一個堅強的外殼,不然會被喵星人給拆了。
那機器人是如何完成處理圖像和視頻的各項任務呢?開源的計算機視覺包——OpenCV?會是你的最佳選擇,今天給小白們做一個最簡單的入門介紹。
作者 |? 臧小滿?言有三?
編輯 |? 臧小滿 言有三?
今天很開心與大家分享一篇關于OpenCV的文章,重點闡述以下幾個問題:?
1.如何部署OpenCV。
?2.OpenCV有哪些模塊,可以做什么。?
3.OpenCV的基本數據結構的熟悉與使用。
希望看過文章后,你也可以開始玩轉OpenCV之路。
?
01?什么OpenCV?
它是一款由Intel公司俄羅斯團隊發起并參與和維護的一個計算機視覺處理開源軟件庫。
作為一款優秀的計算機視覺庫,在諸多方面都有著卓越的表現:
1.編程語言
多數模塊基于C++實現,少部分基于C語言實現,同時提供了Python、Ruby、MATLAB等語言的接口。
2.跨平臺 ??
可自由地運行在Linux、Windows和Mac OS等桌面平臺,Android、 IOS、BlackBerray等移動平臺。
3.活躍的開發團隊
目前已更新至OpenCV4.0
4.豐富的API
完善的傳統計算機視覺算法,涵蓋主流傳統機器學習算法,同時添加了對深度學習的支持。
OpenCV可以完成幾乎所有的圖像處理任務,下面是一個簡要list。
-
視頻分析(Video analysis)
-
3D重建(3D reconstruction)
-
特征提取(Feature extraction)
-
目標檢測(Object detection)
-
機器學習(Machine learning)
-
計算攝影(Computational photography)
-
形狀分析(Shape analysis)
-
光流算法(Optical flow algorithms)
-
人臉和目標識別(Face and object recognition)
-
表面匹配(Surface matching)
-
文本檢測和識別(Text detection and recognition)
-
?
02?如何部署OpenCV?
一般來說我們會使用OpenCV的C++和Python版本,所以下面分別對其安裝進行介紹,以ubuntu系統為例。
2.1 Ubuntu安裝C++ OpenCV
安裝OpenCV所需的庫
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev?
libswscale-dev3 sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev?
下載最新opencv源碼
unzip opencv-3.2.0.zip
cd ~/opencv-3.2.0?
編譯OpenCV
cd ~/opencv-3.2.0
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D?
CMAKE_INSTALL_PREFIX=/usr/local ..
make
sudo make install
一般來說,編譯安裝絕對不可能一次順利完成,以下是幾個常見的問題。
1,編譯過程中ippcv下載失敗,?解決問題的辦法就是手動下載。
2,LAPACK包include報錯,?解決問題的辦法就是在cmake之后馬上修改對應include文件的路徑 ?如果make失敗后再修改則無效。
3,某些模塊找不到,?通常是因為少了編譯安裝contrib模塊。
2.2??Ubuntu安裝Python-OpenCV
安裝opencv
pip3 install opencv-python
進入python,導入cv2
import cv2
?
03?OpenCV模塊簡介
OpenCV提供了許多內置的用于圖像處理和計算機視覺相關操作的基礎數據結構,它們都包含在core模塊中,并且這些數據結構都已經針對速度和內存做了優化,下面以4.0版本為例進行介紹,參考https://docs.opencv.org/master/d9/df8/tutorial_root.html。
Opencv目錄下”modules目錄”列出了OpenCV包含的各個模塊,其中core、highgui、imgproc是最基礎的模塊。
?
-
core模塊實現了最核心的數據結構及其基本運算,如繪圖函數、數組操作相關函數,與OpenGL的互操作等。
-
highgui模塊實現了視頻與圖像的讀取、顯示、存儲等接口。
-
imgproc模塊實現了圖像處理的基礎方法,包括圖像濾波、圖像的幾何變換、平滑、閾值分割、形態學處理、邊緣檢測、目標檢測、運動分析和對象跟蹤等。
對于圖像處理其他更高層次的方向及應用,OpenCV也有相關的模塊實現
-
features2d模塊用于提取圖像特征以及特征匹配,nonfree模塊實現了一些專利算法,如sift特征。
-
objdetect模塊實現了一些目標檢測的功能,經典的基于Haar、LBP特征的人臉檢測,基于HOG的行人、汽車等目標檢測,分類器使用Cascade Classification(級聯分類)和Latent SVM等。
-
stitching模塊實現了圖像拼接功能。
-
FLANN模塊(Fast Library for Approximate Nearest Neighbors),包含快速近似最近鄰搜索FLANN?
和聚類Clustering算法。 -
ml模塊機器學習模塊(SVM,決策樹,Boosting等等)。
-
photo模塊包含圖像修復和圖像去噪兩部分。
-
video模塊針對視頻處理,如背景分離,前景檢測、對象跟蹤等。
-
calib3d模塊即Calibration(校準)3D,這個模塊主要是相機校準和三維重建相關的內容。包含了基本的多視角幾何算法,單個立體攝像頭標定,物體姿態估計,立體相似性算法,3D信息的重建等等。
-
G-API模塊包含超高效的圖像處理pipeline引擎。
另外,原來在opencv2中的shape, superres, videostab, viz等模塊被移動到opencv_contrib中,關于opencv contrib,我們以后再詳細介紹。
?
04?OpenCV基本數據結構
OpenCv提供了多種基本的數據類型,常用的OpenCV的基本數據結構有以下幾種:
-
Mat類
-
Point類
-
Size類
-
Rect類
-
Scalar類
-
Vec類
-
Range類
下面我們重點說一下MAT類。
4.1? Mat類
要熟練使用OpenCV,最重要的就是學會Mat數據結構,在OpenCV中Mat被定義為一個類,把它看作一個數據結構,以矩陣的形式來存儲數據的。
Mat有哪些常見的屬性?
-
dims:表示矩陣M的維度,如2*3的矩陣為2維,3*4*5的矩陣為3維
-
data:uchar型的指針,指向內存中存放矩陣數據的一塊內存
-
rows, cols:矩陣的行數、列數
-
type:表示了矩陣中元素的類型(depth)與矩陣的通道個數(channels);命名規則為CV_ + (位數)+(數據類型)+(通道數)
其中:U(unsigned integer)-- 無符號整數
S(signed integer)-- 有符號整數
F(float)-- 浮點數
例如CV_8UC3,可拆分為:CV_:type的前綴,?
8U:8位無符號整數(depth),C3:3通道(channels)
-
depth:即圖像每一個像素的位數(bits);這個值和type是相關的。例如CV_8UC3中depth則是CV_8U。
-
channels:通道數量,若圖像為RGB、HSV等三通道圖像,則channels = 3;若圖像為灰度圖,則為單通道,則channels = 1
-
elemSize:矩陣中每一個元素的數據大小
elemSize = channels * depth / 8?
例如:type是CV_8UC3,elemSize = 3 * 8 / 8 = 3bytes
-
elemSize1:單通道的矩陣元素占用的數據大小
? ? ? ? elemSize1 = depth / 8
? ? ? ? 例如:type是CV_8UC3,elemSize1 = 8 / 8 = 1bytes
4.2? 其他數據類型
1.點Point類
包含兩個整型數據成員x和y,即坐標點
2.尺寸Size類
數據成員是width和height,一般用來表示圖像的大小,或者矩陣的大小
3.矩形Rect類
數據成員x,y,width,height,分別代表這個矩形左上角的坐標點和矩形的寬度和高度
4.顏色Scalar類
Scalar_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0)
這個默認構造函數的四個參數分別表示RGB+Alpha顏色中的:?
v0---表示RGB中的B(藍色)分量?
v1---表示RGB中的G(綠色)分量?
v2---表示RGB中的R(紅色)分量?
v3---表示Alpha是透明色分量?
5.向量Vec類
一個“一維矩陣”
Vec<int,n>---就是用類型int和向量模板類做一個實例化。其中第一個參數int表示Vec中存儲的為int類型;第二個參數n為一個整型值,表示Vec每個對象中存儲n個int值,也就是n維向量(列向量)
6.Range類
用于指定一個連續的子序列,例如一個輪廓的一部分,或者一個矩陣的列空間
?
05?基本IO操作
這里使用的是python接口
1.圖像讀寫
cv2.imread(文件名,顯示控制參數)? #?讀入圖像? ?
cv2.imshow(窗口名,圖像名)? ?#顯示圖像
cv2.imwrite(文件地址,文件名)? #保存圖像
cv2.namedWindow(窗口名)? #創建窗口
cv2.destroyAllWindows() #銷毀窗口
cv2.waitKey(?? [,delay])? #decay > 0 等待delay 毫秒
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #decay < 0 等待鍵盤單擊
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #decay =? 0 無限等待
2.圖像縮放
dst = cv2.resize(src,dsize,fx,fy)? #dsize表示縮放大小?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#fx,fy縮放比例
3.圖像翻轉
dst = cv2.flip(src,flipCode)?
????????#flipCode=0 以X軸為對稱軸的翻轉?
????????#lipCode>0 以Y軸為對稱軸的翻轉?
????????#flipCode<0 對X、Y軸同時翻轉
4.通道拆分與合并
b,g,r = cv2.split(圖像)?
b = cv2.split(圖像)[通道數] #拆分
bgr = cv2.merge([b,g,r]) #合并
?
06?相關學習資料
6.1? 網絡資料
-
OpenCV Docs官方文檔?
https://docs.opencv.org/
-
OpenCV 官方Github
https://github.com/opencv/opencv
-
OpenCV 中文教程
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.html
6.2? 中文書籍
-
Python計算機視覺編程
-
OpenCV 3計算機視覺:Python語言實現
-
OpenCV算法精解:基于Python與C++
最后,推薦一下大家的Opencv學習路線。
?
總結
本文簡單介紹了OpenCV框架,它是計算機視覺領域必須要熟練掌握的工具,這一期我們沒有說具體的算法和模塊,以后會開設《OpenCV專題》講述。
下期預告:下一期我們會說說Makefile和CMake的基礎。
轉載文章請后臺聯系
侵權必究
喜歡“白身境”系列,歡迎留言,支持有三繼續寫作下去
AI白身境系列完整閱讀:
第一期:【AI白身境】深度學習從棄用windows開始
第二期:【AI白身境】Linux干活三板斧,shell、vim和git
第三期:【AI白身境】學AI必備的python基礎
第四期:【AI白身境】深度學習必備圖像基礎
第五期:【AI白身境】搞計算機視覺必備的OpenCV入門基礎
第六期:【AI白身境】只會用Python?g++,CMake和Makefile了解一下
第七期:【AI白身境】學深度學習你不得不知的爬蟲基礎
第八期:?【AI白身境】深度學習中的數據可視化
第九期:【AI白身境】入行AI需要什么數學基礎:左手矩陣論,右手微積分
第十期:【AI白身境】一文覽盡計算機視覺研究方向
第十一期:【AI白身境】AI+,都加在哪些應用領域了
第十二期:【AI白身境】究竟誰是paper之王,全球前10的計算機科學家
AI初識境系列完整閱讀
第一期:【AI初識境】從3次人工智能潮起潮落說起
第二期:【AI初識境】從頭理解神經網絡-內行與外行的分水嶺
第三期:【AI初識境】近20年深度學習在圖像領域的重要進展節點
第四期:【AI初識境】激活函數:從人工設計到自動搜索
第五期:【AI初識境】什么是深度學習成功的開始?參數初始化
第六期:【AI初識境】深度學習模型中的Normalization,你懂了多少?
第七期:【AI初識境】為了圍剿SGD大家這些年想過的那十幾招
第八期:【AI初識境】被Hinton,DeepMind和斯坦福嫌棄的池化,到底是什么?
第九期:【AI初識境】如何增加深度學習模型的泛化能力
第十期:【AI初識境】深度學習模型評估,從圖像分類到生成模型
第十一期:【AI初識境】深度學習中常用的損失函數有哪些?
第十二期:【AI初識境】給深度學習新手開始項目時的10條建議
?
總結
以上是生活随笔為你收集整理的【AI白身境】搞计算机视觉必备的OpenCV入门基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【AI白身境】深度学习必备图像基础
- 下一篇: 【AI白身境】学深度学习你不得不知的爬虫