[心得] OpenCV 入門經驗
大家好,小弟不才,野人獻曝,大學開始摸索 OpenCV 時遇到很多麻煩
雖然用到現在還不到一年,但想把使用 OpenCV 的入門經驗整理一下,
希望可以幫到正要開始使用OpenCV的人 (PS.以 Windows, VC2008 為例)
1.開始
比較快的方法是下載已經包好的安裝檔
http://sourceforge.net/projects/opencvlibrary/files/
截稿最新版本為 OpenCV-2.1.0-win32-vs2008.exe
若要常常更新,可使用SVN下載
https://code.ros.org/svn/opencv/trunk/opencv
以上兩者可以到 http://opencv.willowgarage.com/wiki/ 參考
2.使用SVN需要自己編譯,理論上更新後要重編譯
預設讀取攝影機是用 VFW & MIL
如果要使用基於 DirectShow 的 videoInput Library 可以到手動定義
HAVE_VIDEOINPUT
因為我需要修改程式碼,所以實際上我是重新下載 videoInput Library
的原始碼,修改後重編的。http://muonics.net/school/spring05/videoInput/
如果沒有讀取速度上的需求,使用 VFW 也許比較簡單。
至於編譯用的專案可以用 CMake 還蠻方便的 http://www.cmake.org/
3.看OpenCV目錄下的pdf文件和 sample
可以看看如何使用 OpenCV,目前 find_obj 範例基於 SURF 的方法有 bug
4.其他 Q&A
Q1.執行的時候找不到 dll?
A1.你可以設環境變數,命名為Path,指向OpenCV下或你編譯的資料夾下bin的資料夾
不過我認為最好的方式是把資料夾下的dll都複製到你執行檔所在目錄下,
這樣換到沒有OpenCV的電腦也能用。
Q2.編譯找不到 ???.lib
A2.一般網路上建議的做法是在VC2008的設定加入連結路徑,
我覺得不妨選個穩定版本的lib複製到專案資料夾,然後在專案屬性設定相依的連結路徑
Q3.無法解析的外部符號
A3.可能忘記把 lib 在專案中設定,注意debug mode檔名常以d作尾
Q4.讀不到攝影機或視訊之類的檔案?A4.或許缺了XviD解碼器。
Q5.色彩整個跑掉?A5.注意OpenCV預設圖檔是B-G-R-B-G-R排列
Q6.讀攝影機或圖是有讀取到,但是顯示不出來。
A6.你可能放在迴圈跑吧,中間不妨delay一下,例如cvWaitKey(30);
不要用 getchar(); system("pause"); Sleep(30); 之類的... ...
Q7.編譯videoInput會缺少檔案?
A7.你的版本比較新,把網路上videoInput資料夾裡面DShow的Include, Extra...等
檔案手動貼到DShow目錄裡面,或者跟DShow原有的揉成肉包後一樣放在專案下。
Q8.Win7不讓改DShow標頭檔案?A8.複製到其他地方,然後貼上新檔案,用系統管理員身分。
Q9.OpenMP缺dll?
A9.雖然OpenCV目前用TBB取代OpenMP,還是說一下,去找到相應的dll,放到執行檔目錄下
或者system32資料夾下。
Q10.不想讀到螢幕上內建的攝影機。
A10.去裝置管理員關掉或程式碼換編號都可。注意換電腦之後攝影機編號常不一樣。
Q11.記憶體爆掉了?
A11.基本上如果是用C的寫法,看到指標,要記得呼叫相應釋放的函數,當然也有例外.
可以查OpenCV目錄下的pdf文件
Q12.如何關掉編譯器給OpenCV的警告,A12:舉例如下
#pragma warning(push,0)
# include <cv.h>
# include <highgui.h>
# include <cvaux.h>
#pragma warning(pop)
... ...
希望不會寫得太多廢話。有錯請指教。
最後希望剛要接觸 OpenCV 的同好們,能夠早日開始專注在演算法上,
而不會被這些小細節浪費時間。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.116.214.41
推
04/22 19:56, , 1F
04/22 19:56, 1F
→
04/22 19:56, , 2F
04/22 19:56, 2F
推
04/22 21:28, , 3F
04/22 21:28, 3F
推
04/23 01:53, , 4F
04/23 01:53, 4F
推
04/24 15:46, , 5F
04/24 15:46, 5F
※ 編輯: applecool 來自: 140.116.214.41 (04/26 10:33)