OpenCV已經將影象處理 識別 的演算法寫成函式了,那我們還有必要去學習這些演算法不

時間 2021-05-07 06:06:28

1樓:Bryant.Li

在應用opencv解決實際問題時,是必須要了解函式背後的演算法原理的。舉幾個實際應用的例子:

1.雙目相機標定,當然直接用opencv自帶的StereoCalibration就可以實現。但直接用函式預設的引數,標定效果不穩定;並且對於無人機的應用場景,需要在較遠距離仍有較高的標定精度,那這時候就需要我們了解這些引數的作用,以及演算法的原理。

最終可以通過設定引數,以及工程上的優化,實現乙個好的標定效果。

2.目標跟蹤,在較新版本的opencv直接有幾種經典跟蹤演算法的函式,例如tld,mil,kcf等。但對於特定場景的應用,例如無人機機載端跟蹤,對運算能力限制較大,需要對每一種演算法的原理實現都了解,這樣才能自己去優化,最終實現跟蹤效果和運算速度的平衡。

3.目標檢測,例如紅外影象的人員目標檢測。opencv提供了一些特徵提取的函式,也有一些分類器工具供我們應用。

在應用時也許直接用hog+svm就能實現一定效果,或者用yolo框架訓練出分類器然後opencv呼叫也可以,但在運算能力有限制的情況下,上述兩者也許都不合適。這時候就不僅僅是優化hog就能解決的了,也許需要對yolo網路剪枝,但這個可能需要更久的學習時間;我們更需要廣泛的查閱文獻,選取其中的幾篇進行方案評估,最終確定演算法方案。例如,採用MSER+特徵提取(距)+樸素貝葉斯的方案就能取得不錯效果,並且上述三者在opencv都有函式可以呼叫。

2樓:這孩子亂跑啊

說說我吧,我也剛為了專案學C++和OPENCV,以前我是C#陣營的,有時候真懶的學OPENCV自帶的那些演算法比如邊緣檢測的五個傳入參我到現在還沒整明白。我只會MAT a.at(x,y),然後我迴圈遍歷畫素做各種操作,比如我寫了高斯模糊,二值化,邊緣檢測,繪製矩形等等,而且就算是1080*1920的圖也是效率奇高,不比OPENCV自帶的演算法差,然後我把這些方法封到DLL裡供WPF呼叫,供UNITY呼叫,我愛我的庫,就像不斷裝修一套屬於自己的房子,這種不斷完善的感覺很美妙,就像OPENGL的GLEW庫一樣,以後OPENCV會不會有我的庫出名了開源供給大家使用。

而且我還對專案有胸有成竹的感覺,因為我完全了解了它,忘記說了,我的專案是通過雙目攝像頭做採集點定位,我愛我的專案。所以我忽略了我的家人,媳婦帶著孩子回外省的老家一呆就是半年多。

3樓:mpcv

有必要,非常有必要。

既然你這麼問了,那我預設你是做影象處理/機器學習方向的研究,或者你是程式設計師,但經常要接觸影象相關的程式設計。

兩種情況下你都需要去了解他們的原理。

因為:

如果你讀過opencv的原始碼,你就會發現,好多的演算法,它的實現效率是多麼地低!以及,他考慮的情況是多麼地少!

有時候為了效能,為了更好地應用到你的實際情況,必須要自己手動去實現一些演算法,或者更改opencv的原始碼。

我舉乙個簡單的小例子:

利用opencv的Laplace運算元對影象進行邊緣檢測。

opencv的呼叫方式很簡單:

#include

#include

using

namespace

std;

using

namespacecv;

intmain

()一句Laplacian(src,dst,src.depth())呼叫就搞定了,確實很簡單。效果也不錯:

檢視它的原始碼:

宣告部分:

// .h

CV_EXPORTS_W void Laplacian( InputArray src, OutputArray dst, int ddepthint ksize=1, double scale=1, double delta=0int borderType=BORDER_DEFAULT );

實現部分:

// .cpp

void Laplacian(InputArray src, OutputArray dst, int ddepth, int ksize, double scaledouble delta, int borderType)

注意倒數第4句的ksize,它只考慮了兩個laplacian的掩膜(mask):

當ksize == 1時(預設值),選擇k[0],即掩膜為:

當ksize==3時,選擇k[1],掩膜為:

這兩個掩膜都是非常簡單的3x3的laplacian的掩膜,但是不是太簡單了!

如果我實際需要5x5的掩膜、7x7的掩膜呢?需要不同的掩膜引數呢?這些通過直接呼叫這個函式就做不到了,所以需要我們自己去寫原始碼實現我們想要的功能。

(這個例子是從演算法實現角度去考慮的,另乙個方面是實現效率上,也有很多可以優化的地方.)

所以,少年,勇敢地去了解演算法的原理吧:)

4樓:陳壯壯

