计算机视觉,计算机图形学和数字图像处理,三者之间的联系和区别是什么?
計算機視覺研究的主要是人工智能, 計算機圖形學是數字圖像的合成產生技術,而數字圖像圖像處理則是圖像數據的分析加工 (圖形學的逆過程)
Computer Graphics,簡稱 CG 。輸入的是對虛擬場景的描述,通常為多邊形數組,而每個多邊形由三個頂點組成,每個頂點包括三維坐標、貼圖坐標、rgb 顏色等。輸出的是圖像,即二維像素數組。
Computer Vision,簡稱 CV。輸入的是圖像或圖像序列,通常來自相機、攝像頭或視頻文件。輸出的是對于圖像序列對應的真實世界的理解,比如檢測人臉、識別車牌。
Digital Image Processing,簡稱 DIP。輸入的是圖像,輸出的也是圖像。Photoshop 中對一副圖像應用濾鏡就是典型的一種圖像處理。常見操作有模糊、灰度化、增強對比度等。
再說聯系:
CG 中也會用到 DIP,現今的三維游戲為了增加表現力都會疊加全屏的后期特效,原理就是 DIP,只是將計算量放在了顯卡端。
CV 更是大量依賴 DIP 來打雜活,比如對需要識別的照片進行預處理。
最后還要提到近年來的熱點——增強現實(AR),它既需要 CG,又需要 CV,當然也不會漏掉 DIP。它用 DIP 進行預處理,用 CV 進行跟蹤物體的識別與姿態獲取,用 CG 進行虛擬三維物體的疊加。
先說區別
1. Computer Graphics,簡稱CG。輸入的是對虛擬場景的描述,通常為多邊形數組,而每個多邊形由三個頂點組成,每個頂點包括三維坐標、貼圖坐標、rgb 顏色等。輸出的是圖像,即二維像素數組。
[xyz xyz xyz ... xyz] -> 圖片
2. Computer Vision,簡稱CV。輸入的是圖像或圖像序列,通常來自相機、攝像頭或視頻文件。輸出的是對于圖像序列對應的真實世界的理解,比如檢測人臉、識別車牌、區分貓狗。
圖片 -> dog or cat?
圖片 -> [xyz xyz xyz ... xyz]
3. Digital Image Processing,簡稱DIP。輸入的是圖像,輸出的也是圖像。Photoshop 中對一副圖像應用濾鏡就是典型的一種圖像處理。常見操作有模糊、灰度化、增強對比度等。
圖片 -> ps后的圖片
再說聯系
1.CG 中也會用到 DIP,現今的三維游戲為了增加表現力都會疊加全屏的后期特效,原理就是 DIP,只是將計算量放在了顯卡端。通常的做法是繪制一個全屏的矩形,在 Pixel Shader 中進行圖像處理。
2.CV 大量依賴 DIP來打雜活,比如對需要識別的照片進行預處理,增強對比度、去除噪點。
3. 最后還要提到今年的熱點——增強現實(AR),它既需要 CG,又需要 CV,當然也不會漏掉 DIP。它用 DIP 進行預處理,用 CV 進行跟蹤物體的識別與姿態獲取,用 CG 進行虛擬三維物體的疊加。
如果讀者留意 OpenCV 2.3 之后的版本,那么會發現 cv::ogl namespace,ogl 自然是 OpenGL了。一個三維計算機圖形庫為何出現在計算機視覺中,傳統的 CV 開發者是否需要學習它,這些問題待我一一來回答。
問題一:為何引入 OpenGL?
在 2.3 之前 OpenCV 的渲染部分都是由 CPU 來實現的,不論是畫線還是把圖片顯示到屏幕上。這有兩個問題,速度慢,同時沒法畫三維物體。引入 OpenGL 是為了借助 顯卡的力量,顯卡比 CPU 更擅長渲染,同時顯卡和 CPU 可以同時干活。比方說,CPU 在獲取攝像頭畫面然后檢測人臉時,顯卡在渲染三維的人臉網格模型和高精度抗鋸齒的二維界面。
另外,隨著民用深度傳感器的普及,cv::VideoCapture 第一時間增加了對 Kinect、華碩 Xtion、Intel Perceptual Computing SDK 等的支持。傳統的視覺計算中,深度圖只能當做單通道的灰度圖進行處理。想實現隔空的多點觸摸是綽綽有余,但是如果想實現三維重建(比如 Kinect Fushion)那么我們必須將算法升級到三維空間。相應的,三維空間的算法也需要三維的 API 進行渲染,也就是 OpenGL。
想開啟該功能,需要在配置 CMake 時選上 WITH_OPENGL=ON,然后重新編譯完整的 OpenCV 庫。我簡要介紹下幾個組件:
ogl::Buffer 是 OpenGL 中的緩存區,可以用于保存多邊形的頂點和顏色等。
ogl::Texture2D 是保存在顯卡中的二維貼圖,可以認為是得到 GPU 加速的 cv::Mat。
前面這兩個類都只是保存數據,要把數據畫出來,還要用到 ogl::render 函數。
void ogl::render(const Texture2D& tex, Rect_<double> wndRect=Rect_<double>(0.0, 0.0, 1.0, 1.0), Rect_<double> texRect=Rect_<double>(0.0, 0.0, 1.0, 1.0))
問題二:是否應該學習 OpenGL?
It depends.
如果你開發的是命令行程序并不顯示任何圖像,或者顯示的圖片很簡單,那么不需要轉換到 cv::ogl 下。
如果你的應用耗費了大量時間在圖片的顯示上,或是希望擁有高質量的界面系統,那么你可以借助 cv::ogl::Texture2D 加速圖像的渲染。
如果你開發的是增強現實應用,你肯定已經擁有了自己的三維渲染模塊,可以考慮與 cv::ogl::Buffer 整合。
如果你已經在使用 CUDA 模塊,對于渲染的時候數據需要回傳到 CPU 表示多此一舉,那么你可以使用 CUDA 與 OpenGL 的協同功能去除多余的數據傳輸。
另一方面,如果你不是 OpenCV 的用戶但是你正在開發虛擬現實應用,你可以考慮將視覺計算引入到你的系統中,實現類似 HoloLens 的設備。
未來展望:OpenCV 與顯卡的關系
由于顯卡能力的增強以及硬件公司的支持,OpenCV 逐漸展露出新的形態,大量的視覺計算位于顯卡上。
運算通過 CUDA 模塊或 OpenCL 模塊,這兩個模塊分別得到 NVIDIA 與 AMD 的大力支持。
渲染通過 OpenGL 模塊。
這意味著除了文件讀寫(highgui 模塊)外,視覺應用可以逐漸脫離 CPU。
簡單點說吧,
1,計算機視覺,里面人工智能的東西更多一些,不僅僅是圖像處理的知識,還涵蓋了人工智能,機器學習等領域知識;
2,計算機圖形學,主要涉及圖形成像及游戲類開發,如opengl等,還有就是視頻渲染等;
3,圖像處理,這個主要針對圖像圖像的基本處理,如圖像檢索或則圖像識別,壓縮,復原等等操作。以上只是本人字面理解
總結
以上是生活随笔為你收集整理的计算机视觉,计算机图形学和数字图像处理,三者之间的联系和区别是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CDH搭建Hadoop集群(Centos
- 下一篇: 谈谈PS模块CAPEX/OPEX的自动科