opencv使用的方法都是最經典最常規最通用的。

這些方法用起來效果不錯,但是穩定性跟速度都沒法保障,當你要開發具體應用的時候,你還是需要結合你的處理物件訂製一些針對性的演算法,這個時候如果能使用opencv裡的基礎方法進行組合,那是比較方便的,但如果不行,就只能自己寫了。

而且,學演算法的作用不僅是學會應用,也是在學習一種解決問題的思路,這也是影象工作者的價值所在,所以還是好好學吧。

5樓:Shiyi001

要知道我們在使用程式語言的時候,很多東西也已經封裝好了,比如vector,stack,queue...

但是我們還是要學習棧,佇列這些知識啊,對知識的掌握才能讓我們更好地去應用工具~

6樓:

工具是工具。輪子是輪子。

會用好工具是高效開發的能力,能重新造輪子則會深入理解工具但是效率必然會低一點。畢竟輪子不是說造就造的。

所以看自己在能力和時間上的盈餘了。

話說沒人@vczh 嗎?

7樓:fledsu

很多CV的演算法其實還有有其侷限性的,不一定在你的應用場景中產生特別好的結果,因此需要了解一些原理才能做一些除錯和針對應用場景做一些改進,

8樓:法蘭克斯雪諾

基本的了解一下還是必須的,因為opencv的很多實現沒有考慮實際情況,真要變成商品級的東西肯定需要優化,你沒有乙個基本概念到時候挺麻煩的,當然我也不提倡學的多深入,計算機圖形學包羅永珍博大精深,乙個點延伸開去你能搞一輩子,所以我舉得應該是有乙個框架性的認識,然後找乙個點深入學習

9樓:

有。計算機視覺很多演算法給的引數差這麼一點點,出來的結果可能差之千里。為了了解這些引數是做什麼用的、發揮什麼作用以及什麼樣的情況該用什麼樣的引數,這些都需要去學習了解演算法。

10樓:野合菌

看你最終需求是什麼。

如果是常規日常影象處理,偶爾拿來作為編輯工具使用一下,我覺得只要基本了解一下演算法的功能然後拿來用就好了。比如說,你說的邊緣檢測濾鏡有好幾種,你至少得了解不同濾鏡的基本原理和優缺點。

當然,如果是想入影象處理大坑,那麼在數學層面系統的理解一些常用演算法絕對是必不可少的。除了幫助你理解這些工具外,還可以幫助你開啟腦洞,讓你的思維更加廣闊。再複雜的機器往往都是由許多簡單的零件堆疊而成的,一點一滴的基礎積累至關重要。

11樓:雞哥

這也是很多開發過程中要糾結的乙個問題,如果某乙個功能已經有現成的庫,究竟用不用好呢(; ̄д ̄)

這些還是要看需求吧。如果是自己實現,會對這個演算法更加了解,可維護性和可控性會提高,還沒什麼開源協議的限制和束縛,實現演算法過程中順便滿足好奇心,特別你如果是做某個領域的東西,就算不需要去碰底層,懂得底層的原理還是很重要的。但是自己實現這些細節的話學習和開發成本會比較大,可能在實際工作中擔負不起這樣的成本,像我這些學生倒是無所謂,反正時間不值錢(逃。

所以在你不太需要了解底層,且第三方庫的開源協議適合,可以跟專案比較好的契合,那就用吧

OpenCV影象處理 1 13 影象金字塔 上取樣與降取樣

曾經我也非常鄙夷那些踏入異性戀婚姻的基佬,覺得他們在向社會妥協,甚至我也不贊成形婚,覺得形婚也不過是一種隱忍,我欣賞那些敢於與這個世界的不公作鬥爭的人。後來我覺得,婚姻這種東西,本身就充斥著各種利益,有的人為了錢結婚,有的人為了孩子結婚,許多年前被傳作佳話的昭君出塞,不也是赤裸裸的利益鏈條下的犧牲品...

請問大家AI影象處理與傳統影象處理各自有何優劣?

從事深度學習研究兩年,談一談個人經歷及感受。傳統影象處理方法 特徵提取主要依賴人工設計的特徵提取器,需要有專業知識及複雜的調參過程,同時每個方法都是針對具體應用,泛化能力及魯棒性較差。傳統影象演算法能解決某些特定場景的 可人工定義 設計 理解的影象任務。特定場景效果好,但普遍泛化性弱,可解釋性更強,...

如何學習C 影象處理?

join 可以學C C primer這本書很好,可以幫助你理解程式設計的原理,岡薩雷斯的影象處理這本書,講的很詳細,如果要長期從事影象處理,還是要看的,這是原理,或者找些其他的講原理並有程式事例的書也可以。我覺得學會了C 再去學其他語言,就會很輕鬆。對於剛入門的人,可以先學學opencv,跟著程式跑...